Created
October 23, 2019 15:22
-
-
Save mitevpi/90ce61cfeeafbcf0d17cc1485024b46a to your computer and use it in GitHub Desktop.
Revit API Collect All Visible Elements
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System.Linq; | |
using Autodesk.Revit.ApplicationServices; | |
using Autodesk.Revit.DB; | |
using Autodesk.Revit.UI; | |
namespace ObjExport | |
{ | |
internal class ElementCollect | |
{ | |
private readonly UIDocument _uiDocument; | |
private readonly Application _app; | |
private readonly Document _parentDocument; | |
private readonly View _activeView; | |
/// <summary> | |
/// A class for collecting elements from parent and linked models. | |
/// </summary> | |
/// <param name="uidoc">The UIDocument instance to operate within.</param> | |
internal ElementCollect(UIDocument uidoc) | |
{ | |
_uiDocument = uidoc; | |
_app = uidoc.Application.Application; | |
_parentDocument = uidoc.Document; | |
_activeView = _parentDocument.ActiveView; | |
} | |
public List<Element> GetVisibleElements() | |
{ | |
VisibleElementContext context = new VisibleElementContext(_parentDocument); | |
CustomExporter exp = new CustomExporter(_parentDocument, context); | |
List<ElementId> views = new List<ElementId> | |
{ | |
_activeView.Id | |
}; | |
exp.Export(views); | |
return context.Elements; | |
} | |
} | |
internal class VisibleElementContext : IExportContext | |
{ | |
public Document ParentDocument; | |
public Document CurrentDocument; | |
public List<Document> Documents; | |
public List<Element> Elements; | |
public List<ElementId> ElementIds; | |
internal VisibleElementContext(Document doc) | |
{ | |
ParentDocument = doc; | |
CurrentDocument = doc; | |
Documents = new List<Document> {doc}; | |
Elements = new List<Element>(); | |
ElementIds = new List<ElementId>(); | |
} | |
public bool Start() | |
{ | |
return true; | |
} | |
public void Finish() | |
{ | |
} | |
public bool IsCanceled() | |
{ | |
return false; | |
} | |
public RenderNodeAction OnViewBegin(ViewNode node) | |
{ | |
return RenderNodeAction.Proceed; | |
} | |
public void OnViewEnd(ElementId elementId) | |
{ | |
} | |
public RenderNodeAction OnElementBegin(ElementId elementId) | |
{ | |
ElementIds.Add(elementId); | |
Element elem = CurrentDocument.GetElement(elementId); | |
Elements.Add(elem); | |
return RenderNodeAction.Proceed; | |
} | |
public void OnElementEnd(ElementId elementId) | |
{ | |
} | |
public RenderNodeAction OnInstanceBegin(InstanceNode node) | |
{ | |
return RenderNodeAction.Skip; | |
} | |
public void OnInstanceEnd(InstanceNode node) | |
{ | |
} | |
public RenderNodeAction OnLinkBegin(LinkNode node) | |
{ | |
Document doc = node.GetDocument(); | |
Documents.Add(doc); | |
CurrentDocument = doc; | |
return RenderNodeAction.Proceed; | |
} | |
public void OnLinkEnd(LinkNode node) | |
{ | |
CurrentDocument = ParentDocument; | |
} | |
public RenderNodeAction OnFaceBegin(FaceNode node) | |
{ | |
return RenderNodeAction.Skip; | |
} | |
public void OnFaceEnd(FaceNode node) | |
{ | |
} | |
public void OnRPC(RPCNode node) | |
{ | |
} | |
public void OnLight(LightNode node) | |
{ | |
} | |
public void OnMaterial(MaterialNode node) | |
{ | |
} | |
public void OnPolymesh(PolymeshTopology node) | |
{ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment