Получение смещения геометрии солида в семействе

Автор Тема: Получение смещения геометрии солида в семействе  (Прочитано 1593 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!
У меня есть задача передать выбранное семейство в Aveva.
Для этого я формирую OBJ файл выбранного семейства и передаю в глобальных координатах. В процессе создания OBJ файла я использую GeometryElement и получаю Solidыы из них и получаю Mesh-ы и соотвественно вершины. Но проблема в том, что в Aveva точка вставки это середина нижней поверхности BoundingBox-а, которая не всегда совпадает с LocationPoint.
Я сделал следующее:
Код - C# [Выбрать]
  1. static private XYZ GetOffset(FamilyInstance familyInstance, XYZ locationPoint)
  2. {
  3.     GeometryInstance geometryInstance = null;
  4.     BoundingBoxXYZ geometryElementBoundingBox = null;
  5.     BoundingBoxXYZ geometrySymbolBoundingBox = null;
  6.     var offset = XYZ.Zero;
  7.  
  8.     if (familyInstance.get_Geometry(new Options() { ComputeReferences = false, IncludeNonVisibleObjects = false }) is GeometryElement geometryElement)
  9.     {
  10.         foreach (GeometryObject obj in geometryElement)
  11.         {
  12.  
  13.             geometryElementBoundingBox = geometryElement.GetBoundingBox();
  14.             _bbmin = geometryElementBoundingBox.Min;
  15.             _bbmax = geometryElementBoundingBox.Max;
  16.             geometryInstance = obj as GeometryInstance;
  17.         }
  18.  
  19.         if (geometryInstance != null)
  20.         {
  21.             foreach (GeometryInstance obj in geometryElement)
  22.             {
  23.                 var symbolGeometry = obj.GetSymbolGeometry();
  24.                 symbolGeometry = symbolGeometry.GetTransformed(_transform);
  25.                 geometrySymbolBoundingBox = symbolGeometry.GetBoundingBox();
  26.                 _bbmin = geometrySymbolBoundingBox.Min;
  27.                 _bbmax = geometrySymbolBoundingBox.Max;
  28.             }
  29.         }
  30.  
  31.         if (geometrySymbolBoundingBox != null)
  32.         {
  33.             var bbCenterPoint = new XYZ((geometrySymbolBoundingBox.Min.X + geometrySymbolBoundingBox.Max.X) / 2, (geometrySymbolBoundingBox.Min.Y + geometrySymbolBoundingBox.Max.Y) / 2, geometrySymbolBoundingBox.Min.Z);
  34.  
  35.             offset = bbCenterPoint - locationPoint;
  36.         }
  37.     }
  38.  
  39.     return offset;
  40. }
  41.  

получаю BoundingBox geometryElement-а, вычисляю его середину и получаю смещение от точки вставки.


И все работало до того момента как мне дали вот такое семейство:

В котором в BoundingBox включены линии и координаты становятся неверны.

Я пробовал отдельно собирать солиды и вычислять нижнюю плоскость путем получения наименьшей координаты Z, но не получилось трансформировать координаты BoundingBox-а солида в глобальные координаты, он всегда в центре своей координатной системы. И даже после преобразования солида в координатную систему семейства, размеры BoundingBox-а неверны.

Есть ли какие-нибудь методы для исключения линий из BoundingBox-а или другие варианты решения?
« Последнее редактирование: 16-08-2022, 13:36:09 от Александр Ривилис »