private void WriteElementGeometry( int elementId )
{
FilteredElementCollector viewCollector = new FilteredElementCollector( m_doc );
viewCollector.OfClass( typeof( ViewPlan ) );
Func<ViewPlan, bool> isLevel1FloorPlan = v => !v.IsTemplate && v.Name == "Level 1" && v.ViewType == ViewType.FloorPlan;
m_targetView = viewCollector.Cast<ViewPlan>().First<ViewPlan>( isLevel1FloorPlan );
Transaction createCurve = new Transaction( m_doc, "Create reference curves" );
createCurve.Start();
const double xReferenceLocation = 30;
Line vLine = Line.CreateBound( new XYZ( xReferenceLocation, 0, 0 ), new XYZ( xReferenceLocation, 20, 0 ) );
m_vLine = m_doc.Create.NewDetailCurve( m_targetView, vLine );
const double yReferenceLocation = -10;
Line hLine = Line.CreateBound( new XYZ( 0, yReferenceLocation, 0 ), new XYZ( 20, yReferenceLocation, 0 ) );
m_hLine = m_doc.Create.NewDetailCurve( m_targetView, hLine );
createCurve.Commit();
Element e = m_doc.GetElement( new ElementId( elementId ) );
Options options = new Options();
options.ComputeReferences = true;
options.IncludeNonVisibleObjects = true;
options.View = m_targetView;
GeometryElement geomElem = e.get_Geometry( options );
foreach( GeometryObject geomObj in geomElem )
{
if( geomObj is Solid )
{
WriteSolid( (Solid) geomObj );
}
else if( geomObj is GeometryInstance )
{
TraverseGeometryInstance( (GeometryInstance) geomObj );
}
else
{
m_writer.WriteLine( "Something else - " + geomObj.GetType().Name );
}
}
foreach( Curve curve in m_referencePlaneReferences )
{
// Try to get the geometry object from reference
Reference curveReference = curve.Reference;
GeometryObject geomObj = e.GetGeometryObjectFromReference( curveReference );
if( geomObj != null )
{
m_writer.WriteLine( "Curve reference leads to: " + geomObj.GetType().Name );
}
}
// Dimension to reference curves
foreach( Curve curve in m_referencePlaneReferences )
{
DetailCurve targetLine = m_vLine;
Line line = (Line) curve;
XYZ lineStartPoint = line.GetEndPoint( 0 );
XYZ lineEndPoint = line.GetEndPoint( 1 );
XYZ direction = lineEndPoint - lineStartPoint;
Line dimensionLine = null;
if( Math.Abs( direction.Y ) < 0.0001 )
{
targetLine = m_hLine;
XYZ dimensionLineStart = new XYZ( lineStartPoint.X + 5, lineStartPoint.Y, 0 );
XYZ dimensionLineEnd = new XYZ( dimensionLineStart.X, dimensionLineStart.Y + 10, 0 );
dimensionLine = Line.CreateBound( dimensionLineStart, dimensionLineEnd );
}
else
{
targetLine = m_vLine;
XYZ dimensionLineStart = new XYZ( lineStartPoint.X, lineStartPoint.Y + 5, 0 );
XYZ dimensionLineEnd = new XYZ( dimensionLineStart.X + 10, dimensionLineStart.Y, 0 );
dimensionLine = Line.CreateBound( dimensionLineStart, dimensionLineEnd );
}
ReferenceArray references = new ReferenceArray();
references.Append( curve.Reference );
references.Append( targetLine.GeometryCurve.Reference );
Transaction t = new Transaction( m_doc, "Create dimension" );
t.Start();
m_doc.Create.NewDimension( m_targetView, dimensionLine, references );
t.Commit();
}
}