Использование FilteredElementCollector для пользовательских параметров.

Автор Тема: Использование FilteredElementCollector для пользовательских параметров.  (Прочитано 5654 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Добрый день,

Пишу небольшую надстройку для себя.
Пытаюсь с помощью FilteredElementCollector получить все комнаты, у которых общий параметр, созданный мной, равен текстовому значению выбранной ранее комнаты (или хотя бы для начала количество комнат).
Если искать по системному параметру, то все ищет, а по моему параметру выдает нулевой список.

Вот кусок кода:
Код - C# [Выбрать]
  1.                        
  2.   Room tmpRoom = document.GetElement(eid) as Room;
  3.   Parameter areaParam = tmpRoom.get_Parameter(new Guid("11111111-0000-0000-0000-000000000001"));
  4.   ParameterValueProvider pvp = new ParameterValueProvider(areaParam.AsElementId());
  5.  
  6.          // evaluator
  7.   FilterStringRuleEvaluator fnrv = new FilterStringEquals();
  8.         // rule value
  9.   string ruleValue = areaParam.AsString();  
  10.         // rule
  11.   FilterRule fRule = new FilterStringRule(pvp, fnrv, ruleValue, true);
  12.                              
  13.   ElementParameterFilter filter = new ElementParameterFilter(fRule);
  14.   FilteredElementCollector collector = new FilteredElementCollector(document);
  15.   IList<Element> rooms = collector.WherePasses(filter).ToElements();
  16.  

Конечно можно это реализовать с помощью циклов. Но все-таки хотелось бы с помощью функционала Revit API.
Это возможно?
Спасибо.
« Последнее редактирование: 26-02-2015, 11:02:32 от Виктор Чекалин »

Отмечено как Решение Alexeysh 26-02-2015, 12:03:18

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Алексей, день добрый.

На вскидку, нужно всего лишь заменить areaParam.AsElementId() на areaParam.Id,

areaParam.AsElementId() - это значения параметра в случае, если в параметре самом хранится ElementId

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Alexeysh,
Я так подозреваю условие фильтра просто не выполняется, поэтому и ничего не возвращается.
Меня смущает вот это:
Код - C# [Выбрать]
  1.         // rule value
  2.   string ruleValue = areaParam.AsString();  

Чему равно значение ruleValue? Название параметра areaParam намекает на то, что тип параметра - Площадь. Соответственно тип данных этого параметра - Double. А это значит, что метод AsString() для этого параметра вернет null.

И Александр тоже верно подметил.

В целом - неверно создали условие. В итоге получили неверный результат.

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
На вскидку, нужно всего лишь заменить areaParam.AsElementId() на areaParam.Id,

areaParam.AsElementId() - это значения параметра в случае, если в параметре самом хранится ElementId
Спасибо большое, Александр и Виктор, за оперативный ответ. Я чувствовал, что не правильно ссылаюсь, но не понимал как.

P.S. А про areaParam - код делал на основе примера из руководства разработчика и не заменил название переменных.