ParameterFilterRuleFactory null value

Автор Тема: ParameterFilterRuleFactory null value  (Прочитано 3323 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
ParameterFilterRuleFactory null value
« : 05-12-2019, 17:38:31 »
Как через ParameterFilterRuleFactory отфильтровать параметры со значением null

что то вроде:

Код - C# [Выбрать]
  1. ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.xxx), String.Empty, false);

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #1 : 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 - инвертируем его

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: ParameterFilterRuleFactory null value
« Ответ #2 : 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

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #3 : 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)

Его уже инвертировать не надо

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: ParameterFilterRuleFactory null value
« Ответ #4 : 05-12-2019, 18:20:31 »
но он тоже не находит элементы

Отмечено как Решение enot 05-12-2019, 18:42:19

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #5 : 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())

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



У тебя коллектор для текущего вида, на нём вообще есть такие элементы? Вообще в модели есть без изоляции?

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: ParameterFilterRuleFactory null value
« Ответ #6 : 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);
так как он ждет строку

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #7 : 05-12-2019, 18:31:23 »
см. выше. передавай пустую строку, работает так прекрасно

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: ParameterFilterRuleFactory null value
« Ответ #8 : 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()

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







Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #9 : 05-12-2019, 18:43:14 »
явно не в этом дело. Никогда так не пишу, чисто из эстетических соображений. Что-то где-то ещё поменял, явно. Ну да не суть, главное, работает

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: ParameterFilterRuleFactory null value
« Ответ #10 : 05-12-2019, 18:46:40 »
а для успокоения души. вы можете у себя проверить?
изначально была идея один коллектор использовать с несколькими фильтрами. не то что бы я много чего выиграю, но тем не менее

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: ParameterFilterRuleFactory null value
« Ответ #11 : 05-12-2019, 18:49:44 »
Поиск нового набора элементов = 1 новый коллектор.

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

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