static Grasshopper.Kernel.Types.IGH_Goo GooFromReshopperObject(ResthopperObject obj) { if (obj.ResolvedData != null) { return(obj.ResolvedData as Grasshopper.Kernel.Types.IGH_Goo); } string data = obj.Data.Trim('"'); switch (obj.Type) { case "System.Double": { var doubleResult = new Grasshopper.Kernel.Types.GH_Number(double.Parse(data)); obj.ResolvedData = doubleResult; return(doubleResult); } case "System.String": { var stringResult = new Grasshopper.Kernel.Types.GH_String(data); obj.ResolvedData = stringResult; return(stringResult); } case "System.Int32": { var intResult = new Grasshopper.Kernel.Types.GH_Integer(int.Parse(data)); obj.ResolvedData = intResult; return(intResult); } case "Rhino.Geometry.Circle": { var circleResult = new Grasshopper.Kernel.Types.GH_Circle(JsonConvert.DeserializeObject <Circle>(data)); obj.ResolvedData = circleResult; return(circleResult); } case "Rhino.Geometry.Line": { var lineResult = new Grasshopper.Kernel.Types.GH_Line(JsonConvert.DeserializeObject <Line>(data)); obj.ResolvedData = lineResult; return(lineResult); } case "Rhino.Geometry.Point3d": { var pointResult = new Grasshopper.Kernel.Types.GH_Point(JsonConvert.DeserializeObject <Point3d>(data)); obj.ResolvedData = pointResult; return(pointResult); } case "Rhino.Geometry.Vector3d": { var vectorResult = new Grasshopper.Kernel.Types.GH_Vector(JsonConvert.DeserializeObject <Vector3d>(data)); obj.ResolvedData = vectorResult; return(vectorResult); } case "Rhino.Geometry.Brep": case "Rhino.Geometry.Curve": case "Rhino.Geometry.Extrusion": case "Rhino.Geometry.Mesh": case "Rhino.Geometry.PolyCurve": case "Rhino.Geometry.NurbsCurve": case "Rhino.Geometry.PolylineCurve": case "Rhino.Geometry.SubD": { Dictionary <string, string> dict = JsonConvert.DeserializeObject <Dictionary <string, string> >(data); var geometry = Rhino.Runtime.CommonObject.FromJSON(dict); Surface surface = geometry as Surface; if (surface != null) { geometry = surface.ToBrep(); } if (geometry is Brep) { return(new Grasshopper.Kernel.Types.GH_Brep(geometry as Brep)); } if (geometry is Curve) { return(new Grasshopper.Kernel.Types.GH_Curve(geometry as Curve)); } if (geometry is Mesh) { return(new Grasshopper.Kernel.Types.GH_Mesh(geometry as Mesh)); } if (geometry is SubD) { return(new Grasshopper.Kernel.Types.GH_SubD(geometry as SubD)); } } break; } if (obj.Type.StartsWith("Rhino.Geometry")) { var pt = new Rhino.Geometry.Point3d(); string s = pt.GetType().AssemblyQualifiedName; int index = s.IndexOf(","); string sType = $"{obj.Type}{s.Substring(index)}"; System.Type type = System.Type.GetType(sType); if (type != null && typeof(GeometryBase).IsAssignableFrom(type)) { Dictionary <string, string> dict = JsonConvert.DeserializeObject <Dictionary <string, string> >(data); var geometry = Rhino.Runtime.CommonObject.FromJSON(dict); Surface surface = geometry as Surface; if (surface != null) { geometry = surface.ToBrep(); } if (geometry is Brep) { return(new Grasshopper.Kernel.Types.GH_Brep(geometry as Brep)); } if (geometry is Curve) { return(new Grasshopper.Kernel.Types.GH_Curve(geometry as Curve)); } if (geometry is Mesh) { return(new Grasshopper.Kernel.Types.GH_Mesh(geometry as Mesh)); } if (geometry is SubD) { return(new Grasshopper.Kernel.Types.GH_SubD(geometry as SubD)); } } } throw new Exception("unable to convert resthopper data"); }
protected override void SolveInstance(IGH_DataAccess DA) { Grasshopper.Kernel.Data.GH_Structure<DHr> hourTreeIn = new Grasshopper.Kernel.Data.GH_Structure<DHr>(); string key = ""; int subdivs = 0; if ((DA.GetDataTree(0, out hourTreeIn)) && (DA.GetData(1, ref key)) && (DA.GetData(3, ref subdivs))) { Interval ival_overall = new Interval(); if (!DA.GetData(2, ref ival_overall)) { // go thru the given hours and find the max and min value for the given key ival_overall.T0 = MDHr.INVALID_VAL; ival_overall.T1 = MDHr.INVALID_VAL; foreach (DHr dhr in hourTreeIn.AllData(true)) { float val = dhr.val(key); if ((ival_overall.T0 == MDHr.INVALID_VAL) || (val < ival_overall.T0)) ival_overall.T0 = val; if ((ival_overall.T1 == MDHr.INVALID_VAL) || (val > ival_overall.T1)) ival_overall.T1 = val; } } Grasshopper.Kernel.Data.GH_Structure<DHr> hourTreeOut = new Grasshopper.Kernel.Data.GH_Structure<DHr>(); Grasshopper.Kernel.Data.GH_Structure<Grasshopper.Kernel.Types.GH_Integer> freqTreeOut = new Grasshopper.Kernel.Data.GH_Structure<Grasshopper.Kernel.Types.GH_Integer>(); Grasshopper.Kernel.Data.GH_Structure<Grasshopper.Kernel.Types.GH_Interval> ivalTreeOut = new Grasshopper.Kernel.Data.GH_Structure<Grasshopper.Kernel.Types.GH_Interval>(); List<Interval> ivalList = new List<Interval>(); if (ival_overall.IsDecreasing) ival_overall.Swap(); double delta = ival_overall.Length / subdivs; for (int n = 0; n < subdivs; n++) { ivalList.Add(new Interval(ival_overall.T0 + n * delta, ival_overall.T0 + ((n + 1) * delta))); } for (int b = 0; b < hourTreeIn.Branches.Count; b++) { Grasshopper.Kernel.Data.GH_Structure<DHr> hourBranch = new Grasshopper.Kernel.Data.GH_Structure<DHr>(); for (int n = 0; n < subdivs; n++) { hourBranch.EnsurePath(n); } List<int> freqOut = new List<int>(); List<DHr> hrsIn = hourTreeIn.Branches[b]; foreach (DHr dhr in hrsIn) { if (dhr.val(key) < ivalList[0].T0) { hourBranch.Append(dhr, new Grasshopper.Kernel.Data.GH_Path(0)); continue; } if (dhr.val(key) > ivalList[ivalList.Count - 1].T1) { hourBranch.Append(dhr, new Grasshopper.Kernel.Data.GH_Path(ivalList.Count - 1)); continue; } for (int n = 0; n < subdivs; n++) { if (ivalList[n].IncludesParameter(dhr.val(key))) { hourBranch.Append(dhr,new Grasshopper.Kernel.Data.GH_Path(n)); break; } } } for (int bb = 0; bb < hourBranch.Branches.Count; bb++) { Grasshopper.Kernel.Data.GH_Path branch_path = hourTreeIn.Paths[b].AppendElement(bb); hourTreeOut.AppendRange(hourBranch.Branches[bb], branch_path); Grasshopper.Kernel.Types.GH_Integer freq = new Grasshopper.Kernel.Types.GH_Integer(hourBranch.Branches[bb].Count); freqTreeOut.Append(freq, branch_path); Grasshopper.Kernel.Types.GH_Interval ival = new Grasshopper.Kernel.Types.GH_Interval(ivalList[bb]); ivalTreeOut.Append(ival, branch_path); } } hourTreeOut.Simplify(Grasshopper.Kernel.Data.GH_SimplificationMode.CollapseAllOverlaps); freqTreeOut.Simplify(Grasshopper.Kernel.Data.GH_SimplificationMode.CollapseAllOverlaps); ivalTreeOut.Simplify(Grasshopper.Kernel.Data.GH_SimplificationMode.CollapseAllOverlaps); DA.SetDataTree(0, freqTreeOut); DA.SetDataTree(1, ivalTreeOut); DA.SetDataTree(2, hourTreeOut); } }