31/07/2020
RealDWG: Получение информации о цвете граней твердых тел
Используя RealDWG SDK следующий код позволяет получить цвета граней твердых тел в чертеже AutoCAD.
Для извлечения цветов из компонентов твердого тела используется BREP API, поэтому необходимо сослаться на сборку AcDbMgdBrep.dll из RealDWG SDK.
Для примера можно воспользоваться этим чертежом – Testdrawing
Код - C#: [Выделить]
- private void DumpSolid3d(Transaction tr, ObjectId solId)
- {
- using (OpenCloseTransaction oct = new OpenCloseTransaction())
- {
- Solid3d solid = tr.GetObject(solId, OpenMode.ForRead) as Solid3d;
- ObjectId[] ids = new ObjectId[] { solid.ObjectId };
- FullSubentityPath path =
- new FullSubentityPath(
- ids,
- new SubentityId(SubentityType.Null, IntPtr.Zero)
- );
- // Для сохранения компонентов цилиндрических граней
- List subentIds = new List();
- using (Brep brep = new Brep(path))
- {
- foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face face in brep.Faces)
- {
- /*
- // Как получить цвета только цилиндрических граней
- Autodesk.AutoCAD.Geometry.Surface surf = face.Surface;
- var ebSurf = surf as Autodesk.AutoCAD.Geometry.ExternalBoundedSurface;
- if (ebSurf != null && ebSurf.IsCylinder)
- {
- subentIds.Add(face.SubentityPath.SubentId);
- }
- */
- subentIds.Add(face.SubentityPath.SubentId);
- }
- }
- if (subentIds.Count > 0)
- {
- List<KeyValuePair<Color,SubentityId>> ColorSubEntityPairs
- = GetColors(solid, subentIds);
- foreach (var item in ColorSubEntityPairs)
- {
- var color = item.Key as Color;
- SubentityId id = item.Value;
- Console.WriteLine($"\nColor - {color.ColorNameForDisplay}
- | SubEntity Index - {id.IndexPtr}");
- }
- }
- oct.Commit();
- }
- }
- List< KeyValuePair< Color,SubentityId >>
- GetColors(Solid3d solid, List subentIds)
- {
- List < KeyValuePair < Color, SubentityId >> ColorSubEntityPairs
- = new List< KeyValuePair >();
- foreach (SubentityId subentId in subentIds)
- {
- try
- {
- Color col = solid.GetSubentityColor(subentId);
- ColorSubEntityPairs.Add(new KeyValuePair(col, subentId));
- }
- catch (Autodesk.AutoCAD.BoundaryRepresentation.Exception ex)
- {
- if(ex.ErrorStatus == ErrorStatus.NotApplicable)
- continue;
- }
- }
- return ColorSubEntityPairs;
- }
Результаты:
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
Опубликовано 31.07.2020
Отредактировано 31.07.2020 в 15:09:18