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

27/07/2016

Чтение иерархии связанных файлов

Для чтения иерархии нужно поиграться со методами GetParentId и GetChilds, чтобы построить иерархию. Также есть метод GetRootId, но он в данном случае он не используется.

Из документации мы можем понять, что GetParentId возвращает InvalidElementId для корневых элементов, таким образом первым шагом будет получение всех корневых связей. Затем, для каждого корневого узла, рекурсивно получим их дочерние связи.

Иерархическую связь проще всего показать в дереве TreeView, как показано ниже. Обратите внимание, что результат точно такой же, как и в диспетчере проектов Revit.

 

Код - C#: [Выделить]
  1. public Result Execute(
  2. ExternalCommandData commandData,
  3. ref string message,
  4. ElementSet elements)
  5. {
  6.   // Берем активный документ
  7.   Document mainDoc = commandData.Application.ActiveUIDocument.Document;
  8.  
  9.   // Подготавливаем отображение результатов
  10.   TreeNode mainNode = new TreeNode();
  11.   mainNode.Text = mainDoc.PathName;
  12.  
  13.   // Начинаем с корневых элементов, т.е. у которых нет родителя
  14.   FilteredElementCollector coll = new FilteredElementCollector(mainDoc);
  15.   coll.OfClass(typeof(RevitLinkInstance));
  16.   foreach (RevitLinkInstance inst in coll)
  17.   {
  18.     RevitLinkType type = mainDoc.GetElement(inst.GetTypeId()) as RevitLinkType;
  19.     if (type.GetParentId() == ElementId.InvalidElementId)
  20.     {
  21.       TreeNode parentNode = new TreeNode(inst.Name);
  22.       mainNode.Nodes.Add(parentNode);
  23.  
  24.       GetChilds(mainDoc, type.GetChildIds(), parentNode);
  25.     }
  26.   }
  27.  
  28.   // Покажем результат на форме
  29.   System.Windows.Forms.Form resultForm = new System.Windows.Forms.Form();
  30.   TreeView treeView = new TreeView();
  31.   treeView.Size = resultForm.Size;
  32.   treeView.Anchor |= AnchorStyles.Bottom | AnchorStyles.Top;
  33.   treeView.Nodes.Add(mainNode);
  34.   resultForm.Controls.Add(treeView);
  35.   resultForm.ShowDialog();
  36.  
  37.   return Result.Succeeded;
  38. }
  39.  
  40. private void GetChilds(Document mainDoc, ICollection<ElementId> ids,
  41.                         TreeNode parentNode)
  42. {
  43.   foreach (ElementId id in ids)
  44.   {
  45.     // Получаем дочерние элементы
  46.     RevitLinkType type = mainDoc.GetElement(id) as RevitLinkType;
  47.  
  48.     TreeNode subNode = new TreeNode(type.Name);
  49.     parentNode.Nodes.Add(subNode);
  50.  
  51.     // Идем на следующий уровень
  52.     GetChilds(mainDoc, type.GetChildIds(), subNode);
  53.   }
  54. }

Источник: http://adndevblog.typepad.com/aec/2015/12/reading-revit-links-hierarchy.html

Автор перевода: Виктор Чекалин

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

Опубликовано 27.07.2016
Отредактировано 28.07.2016 в 07:29:25