public static List <Brep> OptimalFloorSpaceConfiguration(List <Brep> validFloorRegions, TestFitPackage tf) { Curve perimeterCurve = tf.FloorPlanPackage.FloorProfile; Curve coreCurve = tf.FloorPlanPackage.CoreProfile; List <Brep> zonesToSlice = new List <Brep>(); List <Brep> optimizedZones = new List <Brep>(); //Identify zones with irregular proximity or shape. foreach (Brep region in validFloorRegions) { bool intersectsPerimeter = Confirm.CurveRegionIntersection(perimeterCurve, region); bool intersectsCore = Confirm.CurveRegionIntersection(coreCurve, region); if (intersectsPerimeter && intersectsCore) { zonesToSlice.Add(region); } else { optimizedZones.Add(region); } } //Cut them into more manageable pieces. List <Curve> splitterCurves = Select.BestSplitterCurves(zonesToSlice, tf.FloorPlanPackage.CirculationAxisCurves, tf.FloorPlanPackage.CoreProfile); for (int i = 0; i < zonesToSlice.Count; i++) { List <Brep> splitBreps = Breps.SplitByCurve(zonesToSlice[i], splitterCurves[i]); foreach (Brep zone in splitBreps) { optimizedZones.Add(zone); } } //Identify donut zones (zones with a hole in the middle). for (int i = optimizedZones.Count - 1; i >= 0; i--) { bool isNotDonut = Confirm.RegionIsNotDonut(optimizedZones[i]); //Cut up the donuts. if (!isNotDonut) { List <Curve> donutSplitCurves = Select.DonutSplittingCurves(optimizedZones[i]); foreach (Curve crv in donutSplitCurves) { //RhinoDoc.ActiveDoc.Objects.AddCurve(crv); } List <Brep> unDonutZones = Breps.SplitByCurves(optimizedZones[i], donutSplitCurves); optimizedZones.RemoveAt(i); foreach (Brep newZone in unDonutZones) { optimizedZones.Add(newZone); } } } return(optimizedZones); }
public static List <Curve> BestSplitterCurves(List <Brep> zones, List <Curve> circ, Curve core) { int numZones = zones.Count; int numCircCurves = circ.Count; List <Curve> splitterCurves = new List <Curve>(); for (int i = 0; i < numZones; i++) { int validCircCurves = 0; List <bool> intersects = new List <bool>(); List <double> intersectionInterval = new List <double>(); //RhinoApp.WriteLine("---"); for (int j = 0; j < numCircCurves; j++) { if (Confirm.CurveRegionIntersection(circ[j], zones[i]) && circ[j].Degree == 1) { //RhinoApp.WriteLine("Region intersection exists."); validCircCurves++; intersects.Add(true); CurveIntersections csx = Intersection.CurveSurface(circ[j], zones[i].Surfaces[0], 0.1, 0.1); //RhinoApp.WriteLine("--{0} csx event(s). (Overlap: {1})", csx.Count, csx[0].OverlapA.ToString()); intersectionInterval.Add(csx[0].OverlapA.T1 - csx[0].OverlapB.T0); } else { //RhinoApp.WriteLine("Region intersection does not exist."); intersects.Add(false); intersectionInterval.Add(0); } } if (validCircCurves == 0) { //RhinoApp.WriteLine("No circulation options."); Curve newSplitCurve = Select.GenerateSplitCurve(zones[i], core); splitterCurves.Add(newSplitCurve); } if (validCircCurves == 1) { //RhinoApp.WriteLine("Only one option."); splitterCurves.Add(circ[intersects.IndexOf(true)]); } else if (validCircCurves > 1) { //RhinoApp.WriteLine(validCircCurves.ToString() + " options."); splitterCurves.Add(circ[intersectionInterval.IndexOf(intersectionInterval.Max())]); } intersects.Clear(); intersectionInterval.Clear(); } return(splitterCurves); }