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

29/05/2013

Получение информации о гранях PolyFaceMesh в .NET

Это .NET версия этой статьи

Обычно достаточно просто мигрировать из кода ObjectARX в код AutoCAD .NET API, так как это просто обертки над ARX API. Вам нужно убрать префикс AcDb из имён классов базы данных, использовать foreach вместо функции создающей итератор, использовать транзакции, и большая часть следующего кода будет готова :)

Код - C#: [Выделить]
  1. [CommandMethod("PolyTest_PolyFace")]
  2. public void PolyTest_PolyFace()
  3. {
  4.   Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;
  5.  
  6.   PromptEntityResult per = ed.GetEntity("\nВыберите многогранную сеть: ");
  7.   if (per.Status != PromptStatus.OK)
  8.     return;
  9.  
  10.   int color = 0;
  11.  
  12.   Database db = ed.Document.Database;
  13.   using (Transaction tr = db.TransactionManager.StartTransaction())
  14.   {
  15.     BlockTable bt =
  16.       (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  17.  
  18.     BlockTableRecord ms =
  19.       (BlockTableRecord)tr.GetObject(
  20.         bt[BlockTableRecord.ModelSpace],
  21.         OpenMode.ForWrite); 
  22.  
  23.     PolyFaceMesh pfm =
  24.       (PolyFaceMesh)tr.GetObject(per.ObjectId, OpenMode.ForRead);
  25.  
  26.     Point3dCollection vertices = new Point3dCollection();
  27.  
  28.     foreach (ObjectId id in pfm)
  29.     {
  30.       DBObject obj = tr.GetObject(id, OpenMode.ForRead);
  31.  
  32.       if (obj is PolyFaceMeshVertex)
  33.       {
  34.         PolyFaceMeshVertex vertex = (PolyFaceMeshVertex)obj;
  35.         vertices.Add(vertex.Position); 
  36.       }
  37.       else if (obj is FaceRecord)
  38.       {
  39.         FaceRecord face = (FaceRecord)obj;
  40.  
  41.         Point3dCollection pts = new Point3dCollection();
  42.  
  43.         for (short i = 0; i < 4; i++)
  44.         {
  45.           short index = face.GetVertexAt(i);
  46.  
  47.           if (index != 0)
  48.             pts.Add(vertices[Math.Abs(index) - 1]);
  49.         }
  50.  
  51.         // Если точек 4 то рисуем пересечение
  52.         // (может быть и 3 точки)
  53.         if (pts.Count == 4)
  54.         {
  55.           for (int j = 0; j < 2; j++)
  56.           {
  57.             Line line = new Line(pts[j], pts[j + 2]);
  58.             line.ColorIndex = color;
  59.  
  60.             ms.AppendEntity(line);
  61.             tr.AddNewlyCreatedDBObject(line, true);
  62.           }
  63.         }
  64.  
  65.         color = (color + 1) % 7;
  66.       }
  67.     }
  68.  
  69.     tr.Commit();
  70.   }
  71. }
  72.  

Источник: http://adndevblog.typepad.com/autocad/2012/07/get-facet-information-from-polyfacemesh.html

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

Опубликовано 29.05.2013
Отредактировано 08.06.2013 в 00:55:20