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

18/12/2015

Как получить линии из условного обозначения отверстия

Андрей Фазлеев поделился с нами своим решением. Далее с его слов.

На прошлой неделе Хасан Мамаев задал вопрос:

 Я пытаюсь получить геометрию нескольких экземпляров одного плоского семейства таким кодом:

i.GetInstanceGeometry()

но выдаёт ошибку: AttributeError: 'FamilyInstance' object has no attribute 'GetInstanceGeometry'

Объекты, из которых нужно вытянуть линии - условное отображение отверстий:

 

 Сегодня появилось время, пытаюсь разобраться.

Первым делом обращаюсь к документации.

Есть пример с извлечением геометрии из стены, но применить один в один не удалось.

После изысканий разработал такой код:

Код - C#: [Выделить]
  1.  
  2. private List<Line> GetLines(Element element)
  3. {
  4.  
  5.     List<Line> lines = new List<Line>();
  6.  
  7.     Autodesk.Revit.DB.Options geomOption = element.Document.Application.Create.NewGeometryOptions();
  8.  
  9.             if (null != geomOption)
  10.             {
  11.                 geomOption.View = element.Document.ActiveView;              
  12.             }
  13.  
  14.     GeometryElement geometryElement = element.get_Geometry(geomOption);
  15.  
  16.     foreach (GeometryInstance gi in geometryElement)
  17.     {
  18.         foreach (GeometryObject go in gi.GetInstanceGeometry())
  19.         {
  20.             Line l = go as Line;
  21.             if (l != null)
  22.             {
  23.                 lines.Add(l);
  24.             }
  25.         }
  26.     }
  27.  
  28.     return lines;
  29.  
  30. }
  31.  

Этот код заработал для элементов типа Элементы узлов.

Для Типовых аннотаций не работает. Если найду решение, то сделаю продолжение.

 

Продолжение

Всё-таки нашёл решение с получением линий из семейства категории "Типовые аннотации". Как и обещал, пишу продолжение.

Google не помог, в руководстве пользователя тоже ничего не смог обнаружить.

На этот раз выручил сайт revitapisearch.com. Этот сайт - последний рубеж в моих изысканиях.

Если что-то совсем не выходит или нужно окончательно убедиться в том, что невозможно сделать через Revit API - захожу туда, нажимаю на кнопку "Members" и забиваю в поиске на страничке слова по смыслу.

Довольно-таки муторное занятие:

 

И далее F3, F3, F3 по всей простыне.

На 118-м найденном слове наткнулся на метод:

 

Ага, на этот раз охота оказалась удачной.

Строку из предыдущего сообщения

Код - C#: [Выделить]
  1.  
  2. GeometryElement geometryElement = element.get_Geometry(geomOption);
  3.  

заменяю на

Код - C#: [Выделить]
  1.  
  2. FamilyInstance fi = (FamilyInstance)element;
  3. GeometryElement geometryElement = fi.GetOriginalGeometry(geomOption);
  4.  

Код скомпилировался и даже сработал, но в итоге я получил какую-то козявку в базовой точке проекта:

 

Видимо OriginalGeometry - это описание геометрии внутри семейства.

В объекте типа FamilyInstance есть метод GetTransform().

Смотрю что есть интересного в линии:

 

Добавляю строчку с трансформацией линии:

Код - C#: [Выделить]
  1.  
  2. if (l != null)
  3. {
  4.     l = (Line)l.CreateTransformed(fi.GetTransform());
  5.     lines.Add(l);
  6. }
  7.  

В итоге получаю список линий, с изменённым положением и отмасштабированных таким же образом, как и семейства аннотаций:

Удачи!

Спасибо Андрею за его поиски решения и за то, что поделился им с нами.

Обсуждение: http://adn-cis.org/forum/index.php?topic=3288

Опубликовано 18.12.2015
Отредактировано 18.12.2015 в 17:16:01