Как получить линии из условного обозначения отверстия
Андрей Фазлеев поделился с нами своим решением. Далее с его слов.
На прошлой неделе Хасан Мамаев задал вопрос:
Я пытаюсь получить геометрию нескольких экземпляров одного плоского семейства таким кодом:
i.GetInstanceGeometry()
но выдаёт ошибку: AttributeError: 'FamilyInstance' object has no attribute 'GetInstanceGeometry'
Объекты, из которых нужно вытянуть линии - условное отображение отверстий:
Сегодня появилось время, пытаюсь разобраться.
Первым делом обращаюсь к документации.
Есть пример с извлечением геометрии из стены, но применить один в один не удалось.
После изысканий разработал такой код:
- private List<Line> GetLines(Element element)
- {
- List<Line> lines = new List<Line>();
- Autodesk.Revit.DB.Options geomOption = element.Document.Application.Create.NewGeometryOptions();
- if (null != geomOption)
- {
- geomOption.View = element.Document.ActiveView;
- }
- GeometryElement geometryElement = element.get_Geometry(geomOption);
- foreach (GeometryInstance gi in geometryElement)
- {
- foreach (GeometryObject go in gi.GetInstanceGeometry())
- {
- Line l = go as Line;
- if (l != null)
- {
- lines.Add(l);
- }
- }
- }
- return lines;
- }
Этот код заработал для элементов типа Элементы узлов.
Для Типовых аннотаций не работает. Если найду решение, то сделаю продолжение.
Продолжение
Всё-таки нашёл решение с получением линий из семейства категории "Типовые аннотации". Как и обещал, пишу продолжение.
Google не помог, в руководстве пользователя тоже ничего не смог обнаружить.
На этот раз выручил сайт revitapisearch.com. Этот сайт - последний рубеж в моих изысканиях.
Если что-то совсем не выходит или нужно окончательно убедиться в том, что невозможно сделать через Revit API - захожу туда, нажимаю на кнопку "Members" и забиваю в поиске на страничке слова по смыслу.
Довольно-таки муторное занятие:
И далее F3, F3, F3 по всей простыне.
На 118-м найденном слове наткнулся на метод:
Ага, на этот раз охота оказалась удачной.
Строку из предыдущего сообщения
- GeometryElement geometryElement = element.get_Geometry(geomOption);
заменяю на
- FamilyInstance fi = (FamilyInstance)element;
- GeometryElement geometryElement = fi.GetOriginalGeometry(geomOption);
Код скомпилировался и даже сработал, но в итоге я получил какую-то козявку в базовой точке проекта:
Видимо OriginalGeometry - это описание геометрии внутри семейства.
В объекте типа FamilyInstance есть метод GetTransform().
Смотрю что есть интересного в линии:
Добавляю строчку с трансформацией линии:
- if (l != null)
- {
- l = (Line)l.CreateTransformed(fi.GetTransform());
- lines.Add(l);
- }
В итоге получаю список линий, с изменённым положением и отмасштабированных таким же образом, как и семейства аннотаций:
Удачи!
Спасибо Андрею за его поиски решения и за то, что поделился им с нами.
Обсуждение: http://adn-cis.org/forum/index.php?topic=3288
Опубликовано 18.12.2015Отредактировано 18.12.2015 в 16:16:01