Hi Paolo,
Yes it is a custom class.
You can use
public static XYZ GetReferenceDirection(Document doc, Reference reference)
{
XYZ res = XYZ.Zero;
XYZ workPlaneNormal = doc.ActiveView.SketchPlane.GetPlane().Normal;
if (reference.ElementId == ElementId.InvalidElementId)
{
return res;
}
Element elem = doc.GetElement(reference.ElementId);
if (elem == null)
{
return res;
}
if (reference.ElementReferenceType == ElementReferenceType.REFERENCE_TYPE_SURFACE || reference.ElementReferenceType == ElementReferenceType.REFERENCE_TYPE_LINEAR)
{
XYZ bEnd = new XYZ(10, 10, 10);
ReferenceArray refArr = new ReferenceArray();
refArr.Append(reference);
Dimension dim = null;
using (Transaction t = new Transaction(doc, "test"))
{
t.Start();
using (SubTransaction st = new SubTransaction(doc))
{
st.Start();
ReferencePlane refPlane = doc.Create.NewReferencePlane(XYZ.Zero, bEnd, bEnd.CrossProduct(XYZ.BasisZ).Normalize(), doc.ActiveView);
ModelCurve mc = doc.Create.NewModelCurve(Line.CreateBound(XYZ.Zero, new XYZ(10, 10, 10)), SketchPlane.Create(doc, refPlane.Id));
refArr.Append(mc.GeometryCurve.GetEndPointReference(0));
dim = doc.Create.NewDimension(doc.ActiveView, Line.CreateBound(XYZ.Zero, new XYZ(10, 0, 0)), refArr);
ElementTransformUtils.MoveElement(doc, dim.Id, new XYZ(0, 0.1, 0));
st.Commit();
}
if (dim != null)
{
Curve cv = dim.Curve;
cv.MakeBound(0, 1);
XYZ pt1 = cv.GetEndPoint(0);
XYZ pt2 = cv.GetEndPoint(1);
res = pt2.Subtract(pt1).Normalize();
}
t.RollBack();
}
}
return res;
}It works for me.
Cheers