public static Face3D Transform(this Transform transform, Face3D face3D, bool convertUnits = true) { if (transform == null || face3D == null) return null; if (transform.IsIdentity) return new Face3D(face3D); Spatial.Plane plane = Transform(transform, face3D.GetPlane()); if (plane == null) return null; Planar.IClosed2D externalEdge2D = plane.Convert(Transform(transform, face3D.GetExternalEdge3D(), convertUnits)); if (externalEdge2D == null) return null; List<Planar.IClosed2D> internalEdges2D = null; List<IClosedPlanar3D> internalEdges3D = face3D.GetInternalEdge3Ds(); if(internalEdges3D != null) { internalEdges2D = new List<Planar.IClosed2D>(); foreach (IClosedPlanar3D internalEdge3D in internalEdges3D) { Planar.IClosed2D internalEdge2D = plane.Convert(Transform(transform, internalEdge3D, convertUnits)); if (internalEdge2D == null) continue; internalEdges2D.Add(internalEdge2D); } } return Face3D.Create(plane, externalEdge2D, internalEdges2D, EdgeOrientationMethod.Undefined); }
private static List <Face3D> Profiles_RoofBase(this RoofBase roofBase) { List <Face3D> face3Ds = TopProfiles(roofBase); IEnumerable <ElementId> elementIds = roofBase.GetDependentElements(new ElementCategoryFilter(BuiltInCategory.OST_Windows)); if (elementIds == null || elementIds.Count() == 0) { return(face3Ds); } foreach (ElementId elementId in elementIds) { Element element = roofBase.Document.GetElement(elementId); if (element == null) { continue; } BoundingBoxXYZ boundingBoxXYZ = element.get_BoundingBox(null); Point3D point3D = ((boundingBoxXYZ.Max + boundingBoxXYZ.Min) / 2).ToSAM(); foreach (Face3D face3D in face3Ds) { List <Planar.IClosed2D> internalEdges = face3D.InternalEdge2Ds; if (internalEdges == null || internalEdges.Count == 0) { continue; } Spatial.Plane plane = face3D.GetPlane(); Point3D point3D_Projected = plane.Project(point3D); Planar.Point2D point2D = plane.Convert(point3D_Projected); for (int i = 0; i < internalEdges.Count; i++) { Planar.IClosed2D internalEdge = internalEdges[i]; if (internalEdge.Inside(point2D)) { face3D.RemoveInternalEdge(i); break; } } } } return(face3Ds); }
public static double Length(this Face3D face3D) { if (face3D == null) { return(double.NaN); } Planar.IClosed2D closed2D = face3D.ExternalEdge2D; if (closed2D == null) { return(double.NaN); } Planar.ISegmentable2D segmentable2D = closed2D as Planar.ISegmentable2D; if (segmentable2D == null) { throw new System.NotImplementedException(); } return(Planar.Query.MaxDistance(segmentable2D.GetPoints(), out Planar.Point2D point2D_1, out Planar.Point2D point2D_2)); }