SetTargetElementIds в Link документе

Автор Тема: SetTargetElementIds в Link документе  (Прочитано 190 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 318
  • Карма: 2
SetTargetElementIds в Link документе
« : 20-08-2019, 17:24:54 »
ElementId(2522362) - элемент в связанном файле

           
Код - C# [Выбрать]
  1.   var referenceIntersector = new ReferenceIntersector(new[] {new ElementId(2522362) } , FindReferenceTarget.Element, view3D);            
  2.  
  3.             referenceIntersector.FindReferencesInRevitLinks = true;

ReferenceIntersector таким образом ничего не находит , в чем может быть причина ? (луч по факту его пересекает)

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

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 207
  • Skype: alexandr.ignatovich.itc
Re: SetTargetElementIds в Link документе
« Ответ #1 : 20-08-2019, 17:31:14 »
Смотрите. Когда Вы видите ElementId, значит речь всегда о текущем документе, либо Document в метод передается другим параметром.

Ещё заметка - вообще, при работе с ReferenceIntersector-ом лучше самому создать вид с нужной детализацией, наложенными фильтрами и т.д., т.е., если Вы ищите, например, стены, создайте вид, задайте видимость категорий и рабочих наборов и т.д. и уже его передавайте в ReferenceIntersector.

А так, с SetTargetElementIds будет работать только в основном файле

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

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 207
  • Skype: alexandr.ignatovich.itc
Re: SetTargetElementIds в Link документе
« Ответ #2 : 20-08-2019, 17:32:30 »
Да, ещё забыл. Чтобы в связанных искало, нужно свойство FindReferencesInRevitLinks поставить true.

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

  • ADN OPEN
  • ****
  • Сообщений: 318
  • Карма: 2
Re: SetTargetElementIds в Link документе
« Ответ #3 : 20-08-2019, 17:40:21 »
Смотрите. Когда Вы видите ElementId, значит речь всегда о текущем документе, либо Document в метод передается другим параметром.
Мда значит если есть список ElementId из связанного документа , то лучшим решением является:
подать ElementFilter (с категорией/классом этих элементов) в ReferenceIntersector и далее сравнивать полученные Id c исходным списком?

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

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 207
  • Skype: alexandr.ignatovich.itc
Re: SetTargetElementIds в Link документе
« Ответ #4 : 20-08-2019, 17:44:15 »
В точку.

Можно вообще попробовать фильтр передать:
Код - C# [Выбрать]
  1. var filter = new ElementParameterFilter(ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ID_PARAM), new ElementId(<ваш id>)));

Точнее ещё лучше его скомбинировать с быстрым фильтром по классу/категории.

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

  • ADN OPEN
  • ****
  • Сообщений: 318
  • Карма: 2
Re: SetTargetElementIds в Link документе
« Ответ #5 : 20-08-2019, 17:57:14 »
О !, интересно...
только не могу сообразить как правильно подать большой список List<ElementIds>ListIds  через ElementParameterFilter(ParameterFilterRuleFactory.CreateEqualsRule....  в elementFilter ...

Код - C# [Выбрать]
  1.  ElementFilter[] elementFilter = new ElementFilter[]
  2.                 {
  3.  
  4.                     new ElementClassFilter(typeof(Wall)),
  5.                     new ElementIsElementTypeFilter(true),

Тут как то надо добавить List<ElementIds>ListIds списком :

Код - C# [Выбрать]
  1.                     new ElementParameterFilter(ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ID_PARAM), new ElementId(xxx))),
  2.  
  3.                 };

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

  • ADN OPEN
  • ****
  • Сообщений: 318
  • Карма: 2
Re: SetTargetElementIds в Link документе
« Ответ #6 : 20-08-2019, 18:09:52 »
Вроде так..

 
Код - C# [Выбрать]
  1. IList<FilterRule> filterRules = new List<FilterRule>();
  2.  
  3.                 foreach (var x in ListIds)
  4.                 {
  5.                     filterRules.Add(ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ID_PARAM), x)) ;
  6.                 }                              
  7.  
  8.  
  9.                  ElementFilter[] elementFilter = new ElementFilter[]
  10.                 {
  11.  
  12.                     new ElementClassFilter(typeof(Wall)),
  13.                     new ElementIsElementTypeFilter(true),
  14.                     new ElementParameterFilter(filterRules),
  15.  
  16.                 };

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

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 207
  • Skype: alexandr.ignatovich.itc
Re: SetTargetElementIds в Link документе
« Ответ #7 : 20-08-2019, 18:19:19 »
Не, вряд ли. Насколько помню, при создании ElementParameterFilter с передачей нескольких FilterRule будет логическая операция "И", а Вам нужно "Или".

Создавайте список ElementParameterFilter, этот список передавайте в LogicalOrFilter

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

  • ADN OPEN
  • ****
  • Сообщений: 318
  • Карма: 2
Re: SetTargetElementIds в Link документе
« Ответ #8 : 20-08-2019, 18:36:48 »
тогда отфильтровать список ElementId дополнительно по категории элементов как то пока не получается (значит, это должно долго работать)... только через значения параметров ?

Код - C# [Выбрать]
  1.   IList<ElementParameterFilter> filterRules = new List<ElementParameterFilter>();
  2.                 foreach (var x in ElsIds)
  3.                 {
  4.                     filterRules.Add(new ElementParameterFilter(ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ID_PARAM), x)));
  5.                 }    
  6. ...
  7. new ReferenceIntersector(new LogicalOrFilter(filterRules.ToArray()), ....

Отмечено как Решение enot 21-08-2019, 09:45:25

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

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 207
  • Skype: alexandr.ignatovich.itc
Re: SetTargetElementIds в Link документе
« Ответ #9 : 21-08-2019, 08:31:45 »
LogicalAndFilter(
   ElementCategoryFilter,
   LogicalOrFilter(
      ElementParameterFilter, ElementParameterFilter, ... ElementParameterFilter))