Как получить идентификатор типа Фасада здания
Я уже рассуждал на тему как изменить тип Видового экрана и упоминал Стива Мычиника (Steve Mycynek) и его статью Использование Revit API для работы с видами и спецификациями (на англ.), в которое разъясняется все, что не обходимо знать при работе с видами.
Ниже я представлено важное улучшение при работе с видами, которое любезно предоставил Хакан Викемар (Håkan Wikemar) из компании AEC AB.
Вопрос: Я столкнулся с маленькой проблемкой пытаясь создать Фасад здания (View Section). При создании нужно обязательно указать тип:
Когда я пытаюсь найти идентификатор типа фасада здания, тип, который я ищу, отсутствует во всех проектах.
Я использовал метод GetElementByName из примера кода, который представлен в статье Стива.
Существующий в проекте тип не обязательно может называться «Фасад здания» (Bulding Section), как указано в статье Стива. Тип может называться, например, «Фасад 1», если я создал новый вид Фасад здания, и до этого в проекте не было ни одного фасада.
Возможно ли получить Тип фасада здания не по имени?
Как быть, если в файле проекта нет ни одного фасада?
Ниже представлен пример типов вида из существующего проекта, которые я получил с помощью RevitLookup:
И тоже самое, но для нового проекта.
Ответ: Как насчет того, чтобы просто перебрать все типы видов и выбрать первый попавшийся со свойством View.ViewType == ViewType.Section?
Отклик на ответ: Да, точно. Название вида может сильно меняться от проекта к проекту. Мне нужен более удобный и надежный способ определения идентификатора типа фасада. Я реализовал вот такой способ
- ElementId SectionId = GetViewTypeIdByViewType(
- ViewFamily.Section );
- ViewSection NyViewSectionR
- = ViewSection.CreateSection(
- doc.Document, SectionId, bbNewSectionR );
- ElementId GetViewTypeIdByViewType(
- ViewFamily viewFamily )
- {
- FilteredElementCollector fec
- = new FilteredElementCollector(
- m_app.ActiveUIDocument.Document );
- fec.OfClass( typeof( ViewFamilyType ) );
- foreach( ViewFamilyType e in fec )
- {
- System.Diagnostics.Debug.WriteLine( e.Name );
- if( e.ViewFamily == viewFamily )
- {
- return e.Id;
- }
- }
- return null;
- }
Если необходимо, то можно продолжать перебирать все типы и найти все подходящие типы. Затем дать пользователю выбрать, какой тип использовать.
Большое спасибо Хакану, за то что поделился с нами своим решением!
Источник: 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