By Aaron Lu
Below are 2 detail components, each is actually a detail line in the family.
What dimension we want to create is like this:
We know the Document.Create.NewDimension method is:
Dimension NewDimension(View view, Line line, ReferenceArray references)
First 2 arguments are easy: one is the view to create on, the other is the position of the dimension,
So the last one ReferenceArray is the references of the geometry object on these 2 components, but how to get them?
Obviously, using (FamilyInstance.Location as LocationCurve).Curve.Reference, we can only get null reference
So, only Element.get_Geometry way is left, then here is the code:
private static Line GetReferenceOfDetailComponent(Element element, View view) { Options options = new Options(); options.ComputeReferences = true; options.IncludeNonVisibleObjects = true; if (view != null) options.View = view; else options.DetailLevel = ViewDetailLevel.Fine; var geoElem = element.get_Geometry(options); foreach (var item in geoElem) { Line line = item as Line; if (line != null) { //in this case, code will never be executed to here } else { GeometryInstance geoInst = item as GeometryInstance; if (geoInst != null) { GeometryElement geoElemTmp = geoInst.GetSymbolGeometry(); foreach (GeometryObject geomObjTmp in geoElemTmp) { Line line2 = geomObjTmp as Line; if (line2 != null) { //check if it is what you want if (line2.GraphicsStyleId.IntegerValue == 355) { return line2; } } } } } } return null; }
Note:
- Options.ComputeReferences must be set to true, otherwise the Reference of any geometry object is null
- When iterating GeometryElement, if we fount a GeometryInstance, then call GetSymbolGeometry rather than GetInstanceGeometry to get more geometry objects, otherwise, they are still not suitable to create dimension.