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); }
public static Plane ReferencePlane(this Face3D face3D, double tolerance = Core.Tolerance.Distance) { Plane plane = face3D?.GetPlane(); if (plane == null) { return(null); } Vector3D normal = plane.Normal; Vector3D axis_Y = new Plane(plane, Point3D.Zero).Project(Vector3D.WorldZ); if (axis_Y.Length <= tolerance) { axis_Y = Vector3D.WorldY; if (normal.Z > 0) { axis_Y.Negate(); } } Vector3D axis_X = axis_Y.CrossProduct(normal); if (axis_X.Length <= tolerance) { axis_X = Vector3D.WorldX; if (normal.Z > 0) { axis_X.Negate(); } } Plane result = new Plane(plane.Origin, axis_X, axis_Y); List <Point2D> point2Ds = face3D.ExternalEdgePoint3Ds(tolerance)?.ToList().ConvertAll(x => result.Convert(x)); if (point2Ds == null || point2Ds.Count == 0) { return(result); } Point2D point2D_Min = point2Ds.Min(); return(new Plane(result.Convert(point2D_Min), axis_X, axis_Y)); }
public static double HydraulicDiameter(this Face3D face3D, double tolerance = Core.Tolerance.Distance) { Plane plane_Face3D = face3D?.GetPlane(); if (plane_Face3D == null) { return(double.NaN); } Plane plane = Plane.WorldXY; if (plane.Perpendicular(plane_Face3D, tolerance)) { return(0); } Face3D face3D_Project = plane.Project(face3D); if (face3D_Project == null || !face3D_Project.IsValid()) { return(0); } Planar.ISegmentable2D segmentable2D = face3D_Project.ExternalEdge2D as Planar.ISegmentable2D; if (segmentable2D == null) { throw new System.NotImplementedException(); } double area = face3D_Project.GetArea(); if (area <= tolerance) { return(0); } //return (4 * area) / segmentable2D.GetLength(); return(segmentable2D.GetLength()); }
public static FamilyInstance ToRevit(this Aperture aperture, Document document, HostObject hostObject, Core.Revit.ConvertSettings convertSettings) { if (aperture == null || document == null) { return(null); } FamilyInstance result = convertSettings?.GetObject <FamilyInstance>(aperture.Guid); if (result != null) { return(result); } ApertureConstruction apertureConstruction = aperture.ApertureConstruction; if (apertureConstruction == null) { return(null); } FamilySymbol familySymbol = apertureConstruction.ToRevit(document, convertSettings); if (familySymbol == null) { familySymbol = Analytical.Query.DefaultApertureConstruction(hostObject.PanelType(), apertureConstruction.ApertureType).ToRevit(document, convertSettings); //Default Aperture Construction } if (familySymbol == null) { return(null); } Point3D point3D_Location = aperture.PlanarBoundary3D?.Plane?.Origin; if (point3D_Location == null) { return(null); } Level level = Geometry.Revit.Query.LowLevel(document, point3D_Location.Z); if (level == null) { return(null); } XYZ referenceDirection = new XYZ(0, 0, 0); if (hostObject is RoofBase) { Face3D face3D = aperture.GetFace3D(); Geometry.Spatial.Plane plane = face3D.GetPlane(); bool coplanar = plane.Coplanar(Geometry.Spatial.Plane.WorldXY); //if(coplanar) //{ // referenceDirection = new XYZ(0, 0, 1); //} result = document.Create.NewFamilyInstance(point3D_Location.ToRevit(), familySymbol, referenceDirection, hostObject, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); if (result == null) { return(null); } //List<Geometry.Planar.Point2D> point2Ds = new List<Geometry.Planar.Point2D>(); //IClosedPlanar3D closedPlanar3D = face3D.GetExternalEdge3D(); //if (closedPlanar3D is ICurvable3D) //{ // List<ICurve3D> curve3Ds = ((ICurvable3D)closedPlanar3D).GetCurves(); // foreach (ICurve3D curve3D in curve3Ds) // { // ICurve3D curve3D_Temp = plane.Project(curve3D); // point2Ds.Add(plane.Convert(curve3D_Temp.GetStart())); // } //} //Geometry.Planar.Rectangle2D rectangle2D = Geometry.Planar.Create.Rectangle2D(point2Ds); Geometry.Planar.Rectangle2D rectangle2D = Analytical.Create.Rectangle2D(aperture.PlanarBoundary3D); if (rectangle2D == null) { return(null); } document.Regenerate(); result = document.GetElement(result.Id) as FamilyInstance; Vector3D handOrientation_FamilyInstance = result.HandOrientation.ToSAM_Vector3D(false); Vector3D facingOrientation_FamilyInstance = result.FacingOrientation.ToSAM_Vector3D(false); double factor = 0; Geometry.Planar.Vector2D direction = rectangle2D.WidthDirection; if (!coplanar && Core.Query.Round(direction.Y) < 0) { factor = System.Math.PI / 2; } Vector3D handOrienation_Aperture = plane.Convert(direction); Geometry.Spatial.Plane plane_FamilyInstance = new Geometry.Spatial.Plane(point3D_Location, handOrientation_FamilyInstance, facingOrientation_FamilyInstance); handOrienation_Aperture = plane_FamilyInstance.Project(handOrienation_Aperture); double angle = Geometry.Spatial.Query.SignedAngle(handOrientation_FamilyInstance, handOrienation_Aperture, plane.Normal); result.Location.Rotate(Line.CreateUnbound(point3D_Location.ToRevit(), plane.Normal.ToRevit(false)), angle + factor); //document.Regenerate(); //BoundingBox3D boundingBox3D_familyInstance = familyInstance.BoundingBox3D(); //BoundingBox3D boundingBox3D_Aperture = aperture.GetBoundingBox(); //if(boundingBox3D_familyInstance.Min.Distance(boundingBox3D_Aperture.Min) > SAM.Core.Tolerance.MacroDistance) // familyInstance.Location.Rotate(Line.CreateUnbound(point3D_Location.ToRevit(), plane.Normal.ToRevit(false)), System.Math.PI / 2); //Geometry.Planar.Rectangle2D rectangle2D = Geometry.Planar.Create.Rectangle2D(point2Ds); //Geometry.Planar.Vector2D direction = null; //if (rectangle2D.Height > rectangle2D.Width) // direction = rectangle2D.HeightDirection; //else // direction = rectangle2D.WidthDirection; //double angle = plane.Convert(direction).ToRevit(false).AngleTo(new XYZ(0, 1, 0)); //angle = System.Math.PI - angle; ////if (angle > System.Math.PI) //// angle = -(angle - System.Math.PI); //if (direction.X < 0) // angle = -angle; //familyInstance.Location.Rotate(Line.CreateUnbound(point3D_Location.ToRevit(), plane.Normal.ToRevit(false)), angle); } else { result = document.Create.NewFamilyInstance(point3D_Location.ToRevit(), familySymbol, hostObject, level, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); } if (result == null) { return(null); } if (result.CanFlipHand) { document.Regenerate(); //This is needed to get flip correctly pushed to revit Vector3D axisX = result.HandOrientation.ToSAM_Vector3D(false); if (!axisX.SameHalf(aperture.Plane.AxisX)) { result.flipHand(); } } if (result.CanFlipFacing) { document.Regenerate(); //This is needed to get flip correctly pushed to revit Vector3D normal = result.FacingOrientation.ToSAM_Vector3D(false); if (!normal.SameHalf(aperture.Plane.Normal)) { result.flipFacing(); } } if (convertSettings.ConvertParameters) { Core.Revit.Modify.SetValues(result, aperture, new BuiltInParameter[] { BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM, BuiltInParameter.INSTANCE_HEAD_HEIGHT_PARAM, BuiltInParameter.FAMILY_LEVEL_PARAM, BuiltInParameter.SCHEDULE_LEVEL_PARAM }); Core.Revit.Modify.SetValues(result, aperture, ActiveSetting.Setting); bool simplified = false; //Check if geometry is simplified if (!Geometry.Planar.Query.Rectangular(aperture.PlanarBoundary3D?.ExternalEdge2DLoop?.GetClosed2D(), Core.Tolerance.MacroDistance)) { simplified = true; } if (!simplified && result.Host is Autodesk.Revit.DB.Wall) { Face3D face3D = aperture.GetFace3D(); Geometry.Spatial.Plane plane = face3D.GetPlane(); Geometry.Planar.Rectangle2D rectangle2D = Analytical.Create.Rectangle2D(aperture.PlanarBoundary3D); if (rectangle2D != null) { Vector3D widthDirection = plane.Convert(rectangle2D.WidthDirection); Vector3D heightDirection = plane.Convert(rectangle2D.HeightDirection); //TODO: Implement code for Tilted Walls Vector3D vector3D_Z = Vector3D.WorldZ; if (!widthDirection.AlmostSimilar(vector3D_Z) && !heightDirection.AlmostSimilar(vector3D_Z)) { simplified = true; } } } Core.Revit.Modify.SetSimplified(result, simplified); Core.Revit.Modify.SetJson(result, aperture.ToJObject()?.ToString()); } convertSettings?.Add(aperture.Guid, result); return(result); }