/// <summary> /// Set the curve internally. Returns false if this method failed to set the curve /// </summary> /// <param name="c"></param> /// <returns></returns> private bool InternalSetSketchPlaneFromCurve(Autodesk.Revit.DB.Curve c) { TransactionManager.Instance.EnsureInTransaction(Document); // Infer the sketch plane Autodesk.Revit.DB.Plane plane = CurveUtils.GetPlaneFromCurve(c, false); // attempt to change the sketch plane bool needsRemake = false; string idSpUnused = resetSketchPlaneMethod(this.InternalCurveElement, c, plane, out needsRemake); // if we got a valid id, delete the old sketch plane if (idSpUnused != String.Empty) { DocumentManager.Instance.DeleteElement(new ElementUUID(idSpUnused)); } TransactionManager.Instance.TransactionTaskDone(); return(!needsRemake); }
private static string resetSketchPlaneMethod(Autodesk.Revit.DB.CurveElement mc, Curve c, Autodesk.Revit.DB.Plane flattenedOnPlane, out bool needsSketchPlaneReset) { //do we need to reset? needsSketchPlaneReset = false; Autodesk.Revit.DB.Plane newPlane = flattenedOnPlane != null ? flattenedOnPlane : CurveUtils.GetPlaneFromCurve(c, false); Autodesk.Revit.DB.Plane curPlane = mc.SketchPlane.GetPlane(); bool resetPlane = false; { double llSqCur = curPlane.Normal.DotProduct(curPlane.Normal); double llSqNew = newPlane.Normal.DotProduct(newPlane.Normal); double dotP = newPlane.Normal.DotProduct(curPlane.Normal); double dotSqNormalized = (dotP / llSqCur) * (dotP / llSqNew); double angleTol = System.Math.PI / 1800.0; if (dotSqNormalized < 1.0 - angleTol * angleTol) { resetPlane = true; } } Autodesk.Revit.DB.SketchPlane sp = null; if (!resetPlane) { double originDiff = curPlane.Normal.DotProduct(curPlane.Origin - newPlane.Origin); double tolerance = 0.000001; if (originDiff > tolerance || originDiff < -tolerance) { sp = GetSketchPlaneFromCurve(c); mc.SketchPlane = GetSketchPlaneFromCurve(c); } return((sp == null || mc.SketchPlane.Id == sp.Id) ? "" : sp.UniqueId); } //do reset if method is available bool foundMethod = false; if (hasMethodResetSketchPlane) { Type CurveElementType = typeof(Autodesk.Revit.DB.CurveElement); MethodInfo[] curveElementMethods = CurveElementType.GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); System.String nameOfMethodSetCurve = "ResetSketchPlaneAndCurve"; System.String nameOfMethodSetCurveAlt = "SetSketchPlaneAndCurve"; foreach (MethodInfo m in curveElementMethods) { if (m.Name == nameOfMethodSetCurve || m.Name == nameOfMethodSetCurveAlt) { object[] argsM = new object[2]; sp = GetSketchPlaneFromCurve(c); argsM[0] = sp; argsM[1] = null; foundMethod = true; m.Invoke(mc, argsM); break; } } } if (!foundMethod) { //sp = dynRevitUtils.GetSketchPlaneFromCurve(c); hasMethodResetSketchPlane = false; needsSketchPlaneReset = true; //expect exception, so try to keep old plane? //mc.SketchPlane = sp; return(""); } if (sp != null && mc.SketchPlane.Id != sp.Id) { return(sp.UniqueId); } return(""); }