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

14/02/2014

Два различных типа соединений элементов

В Revit очень много элементов имеют взаимосвязь друг с другом.

Мы уже ранее затрагивали пару раз тему работы с объединением элементов:

В пользовательском интерфейсе Revit также присутствует подобная функциональность с соответствующим названием «Присоединить элементы геометрии».

 

В API же подобная функциональность достигается различными функциями и порой может ввести в ступор из-за некоторого несоответствия названия функции с ее действиями.

Недавний вопрос от одного из разработчика лишний раз доказывает мои слова. Ответ предоставил мой коллега Акира Кудо (Akira Kudo):

Вопрос: Я пытаюсь воспользоваться методом JoinGeometryUtils.GetJoinedElements, но пока у меня это не совсем получается.

Я передаю в качестве параметра элемент, к которому уже присоединен другой элемент, однако метод все равно возвращает пустую коллекцию.

Тем не менее, если я щелкаю правой кнопкой мыши на одном из элементов в интерфейсе и выбираю «Выбрать присоединенные элементы», то оба элемента выделяются.

Ответ: Метод GetJoinedElements возвращает только те элементы, у которых объединяется геометрия. Т.е. у которых геометрия одного элемента как бы врезается в геометрию другого элемента.

Посмотреть пример таких объектов можно во вложенном архиве с кодом и моделью JoinedElements1.zip. В коде реализована следующая команда:

Код - C#: [Выделить]
  1.   public Result Execute(
  2.     ExternalCommandData commandData,
  3.     ref string message,
  4.     ElementSet elements )
  5.   {
  6.     UIApplication uiapp = commandData.Application;
  7.     UIDocument uidoc = uiapp.ActiveUIDocument;
  8.     Document doc = uidoc.Document;
  9.  
  10.     Reference ref1 = uidoc.Selection.PickObject(
  11.       ObjectType.Element, "Выберите элемент" );
  12.  
  13.     Element elem = doc.GetElement( ref1 );
  14.  
  15.     ICollection<ElementId> the_list_of_the_joined
  16.       = JoinGeometryUtils.GetJoinedElements(
  17.         doc, elem );
  18.  
  19.     System.Windows.Forms.MessageBox.Show(
  20.       the_list_of_the_joined.Count.ToString() );
  21.  
  22.     uidoc.Selection.Elements.Clear();
  23.  
  24.     foreach( ElementId id in the_list_of_the_joined )
  25.     {
  26.       uidoc.Selection.Elements.Add(
  27.         doc.GetElement( id ) );
  28.     }
  29.     return Result.Succeeded;
  30.   }

Действия, выполняемые в этом методе, совершенно отличаются от тех, что вы делаете в интерфейсе, когда выбираете «Выбрать присоединенные элементы».

Подобная функциональность достигается с помощью другого метода: LocationCurve.get_ElementsAtJoin. Метод определяет какие элементы присоединены к одному из концов заданного элемента. Также метод позволяет изменить тип и порядок соединения.

Пример кода и демонстрационную модель можно найти в архиве JoinedElements2.zip. В проекте реализована команда:

Код - C#: [Выделить]
  1.   public Result Execute(
  2.     ExternalCommandData commandData,
  3.     ref string message,
  4.     ElementSet elements )
  5.   {
  6.     UIApplication uiapp = commandData.Application;
  7.     UIDocument uidoc = uiapp.ActiveUIDocument;
  8.     Document doc = uidoc.Document;
  9.  
  10.     Reference ref1 = uidoc.Selection.PickObject(
  11.       ObjectType.Element, "Выберите элемент" );
  12.  
  13.     Element elem = doc.GetElement( ref1 );
  14.     FamilyInstance fi = elem as FamilyInstance;
  15.     LocationCurve lc = fi.Location as LocationCurve;
  16.  
  17.     uidoc.Selection.Elements.Clear();
  18.     ElementArray startarray = lc
  19.       .get_ElementsAtJoin( 0 ); // start
  20.  
  21.     foreach( Element elem1 in startarray )
  22.     {
  23.       uidoc.Selection.Elements.Add( elem1 );
  24.     }
  25.  
  26.     ElementArray endarray = lc
  27.       .get_ElementsAtJoin( 1 ); // end
  28.  
  29.     foreach( Element elem2 in endarray )
  30.     {
  31.       uidoc.Selection.Elements.Add( elem2 );
  32.     }
  33.     return Result.Succeeded;
  34.   }

Так же рекомендую ознакомиться с проектом 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