2015-12-17 4 views
1

Мы пытаемся получить список и иерархию всех связанных внешних файлов. В настоящий момент мы пропустили следующий код:Как получить список и иерархию связанных и подзаголовнных файлов Revit

FilteredElementCollector collectorI = new FilteredElementCollector(DocChild); 
IList<Element> elemsI = collectorI.OfCategory(BuiltInCategory.OST_RvtLinks).OfClass(typeof(RevitLinkInstance)).ToElements(); 

foreach (Element eI in elemsI) 
{ 
    if (eI is RevitLinkInstance) 
    { 
     RevitLinkInstance InstanceType = eI as RevitLinkInstance; 
     RevitLinkType type = DocChild.GetElement(InstanceType.GetTypeId()) as RevitLinkType; 
     TaskDialog.Show("Debug", "IsNestedLink=" + type.IsNestedLink.ToString() + " IsLinked=" + DocChild.IsLinked.ToString()); 

     if (!type.IsNestedLink) 
     { 
      TaskDialog.Show("Debug", "Children=" + InstanceType.GetLinkDocument().PathName.ToString()); 
     } 
    } 
} 

Нам удалось получить список всех связанных файлов, но нет иерархии. Мы не знаем, какой файл является дочерним элементом какого родителя.

Это структура Link мы пытаемся получить:

enter image description here

ответ

0

Вы должны играть с GetParentId и методами GetChilds читать иерархию. Вот код:

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); 
    } 
} 

И результат должен выглядеть следующим образом:

enter image description here

Оригинал source блог.

+0

Благодарим вас за отличный ответ. Это помогло лисице значительную часть моей проблемы, но у меня осталась еще одна проблема: как получить полное имя пути для всех экземпляров. В некоторых случаях один и тот же файл повторно используется два раза в иерархии ссылок Revit. С уважением, – Philippe

+0

, для этого вам потребуется имя PathName объекта Document из связанного файла. Он должен работать –

+0

Извините, но в RevitLinkType не удается получить доступ к имени только для имени пути. А в сборке AttachmentType всегда оверлей .. – Philippe

-2

Благодарим вас за отличный ответ. Это помогло лисице значительную часть моей проблемы, но у меня осталась еще одна проблема: как получить полное имя пути для всех экземпляров. В некоторых случаях один и тот же файл повторно используется два раза в иерархии ссылок Revit. С уважением

+0

Это новый вопрос, а не ответ. –