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

13/08/2014

Преобразование ссылок на геометрию объекта в связанных файлах

В Revit API 2014 появились дополнительные методы для работы со связанными файлами. Среди них:

  • Reference.LinkedElementId
  • Reference.CreateLinkReference
  • Reference.CreateReferenceInLink

Эти методы нужны для преобразования ссылок на объекты, который находятся в связанном файле, на ссылки, которые находятся в текущей модели.

Поясним на примере. Предположим вам нужно вставить некий объект, который может располагаться только на поверхности. Требуемая поверхность находится в связанном файле. С помощью этих методов можно получить корректную ссылку на поверхность, преобразовав ее из ссылки на поверхность связанного файла, в ссылку на поверхность в текущем файле. Также можно преобразовать ссылку на объект в текущем файле, в ссылку на объект в связанном файле. Этот способ может пригодиться при использовании метода Element.GetGeometryObjectFromReference.

По использованию новой функциональности мы получаем довольно много вопросов. Вот один из них.

Вопрос: Не могли бы вы привести пример кода, как использовать метод Reference.CreateLinkReference(RvtLink) для того чтобы поместить семейство на поверхность, находящуюся в связанном файле?

Вопрос 2: С момента как в API появился метод CreateLinkReference я все пытался попробовать его применить, но, к сожалению, безуспешно. Документация по его использованию нет. Я был бы очень признателен, если бы вы на примере показали, как можно присоединить семейство на поверхность, находящуюся в связанном файле.

Ответ: Ниже приведен пример использования данного метода, который нам любезно предоставила команда разработчиков. Имейте ввиду, что в примере жестко заданы ссылки на идентификаторы элементов из определенной модели для тестирования, поэтому вполне очевидно, что вы должны адаптировать этот код под свои потребности.

 

Код - C#: [Выделить]
  1.   public void AddFaceBasedFamilyToLinks( Document doc )
  2.   {
  3.     ElementId alignedLinkId = new ElementId( 125929 );
  4.  
  5.     // получаем типоразмер
  6.  
  7.     ElementId symbolId = new ElementId( 126580 );
  8.  
  9.     FamilySymbol fs = doc.GetElement( symbolId )
  10.       as FamilySymbol;
  11.  
  12.     // Выравниваем
  13.  
  14.     RevitLinkInstance linkInstance = doc.GetElement(
  15.       alignedLinkId ) as RevitLinkInstance;
  16.  
  17.     Document linkDocument = linkInstance
  18.       .GetLinkDocument();
  19.  
  20.     FilteredElementCollector wallCollector
  21.       = new FilteredElementCollector( linkDocument );
  22.  
  23.     wallCollector.OfClass( typeof( Wall ) );
  24.  
  25.     Wall targetWall = wallCollector.FirstElement()
  26.       as Wall;
  27.  
  28.     Reference exteriorFaceRef
  29.       = HostObjectUtils.GetSideFaces(
  30.         targetWall, ShellLayerType.Exterior )
  31.           .First<Reference>();
  32.  
  33.     Reference linkToExteriorFaceRef
  34.       = exteriorFaceRef.CreateLinkReference(
  35.         linkInstance );
  36.  
  37.     Line wallLine = ( targetWall.Location
  38.       as LocationCurve ).Curve as Line;
  39.  
  40.     XYZ wallVector = ( wallLine.GetEndPoint( 1 )
  41.       - wallLine.GetEndPoint( 0 ) ).Normalize();
  42.  
  43.     using( Transaction t = new Transaction( doc ) )
  44.     {
  45.       t.Start( "Добавляем на поверхность" );
  46.  
  47.       doc.Create.NewFamilyInstance(
  48.         linkToExteriorFaceRef, XYZ.Zero,
  49.         wallVector, fs );
  50.  
  51.       t.Commit();
  52.     }
  53.   }

Источник: http://thebuildingcoder.typepad.com/blog/2014/07/createlinkreference-sample-code.html#2

Обсуждение: http://adn-cis.org/forum/index.php?topic=910

Опубликовано 13.08.2014