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

31/07/2018

Об использовании FilterCategoryRule

Вопрос: у меня есть 3 вопроса относительно использования класса FilterCategoryRule

1) Как он соотносится с пользовательским интерфейсом Revit?

2) Если он представляет собой фильтр по категориям, как он соотносится с перечнем категорий, передаваемых в метод ParameterFilterElement.Create?

3) Как мне создать фильтр с этим правилом? Я пробовал в 2017 и 2018 версиях Revit и получал ошибку "An internal error has occurred". В справке сказано, что FilterCategoryRule это правило фильтра, по которому отбираются элементы заданного множества категорий.

Ответ: Класс FilterCategoryRule может быть использован в описании ParameterFilterElement. Он представляет собой правило, которому соответствуют элементы из множества категорий. Метод ParameterFilterElement.AllCategoriesFilterable() был заменен на FilterCategoryRule.AllCategoriesFilterable().

Ответы команды разработчиков:

1) Как он соотносится с пользовательским интерфейсом Revit?

Прямой связи между UI нет, этот FilterRule используется только в API

2) Если он представляет собой фильтр по категориям, как он соотносится с перечнем категорий, передаваемых в метод ParameterFilterElement.Create?

Такая связь также отсутствует

3) Как мне создать фильтр с этим правилом?

Создать ParameterFilterElement, основанный на FilterCategoryRule нельзя, но можно создать ElementParameterFilter, передав FilterCategoryRule в конструктор

Вот пример кода:

Код - C#: [Выделить]
  1.  
  2. // Найти все стены и окна в документе
  3. IList<ElementId> cats = new List<ElementId>();
  4. cats.Add(new ElementId(BuiltInCategory.OST_Walls));
  5. cats.Add(new ElementId(BuiltInCategory.OST_Windows));
  6. FilterCategoryRule r = new FilterCategoryRule(cats);
  7.  
  8. ElementParameterFilter f = new ElementParameterFilter(r, true);
  9.  
  10. FilteredElementCollector wallsAndWindows = new FilteredElementCollector(doc).WherePasses(f);
  11.  

 

Справка по Revit API не совсем верная, особенно предложение "The new class FilterCategoryRule can be used in the definition of a ParameterFilterElement" (Новый класс FilterCategoryRule может быть использован в определении ParameterFilterElement). Потенциально метод ParameterFilterElement.Create может принимать параметром объект FilterCategoryRule вместо множества Id категорий, но такой метод так и не был добавлен. Мы поставили задачу команде разработки исправить справку или добавить метод. Ну и в дополнении в Revit API несколько неоднозначно названы классы ParameterFilterElement and ElementParameterFilter   :-~

Как заметил Benoit FilterCategoryRule можно заменить Extension-методом ElementCategoryFilter с помощью методов OfCategory и OfCategoryId.

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

Примечание переводчика: я считаю, что в таких случаях разумнее использовать ElementMulticategoryFilter

Источник: http://thebuildingcoder.typepad.com/blog/2018/05/how-to-use-filtercategoryrule.html

 

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

Опубликовано 31.07.2018