Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. // Decompiled with JetBrains decompiler
  2. // Type: Revit.Elements.ModelCurve
  3. // Assembly: RevitNodes, Version=0.8.3.2256, Culture=neutral, PublicKeyToken=null
  4. // MVID: 52AFFC12-09EE-40BB-8111-4A7DCCE89D77
  5. // Assembly location: C:\Program Files\Dynamo 0.83\Revit_2015\RevitNodes.dll
  6.  
  7. using Autodesk.DesignScript.Geometry;
  8. using Autodesk.Revit.Creation;
  9. using Autodesk.Revit.DB;
  10. using DynamoServices;
  11. using Revit.GeometryConversion;
  12. using Revit.Properties;
  13. using RevitServices.Persistence;
  14. using RevitServices.Transactions;
  15. using System;
  16. using System.Collections;
  17. using System.Collections.Generic;
  18. using System.Linq;
  19. using System.Reflection;
  20.  
  21. namespace Revit.Elements
  22. {
  23.   /// <summary>
  24.   /// Revit ModelCurve
  25.   /// </summary>
  26.   [RegisterForTrace]
  27.   public class ModelCurve : CurveElement
  28.   {
  29.     private static bool hasMethodResetSketchPlane = true;
  30.  
  31.     private ModelCurve(ModelCurve curve)
  32.     {
  33.       ModelCurve modelCurve = this;
  34.       this.SafeInit((Action) (() => modelCurve.InitModelCurve(curve)));
  35.     }
  36.  
  37.     private ModelCurve(Curve crv, bool makeReferenceCurve)
  38.     {
  39.       ModelCurve modelCurve = this;
  40.       this.SafeInit((Action) (() => modelCurve.InitModelCurve(crv, makeReferenceCurve)));
  41.     }
  42.  
  43.     private void InitModelCurve(ModelCurve curve)
  44.     {
  45.       this.InternalSetCurveElement((CurveElement) curve);
  46.     }
  47.  
  48.     private void InitModelCurve(Curve crv, bool makeReferenceCurve)
  49.     {
  50.       ModelCurve elementFromTrace = ElementBinder.GetElementFromTrace<ModelCurve>(Element.Document);
  51.       if (elementFromTrace != null)
  52.       {
  53.         this.InternalSetCurveElement((CurveElement) elementFromTrace);
  54.         if (!this.InternalSetSketchPlaneFromCurve(crv))
  55.         {
  56.           this.InternalSetCurve(crv);
  57.           return;
  58.         }
  59.       }
  60.       ElementId elementId = elementFromTrace != null ? ((Element) elementFromTrace).get_Id() : ElementId.get_InvalidElementId();
  61.       string uuid = elementFromTrace != null ? ((Element) elementFromTrace).get_UniqueId() : string.Empty;
  62.       TransactionManager.Instance.EnsureInTransaction(Element.Document);
  63.       SketchPlane sketchPlaneFromCurve = ModelCurve.GetSketchPlaneFromCurve(crv);
  64.       Plane plane = sketchPlaneFromCurve.GetPlane();
  65.       ModelCurve modelCurve;
  66.       if (CurveUtils.GetPlaneFromCurve(crv, true) == null)
  67.       {
  68.         Curve curve = ModelCurve.Flatten3dCurveOnPlane(crv, plane);
  69.         modelCurve = Element.Document.get_IsFamilyDocument() ? ((ItemFactoryBase) Element.Document.get_FamilyCreate()).NewModelCurve(curve, sketchPlaneFromCurve) : ((ItemFactoryBase) Element.Document.get_Create()).NewModelCurve(curve, sketchPlaneFromCurve);
  70.         CurveElement.setCurveMethod((CurveElement) modelCurve, crv);
  71.       }
  72.       else
  73.         modelCurve = Element.Document.get_IsFamilyDocument() ? ((ItemFactoryBase) Element.Document.get_FamilyCreate()).NewModelCurve(crv, sketchPlaneFromCurve) : ((ItemFactoryBase) Element.Document.get_Create()).NewModelCurve(crv, sketchPlaneFromCurve);
  74.       if (ElementId.op_Inequality(((Element) ((CurveElement) modelCurve).get_SketchPlane()).get_Id(), ((Element) sketchPlaneFromCurve).get_Id()))
  75.         DocumentManager.Instance.DeleteElement(new ElementUUID(((Element) sketchPlaneFromCurve).get_UniqueId()));
  76.       this.InternalSetCurveElement((CurveElement) modelCurve);
  77.       if (ElementId.op_Inequality(elementId, ((Element) modelCurve).get_Id()) && ElementId.op_Inequality(elementId, ElementId.get_InvalidElementId()))
  78.         DocumentManager.Instance.DeleteElement(new ElementUUID(uuid));
  79.       if (makeReferenceCurve)
  80.         modelCurve.ChangeToReferenceLine();
  81.       TransactionManager.Instance.TransactionTaskDone();
  82.       ElementBinder.SetElementForTrace(this.InternalElement);
  83.     }
  84.  
  85.     private bool InternalSetSketchPlaneFromCurve(Curve c)
  86.     {
  87.       TransactionManager.Instance.EnsureInTransaction(Element.Document);
  88.       Plane planeFromCurve = CurveUtils.GetPlaneFromCurve(c, false);
  89.       bool needsSketchPlaneReset = false;
  90.       string uuid = ModelCurve.resetSketchPlaneMethod(this.InternalCurveElement, c, planeFromCurve, out needsSketchPlaneReset);
  91.       if (uuid != string.Empty)
  92.         DocumentManager.Instance.DeleteElement(new ElementUUID(uuid));
  93.       TransactionManager.Instance.TransactionTaskDone();
  94.       return !needsSketchPlaneReset;
  95.     }
  96.  
  97.     /// <summary>
  98.     /// Построение элемента Revit ModelCurve на основе кривой
  99.     /// </summary>
  100.     /// <param name="curve"/>
  101.     /// <returns/>
  102.     public static ModelCurve ByCurve(Curve curve)
  103.     {
  104.       if (curve == null)
  105.         throw new ArgumentNullException("curve");
  106.       return new ModelCurve(ModelCurve.ExtractLegalRevitCurve(curve), false);
  107.     }
  108.  
  109.     /// <summary>
  110.     /// Построение элемента Revit ModelCurve на основе кривой
  111.     /// </summary>
  112.     /// <param name="curve"/>
  113.     /// <returns/>
  114.     public static ModelCurve ReferenceCurveByCurve(Curve curve)
  115.     {
  116.       if (curve == null)
  117.         throw new ArgumentNullException("curve");
  118.       if (!Element.Document.get_IsFamilyDocument())
  119.         throw new Exception(Resources.ReferenceCurveCreationFailure);
  120.       return new ModelCurve(ModelCurve.ExtractLegalRevitCurve(curve), true);
  121.     }
  122.  
  123.     internal static ModelCurve FromExisting(ModelCurve modelCurve, bool isRevitOwned)
  124.     {
  125.       ModelCurve modelCurve1 = new ModelCurve(modelCurve);
  126.       modelCurve1.IsRevitOwned = isRevitOwned;
  127.       return modelCurve1;
  128.     }
  129.  
  130.     private static Curve ExtractLegalRevitCurve(Curve curve)
  131.     {
  132.       if (curve is PolyCurve)
  133.         throw new Exception(Resources.PolyCurvesConversionError);
  134.       return ProtoToRevitCurve.ToRevitType(curve, true);
  135.     }
  136.  
  137.     private static string resetSketchPlaneMethod(CurveElement mc, Curve c, Plane flattenedOnPlane, out bool needsSketchPlaneReset)
  138.     {
  139.       needsSketchPlaneReset = false;
  140.       Plane plane1 = flattenedOnPlane != null ? flattenedOnPlane : CurveUtils.GetPlaneFromCurve(c, false);
  141.       Plane plane2 = mc.get_SketchPlane().GetPlane();
  142.       bool flag1 = false;
  143.       double num1 = plane2.get_Normal().DotProduct(plane2.get_Normal());
  144.       double num2 = plane1.get_Normal().DotProduct(plane1.get_Normal());
  145.       double num3 = plane1.get_Normal().DotProduct(plane2.get_Normal());
  146.       double num4 = num3 / num1 * (num3 / num2);
  147.       double num5 = 0.00174532925199433;
  148.       if (num4 < 1.0 - num5 * num5)
  149.         flag1 = true;
  150.       SketchPlane sketchPlane = (SketchPlane) null;
  151.       if (!flag1)
  152.       {
  153.         double num6 = plane2.get_Normal().DotProduct(XYZ.op_Subtraction(plane2.get_Origin(), plane1.get_Origin()));
  154.         double num7 = 1E-06;
  155.         if (num6 > num7 || num6 < -num7)
  156.         {
  157.           sketchPlane = ModelCurve.GetSketchPlaneFromCurve(c);
  158.           mc.set_SketchPlane(ModelCurve.GetSketchPlaneFromCurve(c));
  159.         }
  160.         if (sketchPlane != null && !ElementId.op_Equality(((Element) mc.get_SketchPlane()).get_Id(), ((Element) sketchPlane).get_Id()))
  161.           return ((Element) sketchPlane).get_UniqueId();
  162.         return "";
  163.       }
  164.       bool flag2 = false;
  165.       if (ModelCurve.hasMethodResetSketchPlane)
  166.       {
  167.         MethodInfo[] methods = typeof (CurveElement).GetMethods(BindingFlags.Instance | BindingFlags.Public);
  168.         string str1 = "ResetSketchPlaneAndCurve";
  169.         string str2 = "SetSketchPlaneAndCurve";
  170.         foreach (MethodInfo methodInfo in methods)
  171.         {
  172.           if (methodInfo.Name == str1 || methodInfo.Name == str2)
  173.           {
  174.             object[] parameters = new object[2];
  175.             sketchPlane = ModelCurve.GetSketchPlaneFromCurve(c);
  176.             parameters[0] = (object) sketchPlane;
  177.             parameters[1] = (object) null;
  178.             flag2 = true;
  179.             methodInfo.Invoke((object) mc, parameters);
  180.             break;
  181.           }
  182.         }
  183.       }
  184.       if (!flag2)
  185.       {
  186.         ModelCurve.hasMethodResetSketchPlane = false;
  187.         needsSketchPlaneReset = true;
  188.         return "";
  189.       }
  190.       if (sketchPlane != null && ElementId.op_Inequality(((Element) mc.get_SketchPlane()).get_Id(), ((Element) sketchPlane).get_Id()))
  191.         return ((Element) sketchPlane).get_UniqueId();
  192.       return "";
  193.     }
  194.  
  195.     private static SketchPlane GetSketchPlaneFromCurve(Curve c)
  196.     {
  197.       return SketchPlane.Create(Element.Document, CurveUtils.GetPlaneFromCurve(c, false));
  198.     }
  199.  
  200.     private static Curve Flatten3dCurveOnPlane(Curve c, Plane plane)
  201.     {
  202.       if (c is HermiteSpline)
  203.       {
  204.         HermiteSpline hermiteSpline = c as HermiteSpline;
  205.         plane = CurveUtils.GetPlaneFromCurve(c, false);
  206.         List<XYZ> list = new List<XYZ>();
  207.         using (IEnumerator<XYZ> enumerator = ((IEnumerable<XYZ>) hermiteSpline.get_ControlPoints()).GetEnumerator())
  208.         {
  209.           while (((IEnumerator) enumerator).MoveNext())
  210.           {
  211.             XYZ current = enumerator.Current;
  212.             XYZ xyz = XYZ.op_Subtraction(current, XYZ.op_Multiply(XYZ.op_Subtraction(current, plane.get_Origin()).DotProduct(plane.get_Normal()), plane.get_Normal()));
  213.             list.Add(xyz);
  214.           }
  215.         }
  216.         return (Curve) HermiteSpline.Create((IList<XYZ>) list, false);
  217.       }
  218.       if (!(c is NurbSpline))
  219.         return c;
  220.       NurbSpline nurbSpline = c as NurbSpline;
  221.       if (plane == null)
  222.         plane = GeometryPrimitiveConverter.ToPlane(Plane.ByBestFitThroughPoints((IEnumerable<Point>) GeometryPrimitiveConverter.ToPoints(Enumerable.ToList<XYZ>((IEnumerable<XYZ>) nurbSpline.get_CtrlPoints()), false)), false);
  223.       List<XYZ> list1 = new List<XYZ>();
  224.       using (IEnumerator<XYZ> enumerator = ((IEnumerable<XYZ>) nurbSpline.get_CtrlPoints()).GetEnumerator())
  225.       {
  226.         while (((IEnumerator) enumerator).MoveNext())
  227.         {
  228.           XYZ current = enumerator.Current;
  229.           XYZ xyz = XYZ.op_Subtraction(current, XYZ.op_Multiply(XYZ.op_Subtraction(current, plane.get_Origin()).DotProduct(plane.get_Normal()), plane.get_Normal()));
  230.           list1.Add(xyz);
  231.         }
  232.       }
  233.       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());
  234.     }
  235.  
  236.     public override string ToString()
  237.     {
  238.       return "ModelCurve";
  239.     }
  240.   }
  241. }