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

ADN Club => Revit API => Тема начата: enot от 19-02-2019, 15:22:28

Название: Referfence из связанного файла
Отправлено: enot от 19-02-2019, 15:22:28
Как получить Referfence из элемента связанного файла ?
В чем проблема:
Получаю элемент из связанного файла => пытаюсь получить Reference => вылетает ошибка


Так получаю элементы из связанного файла:

 
Код - C# [Выбрать]
  1.  var RVT_Links = new FilteredElementCollector(doc, doc.ActiveView.Id)
  2.                     .OfCategory(BuiltInCategory.OST_RvtLinks)
  3.                     .Cast<RevitLinkInstance>();
  4.  
  5.                     List<Document> linkDoc_lst = new List<Document>();
  6.                     foreach (RevitLinkInstance x in RVT_Links)
  7.                     {
  8.                         Document linkDoc = x.GetLinkDocument();
  9.                         linkDoc_lst.Add(linkDoc);
  10.                     }
  11.                     ICollection<ElementId> cat_icolls = new Collection<ElementId>();
  12.                     cat_icolls.Add(new ElementId(BuiltInCategory.OST_Floors));
  13.                     cat_icolls.Add(new ElementId(BuiltInCategory.OST_Walls));
  14.                     ElementMulticategoryFilter mcats_filter = new ElementMulticategoryFilter(cat_icolls);                
  15.  
  16.                     var linkDoc_els = linkDoc_lst.Select(x => new FilteredElementCollector(x).WherePasses(mcats_filter).WhereElementIsNotElementType().ToElements()).SelectMany(x => x);

ну а затем пытаюсь получить Reference из linkDoc_els => получаю ошибку.  (в текущем (не связанном) файле Reference этих элементов определяется)
Название: Re: Referfence из связанного файла
Отправлено: Александр Игнатович от 19-02-2019, 16:11:50
Какая ошибка возникает и при каком действии мы сами должны догадаться?

Вообще говоря, в отдельных случаях может потребоваться хак с ручным редактированием строки, полученной методом ConvertToStableRepresentation + Reference.ParseFromStableRepresentation
Название: Re: Referfence из связанного файла
Отправлено: enot от 19-02-2019, 16:44:13
Какая ошибка возникает и при каком действии

Когда получаю Reference :
 
Код - C# [Выбрать]
  1. ReferenceArray referenceArray = new ReferenceArray();
  2.   foreach (var link_elem in linkDoc_els)
  3.                 {                    
  4.                      if (link_elem.Category.Id == doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls).Id)
  5.                     {
  6.                         Wall wall = link_elem as Wall;
  7.                         foreach (var i in HostObjectUtils.GetSideFaces(wall, ShellLayerType.Exterior))
  8.                         {
  9.                             referenceArray.Append(i);
  10.                         }
  11.  
  12.                         foreach (var i in HostObjectUtils.GetSideFaces(wall, ShellLayerType.Interior))
  13.                         {
  14.                             referenceArray.Append(i);
  15.                         }
  16.                     }
  17.  
  18.                 }

И далее пытаюсь создать размер :

Код - C# [Выбрать]
  1.  doc.Create.NewDimension(doc.ActiveView, dimLine, referenceArray);
=> тут получаю ошибку:


(https://i.postimg.cc/dhHChskr/Error-Link-Reference.png) (https://postimg.cc/dhHChskr)
Название: Re: Referfence из связанного файла
Отправлено: Александр Игнатович от 19-02-2019, 17:01:08
Да, тут тот самый случай, когда необходим "хак".

Во-первых, Reference должен быть на объект в связанном файле. Для этого нужно вызвать:
Код - C# [Выбрать]
  1. var r = i.CreateLinkReference(revitLinkInstance);

Дальше смотрим результат метода r.ConvertToStableRepresentation(doc). Здесь doc - родительский документ (не linkInstace.GetLinkDocument()) Будет что-то вида:
Цитировать
eb437e5a-95f6-4f2f-8aaa-df56304627ab-00000990:RVTLINK/eb437e5a-95f6-4f2f-8aaa-df56304627ab-0000098f:2557:5:SURFACE

Теперь создадим размер руками и посмотрим RevitLookup-ом, что там у него будет в Reference-ах. Здесь будет что-то вроде:
Цитировать
eb437e5a-95f6-4f2f-8aaa-df56304627ab-00000990:0:RVTLINK:2557:5:SURFACE

Соответственно, меняем исходную строку - выкидываем лишнее. Дальше получаем Reference с помощью Reference.ParseFromStableRepresentation - опять же передаем родительский документ. И уже именно этот Reference добавляем в ReferenceArray.
Название: Re: Referfence из связанного файла
Отправлено: enot от 19-02-2019, 19:30:22
Александр Игнатович,
Работает!
Огромное спасибо!