Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API :3D ソリッドの底面位置合わせ

Issue

複数の 3D ソリッドの底面を XY 平面(Z 座標値 0.0)に一斉に揃えることは出来ますか?

 

Solution

選択した 3D ソリッドの底辺を Z=0.0 に位置合わせするコードを作成する場合、オブジェクト(Solid3d)の境界ボックス座標を Entity.GeometricExtents プロパティで取得してから、Extents3d.MinPoint.Z で現在の底面の Z 値を取得、次に、XY 平面(Z 値 0.0)からのベクトル(Vector3d)からマトリックス(Matrix3d)を作成後、同マトリックスを反転して、Z 値 0.0 の移動させることで、底面の位置合わせを行うことが出来ます。次の例は、その C# コードとなります。
ご参考:オブジェクトを移動する(.NET) | Autodesk

 

   Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
   Database db = Application.DocumentManager.MdiActiveDocument.Database;
   Document doc = Application.DocumentManager.MdiActiveDocument;

   using (Transaction tr = db.TransactionManager.StartTransaction())
   {
    PromptSelectionResult psr = doc.Editor.GetSelection();
    SelectionSet sset = psr.Value;

    if (psr.Status == PromptStatus.OK)
    {
     Entity ent = null;
     Extents3d ext;
     foreach (SelectedObject so in sset)
     {
      ent = (Entity)tr.GetObject(so.ObjectId, OpenMode.ForWrite);
      if(ent.GetRXClass().Name == "AcDb3dSolid")
      {
       Solid3d sol = (Solid3d)ent;
       ext = sol.GeometricExtents;
       ed.WriteMessage("\nSolid3d Z value = {0}", ext.MinPoint.Z);

       Point3d pt = new Point3d(0, 0, 0);
       Vector3d vec = pt.GetVectorTo(new Point3d(0.0, 0.0, ext.MinPoint.Z));

       sol.TransformBy(Matrix3d.Displacement(vec).Inverse());
      }
     }

    }
    tr.Commit();
   }

align.gif