예제 #1
0
        public static Curve GenerateSplitCurve(Brep zone, Curve core)
        {
            Point3d  zoneCenter   = Utils.GetRegionCenter(zone);
            Point3d  coreCenter   = Utils.GetRegionCenter(Brep.CreatePlanarBreps(core)[0]);
            Vector3d vectorToCore = new Vector3d(coreCenter - zoneCenter);

            bool   isVerticalProportion = Confirm.VectorProportionIsVertical(vectorToCore);
            double componentToCheck     = (isVerticalProportion) ? vectorToCore.Y : vectorToCore.X;
            bool   isPositive           = (componentToCheck > 0) ? true : false;

            Point3d coreMin = Brep.CreatePlanarBreps(core)[0].GetBoundingBox(Plane.WorldXY).Min;
            Point3d coreMax = Brep.CreatePlanarBreps(core)[0].GetBoundingBox(Plane.WorldXY).Max;

            Point3d coreExtent      = (isPositive) ? coreMin : coreMax;
            double  coreExtentValue = (isVerticalProportion) ? coreExtent.Y : coreExtent.X;

            Point3d zoneMin = zone.GetBoundingBox(Plane.WorldXY).Min;
            Point3d zoneMax = zone.GetBoundingBox(Plane.WorldXY).Max;

            Point3d zoneExtent      = (isPositive) ? zoneMin : zoneMax;
            double  zoneExtentValue = (isVerticalProportion) ? zoneExtent.Y : zoneExtent.X;

            double curveOffset = (zoneExtentValue - coreExtentValue) * 0.20; //Make this a function of zone proportionality.

            double curveStart = coreExtentValue + curveOffset;

            Curve splitCurve = (isVerticalProportion) ? new LineCurve(new Point2d(zoneMin.X, curveStart), new Point2d(zoneMax.X, curveStart)) : new LineCurve(new Point2d(curveStart, zoneMin.Y), new Point2d(curveStart, zoneMax.Y));

            return(splitCurve);
        }
예제 #2
0
        public static List <Brep> OrthogonalEgress(List <Curve> coreCurves, List <Curve> egressAxis)
        {
            List <Brep> egressExemptionRegions = new List <Brep>();

            for (int i = 0; i < egressAxis.Count; i++)
            {
                Point3d coreCurveMidpoint = Utils.GetCurveMidPoint(coreCurves[i]);
                egressAxis[i].ClosestPoint(coreCurveMidpoint, out double circulationParameter);
                Point3d circulationPoint = egressAxis[i].PointAt(circulationParameter);

                Vector3d connectionVector     = new Vector3d(circulationPoint - coreCurveMidpoint);
                bool     proportionIsVertical = Confirm.VectorProportionIsVertical(connectionVector);

                Vector3d egressVector = (proportionIsVertical == true) ? new Vector3d(0, connectionVector.Y, 0) : new Vector3d(connectionVector.X, 0, 0);

                Curve egressRegionProfile = Curves.RebuildPerpendicularTo(coreCurves[i], egressVector);

                //MessageBox.Show(connectionVector.ToString() + " => " + egressVector.ToString());

                Brep egressRegion = Brep.CreateFromSurface(Extrusion.CreateExtrusion(egressRegionProfile, egressVector));

                egressExemptionRegions.Add(egressRegion);
            }

            return(egressExemptionRegions);
        }