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

31/07/2020

RealDWG: Получение информации о цвете граней твердых тел

Используя RealDWG SDK следующий код позволяет получить цвета граней твердых тел в чертеже AutoCAD.

Для извлечения цветов из компонентов твердого тела используется BREP API, поэтому необходимо сослаться на сборку AcDbMgdBrep.dll из RealDWG SDK.

Для примера можно воспользоваться этим чертежом – Testdrawing 

Код - C#: [Выделить]
  1. private void DumpSolid3d(Transaction tr, ObjectId solId)
  2. {
  3.     using (OpenCloseTransaction oct = new OpenCloseTransaction())
  4.     {
  5.         Solid3d solid = tr.GetObject(solId, OpenMode.ForRead) as Solid3d;
  6.  
  7.         ObjectId[] ids = new ObjectId[] { solid.ObjectId };
  8.  
  9.         FullSubentityPath path =
  10.           new FullSubentityPath(
  11.             ids,
  12.             new SubentityId(SubentityType.Null, IntPtr.Zero)
  13.           );
  14.  
  15.         // Для сохранения компонентов цилиндрических граней
  16.  
  17.         List subentIds = new List();
  18.  
  19.         using (Brep brep = new Brep(path))
  20.         {
  21.             foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face face in brep.Faces)
  22.             {
  23.                 /*
  24.                 // Как получить цвета только цилиндрических граней
  25.                 
  26.                 Autodesk.AutoCAD.Geometry.Surface surf = face.Surface;
  27.                 var ebSurf = surf as Autodesk.AutoCAD.Geometry.ExternalBoundedSurface;
  28.                 if (ebSurf != null && ebSurf.IsCylinder)
  29.                 {
  30.                     subentIds.Add(face.SubentityPath.SubentId);
  31.                 }
  32.                
  33.                  */
  34.                 subentIds.Add(face.SubentityPath.SubentId);
  35.             }
  36.         }
  37.  
  38.         if (subentIds.Count > 0)
  39.         {
  40.             List<KeyValuePair<Color,SubentityId>> ColorSubEntityPairs
  41.                  = GetColors(solid, subentIds);
  42.             foreach (var item in ColorSubEntityPairs)
  43.             {
  44.                 var color = item.Key as Color;
  45.                 SubentityId id = item.Value;
  46.                 Console.WriteLine($"\nColor - {color.ColorNameForDisplay}
  47.                                                 | SubEntity Index - {id.IndexPtr}");
  48.             }
  49.         }
  50.        oct.Commit();
  51.     }
  52. }
  53.  
  54. List< KeyValuePair< Color,SubentityId >>
  55. GetColors(Solid3d solid, List subentIds)
  56. {
  57.     List < KeyValuePair < Color, SubentityId >> ColorSubEntityPairs
  58.             = new List< KeyValuePair >();
  59.     foreach (SubentityId subentId in subentIds)
  60.     {
  61.         try
  62.         {
  63.             Color col = solid.GetSubentityColor(subentId);
  64.             ColorSubEntityPairs.Add(new KeyValuePair(col, subentId));
  65.         }
  66.         catch (Autodesk.AutoCAD.BoundaryRepresentation.Exception ex)
  67.         {
  68.             if(ex.ErrorStatus == ErrorStatus.NotApplicable)
  69.             continue;
  70.         }
  71.        
  72.  
  73.        
  74.     }
  75.     return ColorSubEntityPairs;
  76. }

Результаты:

SolidColors.exe "C:\rd2020\RealDWG 2020\Samples\SolidColors\testBox.dwg"
BlockTable -*Model_Space
Color - 250 | SubEntity Index - 1
Color - 250 | SubEntity Index - 2
Color - 250 | SubEntity Index - 3
Color - 250 | SubEntity Index - 4
Color - 250 | SubEntity Index - 5
Color - 250 | SubEntity Index - 6
Color - 250 | SubEntity Index - 7
Color - 50 | SubEntity Index - 8
Color - 50 | SubEntity Index - 9
Color - 50 | SubEntity Index - 10
Color - 50 | SubEntity Index - 11
Color - 50 | SubEntity Index - 12
Color - 50 | SubEntity Index - 13
BlockTable -*Paper_Space
BlockTable -*Paper_Space0

Исходный код

Источник:  https://adndevblog.typepad.com/autocad/2020/03/realdwg-extracting-color-information-from-solids.html

 

 

Автор перевода: Александр Ривилис
Опубликовано 31.07.2020
Отредактировано 31.07.2020 в 15:09:18