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

21/08/2013

Как получить идентификатор типа Фасада здания

Я уже рассуждал на тему как изменить тип Видового экрана и упоминал Стива Мычиника (Steve Mycynek) и его статью Использование Revit API для работы с видами и спецификациями (на англ.), в которое разъясняется все, что не обходимо знать при работе с видами.

 

Ниже я представлено важное улучшение при работе с видами, которое любезно предоставил Хакан Викемар (Håkan Wikemar) из компании AEC AB.  

Вопрос: Я столкнулся  с маленькой проблемкой пытаясь создать Фасад здания (View Section). При создании нужно обязательно указать тип: 

NyViewSectionB = ViewSection.CreateSection(doc.Document, SectionId, bbNewSectionF );

Когда я пытаюсь найти идентификатор типа фасада здания, тип, который я ищу, отсутствует во всех проектах.

Я использовал метод GetElementByName из примера кода, который представлен в статье Стива.

Существующий в проекте тип не обязательно может называться «Фасад здания» (Bulding Section), как указано в статье Стива. Тип может называться, например, «Фасад 1», если я создал новый вид Фасад здания, и до этого в проекте не было ни одного фасада.

Возможно ли получить Тип фасада здания не по имени?

Как быть, если в файле проекта нет ни одного фасада?

Ниже представлен пример типов вида из существующего проекта, которые я получил с помощью RevitLookup:

 

И тоже самое, но для нового проекта.

 

Ответ: Как насчет того, чтобы просто перебрать все типы видов и выбрать первый попавшийся со свойством View.ViewType == ViewType.Section?

Отклик на ответ: Да, точно. Название вида может сильно меняться от проекта к проекту. Мне нужен более удобный и надежный способ определения идентификатора типа фасада. Я реализовал вот такой способ

Код - C#: [Выделить]
  1.   ElementId SectionId = GetViewTypeIdByViewType(
  2.     ViewFamily.Section );
  3.  
  4.   ViewSection NyViewSectionR
  5.     = ViewSection.CreateSection(
  6.       doc.Document, SectionId, bbNewSectionR );
  7.  
  8.   ElementId GetViewTypeIdByViewType(
  9.     ViewFamily viewFamily )
  10.   {
  11.     FilteredElementCollector fec
  12.       = new FilteredElementCollector(
  13.         m_app.ActiveUIDocument.Document );
  14.  
  15.     fec.OfClass( typeof( ViewFamilyType ) );
  16.  
  17.     foreach( ViewFamilyType e in fec )
  18.     {
  19.       System.Diagnostics.Debug.WriteLine( e.Name );
  20.  
  21.       if( e.ViewFamily == viewFamily )
  22.       {
  23.         return e.Id;
  24.       }
  25.     }
  26.     return null;
  27.   }

Если необходимо, то можно продолжать перебирать все типы и найти все подходящие типы. Затем дать пользователю выбрать, какой тип использовать.

 

Большое спасибо Хакану, за то что поделился с нами своим решением!

 

Источник: http://thebuildingcoder.typepad.com/blog/2013/08/language-independent-view-type-id-retrieval.html

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

Опубликовано 21.08.2013
Отредактировано 21.08.2013 в 22:15:41