diff --git a/src/RhinoInside.Revit.External/DB/Extensions/BoundingBoxXYZ.cs b/src/RhinoInside.Revit.External/DB/Extensions/BoundingBoxXYZ.cs index ec54333b8..8aed89412 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/BoundingBoxXYZ.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/BoundingBoxXYZ.cs @@ -252,7 +252,7 @@ public static void CopyFrom(this BoundingBoxXYZ value, BoundingBoxXYZ other) public static XYZ Evaluate(this BoundingBoxXYZ value, UnitXYZ xyz) { - if (!xyz) return default; + if (xyz.IsNaN) return XYZExtension.NaN; var (x, y, z) = xyz; var (min, max) = value; diff --git a/src/RhinoInside.Revit.External/DB/Extensions/Curve.cs b/src/RhinoInside.Revit.External/DB/Extensions/Curve.cs index db1a8b458..4ce7bf79f 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/Curve.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/Curve.cs @@ -273,7 +273,7 @@ public static bool TryGetLocation(this NurbSpline curve, out XYZ origin, out Uni cov.SetCovariance(ctrlPoints, plane.Project(cov.Origin)); basisY = cov.GetPrincipalComponent(0D); - if (!basisY) + if (basisY.IsNaN) basisY = basisX.Right(); } } @@ -296,7 +296,7 @@ public static bool TryGetLocation(this NurbSpline curve, out XYZ origin, out Uni cov.SetCovariance(ctrlPoints.Skip(closed), plane.Project(cov.Origin)); basisY = cov.GetPrincipalComponent(0D); - if (!basisY) + if (basisY.IsNaN) basisY = basisX.Right(); } } diff --git a/src/RhinoInside.Revit.External/DB/Extensions/ElementLocation.cs b/src/RhinoInside.Revit.External/DB/Extensions/ElementLocation.cs index 1eb75a395..1e7946c2b 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/ElementLocation.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/ElementLocation.cs @@ -85,7 +85,7 @@ internal static void SetLocation(this T element, XYZ newOrigin, UnitXYZ newBa UnitXYZ.Orthonormal(basisX, basisY, out var basisZ); newBasisX = (new PlaneEquation(origin, basisZ).Project(origin + newBasisX) - origin).ToUnitXYZ(); - if (newBasisX && !basisX.AlmostEquals(newBasisX)) + if (!newBasisX.IsNaN && !basisX.AlmostEquals(newBasisX)) { if (element.Pinned) element.Pinned = false; using (var axis = Line.CreateUnbound(origin, basisZ)) diff --git a/src/RhinoInside.Revit.External/DB/Extensions/Solid.cs b/src/RhinoInside.Revit.External/DB/Extensions/Solid.cs index 44828ef8a..8c3bf6a8d 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/Solid.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/Solid.cs @@ -382,7 +382,7 @@ public static IntersectionResult Project(this Edge edge, XYZ point, out Face fac var vector = (point - intersection.XYZPoint).ToUnitXYZ(); var faces = new Face[] { edge.GetFace(0), edge.GetFace(1) }; - if (vector) + if (!vector.IsNaN) { var dot0 = double.PositiveInfinity; if (faces[0] is object) diff --git a/src/RhinoInside.Revit.External/DB/Extensions/Transform.cs b/src/RhinoInside.Revit.External/DB/Extensions/Transform.cs index 79c7ebd97..3755b0d01 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/Transform.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/Transform.cs @@ -136,7 +136,7 @@ internal static UnitXYZ GetPrincipalComponent(this Transform covarianceMatrix, d var principal = covarianceMatrix.OfVector(previous).ToUnitXYZ(); var iterations = 50; - while (--iterations > 0 && principal && !previous.AlmostEquals(principal, tolerance)) + while (--iterations > 0 && !principal.IsNaN && !previous.AlmostEquals(principal, tolerance)) { previous = principal; principal = covarianceMatrix.OfVector(previous).ToUnitXYZ(); diff --git a/src/RhinoInside.Revit.External/DB/Extensions/XYZ.cs b/src/RhinoInside.Revit.External/DB/Extensions/XYZ.cs index de1b14bbe..7ba80bba9 100644 --- a/src/RhinoInside.Revit.External/DB/Extensions/XYZ.cs +++ b/src/RhinoInside.Revit.External/DB/Extensions/XYZ.cs @@ -9,7 +9,7 @@ namespace RhinoInside.Revit.External.DB.Extensions public static class XYZExtension { - public static XYZ NaN { get; } = null; // new XYZ(double.NaN, double.NaN, double.NaN); + public static XYZ NaN { get; } = default; public static XYZ Zero { get; } = XYZ.Zero; public static XYZ One { get; } = new XYZ(1.0, 1.0, 1.0); @@ -104,7 +104,7 @@ public static double Norm(this XYZ xyz, double tolerance = Constant.DefaultToler public static UnitXYZ ToUnitXYZ(this XYZ xyz) { var (x, y, z) = xyz; - return Euclidean.Normalize3(ref x, ref y, ref z) ? (UnitXYZ) new XYZ(x, y, z) : default; + return Euclidean.Normalize3(ref x, ref y, ref z) ? (UnitXYZ) new XYZ(x, y, z) : UnitXYZ.NaN; } /// diff --git a/src/RhinoInside.Revit.External/DB/UnitXYZ.cs b/src/RhinoInside.Revit.External/DB/UnitXYZ.cs index 1e7dd0a82..e37fe7c98 100644 --- a/src/RhinoInside.Revit.External/DB/UnitXYZ.cs +++ b/src/RhinoInside.Revit.External/DB/UnitXYZ.cs @@ -22,7 +22,7 @@ public readonly struct UnitXYZ public static UnitXYZ BasisY { get; } = new UnitXYZ(XYZ.BasisY); public static UnitXYZ BasisZ { get; } = new UnitXYZ(XYZ.BasisZ); - public static implicit operator bool(UnitXYZ unit) => unit.Direction is object; + public bool IsNaN => Direction is null; public static XYZ operator *(UnitXYZ unit, double magnitude) => unit.Direction * magnitude; public static XYZ operator *(double magnitude, UnitXYZ unit) => magnitude * unit.Direction; @@ -105,7 +105,7 @@ public static bool Orthonormalize(XYZ u, XYZ v, out UnitXYZ x, out UnitXYZ y, ou x = u.ToUnitXYZ(); y = v.ToUnitXYZ(); z = CrossProduct(x, y).ToUnitXYZ(); - if (!z) return false; + if (z.IsNaN) return false; y = (UnitXYZ) CrossProduct(z, x); return true;