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");
        }
示例#2
0
        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);
            }
        }