Преобразование ссылок на геометрию объекта в связанных файлах
В Revit API 2014 появились дополнительные методы для работы со связанными файлами. Среди них:
- Reference.LinkedElementId
- Reference.CreateLinkReference
- Reference.CreateReferenceInLink
Эти методы нужны для преобразования ссылок на объекты, который находятся в связанном файле, на ссылки, которые находятся в текущей модели.
Поясним на примере. Предположим вам нужно вставить некий объект, который может располагаться только на поверхности. Требуемая поверхность находится в связанном файле. С помощью этих методов можно получить корректную ссылку на поверхность, преобразовав ее из ссылки на поверхность связанного файла, в ссылку на поверхность в текущем файле. Также можно преобразовать ссылку на объект в текущем файле, в ссылку на объект в связанном файле. Этот способ может пригодиться при использовании метода Element.GetGeometryObjectFromReference.
По использованию новой функциональности мы получаем довольно много вопросов. Вот один из них.
Вопрос: Не могли бы вы привести пример кода, как использовать метод Reference.CreateLinkReference(RvtLink) для того чтобы поместить семейство на поверхность, находящуюся в связанном файле?
Вопрос 2: С момента как в API появился метод CreateLinkReference я все пытался попробовать его применить, но, к сожалению, безуспешно. Документация по его использованию нет. Я был бы очень признателен, если бы вы на примере показали, как можно присоединить семейство на поверхность, находящуюся в связанном файле.
Ответ: Ниже приведен пример использования данного метода, который нам любезно предоставила команда разработчиков. Имейте ввиду, что в примере жестко заданы ссылки на идентификаторы элементов из определенной модели для тестирования, поэтому вполне очевидно, что вы должны адаптировать этот код под свои потребности.
- public void AddFaceBasedFamilyToLinks( Document doc )
- {
- ElementId alignedLinkId = new ElementId( 125929 );
- // получаем типоразмер
- ElementId symbolId = new ElementId( 126580 );
- FamilySymbol fs = doc.GetElement( symbolId )
- as FamilySymbol;
- // Выравниваем
- RevitLinkInstance linkInstance = doc.GetElement(
- alignedLinkId ) as RevitLinkInstance;
- Document linkDocument = linkInstance
- .GetLinkDocument();
- FilteredElementCollector wallCollector
- = new FilteredElementCollector( linkDocument );
- wallCollector.OfClass( typeof( Wall ) );
- Wall targetWall = wallCollector.FirstElement()
- as Wall;
- Reference exteriorFaceRef
- = HostObjectUtils.GetSideFaces(
- targetWall, ShellLayerType.Exterior )
- .First<Reference>();
- Reference linkToExteriorFaceRef
- = exteriorFaceRef.CreateLinkReference(
- linkInstance );
- Line wallLine = ( targetWall.Location
- as LocationCurve ).Curve as Line;
- XYZ wallVector = ( wallLine.GetEndPoint( 1 )
- - wallLine.GetEndPoint( 0 ) ).Normalize();
- using( Transaction t = new Transaction( doc ) )
- {
- t.Start( "Добавляем на поверхность" );
- doc.Create.NewFamilyInstance(
- linkToExteriorFaceRef, XYZ.Zero,
- wallVector, fs );
- t.Commit();
- }
- }
Источник: http://thebuildingcoder.typepad.com/blog/2014/07/createlinkreference-sample-code.html#2
Обсуждение: http://adn-cis.org/forum/index.php?topic=910
Опубликовано 13.08.2014