Разделение составных твердых тел на отдельные тела
Мы можем воспользоваться методом Solid3d.SeparateBody
Этот метод разделяет твердое тело на коллекцию непересекающихся твердых тел.
Вызывающее этот метод приложение должно что-то сделать с твердыми телами полученной коллекции (или добавить их в базу данных или удалить, если они больше не нужны). Когда вызывающее приложение закрывает твердое тело, результирующее твердое тело фиксируется в базе данных.
Таким образом если не добавить твердые тела из коллекции в базу данных, мы потеряем какую-то информацию.
Чтобы разделить составные твердые тела в редакторе AutoCAD, прочтите эту статью.
Обратите внимание, что вам нужно единое твердое тело, хотя визуально оно может выглядеть как два и даже больше, так что вы можете копировать и перемещать много непересекающихся твердых тел как одно тело.
Я подготовил такой чертеж.
- public static void SepSolid()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptEntityOptions peo = new PromptEntityOptions("\nВыберите 3D-Тело:");
- peo.SetRejectMessage("\nЭто не 3D-тело.");
- peo.AddAllowedClass(typeof(Solid3d), false);
- PromptEntityResult per = ed.GetEntity(peo);
- if (per.Status != PromptStatus.OK) return;
- Transaction tr = db.TransactionManager.StartTransaction();
- using (tr)
- {
- Solid3d sol = tr.GetObject(per.ObjectId, OpenMode.ForRead)
- as Solid3d;
- if (sol != null)
- {
- sol.UpgradeOpen();
- // Твердое тело должно состоять из отдельных частей
- Solid3d[] disjointSolids = sol.SeparateBody();
- foreach (Solid3d v in disjointSolids)
- {
- Vector3d dispVector = Point3d.Origin.GetVectorTo(v.MassProperties.Centroid);
- v.TransformBy(Matrix3d.Displacement(dispVector));
- v.ColorIndex = 3;
- using (OpenCloseTransaction oct = new OpenCloseTransaction())
- {
- // Open the Block table for read
- BlockTable acBlkTbl;
- acBlkTbl = oct.GetObject(db.BlockTableId,
- OpenMode.ForRead) as BlockTable;
- // Open the Block table record Model space for write
- BlockTableRecord acBlkTblRec;
- acBlkTblRec = oct.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
- OpenMode.ForWrite) as BlockTableRecord;
- acBlkTblRec.AppendEntity(v);
- oct.AddNewlyCreatedDBObject(v, true);
- // Сохраняем новые объекты в базу данных
- oct.Commit();
- }
- }
- }
- tr.Commit();
- }
- }
Источник: https://adndevblog.typepad.com/autocad/2020/06/separate-solid-complexes-into-separate-solids.html
Опубликовано 19.06.2020