Ejemplo n.º 1
0
        private Grasshopper.Kernel.Data.GH_Structure <Grasshopper.Kernel.Types.GH_Point> FromListToTree(List <List <Point3d> > points)
        {
            Grasshopper.Kernel.Data.GH_Structure <Grasshopper.Kernel.Types.GH_Point> new_points = new Grasshopper.Kernel.Data.GH_Structure <Grasshopper.Kernel.Types.GH_Point>();

            for (int i = 0; i < points.Count; i++)
            {
                for (int j = 0; j < points[i].Count; j++)
                {
                    Grasshopper.Kernel.Types.GH_Point pt = new Grasshopper.Kernel.Types.GH_Point();
                    pt.Value = points[i][j];
                    new_points.Append(pt, new Grasshopper.Kernel.Data.GH_Path(i));
                }
            }
            return(new_points);
        }
Ejemplo n.º 2
0
        public static bool TryGetElectricNodes(IGH_DataAccess DA, Graph.GeometryGraph graph, Grasshopper.Kernel.Types.GH_Point elecSource, List <Grasshopper.Kernel.Types.GH_Point> elecTargets, out Node elecSourceNode, out HashSet <Node> elecTargetNodes)
        {
            elecTargetNodes = new HashSet <Node>();
            if (!graph.TryGetNode(elecSource.Value, out elecSourceNode))
            {
                return(false);
            }

            foreach (var tar in elecTargets)
            {
                if (!graph.TryGetNode(tar.Value, out var elecTargetNode))
                {
                    return(false);
                }
                else
                {
                    elecTargetNodes.Add(elecTargetNode);
                }
            }

            return(true);
        }
        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");
        }
