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

ADN Club => Revit API => Тема начата: enot от 05-12-2019, 17:38:31

Название: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 17:38:31
Как через ParameterFilterRuleFactory отфильтровать параметры со значением null

что то вроде:

Код - C# [Выбрать]
  1. ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.xxx), String.Empty, false);
Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 17:56:56
Можно.

Вообще говоря, логичным результатам было бы написать как-то так:
Код - C# [Выбрать]
  1. rule = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_IMAGE), ElementId.InvalidElementId)

Но так не работает :D

Вот так рабочий вариант:
Код - C# [Выбрать]
  1. var rule = ParameterFilterRuleFactory.CreateGreaterOrEqualRule(new ElementId(BuiltInParameter.ALL_MODEL_IMAGE), ElementId.InvalidElementId);
  2. var filter = new ElementParameterFilter(rule, true);
  3.  

Обрати внимание на 2 параметр конструктора ElementParameterFilter - инвертируем его
Название: Re: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 18:10:18
Что то у меня не получается....


Код - C# [Выбрать]
  1.   public ElementFilter GetFilter()
  2.         {
  3.    
  4.             var rule = ParameterFilterRuleFactory.CreateGreaterOrEqualRule(new ElementId(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE), ElementId.InvalidElementId);
  5.                                                                  
  6.             return  new ElementParameterFilter(rule, true);  
  7.         }
  8.  
  9.  
  10.             var collector =
  11.                 new FilteredElementCollector(doc, doc.ActiveView.Id)
  12.                 .OfCategory(BuiltInCategory.OST_DuctCurves)
  13.                 .WhereElementIsNotElementType();
  14.  
  15.             var elements = collector.WherePasses(GetFilter())

В итоге количество elements=0
Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 18:18:25
Так это потомучто у параметра BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE тип текстовый, код выше для параметров с типом ElementId.

Для этого параметра твой изначальный вариант - самое оно:
Код - C# [Выбрать]
  1. ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE), string.Empty, false)

Его уже инвертировать не надо
Название: Re: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 18:20:31
но он тоже не находит элементы
Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 18:27:41
Вообще должен.

По-быстрому проверил в Iron Python (взял только для труб, под рукой проект был):
Код - Python [Выбрать]
  1. rule = ParameterFilterRuleFactory.CreateEqualsRule(ElementId(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE), "", False)
  2.  
  3. filter = LogicalAndFilter(ElementCategoryFilter(BuiltInCategory.OST_PipeCurves), ElementParameterFilter(rule))
  4.  
  5. lookup(FilteredElementCollector(doc).WherePasses(filter).WhereElementIsNotElementType().ToElements())

Работает как часы

(https://i.postimg.cc/LJckBCcp/pipes.png) (https://postimg.cc/LJckBCcp)

У тебя коллектор для текущего вида, на нём вообще есть такие элементы? Вообще в модели есть без изоляции?
Название: Re: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 18:28:41
Если напрямую считать значение одного элемента

var value =element.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE).AsString();

то value будет null

но мы не можем:
Код - C# [Выбрать]
  1. ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE), null, false);
так как он ждет строку
Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 18:31:23
см. выше. передавай пустую строку, работает так прекрасно
Название: Re: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 18:40:31
в чем была ошибка:

Код - C# [Выбрать]
  1.   var collector =
  2.                 new FilteredElementCollector(doc, doc.ActiveView.Id);
  3.   var elems=
  4.                 collector
  5.                 .WherePasses(filter)
  6.                 .WhereElementIsNotElementType()
  7.  
Нужно сразу использовать коллектор
Код - C# [Выбрать]
  1. var elems=
  2.                 new FilteredElementCollector(doc, doc.ActiveView.Id)
  3.                 .WherePasses(filter)
  4.                 .WhereElementIsNotElementType()

Не знаю почему






Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 18:43:14
явно не в этом дело. Никогда так не пишу, чисто из эстетических соображений. Что-то где-то ещё поменял, явно. Ну да не суть, главное, работает
Название: Re: ParameterFilterRuleFactory null value
Отправлено: enot от 05-12-2019, 18:46:40
а для успокоения души. вы можете у себя проверить?
изначально была идея один коллектор использовать с несколькими фильтрами. не то что бы я много чего выиграю, но тем не менее
Название: Re: ParameterFilterRuleFactory null value
Отправлено: Александр Игнатович от 05-12-2019, 18:49:44
Поиск нового набора элементов = 1 новый коллектор.

Фильтры можно складывать, те самые короткие методы аля OfClass, OfCategory так и делают. Мне, правда, больше нравится (опять же по эстетическим, в основном, но не только, причинам) собирать в один фильтр используя логические фильтры LogicalOr / LogicalAnd

А так у меня всё равботает.