Как получить все доступные стили линий
Я уже говорил о замечательной статье на блоге AEC DevBlog, в которой рассказывается о том как можно программно получить все стили линий с помощью метода CurveElement.GetLineStyleIds. Я отмечал, что можно создать временную кривую, вызвать у ней метод GetLineStyleIds в отдельной транзакции, а затем ее откатить.
Как оказалось, нет необходимости проделывать такую процедуру. Следующий вопрос объясняет, как можно это сделать гораздо проще.
Вопрос: Мне необходимо получить все доступные в проекте стили линий.
Я немного поискал и нашел решение на блоге, у котором вы уже говорили. Но там используется метод, в котором требуется создавать дополнительную кривую, а затем ее удалять
Это выглядит довольно нелогично, в сравнении с похожими методами, когда нужно получить, скажем, материалы или линии штриховки.
Их можно легко получить с помощью такого кода:
- ElementCollectionHelper.GetAllProjectElements(doc)
- .Where( c => c.GetType() == typeof(Material) )
- .ToList());
- ElementCollectionHelper.GetAllProjectElements(doc)
- .Where( c => c.GetType() == typeof(FillPatternElement) )
- .ToList());
Поэтому мне кажется довольно странным, что для того, чтобы получить все стили линий, нужно создавать какую-то вспомогательную кривую.
Неужели нет способа попроще?
Ответ: Так как в Revit API нет такого элемента, как LineStyle, то нельзя получить стили линий с помощью класса FilteredElementCollector, как в вашем примере. Стили линий являются подкатегорией категории Линии.
Тем не менее, все же есть способ получить стили линий без создания вспомогательной кривой.
Вот небольшой макрос, в котором перечисляются все подкатегории категории Линии.
- public void GetListOfLinestyles( Document doc )
- {
- Category c = doc.Settings.Categories.get_Item(
- BuiltInCategory.OST_Lines );
- CategoryNameMap subcats = c.SubCategories;
- foreach( Category lineStyle in subcats )
- {
- TaskDialog.Show( "Line style", string.Format(
- "Linestyle {0} id {1}", lineStyle.Name,
- lineStyle.Id.ToString() ) );
- }
- }
Обратите внимание, что существуют такие стили линии, как «Граница комнаты», которую нельзя присвоить линии в интерфейсе Revit.
После того, как вы получили список всех стилей линий, вы уже можете создать FilteredElementCollector, с помощью которого извлечь все типы элементов, имеющих отношение к любому из стилей.
Источник: http://thebuildingcoder.typepad.com/blog/2013/08/retrieving-all-available-line-styles.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=292
Опубликовано 29.10.2013