Ejemplo n.º 4
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Boolean reset = false;

            DA.GetData(0, ref reset);
            if (!reset)
            {
                this.counter = 0;
                return;
            }

            List <Grasshopper.Kernel.Types.IGH_GeometricGoo> Geometries = new List <Grasshopper.Kernel.Types.IGH_GeometricGoo>();
            GeometryBase geo = null;

            var    Materials = new List <Rhino.DocObjects.Material>();
            string directory = string.Empty;

            DA.GetDataList(1, Geometries);
            DA.GetDataList(2, Materials);
            DA.GetData(3, ref directory);

            RhinoDoc doc        = RhinoDoc.ActiveDoc;
            int      layerIndex = doc.Layers.Add("__temp__", Color.Black);

            int         indexGeo = 0, indexMat = 0, n = 0;
            List <Guid> Ids = new List <Guid>();
            bool        flag1 = true, flag2 = true;

            while (flag1 || flag2)
            {
                var attr = new Rhino.DocObjects.ObjectAttributes();
                Materials[indexMat].Name = "__temp__" + n.ToString();
                int materialIndex = doc.Materials.Add(Materials[indexMat]);

                attr.LayerIndex     = layerIndex;
                attr.ColorSource    = Rhino.DocObjects.ObjectColorSource.ColorFromObject;
                attr.ObjectColor    = Materials[indexMat].DiffuseColor;
                attr.MaterialIndex  = materialIndex;
                attr.MaterialSource = Rhino.DocObjects.ObjectMaterialSource.MaterialFromObject;

                Guid id;
                if (Geometries[indexGeo].CastTo <GeometryBase>(out geo))
                {
                    id = doc.Objects.Add(geo, attr);
                    Ids.Add(id);
                }
                else
                {
                    Grasshopper.Kernel.Types.GH_Point p = Geometries[indexGeo] as Grasshopper.Kernel.Types.GH_Point;
                    id = doc.Objects.Add(new Rhino.Geometry.Point(p.Value), attr);
                    Ids.Add(id);
                }

                if (indexGeo < Geometries.Count - 1)
                {
                    indexGeo += 1;
                }
                else
                {
                    flag1 = false;
                }
                if (indexMat < Materials.Count - 1)
                {
                    indexMat += 1;
                }
                else
                {
                    flag2 = false;
                }
                n += 1;
            }

            GH_Document ghDoc               = Grasshopper.Instances.ActiveCanvas.Document;
            var         originalPreviewMode = ghDoc.PreviewMode;

            ghDoc.PreviewMode = GH_PreviewMode.Disabled;
            doc.Views.Redraw();

            Bitmap bitmap = doc.Views.ActiveView.CaptureToBitmap();

            bitmap.Save(directory + counter.ToString("D5") + ".jpg");
            this.counter += 1;

            ghDoc.PreviewMode = originalPreviewMode;

            foreach (var id in Ids)
            {
                doc.Objects.Delete(id, true);
            }
            for (int i = 0; i < n; i++)
            {
                doc.Materials.DeleteAt(doc.Materials.Count - 1);
            }
            doc.Layers.Delete(layerIndex, true);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            try
            {
                var floors   = new List <Line>();
                var walls    = new List <Line>();
                var ceilings = new List <Line>();

                var elecTargets = new List <Grasshopper.Kernel.Types.GH_Point>();
                var elecSource  = new Grasshopper.Kernel.Types.GH_Point();
                var type        = 0;

                if (!DA.GetDataList(0, floors))
                {
                    return;
                }

                if (!DA.GetDataList(1, walls))
                {
                    return;
                }

                if (!DA.GetDataList(2, ceilings))
                {
                    return;
                }

                if (!DA.GetDataList(3, elecTargets))
                {
                    return;
                }

                if (!DA.GetData(4, ref elecSource))
                {
                    return;
                }

                if (!DA.GetData(5, ref type))
                {
                    return;
                }

                //build the graph along with a geometry -> edge/node map
                var graph = new GeometryGraph(floors, 1.0, walls, 1.0, ceilings, 1.0);

                //get the corresponding node for the electric source
                if (!PathFindUtil.TryGetElectricNodes(DA, graph, elecSource, elecTargets, out var elecSourceNode, out var elecTargetNodes))
                {
                    DA.SetDataList(0, null);
                    DA.SetData(1, "Failed to find source on graph");
                }

                //find the shortest pats
                var fpt = FindPathType.Dijkstra;
                switch (type)
                {
                case 1:
                    fpt = FindPathType.Bellman;
                    break;

                case 2:
                    fpt = FindPathType.AStar;
                    break;

                default:
                    fpt = FindPathType.Dijkstra;
                    break;
                }
                var res = graph.SolvePathFind(fpt, elecSourceNode, elecTargetNodes);

                //build the data tree with all of the paths
                var tree = PathFindUtil.BuildTree(res);

                DA.SetDataTree(0, tree);
                DA.SetData(1, "Success!");
            }
            catch (Exception x)
            {
                DA.SetDataList(0, null);
                DA.SetData(1, $"M: {x.Message} - S: {x.StackTrace}");
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            try
            {
                //Extract the parameter data
                var floors   = new List <Line>();
                var walls    = new List <Line>();
                var ceilings = new List <Line>();

                var elecTargets = new List <Grasshopper.Kernel.Types.GH_Point>();
                var elecSource  = new Grasshopper.Kernel.Types.GH_Point();

                var floorMulti   = 0.0;
                var wallMulti    = 0.0;
                var ceilingMulti = 0.0;

                if (!DA.GetDataList(0, floors))
                {
                    return;
                }

                if (!DA.GetDataList(1, walls))
                {
                    return;
                }

                if (!DA.GetDataList(2, ceilings))
                {
                    return;
                }

                if (!DA.GetDataList(3, elecTargets))
                {
                    return;
                }

                if (!DA.GetData(4, ref elecSource))
                {
                    return;
                }

                if (!DA.GetData(5, ref floorMulti))
                {
                    return;
                }

                if (!DA.GetData(6, ref wallMulti))
                {
                    return;
                }

                if (!DA.GetData(7, ref ceilingMulti))
                {
                    return;
                }

                //build the graph along with a geometry -> edge/node map
                var graph = new GeometryGraph(floors, floorMulti, walls, wallMulti, ceilings, ceilingMulti);

                //get the corresponding node for the electric source
                if (!PathFindUtil.TryGetElectricNodes(DA, graph, elecSource, elecTargets, out var elecSourceNode, out var elecTargetNodes))
                {
                    DA.SetDataList(0, null);
                    DA.SetData(1, "Failed to find source on graph");
                }

                //find the shortest pats
                var res = graph.SolvePathFind(FindPathType.AStar, elecSourceNode, elecTargetNodes);

                //build the data tree with all of the paths
                var tree = PathFindUtil.BuildTree(res);

                DA.SetDataTree(0, tree);
                DA.SetData(1, "Success!");
            }
            catch (Exception x)
            {
                DA.SetDataList(0, null);
                DA.SetData(1, $"M: {x.Message} - S: {x.StackTrace}");
            }
        }