Два различных типа соединений элементов
В Revit очень много элементов имеют взаимосвязь друг с другом.
Мы уже ранее затрагивали пару раз тему работы с объединением элементов:
- AutoJoinElements
- Joined Beam Geometry Access
- Wall Joins and Geometry
- Перемещение соединений воздуховодов
В пользовательском интерфейсе Revit также присутствует подобная функциональность с соответствующим названием «Присоединить элементы геометрии».
В API же подобная функциональность достигается различными функциями и порой может ввести в ступор из-за некоторого несоответствия названия функции с ее действиями.
Недавний вопрос от одного из разработчика лишний раз доказывает мои слова. Ответ предоставил мой коллега Акира Кудо (Akira Kudo):
Вопрос: Я пытаюсь воспользоваться методом JoinGeometryUtils.GetJoinedElements, но пока у меня это не совсем получается.
Я передаю в качестве параметра элемент, к которому уже присоединен другой элемент, однако метод все равно возвращает пустую коллекцию.
Тем не менее, если я щелкаю правой кнопкой мыши на одном из элементов в интерфейсе и выбираю «Выбрать присоединенные элементы», то оба элемента выделяются.
Ответ: Метод GetJoinedElements возвращает только те элементы, у которых объединяется геометрия. Т.е. у которых геометрия одного элемента как бы врезается в геометрию другого элемента.
Посмотреть пример таких объектов можно во вложенном архиве с кодом и моделью JoinedElements1.zip. В коде реализована следующая команда:
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements )
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- Reference ref1 = uidoc.Selection.PickObject(
- ObjectType.Element, "Выберите элемент" );
- Element elem = doc.GetElement( ref1 );
- ICollection<ElementId> the_list_of_the_joined
- = JoinGeometryUtils.GetJoinedElements(
- doc, elem );
- System.Windows.Forms.MessageBox.Show(
- the_list_of_the_joined.Count.ToString() );
- uidoc.Selection.Elements.Clear();
- foreach( ElementId id in the_list_of_the_joined )
- {
- uidoc.Selection.Elements.Add(
- doc.GetElement( id ) );
- }
- return Result.Succeeded;
- }
Действия, выполняемые в этом методе, совершенно отличаются от тех, что вы делаете в интерфейсе, когда выбираете «Выбрать присоединенные элементы».
Подобная функциональность достигается с помощью другого метода: LocationCurve.get_ElementsAtJoin. Метод определяет какие элементы присоединены к одному из концов заданного элемента. Также метод позволяет изменить тип и порядок соединения.
Пример кода и демонстрационную модель можно найти в архиве JoinedElements2.zip. В проекте реализована команда:
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements )
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- Reference ref1 = uidoc.Selection.PickObject(
- ObjectType.Element, "Выберите элемент" );
- Element elem = doc.GetElement( ref1 );
- FamilyInstance fi = elem as FamilyInstance;
- LocationCurve lc = fi.Location as LocationCurve;
- uidoc.Selection.Elements.Clear();
- ElementArray startarray = lc
- .get_ElementsAtJoin( 0 ); // start
- foreach( Element elem1 in startarray )
- {
- uidoc.Selection.Elements.Add( elem1 );
- }
- ElementArray endarray = lc
- .get_ElementsAtJoin( 1 ); // end
- foreach( Element elem2 in endarray )
- {
- uidoc.Selection.Elements.Add( elem2 );
- }
- return Result.Succeeded;
- }
Так же рекомендую ознакомиться с проектом ProximityDetection_WallJoinControl из примеров Revit SDK. Проект находится в папке GeometryAPI.
Источник: http://thebuildingcoder.typepad.com/blog/2014/02/getting-two-different-kinds-of-joined-elements.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=531
Опубликовано 14.02.2014