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

29/10/2013

Как получить все доступные стили линий

Я уже говорил о замечательной статье на блоге AEC DevBlog, в которой рассказывается о том как можно программно получить все стили линий с помощью метода CurveElement.GetLineStyleIds. Я отмечал, что можно создать временную кривую, вызвать у ней метод GetLineStyleIds в отдельной транзакции, а затем ее откатить.

Как оказалось, нет необходимости проделывать такую процедуру.  Следующий вопрос объясняет, как можно это сделать гораздо проще.

Вопрос: Мне необходимо получить все доступные в проекте стили линий.

 

Я немного поискал и нашел решение на блоге, у котором вы уже говорили. Но там используется метод, в котором требуется создавать дополнительную кривую, а затем ее удалять

Это выглядит довольно нелогично, в сравнении с похожими методами, когда нужно получить, скажем, материалы или линии штриховки.

Их можно легко получить с помощью такого кода:

Код - C#: [Выделить]
  1.  ElementCollectionHelper.GetAllProjectElements(doc)
  2.     .Where( c => c.GetType() == typeof(Material) )
  3.     .ToList());
  4.  
  5.   ElementCollectionHelper.GetAllProjectElements(doc)
  6.     .Where( c => c.GetType() == typeof(FillPatternElement) )
  7.     .ToList());

Поэтому мне кажется довольно странным, что для того, чтобы получить все стили линий, нужно создавать какую-то вспомогательную кривую.

Неужели нет способа попроще?

Ответ: Так как в Revit API нет такого элемента, как LineStyle, то нельзя получить стили линий с помощью класса FilteredElementCollector, как в вашем примере. Стили линий являются подкатегорией категории Линии.

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

Вот небольшой макрос, в котором перечисляются все подкатегории категории Линии.

Код - C#: [Выделить]
  1.  public void GetListOfLinestyles( Document doc )
  2.   {
  3.     Category c = doc.Settings.Categories.get_Item(
  4.       BuiltInCategory.OST_Lines );
  5.  
  6.     CategoryNameMap subcats = c.SubCategories;
  7.  
  8.     foreach( Category lineStyle in subcats )
  9.     {
  10.       TaskDialog.Show( "Line style", string.Format(
  11.         "Linestyle {0} id {1}", lineStyle.Name,
  12.         lineStyle.Id.ToString() ) );
  13.     }
  14.   }

Обратите внимание, что существуют такие стили линии, как «Граница комнаты», которую нельзя присвоить линии в интерфейсе 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