ADN Open CIS
Сообщество программистов Autodesk в СНГ

19/06/2020

Разделение составных твердых тел на отдельные тела

Мы можем воспользоваться методом Solid3d.SeparateBody

Этот метод разделяет твердое тело на коллекцию непересекающихся твердых тел.
Вызывающее этот метод приложение должно что-то сделать с твердыми телами полученной коллекции (или добавить их в базу данных или удалить, если они больше не нужны). Когда вызывающее приложение закрывает твердое тело, результирующее твердое тело фиксируется в базе данных.
Таким образом если не добавить твердые тела из коллекции в базу данных, мы потеряем какую-то информацию.

Чтобы разделить составные твердые тела в редакторе AutoCAD, прочтите эту статью.

Обратите внимание, что вам нужно единое твердое тело, хотя визуально оно может выглядеть как два и даже больше, так что вы можете копировать и перемещать много непересекающихся твердых тел как одно тело.
Я подготовил такой  чертеж.

Код - C#: [Выделить]
  1. public static void SepSolid()
  2. {
  3.     Document doc = Application.DocumentManager.MdiActiveDocument;
  4.     Database db = doc.Database;
  5.     Editor ed = doc.Editor;
  6.     PromptEntityOptions peo = new PromptEntityOptions("\nВыберите 3D-Тело:");
  7.     peo.SetRejectMessage("\nЭто не 3D-тело.");
  8.     peo.AddAllowedClass(typeof(Solid3d)false);
  9.     PromptEntityResult per = ed.GetEntity(peo);
  10.     if (per.Status != PromptStatus.OK) return;
  11.     Transaction tr = db.TransactionManager.StartTransaction();
  12.     using (tr)
  13.     {
  14.         Solid3d sol = tr.GetObject(per.ObjectId, OpenMode.ForRead)
  15.         as Solid3d;
  16.         if (sol != null)
  17.         {
  18.             sol.UpgradeOpen();
  19.             // Твердое тело должно состоять из отдельных частей
  20.             Solid3d[] disjointSolids = sol.SeparateBody();
  21.             foreach (Solid3d v in disjointSolids)
  22.             {
  23.                 Vector3d dispVector = Point3d.Origin.GetVectorTo(v.MassProperties.Centroid);
  24.                 v.TransformBy(Matrix3d.Displacement(dispVector));
  25.                 v.ColorIndex = 3;
  26.                 using (OpenCloseTransaction oct = new OpenCloseTransaction())
  27.                 {
  28.                     // Open the Block table for read
  29.                     BlockTable acBlkTbl;
  30.                     acBlkTbl = oct.GetObject(db.BlockTableId,
  31.                                                         OpenMode.ForRead) as BlockTable;
  32.                     // Open the Block table record Model space for write
  33.                     BlockTableRecord acBlkTblRec;
  34.                     acBlkTblRec = oct.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  35.                                                             OpenMode.ForWrite) as BlockTableRecord;
  36.                     acBlkTblRec.AppendEntity(v);
  37.                     oct.AddNewlyCreatedDBObject(v, true);
  38.                     // Сохраняем новые объекты в базу данных
  39.                     oct.Commit();
  40.                 }
  41.             }
  42.         }
  43.         tr.Commit();
  44.     }
  45. }

 

Источник: https://adndevblog.typepad.com/autocad/2020/06/separate-solid-complexes-into-separate-solids.html

 

Автор перевода: Александр Ривилис
Опубликовано 19.06.2020