Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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));
        }