Revit二次开发-获取链接目录树
封装一个类 用来存储链接关系
internal class LinkTypeModel
{
public string Name { get; }
public ElementId Id { get; }
public List<LinkTypeModel> Children { get; set; } = new List<LinkTypeModel> { };
public LinkTypeModel Parent { get; set; }
public LinkTypeModel(string name, ElementId id)
{
Name = name;
Id = id;
}
}
获取链接关系
[Transaction(TransactionMode.Manual)]
public class LinkedInstanceTest : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var doc = commandData.Application.ActiveUIDocument.Document;
var linkTypes = new List<LinkTypeModel>();
using (var collector = new FilteredElementCollector(doc))
{
var linkedInstances = collector.OfClass(typeof(RevitLinkInstance)).OfCategory(BuiltInCategory.OST_RvtLinks).OfType<RevitLinkInstance>().ToList();
foreach (var instance in linkedInstances.ToList())
{
var linkedType = (RevitLinkType)doc.GetElement(instance.GetTypeId());
if (linkedType.GetLinkedFileStatus() == LinkedFileStatus.Loaded)
{
if (linkedType.GetParentId() == ElementId.InvalidElementId)
{
var linkModel = new LinkTypeModel(linkedType.Name, linkedType.Id);
GetChildren(doc, linkedType.GetChildIds(), linkModel);
linkedInstances.Remove(instance);
linkTypes.Add(linkModel);
}
}
}
}
return Result.Succeeded;
}
private void GetChildren(Document mainDoc, ICollection<ElementId> ids, LinkTypeModel parentNode)
{
foreach (var id in ids)
{
var type = mainDoc.GetElement(id) as RevitLinkType;
var child= new LinkTypeModel(type.Name, id);
child.Parent = parentNode;
parentNode.Children.Add(child);
GetChildren(mainDoc, type.GetChildIds(), child);
}
}
}