ユーザ座標系を定義する(.NET)

原点(0, 0, 0)の位置、XY 平面と Z 軸の方向を変更するには、ユーザ座標系(UCS)オブジェクトを定義します。3D 空間の任意の場所および方向に UCS を配置することができます。必要な数のユーザ座標系の定義、保存、呼び出しが可能です。座標の指定および表示は、現在の UCS を基準とした相対的な値で行います。

UCS の原点と方向を示すために、Viewport オブジェクトの IconAtOrigin プロパティまたはシステム変数 UCSICON を使用して、UCS 原点に UCS アイコンを表示できます。UCS アイコンが有効になっていて(IconVisible プロパティ)、原点に表示されない場合は、システム変数 UCSORG により定義された WCS 座標に表示されます。

UCSTable オブジェクトの Add メソッドを使用して新しいユーザ座標系を作成することができます。このメソッドでは、原点の座標、X 軸および Y 軸上の座標、UCS の名前の 4 つの値を入力する必要があります。

AutoCAD 内のほとんどの座標は、ワールド座標系(WCS)で提供されます。同等の WCS 座標を得るには、GetUCSMatrix メソッドを使用して、特定の UCS の変換マトリックスを返します。

UCS をアクティブにするには、Document オブジェクトで ActiveUCS プロパティを使用します。アクティブな UCS に変更を加えた場合、変更結果を表示するには、その新しい UCS オブジェクトをアクティブな UCS に再設定してください。アクティブな UCS をリセットするには、更新した UCS オブジェクトの ActiveUCS プロパティをもう一度呼び出します。

新しい UCS を作成してアクティブ化し、点の座標を UCS 座標へ変換する

以下の例では、新しい UCS を作成し、図面に対しアクティブな UCS として設定します。次にユーザに図面内の点をクリックするようプロンプトを表示し、その点の WCS および UCS の両座標を返します。

C# の例

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("NewUCS")]
public static void NewUCS()
{
    // Get the current document and database, and start a transaction
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;

    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // Open the UCS table for read
        UcsTable acUCSTbl;
        acUCSTbl = acTrans.GetObject(acCurDb.UcsTableId,
                                     OpenMode.ForRead) as UcsTable;

        UcsTableRecord acUCSTblRec;

        // Check to see if the "New_UCS" UCS table record exists
        if (acUCSTbl.Has("New_UCS") == false)
        {
            acUCSTblRec = new UcsTableRecord();
            acUCSTblRec.Name = "New_UCS";

            // Open the UCSTable for write
            acTrans.GetObject(acCurDb.UcsTableId, OpenMode.ForWrite);

            // Add the new UCS table record
            acUCSTbl.Add(acUCSTblRec);
            acTrans.AddNewlyCreatedDBObject(acUCSTblRec, true);
        }
        else
        {
            acUCSTblRec = acTrans.GetObject(acUCSTbl["New_UCS"],
                                            OpenMode.ForWrite) as UcsTableRecord;
        }

        acUCSTblRec.Origin = new Point3d(4, 5, 3);
        acUCSTblRec.XAxis = new Vector3d(1, 0, 0);
        acUCSTblRec.YAxis = new Vector3d(0, 1, 0);

        // Open the active viewport
        ViewportTableRecord acVportTblRec;
        acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,
                                          OpenMode.ForWrite) as ViewportTableRecord;

        // Display the UCS Icon at the origin of the current viewport
        acVportTblRec.IconAtOrigin = true;
        acVportTblRec.IconEnabled = true;

        // Set the UCS current
        acVportTblRec.SetUcs(acUCSTblRec.ObjectId);
        acDoc.Editor.UpdateTiledViewportsFromDatabase();

        // Display the name of the current UCS
        UcsTableRecord acUCSTblRecActive;
        acUCSTblRecActive = acTrans.GetObject(acVportTblRec.UcsName,
                                              OpenMode.ForRead) as UcsTableRecord;

        Application.ShowAlertDialog("The current UCS is: " +
                                    acUCSTblRecActive.Name);

        PromptPointResult pPtRes;
        PromptPointOptions pPtOpts = new PromptPointOptions("");

        // Prompt for a point
        pPtOpts.Message = "\nEnter a point: ";
        pPtRes = acDoc.Editor.GetPoint(pPtOpts);

        Point3d pPt3dWCS;
        Point3d pPt3dUCS;

        // If a point was entered, then translate it to the current UCS
        if (pPtRes.Status == PromptStatus.OK)
        {
            pPt3dWCS = pPtRes.Value;
            pPt3dUCS = pPtRes.Value;

            // Translate the point from the current UCS to the WCS
            Matrix3d newMatrix = new Matrix3d();
            newMatrix = Matrix3d.AlignCoordinateSystem(Point3d.Origin,
                                                        Vector3d.XAxis,
                                                        Vector3d.YAxis,
                                                        Vector3d.ZAxis,
                                                        acVportTblRec.Ucs.Origin,
                                                        acVportTblRec.Ucs.Xaxis,
                                                        acVportTblRec.Ucs.Yaxis,
                                                        acVportTblRec.Ucs.Zaxis);

            pPt3dWCS = pPt3dWCS.TransformBy(newMatrix);

            Application.ShowAlertDialog("The WCS coordinates are: \n" +
                                        pPt3dWCS.ToString() + "\n" +
                                        "The UCS coordinates are: \n" +
                                        pPt3dUCS.ToString());
        }

        // Save the new objects to the database
        acTrans.Commit();
    }
}