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

ADN Club => Revit API => Тема начата: enot от 20-08-2019, 17:24:54

Название: SetTargetElementIds в Link документе
Отправлено: enot от 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 таким образом ничего не находит , в чем может быть причина ? (луч по факту его пересекает)
Название: Re: SetTargetElementIds в Link документе
Отправлено: Александр Игнатович от 20-08-2019, 17:31:14
Смотрите. Когда Вы видите ElementId, значит речь всегда о текущем документе, либо Document в метод передается другим параметром.

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

А так, с SetTargetElementIds будет работать только в основном файле
Название: Re: SetTargetElementIds в Link документе
Отправлено: Александр Игнатович от 20-08-2019, 17:32:30
Да, ещё забыл. Чтобы в связанных искало, нужно свойство FindReferencesInRevitLinks поставить true.
Название: Re: SetTargetElementIds в Link документе
Отправлено: enot от 20-08-2019, 17:40:21
Смотрите. Когда Вы видите ElementId, значит речь всегда о текущем документе, либо Document в метод передается другим параметром.
Мда значит если есть список ElementId из связанного документа , то лучшим решением является:
подать ElementFilter (с категорией/классом этих элементов) в ReferenceIntersector и далее сравнивать полученные Id c исходным списком?
Название: Re: SetTargetElementIds в Link документе
Отправлено: Александр Игнатович от 20-08-2019, 17:44:15
В точку.

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

Точнее ещё лучше его скомбинировать с быстрым фильтром по классу/категории.
Название: Re: SetTargetElementIds в Link документе
Отправлено: enot от 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.                 };
Название: Re: SetTargetElementIds в Link документе
Отправлено: enot от 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.                 };
Название: Re: SetTargetElementIds в Link документе
Отправлено: Александр Игнатович от 20-08-2019, 18:19:19
Не, вряд ли. Насколько помню, при создании ElementParameterFilter с передачей нескольких FilterRule будет логическая операция "И", а Вам нужно "Или".

Создавайте список ElementParameterFilter, этот список передавайте в LogicalOrFilter
Название: Re: SetTargetElementIds в Link документе
Отправлено: enot от 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()), ....
Название: Re: SetTargetElementIds в Link документе
Отправлено: Александр Игнатович от 21-08-2019, 08:31:45
LogicalAndFilter(
   ElementCategoryFilter,
   LogicalOrFilter(
      ElementParameterFilter, ElementParameterFilter, ... ElementParameterFilter))