diff --git a/src/Ironbug.Grasshopper/Classes/Helper.cs b/src/Ironbug.Grasshopper/Classes/Helper.cs index 08ee4d8f..24bfa875 100644 --- a/src/Ironbug.Grasshopper/Classes/Helper.cs +++ b/src/Ironbug.Grasshopper/Classes/Helper.cs @@ -1,4 +1,5 @@ using Grasshopper.Kernel.Types; +using Rhino.Geometry; using System.Collections.Generic; using System.Linq; @@ -83,6 +84,60 @@ public static string GetRoomName(object HBObj) } + public static Point3d GetRoomCenter(object HBObj) + { + if (HBObj is null) + throw new System.ArgumentException("Invalid Room object!"); + + if (HBObj is Types.OsZone z) + { + return VolumeMassProperties.Compute(z.Value).Centroid; + } + else if (HBObj is GH_Brep b) + { + // Legacy HBZones + throw new System.ArgumentException("Ironbug doesn't support HBZones from the legacy version anymore!"); + } + else if (HBObj is GH_ObjectWrapper wrapper) + { + + var pyObj = wrapper.Value; + if (pyObj is Ironbug.HVAC.BaseClass.IB_ThermalZone) + throw new System.ArgumentException("Invalid Room object!"); + + // LBT Room + var isPythonObj = pyObj.GetType().ToString().StartsWith("IronPython."); + if (!isPythonObj) + throw new System.ArgumentException("Invalid Room object!"); + + var name = pyObj.ToString(); + var isLBTRoom = name.StartsWith("Room:"); + var isDFRoom2D = name.StartsWith("Room2D:"); + + if (isLBTRoom || isDFRoom2D) + return GetLBTRoomCenter(pyObj); + + + } + else if (HBObj.GetType().Name == "GH_HBPythonObjectGoo") //Pollination Honeybee components + { + var rm = HBObj; + var tp = HBObj?.GetType(); + var type = tp?.GetProperty("POTypeName")?.GetValue(rm)?.ToString(); + + if (type == "Room") + { + var pyObj = tp.GetProperty("RefPythonObj")?.GetValue(rm); + return GetLBTRoomCenter(pyObj); + } + } + + + throw new System.ArgumentException("Invalid Room object!"); + + } + + public static int[] GetDateRange(object LBObj) { if (LBObj is null) @@ -101,6 +156,7 @@ public static int[] GetDateRange(object LBObj) throw new System.ArgumentException("Failed to convert LB Analysis Period!"); } + /// For new Honeybee static string GetLBTRoomName(object lbtRoom) { @@ -132,6 +188,23 @@ public static IEnumerable FromLBTRooms(IEnumerable inRooms) return zoneIds; } + public static Point3d GetLBTRoomCenter(object lbtRoom) + { + var pyRun = GetPython(); + pyRun.SetVariable("HBRoom", lbtRoom); + string pyScript = @" +xyz = HBRoom.geometry.center.to_array() +"; + pyRun.ExecuteScript(pyScript); + var list = pyRun.GetVariable("xyz") as IList; + if (list == null || list.Count() != 3) + throw new System.ArgumentException("Invalid Honeybee Room object"); + var xyz = list.OfType().ToArray(); + var p = new Point3d(xyz[0], xyz[1], xyz[2]); + return p; + + } + static int[] GetLBTDateRange(object lbtAnalysisPeriod) { var pyRun = GetPython(); @@ -144,6 +217,7 @@ static int[] GetLBTDateRange(object lbtAnalysisPeriod) var dateRange = pyobj.OfType().ToArray(); return dateRange; } + /// For legacy Honeybee public static IEnumerable CallFromHBHive(IEnumerable inBreps) { diff --git a/src/Ironbug.Grasshopper/Component/Ironbug/BaseClasses/Ironbug_ZonePicker.cs b/src/Ironbug.Grasshopper/Component/Ironbug/BaseClasses/Ironbug_ZonePicker.cs index 5a343427..afdde21b 100644 --- a/src/Ironbug.Grasshopper/Component/Ironbug/BaseClasses/Ironbug_ZonePicker.cs +++ b/src/Ironbug.Grasshopper/Component/Ironbug/BaseClasses/Ironbug_ZonePicker.cs @@ -24,33 +24,34 @@ public Ironbug_ZonePicker() protected override void RegisterInputParams(GH_InputParamManager pManager) { - pManager.AddBrepParameter("Zones", "_zones", "objects to be picked", GH_ParamAccess.list); + pManager.AddGenericParameter("Zones", "_zones", "objects to be picked", GH_ParamAccess.list); pManager[pManager.AddBrepParameter("Scopes", "scopes", "Scope breps for picking zone breps based on its centroid location.", GH_ParamAccess.list)].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) { - pManager.AddBrepParameter("Selected Zones", "zones", "Picked objects", GH_ParamAccess.list); - pManager.AddBrepParameter("Unselected Zones", "unSelected", "Unselected objects", GH_ParamAccess.list); - (pManager[1] as GH.Kernel.Parameters.Param_Brep).Hidden = true; + pManager.AddGenericParameter("Selected Zones", "zones", "Picked objects", GH_ParamAccess.list); + pManager.AddGenericParameter("Unselected Zones", "unSelected", "Unselected objects", GH_ParamAccess.list); } - List AllInputBreps = new List(); + List<(object room, Point3d centroid)> AllInputBreps = new List<(object, Point3d)>(); protected override void SolveInstance(IGH_DataAccess DA) { - var allBps = new List(); + var allBps = new List(); if (!DA.GetDataList(0, allBps)) return; - AllInputBreps = allBps; + + var cs = allBps.Select(_=> ( room : _, centroid : Helper.GetRoomCenter(_) )).ToList(); + AllInputBreps = cs; var nodes = new List(); DA.GetDataList(1, nodes); - var unselectedZones = new List(); + var unselectedZones = new List(); if (nodes.Count > 0) { - var selectedZs = GetZoneFromNode(allBps, nodes, out unselectedZones); + var selectedZs = GetZoneFromNode(cs, nodes, out unselectedZones); DA.SetDataList(0, selectedZs); } else @@ -62,18 +63,21 @@ protected override void SolveInstance(IGH_DataAccess DA) } - private static List GetZoneFromNode(List allBps, IEnumerable outBx, out List Unselected) + private static List GetZoneFromNode(List<(object room, Point3d centroid)> allBps, IEnumerable outBx, out List Unselected) { - var selectedZones = new List(); - var unselectedZones = new List(); + var selectedZones = new List(); + var unselectedZones = new List(); - var inputBrpsCenterPts = allBps.AsParallel().AsOrdered().Select(_ => VolumeMassProperties.Compute(_.Value).Centroid); var num = 0; - foreach (var pt in inputBrpsCenterPts) + foreach (var rmC in allBps) { - var isSel = outBx.AsParallel().FirstOrDefault(_ => _.Value.IsPointInside(pt,0.0001,true)) != null; - var currentItem = allBps[num]; + var c = rmC.centroid; + if (c == Point3d.Unset) + continue; + + var isSel = outBx.AsParallel().FirstOrDefault(_ => _.Value.IsPointInside(c,0.0001,true)) != null; + var currentItem = allBps[num].room; if (isSel) { selectedZones.Add(currentItem); @@ -104,14 +108,10 @@ private void PickZones() var allBps = this.AllInputBreps; - if (!allBps.Any()) - { - return; - } - var zParm = this.Params.Input[0] as GH.Kernel.Parameters.Param_Brep; - zParm.Hidden = false; + if (!allBps.Any()) return; + var nodeIds = new List(); - var centers = allBps.AsParallel().Select(_ => VolumeMassProperties.Compute(_.Value).Centroid); + var centers = allBps.Select(_ => _.centroid); foreach (var item in centers) { @@ -145,14 +145,12 @@ private void PickZones() foreach (var item in pickedZoneNodes) { item.LoadGeometry(doc); - } doc.Objects.Delete(nodeIds, true); //var nds = pickedZoneNodes.Select(_ => new GH_Brep( GenZoneNode(_.Boundingbox.Center))); var nds = pickedZoneNodes.Select(_ => new GH_Brep(GenZoneNode(_.Boundingbox.Center).ToBrep())); - scopeParm.SetPersistentData(nds); ExpireSolution(true);