Referfence из связанного файла

Автор Тема: Referfence из связанного файла  (Прочитано 2263 раз)

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

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Как получить 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 этих элементов определяется)
« Последнее редактирование: 19-02-2019, 15:58:40 от enot »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Referfence из связанного файла
« Ответ #1 : 19-02-2019, 16:11:50 »
Какая ошибка возникает и при каком действии мы сами должны догадаться?

Вообще говоря, в отдельных случаях может потребоваться хак с ручным редактированием строки, полученной методом ConvertToStableRepresentation + Reference.ParseFromStableRepresentation

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Referfence из связанного файла
« Ответ #2 : 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);
=> тут получаю ошибку:




Отмечено как Решение enot 19-02-2019, 19:28:09

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Referfence из связанного файла
« Ответ #3 : 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.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Referfence из связанного файла
« Ответ #4 : 19-02-2019, 19:30:22 »
Александр Игнатович,
Работает!
Огромное спасибо!