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

ADN Club => Revit API => Тема начата: enot от 17-02-2019, 15:11:52

Название: Solid фильтровать Face по ориентации
Отправлено: enot от 17-02-2019, 15:11:52
Солид представляет собой куб, есть ли методы апи , которые позволят быстро получить:

-  самую верхнюю и самую нижнюю горизонтальную поверхность (Face) куба
- получить все вертикальные и горизонтальные поверхности
- как узнать что Face имеет отверстия внутри?


Название: Re: Solid фильтровать Face по ориентации
Отправлено: Александр Игнатович от 17-02-2019, 15:31:51
получить плоские face-ы - solid.Faces.OfType<PlanarFace>()

-  самую верхнюю и самую нижнюю горизонтальную поверхность (Face) куба

у плоской поверхности получить нормаль, если она BasisZ - то это горизонтальная верхняя поверхность, самая верхняя или нет - смотрим свойство face.Origin.Z, горизонтальная нижняя имеет нормаль -1*BasisZ

- получить все вертикальные и горизонтальные поверхности

с горизонтальными разобрались, вертикальные опять же проверяем нормаль: normal.DotProduct(XYZ.BasisZ) ~ 0

- как узнать что Face имеет отверстия внутри?

получаем все границы face.GetEdgesAsCurveLoops, дальше каждую из них тестируем методом IsCounterclockwise, которому передаем нормаль faсe-а, если результат false - значит, это отверстие
Название: Re: Solid фильтровать Face по ориентации
Отправлено: enot от 17-02-2019, 16:04:04
solid.Faces.OfType<PlanarFace>()
Это интересно  :) (нет такого метода , хотя может это тот же метод   .GetType()). Вообще Face может быть либо PlanarFace , либо Face ?
Если у нас к примеру шар - то для него будет solid.Faces.OfType<Face>() ?
Название: Re: Solid фильтровать Face по ориентации
Отправлено: Александр Игнатович от 17-02-2019, 16:17:07
Где у шара "горизонтальная поверхность"?

Face - базовый класс, какими бывают Face-ы - см. в SDK