Skip to content

Instantly share code, notes, and snippets.

@mitevpi
Created October 23, 2019 15:22
Show Gist options
  • Save mitevpi/90ce61cfeeafbcf0d17cc1485024b46a to your computer and use it in GitHub Desktop.
Save mitevpi/90ce61cfeeafbcf0d17cc1485024b46a to your computer and use it in GitHub Desktop.
Revit API Collect All Visible Elements
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