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

09/04/2016

Как получить границы области (Region)

Вопрос: Как средствами AutoCAD .NET API можно получить границы (контура) области (Region)?

Ответ: Для этой цели следует воспользоваться возможностями Brep .NET API. Пример получения граничных контуров ниже. Внешние контура красного цвета, внутренние - желтого.

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.BoundaryRepresentation;
  7. using AcBr = Autodesk.AutoCAD.BoundaryRepresentation;
  8.  
  9. #pragma warning disable 0618
  10.  
  11. [assembly: CommandClass(typeof(Rivilis.RegionExtBoundary))]
  12.  
  13. namespace Rivilis
  14. {
  15.  
  16.   public class RegionExtBoundary
  17.   {
  18.     [CommandMethod("REB", CommandFlags.Modal)]
  19.     public void MyCommand()
  20.     {
  21.       Document doc = Application.DocumentManager.MdiActiveDocument;
  22.       if (doc == null) return;
  23.       Editor ed = doc.Editor;
  24.       ObjectId curSpaceId = doc.Database.CurrentSpaceId;
  25.       PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите область: ");
  26.       prEnt.SetRejectMessage("Это не область");
  27.       prEnt.AddAllowedClass(typeof(Region), false);
  28.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  29.       if (rsEnt.Status != PromptStatus.OK) return;
  30.       using (Region reg = rsEnt.ObjectId.Open(OpenMode.ForRead) as Region)
  31.       {
  32.         using (BlockTableRecord btr = curSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  33.         {
  34.           AcBr.Brep brep = new AcBr.Brep(reg);
  35.           int iFaces = 0;
  36.           foreach (AcBr.Face face in brep.Faces)
  37.           {
  38.  
  39.             ed.WriteMessage("\nГрань №{0}.", iFaces++);
  40.  
  41.             int iLoop = 0;
  42.             foreach (AcBr.BoundaryLoop loop in face.Loops)
  43.             {
  44.               ed.WriteMessage("\nКонтур №{0}. Тип контура = {1}", iLoop++,
  45.                 (loop.LoopType == LoopType.LoopExterior) ? "Внешний" : "Внутренний");
  46.               int iVertex = 0;
  47.               using (Point3dCollection pts = new Point3dCollection())
  48.               {
  49.                 foreach (AcBr.Vertex vert in loop.Vertices)
  50.                 {
  51.                   ed.WriteMessage("\n\tВершина №{0} с координатами = {1}", iVertex++, vert.Point);
  52.                   pts.Add(vert.Point);
  53.                 }
  54.                 using (Polyline3d p3d = new Polyline3d(Poly3dType.SimplePoly, pts, true))
  55.                 {
  56.                   p3d.SetDatabaseDefaults();
  57.                   switch (loop.LoopType)
  58.                   {
  59.                     case LoopType.LoopExterior:
  60.                       p3d.ColorIndex = 1;
  61.                       break;
  62.                     case LoopType.LoopInterior:
  63.                       p3d.ColorIndex = 2;
  64.                       break;
  65.                     default:
  66.                       p3d.ColorIndex = 3;
  67.                       break;
  68.                   }
  69.                   btr.AppendEntity(p3d);
  70.                 }
  71.               }
  72.             }
  73.             iLoop++;
  74.           }
  75.         }
  76.       }
  77.     }
  78.   }
  79. }



 

Автор: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7020

Опубликовано 09.04.2016