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();
}
記事全体を表示