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); }
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"); }
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); }
/// <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}"); } }
/// <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}"); } }