using System; using System.Collections.Generic; using System.Linq; using Autodesk.Revit.DB; using KGdev.BI3D.Revit.Common; using KGdev.BI3D.Revit.Common.Models; namespace KGdev.BI3D.Revit.Implementations { internal class DefaultLinkedDocumentUtilities : ILinkedDocumentsUtilities { public Element GetElement(Document rootDocument, LinkedElementIdPath path) { Document document = rootDocument; Queue queue = new Queue(path.ElementIds); Element element = null; while (queue.Count > 0) { ElementId elementId = queue.Dequeue(); bool flag = queue.Count == 0; if (flag) { element = document.GetElement(elementId); } else { RevitLinkInstance revitLinkInstance = document.GetElement(elementId) as RevitLinkInstance; document = revitLinkInstance.GetLinkDocument(); } } return element; } public IList GetLinkedDocuments( Document rootDocument, Transform baseTransform, bool includeThis, List passedLinkInstanceIds ) { List list = new List(); if (includeThis) { list.Add( new LinkedDocumentInformation { Document = rootDocument, TransformToRoot = baseTransform, PassedLinkInstanceIds = passedLinkInstanceIds } ); } IEnumerable enumerable = new FilteredElementCollector(rootDocument) .OfCategory(BuiltInCategory.OST_RvtLinks) .OfClass(typeof(RevitLinkInstance)) .Cast(); foreach (RevitLinkInstance revitLinkInstance in enumerable) { bool flag = !revitLinkInstance.IsValidObject; if (!flag) { Document linkDocument = revitLinkInstance.GetLinkDocument(); bool flag2 = linkDocument == null || !linkDocument.IsValidObject; if (!flag2) { Transform transform = baseTransform.Multiply( revitLinkInstance.GetTransform() ); List list2 = new List(); list2.AddRange(passedLinkInstanceIds); list2.Add(revitLinkInstance.Id); IList linkedDocuments = this.GetLinkedDocuments( linkDocument, transform, true, list2 ); list.AddRange(linkedDocuments); } } } return list; } } }