Добрый день!
У меня есть задача передать выбранное семейство в Aveva.
Для этого я формирую OBJ файл выбранного семейства и передаю в глобальных координатах. В процессе создания OBJ файла я использую GeometryElement и получаю Solidыы из них и получаю Mesh-ы и соотвественно вершины. Но проблема в том, что в Aveva точка вставки это середина нижней поверхности BoundingBox-а, которая не всегда совпадает с LocationPoint.
Я сделал следующее:
static private XYZ GetOffset(FamilyInstance familyInstance, XYZ locationPoint)
{
GeometryInstance geometryInstance = null;
BoundingBoxXYZ geometryElementBoundingBox = null;
BoundingBoxXYZ geometrySymbolBoundingBox = null;
var offset = XYZ.Zero;
if (familyInstance.get_Geometry(new Options() { ComputeReferences = false, IncludeNonVisibleObjects = false }) is GeometryElement geometryElement)
{
foreach (GeometryObject obj in geometryElement)
{
geometryElementBoundingBox = geometryElement.GetBoundingBox();
_bbmin = geometryElementBoundingBox.Min;
_bbmax = geometryElementBoundingBox.Max;
geometryInstance = obj as GeometryInstance;
}
if (geometryInstance != null)
{
foreach (GeometryInstance obj in geometryElement)
{
var symbolGeometry = obj.GetSymbolGeometry();
symbolGeometry = symbolGeometry.GetTransformed(_transform);
geometrySymbolBoundingBox = symbolGeometry.GetBoundingBox();
_bbmin = geometrySymbolBoundingBox.Min;
_bbmax = geometrySymbolBoundingBox.Max;
}
}
if (geometrySymbolBoundingBox != null)
{
var bbCenterPoint = new XYZ((geometrySymbolBoundingBox.Min.X + geometrySymbolBoundingBox.Max.X) / 2, (geometrySymbolBoundingBox.Min.Y + geometrySymbolBoundingBox.Max.Y) / 2, geometrySymbolBoundingBox.Min.Z);
offset = bbCenterPoint - locationPoint;
}
}
return offset;
}
получаю BoundingBox geometryElement-а, вычисляю его середину и получаю смещение от точки вставки.
И все работало до того момента как мне дали вот такое семейство:
В котором в BoundingBox включены линии и координаты становятся неверны.
Я пробовал отдельно собирать солиды и вычислять нижнюю плоскость путем получения наименьшей координаты Z, но не получилось трансформировать координаты BoundingBox-а солида в глобальные координаты, он всегда в центре своей координатной системы. И даже после преобразования солида в координатную систему семейства, размеры BoundingBox-а неверны.
Есть ли какие-нибудь методы для исключения линий из BoundingBox-а или другие варианты решения?