/// <summary> /// Retrive family instance hosted in boundary elements /// This is the base function for Windows and Doors /// </summary> /// <param name="cat">The category of hosted elements</param> /// <returns></returns> private List <FamilyInstance> BoundaryFamilyInstance(DB.BuiltInCategory cat) { List <FamilyInstance> output = new List <FamilyInstance>(); //the document of the room DB.Document doc = InternalElement.Document; // DocumentManager.Instance.CurrentDBDocument; //Find boundary elements and their associated document List <DB.ElementId> boundaryElements = new List <DB.ElementId>(); List <DB.Document> boundaryDocuments = new List <DB.Document>(); foreach (DB.BoundarySegment segment in InternalBoundarySegments) { DB.Element boundaryElement = doc.GetElement(segment.ElementId); if (boundaryElement.GetType() == typeof(DB.RevitLinkInstance)) { DB.RevitLinkInstance linkInstance = boundaryElement as DB.RevitLinkInstance; boundaryDocuments.Add(linkInstance.GetLinkDocument()); boundaryElements.Add(segment.LinkElementId); } else { boundaryDocuments.Add(doc); boundaryElements.Add(segment.ElementId); } } // Create a category filter DB.ElementCategoryFilter filter = new DB.ElementCategoryFilter(cat); // Apply the filter to the elements in these documents, // Use shortcut WhereElementIsNotElementType() to find family instances in all boundary documents boundaryDocuments = boundaryDocuments.Distinct().ToList(); List <DB.FamilyInstance> familyInstances = new List <DB.FamilyInstance>(); foreach (DB.Document boundaryDocument in boundaryDocuments) { DB.FilteredElementCollector collector = new DB.FilteredElementCollector(boundaryDocument); familyInstances.AddRange(collector.WherePasses(filter).WhereElementIsNotElementType().ToElements().Cast <DB.FamilyInstance>().ToList()); } //Find all family instance hosted on a boundary element IEnumerable <DB.FamilyInstance> boundaryFamilyInstances = familyInstances.Where(s => boundaryElements.Contains(s.Host.Id)); //loop on these boundary family instance to find to and from room foreach (DB.FamilyInstance boundaryFamilyInstance in boundaryFamilyInstances) { DB.Phase familyInstancePhase = boundaryFamilyInstance.Document.GetElement(boundaryFamilyInstance.CreatedPhaseId) as DB.Phase; if (boundaryFamilyInstance.get_FromRoom(familyInstancePhase) != null) { if (boundaryFamilyInstance.get_FromRoom(familyInstancePhase).Id == InternalRoom.Id) { output.Add(ElementWrapper.ToDSType(boundaryFamilyInstance, true) as FamilyInstance); continue; } } if (boundaryFamilyInstance.get_ToRoom(familyInstancePhase) != null) { if (boundaryFamilyInstance.get_ToRoom(familyInstancePhase).Id == InternalRoom.Id) { output.Add(ElementWrapper.ToDSType(boundaryFamilyInstance, true) as FamilyInstance); } } } output = output.Distinct().ToList(); return(output); }