Reading Revit Links hierarchy

By Augusto Goncalves (@augustomaia)

Basically we need to play with GetParentId and GetChilds methods to understand the hierarchy of the linked files. There is also a GetRootId method, but we’re not using here.

From the documentation, we can see that GetParentId results InvalidElementId for root elements, so we do a first run through to find all root elements. Then, for each get again and recursively get the childs again.

It’s not easy to show a hierarchical result, so let’s create a TreeView, as shown below. Note the result is similar to Revit UI. Cool!

Code results vs. Revit UI

 

public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elements){  // get active document  Document mainDoc = commandData.Application.ActiveUIDocument.Document;   // prepare to show the results...  TreeNode mainNode = new TreeNode();  mainNode.Text = mainDoc.PathName;   // start by the root links (no parent node)  FilteredElementCollector coll = new FilteredElementCollector(mainDoc);  coll.OfClass(typeof(RevitLinkInstance));  foreach (RevitLinkInstance inst in coll)  {    RevitLinkType type = mainDoc.GetElement(inst.GetTypeId()) as RevitLinkType;    if (type.GetParentId() == ElementId.InvalidElementId)    {      TreeNode parentNode = new TreeNode(inst.Name);      mainNode.Nodes.Add(parentNode);       GetChilds(mainDoc, type.GetChildIds(), parentNode);    }  }   // show the results in a form  System.Windows.Forms.Form resultForm = new System.Windows.Forms.Form();  TreeView treeView = new TreeView();  treeView.Size = resultForm.Size;  treeView.Anchor |= AnchorStyles.Bottom | AnchorStyles.Top;  treeView.Nodes.Add(mainNode);  resultForm.Controls.Add(treeView);  resultForm.ShowDialog();   return Result.Succeeded;} private void GetChilds(Document mainDoc, ICollection<ElementId> ids,                        TreeNode parentNode){  foreach (ElementId id in ids)  {    // get the child information    RevitLinkType type = mainDoc.GetElement(id) as RevitLinkType;     TreeNode subNode = new TreeNode(type.Name);    parentNode.Nodes.Add(subNode);     // then go to the next level    GetChilds(mainDoc, type.GetChildIds(), subNode);  }}

Comments

One response to “Reading Revit Links hierarchy”

  1. I’d like to thank the author for writing such an insightful and informative blog post about revit hierarchy that is not just useful to the readers but also revealing.

Leave a Reply to Technostruct LLCCancel reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading