Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Decompiled with JetBrains decompiler
- // Type: Revit.Elements.ModelCurve
- // Assembly: RevitNodes, Version=0.8.3.2256, Culture=neutral, PublicKeyToken=null
- // MVID: 52AFFC12-09EE-40BB-8111-4A7DCCE89D77
- // Assembly location: C:\Program Files\Dynamo 0.83\Revit_2015\RevitNodes.dll
- using Autodesk.DesignScript.Geometry;
- using Autodesk.Revit.Creation;
- using Autodesk.Revit.DB;
- using DynamoServices;
- using Revit.GeometryConversion;
- using Revit.Properties;
- using RevitServices.Persistence;
- using RevitServices.Transactions;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- namespace Revit.Elements
- {
- /// <summary>
- /// Revit ModelCurve
- /// </summary>
- [RegisterForTrace]
- public class ModelCurve : CurveElement
- {
- private static bool hasMethodResetSketchPlane = true;
- private ModelCurve(ModelCurve curve)
- {
- ModelCurve modelCurve = this;
- this.SafeInit((Action) (() => modelCurve.InitModelCurve(curve)));
- }
- private ModelCurve(Curve crv, bool makeReferenceCurve)
- {
- ModelCurve modelCurve = this;
- this.SafeInit((Action) (() => modelCurve.InitModelCurve(crv, makeReferenceCurve)));
- }
- private void InitModelCurve(ModelCurve curve)
- {
- this.InternalSetCurveElement((CurveElement) curve);
- }
- private void InitModelCurve(Curve crv, bool makeReferenceCurve)
- {
- ModelCurve elementFromTrace = ElementBinder.GetElementFromTrace<ModelCurve>(Element.Document);
- if (elementFromTrace != null)
- {
- this.InternalSetCurveElement((CurveElement) elementFromTrace);
- if (!this.InternalSetSketchPlaneFromCurve(crv))
- {
- this.InternalSetCurve(crv);
- return;
- }
- }
- ElementId elementId = elementFromTrace != null ? ((Element) elementFromTrace).get_Id() : ElementId.get_InvalidElementId();
- string uuid = elementFromTrace != null ? ((Element) elementFromTrace).get_UniqueId() : string.Empty;
- TransactionManager.Instance.EnsureInTransaction(Element.Document);
- SketchPlane sketchPlaneFromCurve = ModelCurve.GetSketchPlaneFromCurve(crv);
- Plane plane = sketchPlaneFromCurve.GetPlane();
- ModelCurve modelCurve;
- if (CurveUtils.GetPlaneFromCurve(crv, true) == null)
- {
- Curve curve = ModelCurve.Flatten3dCurveOnPlane(crv, plane);
- modelCurve = Element.Document.get_IsFamilyDocument() ? ((ItemFactoryBase) Element.Document.get_FamilyCreate()).NewModelCurve(curve, sketchPlaneFromCurve) : ((ItemFactoryBase) Element.Document.get_Create()).NewModelCurve(curve, sketchPlaneFromCurve);
- CurveElement.setCurveMethod((CurveElement) modelCurve, crv);
- }
- else
- modelCurve = Element.Document.get_IsFamilyDocument() ? ((ItemFactoryBase) Element.Document.get_FamilyCreate()).NewModelCurve(crv, sketchPlaneFromCurve) : ((ItemFactoryBase) Element.Document.get_Create()).NewModelCurve(crv, sketchPlaneFromCurve);
- if (ElementId.op_Inequality(((Element) ((CurveElement) modelCurve).get_SketchPlane()).get_Id(), ((Element) sketchPlaneFromCurve).get_Id()))
- DocumentManager.Instance.DeleteElement(new ElementUUID(((Element) sketchPlaneFromCurve).get_UniqueId()));
- this.InternalSetCurveElement((CurveElement) modelCurve);
- if (ElementId.op_Inequality(elementId, ((Element) modelCurve).get_Id()) && ElementId.op_Inequality(elementId, ElementId.get_InvalidElementId()))
- DocumentManager.Instance.DeleteElement(new ElementUUID(uuid));
- if (makeReferenceCurve)
- modelCurve.ChangeToReferenceLine();
- TransactionManager.Instance.TransactionTaskDone();
- ElementBinder.SetElementForTrace(this.InternalElement);
- }
- private bool InternalSetSketchPlaneFromCurve(Curve c)
- {
- TransactionManager.Instance.EnsureInTransaction(Element.Document);
- Plane planeFromCurve = CurveUtils.GetPlaneFromCurve(c, false);
- bool needsSketchPlaneReset = false;
- string uuid = ModelCurve.resetSketchPlaneMethod(this.InternalCurveElement, c, planeFromCurve, out needsSketchPlaneReset);
- if (uuid != string.Empty)
- DocumentManager.Instance.DeleteElement(new ElementUUID(uuid));
- TransactionManager.Instance.TransactionTaskDone();
- return !needsSketchPlaneReset;
- }
- /// <summary>
- /// Построение элемента Revit ModelCurve на основе кривой
- /// </summary>
- /// <param name="curve"/>
- /// <returns/>
- public static ModelCurve ByCurve(Curve curve)
- {
- if (curve == null)
- throw new ArgumentNullException("curve");
- return new ModelCurve(ModelCurve.ExtractLegalRevitCurve(curve), false);
- }
- /// <summary>
- /// Построение элемента Revit ModelCurve на основе кривой
- /// </summary>
- /// <param name="curve"/>
- /// <returns/>
- public static ModelCurve ReferenceCurveByCurve(Curve curve)
- {
- if (curve == null)
- throw new ArgumentNullException("curve");
- if (!Element.Document.get_IsFamilyDocument())
- throw new Exception(Resources.ReferenceCurveCreationFailure);
- return new ModelCurve(ModelCurve.ExtractLegalRevitCurve(curve), true);
- }
- internal static ModelCurve FromExisting(ModelCurve modelCurve, bool isRevitOwned)
- {
- ModelCurve modelCurve1 = new ModelCurve(modelCurve);
- modelCurve1.IsRevitOwned = isRevitOwned;
- return modelCurve1;
- }
- private static Curve ExtractLegalRevitCurve(Curve curve)
- {
- if (curve is PolyCurve)
- throw new Exception(Resources.PolyCurvesConversionError);
- return ProtoToRevitCurve.ToRevitType(curve, true);
- }
- private static string resetSketchPlaneMethod(CurveElement mc, Curve c, Plane flattenedOnPlane, out bool needsSketchPlaneReset)
- {
- needsSketchPlaneReset = false;
- Plane plane1 = flattenedOnPlane != null ? flattenedOnPlane : CurveUtils.GetPlaneFromCurve(c, false);
- Plane plane2 = mc.get_SketchPlane().GetPlane();
- bool flag1 = false;
- double num1 = plane2.get_Normal().DotProduct(plane2.get_Normal());
- double num2 = plane1.get_Normal().DotProduct(plane1.get_Normal());
- double num3 = plane1.get_Normal().DotProduct(plane2.get_Normal());
- double num4 = num3 / num1 * (num3 / num2);
- double num5 = 0.00174532925199433;
- if (num4 < 1.0 - num5 * num5)
- flag1 = true;
- SketchPlane sketchPlane = (SketchPlane) null;
- if (!flag1)
- {
- double num6 = plane2.get_Normal().DotProduct(XYZ.op_Subtraction(plane2.get_Origin(), plane1.get_Origin()));
- double num7 = 1E-06;
- if (num6 > num7 || num6 < -num7)
- {
- sketchPlane = ModelCurve.GetSketchPlaneFromCurve(c);
- mc.set_SketchPlane(ModelCurve.GetSketchPlaneFromCurve(c));
- }
- if (sketchPlane != null && !ElementId.op_Equality(((Element) mc.get_SketchPlane()).get_Id(), ((Element) sketchPlane).get_Id()))
- return ((Element) sketchPlane).get_UniqueId();
- return "";
- }
- bool flag2 = false;
- if (ModelCurve.hasMethodResetSketchPlane)
- {
- MethodInfo[] methods = typeof (CurveElement).GetMethods(BindingFlags.Instance | BindingFlags.Public);
- string str1 = "ResetSketchPlaneAndCurve";
- string str2 = "SetSketchPlaneAndCurve";
- foreach (MethodInfo methodInfo in methods)
- {
- if (methodInfo.Name == str1 || methodInfo.Name == str2)
- {
- object[] parameters = new object[2];
- sketchPlane = ModelCurve.GetSketchPlaneFromCurve(c);
- parameters[0] = (object) sketchPlane;
- parameters[1] = (object) null;
- flag2 = true;
- methodInfo.Invoke((object) mc, parameters);
- break;
- }
- }
- }
- if (!flag2)
- {
- ModelCurve.hasMethodResetSketchPlane = false;
- needsSketchPlaneReset = true;
- return "";
- }
- if (sketchPlane != null && ElementId.op_Inequality(((Element) mc.get_SketchPlane()).get_Id(), ((Element) sketchPlane).get_Id()))
- return ((Element) sketchPlane).get_UniqueId();
- return "";
- }
- private static SketchPlane GetSketchPlaneFromCurve(Curve c)
- {
- return SketchPlane.Create(Element.Document, CurveUtils.GetPlaneFromCurve(c, false));
- }
- private static Curve Flatten3dCurveOnPlane(Curve c, Plane plane)
- {
- if (c is HermiteSpline)
- {
- HermiteSpline hermiteSpline = c as HermiteSpline;
- plane = CurveUtils.GetPlaneFromCurve(c, false);
- List<XYZ> list = new List<XYZ>();
- using (IEnumerator<XYZ> enumerator = ((IEnumerable<XYZ>) hermiteSpline.get_ControlPoints()).GetEnumerator())
- {
- while (((IEnumerator) enumerator).MoveNext())
- {
- XYZ current = enumerator.Current;
- XYZ xyz = XYZ.op_Subtraction(current, XYZ.op_Multiply(XYZ.op_Subtraction(current, plane.get_Origin()).DotProduct(plane.get_Normal()), plane.get_Normal()));
- list.Add(xyz);
- }
- }
- return (Curve) HermiteSpline.Create((IList<XYZ>) list, false);
- }
- if (!(c is NurbSpline))
- return c;
- NurbSpline nurbSpline = c as NurbSpline;
- if (plane == null)
- plane = GeometryPrimitiveConverter.ToPlane(Plane.ByBestFitThroughPoints((IEnumerable<Point>) GeometryPrimitiveConverter.ToPoints(Enumerable.ToList<XYZ>((IEnumerable<XYZ>) nurbSpline.get_CtrlPoints()), false)), false);
- List<XYZ> list1 = new List<XYZ>();
- using (IEnumerator<XYZ> enumerator = ((IEnumerable<XYZ>) nurbSpline.get_CtrlPoints()).GetEnumerator())
- {
- while (((IEnumerator) enumerator).MoveNext())
- {
- XYZ current = enumerator.Current;
- XYZ xyz = XYZ.op_Subtraction(current, XYZ.op_Multiply(XYZ.op_Subtraction(current, plane.get_Origin()).DotProduct(plane.get_Normal()), plane.get_Normal()));
- list1.Add(xyz);
- }
- }
- return (Curve) NurbSpline.Create((IList<XYZ>) list1, (IList<double>) Enumerable.ToList<double>(Enumerable.Cast<double>((IEnumerable) nurbSpline.get_Weights())), (IList<double>) Enumerable.ToList<double>(Enumerable.Cast<double>((IEnumerable) nurbSpline.get_Knots())), nurbSpline.get_Degree(), nurbSpline.get_isClosed(), nurbSpline.get_isRational());
- }
- public override string ToString()
- {
- return "ModelCurve";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement