// 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";
}
}
}