private void DrawGeometryObject(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { if (obj == null) { return; } if (obj is XYZ) { DrawXyz(node, obj, tag, rd, octree); } if (obj is Curve) { DrawCurve(node, obj, tag, rd, octree); } else if (obj is Solid) { DrawSolid(node, obj, tag, rd, octree); } else if (obj is Face) { DrawFace(node, obj, rd, octree); } else { DrawUndrawable(node, obj, rd, octree); } }
private void DrawFace(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var face = obj as Face; if (face == null) { return; } var mesh = face.Triangulate(0.2); if (mesh == null) { Debug.WriteLine("Mesh could not be computed from face."); return; } if (node.IsSelected) { rd.SelectedMeshes.Add(RevitMeshToHelixMesh(mesh, octree, node)); } else { rd.Meshes.Add(RevitMeshToHelixMesh(mesh, octree, node)); } }
private void DrawXyz(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var point = obj as XYZ; if (point == null) { return; } var pt = new Point3D(point.X, point.Y, point.Z); if (node.IsSelected) { rd.SelectedPoints.Add(pt); } else { rd.Points.Add(pt); } if (node.DisplayLabels) { rd.Text.Add(new BillboardTextItem { Text = tag, Position = pt }); } }
private void DrawTransform(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var t = obj as Transform; if (t == null) { return; } var origin = new Point3D(t.Origin.X, t.Origin.Y, t.Origin.Z); XYZ x1 = t.Origin + t.BasisX.Normalize(); XYZ y1 = t.Origin + t.BasisY.Normalize(); XYZ z1 = t.Origin + t.BasisZ.Normalize(); var xEnd = new Point3D(x1.X, x1.Y, x1.Z); var yEnd = new Point3D(y1.X, y1.Y, y1.Z); var zEnd = new Point3D(z1.X, z1.Y, z1.Z); rd.XAxisPoints.Add(origin); rd.XAxisPoints.Add(xEnd); rd.YAxisPoints.Add(origin); rd.YAxisPoints.Add(yEnd); rd.ZAxisPoints.Add(origin); rd.ZAxisPoints.Add(zEnd); }
private void DrawCurve(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var curve = obj as Curve; if (curve == null) { return; } IList <XYZ> points = curve.Tessellate(); bool selected = node.IsSelected; for (int i = 0; i < points.Count; ++i) { XYZ xyz = points[i]; rd.Lines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z)); if (i == 0 || i == (points.Count - 1)) { continue; } if (selected) { rd.SelectedLines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z)); } else { rd.Lines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z)); } } }
private void DrawTriangleFace(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var face = obj as TriangleFace; if (face == null) { return; } var builder = new MeshBuilder(); builder.Positions.Add(face.Vertices[1].ToPoint3D()); builder.Positions.Add(face.Vertices[0].ToPoint3D()); builder.Positions.Add(face.Vertices[2].ToPoint3D()); builder.TriangleIndices.Add(builder.Positions.Count - 1); builder.TriangleIndices.Add(builder.Positions.Count - 2); builder.TriangleIndices.Add(builder.Positions.Count - 3); builder.TextureCoordinates.Add(new System.Windows.Point(0, 0)); builder.TextureCoordinates.Add(new System.Windows.Point(0, 0)); builder.TextureCoordinates.Add(new System.Windows.Point(0, 0)); if (node.IsSelected) { rd.SelectedMeshes.Add(builder.ToMesh(true)); } else { rd.Meshes.Add(builder.ToMesh(true)); } }
/// <summary> /// Aggregates all upstream geometry for the given node then sends /// a message that a visualization is ready /// </summary> /// <param name="node">The node whose upstream geometry you need.</param> /// <returns>A render description containing all upstream geometry.</returns> public void RenderUpstream(NodeModel node) { var rd = new RenderDescription(); //send back just what the node needs var watch = new Stopwatch(); watch.Start(); if (node == null) { //send back everything rd = AggregateRenderDescriptions(); OnResultsReadyToVisualize(this, new VisualizationEventArgs(rd, string.Empty)); } else { //send back renderables for the branch var drawables = GetUpstreamDrawableIds(node.Inputs); var ids = from viz in dynSettings.Controller.VisualizationManager.Visualizations where drawables.Contains(viz.Key) select viz; var keyValuePairs = ids as KeyValuePair <string, RenderDescription>[] ?? ids.ToArray(); var pts = keyValuePairs.SelectMany(x => x.Value.Points); var lines = keyValuePairs.SelectMany(x => x.Value.Lines); var meshes = keyValuePairs.SelectMany(x => x.Value.Meshes); var xs = keyValuePairs.SelectMany(x => x.Value.XAxisPoints); var ys = keyValuePairs.SelectMany(x => x.Value.YAxisPoints); var zs = keyValuePairs.SelectMany(x => x.Value.ZAxisPoints); var pts_sel = keyValuePairs.SelectMany(x => x.Value.SelectedPoints); var lines_sel = keyValuePairs.SelectMany(x => x.Value.SelectedLines); var mesh_sel = keyValuePairs.SelectMany(x => x.Value.SelectedMeshes); rd.Points.AddRange(pts); rd.Lines.AddRange(lines); rd.Meshes.AddRange(meshes); rd.XAxisPoints.AddRange(xs); rd.YAxisPoints.AddRange(ys); rd.ZAxisPoints.AddRange(zs); rd.SelectedPoints.AddRange(pts_sel); rd.SelectedLines.AddRange(lines_sel); rd.SelectedMeshes.AddRange(mesh_sel); OnResultsReadyToVisualize(this, new VisualizationEventArgs(rd, node.GUID.ToString())); } watch.Stop(); Debug.WriteLine(String.Format("{0} ellapsed for aggregating geometry for watch.", watch.Elapsed)); //LogVisualizationUpdateData(rd, watch.Elapsed.ToString()); }
private void DrawFacet(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var facet = obj as Facet; if (facet == null) { return; } var builder = new MeshBuilder(); var points = new Point3DCollection(); var tex = new PointCollection(); var norms = new Vector3DCollection(); var tris = new List <int>(); var a = facet.Points[0]; var b = facet.Points[1]; var c = facet.Points[2]; var side1 = (b - a).Normalize(); var side2 = (c - a).Normalize(); var norm = side1.CrossProduct(side2); int count = 0; foreach (var pt in facet.Points) { points.Add(new Point3D(pt.X, pt.Y, pt.Z)); tex.Add(new System.Windows.Point(0, 0)); tris.Add(count); norms.Add(new Vector3D(norm.X, norm.Y, norm.Z)); count++; } builder.Append(points, tris, norms, tex); if (node.IsSelected) { rd.SelectedMeshes.Add(builder.ToMesh(true)); } else { rd.Meshes.Add(builder.ToMesh(true)); } if (node.DisplayLabels) { var cp = (a + b + c) / 3; rd.Text.Add(new BillboardTextItem { Text = tag, Position = new Point3D(cp.X, cp.Y, cp.Z) }); } }
private void DrawForm(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var form = obj as Form; if (form == null) { return; } DrawGeometryElement(node, form.get_Geometry(new Options()), tag, rd, octree); }
private void DrawCurveElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var elem = obj as CurveElement; if (elem == null) { return; } DrawCurve(node, elem.GeometryCurve, tag, rd, octree); }
internal void VisualizeGeometry(NodeModel node, object geom, string tag, RenderDescription rd) { var t = geom.GetType(); var viz = Visualizers.FirstOrDefault(x => x.Key == t || x.Key.IsAssignableFrom(t)); //draw what's in the container if (viz.Value != null) { viz.Value.Invoke(node, geom, tag, rd, octree); } }
private void DrawCurveLoop(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var cl = obj as Autodesk.Revit.DB.CurveLoop; if (cl == null) { return; } foreach (var crv in cl) { DrawCurve(node, crv, tag, rd, octree); } }
private void DrawGeometryElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { try { var gelem = obj as GeometryElement; foreach (GeometryObject go in gelem) { DrawGeometryObject(node, go, tag, rd, octree); } } catch (Exception ex) { DynamoLogger.Instance.Log(ex.Message); DynamoLogger.Instance.Log(ex.StackTrace); } }
private void DrawParticleSystem(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var ps = obj as ParticleSystem; if (ps == null) { return; } for (int i = 0; i < ps.numberOfParticles(); i++) { Particle p = ps.getParticle(i); XYZ pos = p.getPosition(); if (i < rd.Points.Count) { rd.Points[i] = new Point3D(pos.X, pos.Y, pos.Z); } else { var pt = new Point3D(pos.X, pos.Y, pos.Z); rd.Points.Add(pt); } } for (int i = 0; i < ps.numberOfSprings(); i++) { ParticleSpring spring = ps.getSpring(i); XYZ pos1 = spring.getOneEnd().getPosition(); XYZ pos2 = spring.getTheOtherEnd().getPosition(); if (i * 2 + 1 < rd.Lines.Count) { rd.Lines[i * 2] = new Point3D(pos1.X, pos1.Y, pos1.Z); rd.Lines[i * 2 + 1] = new Point3D(pos2.X, pos2.Y, pos2.Z); } else { var pt1 = new Point3D(pos1.X, pos1.Y, pos1.Z); var pt2 = new Point3D(pos2.X, pos2.Y, pos2.Z); rd.Lines.Add(pt1); rd.Lines.Add(pt2); } } }
private void DrawXyz(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var point = obj as XYZ; if (point == null) { return; } if (node.IsSelected) { rd.SelectedPoints.Add(new Point3D(point.X, point.Y, point.Z)); } else { rd.Points.Add(new Point3D(point.X, point.Y, point.Z)); } }
/// <summary> /// Log visualization update timing and geometry data. /// </summary> /// <param name="rd">The aggregated render description for the model.</param> /// <param name="ellapsedTime">The ellapsed time of visualization as a string.</param> protected void LogVisualizationUpdateData(RenderDescription rd, string ellapsedTime) { var renderDict = new Dictionary <string, object>(); renderDict["points"] = rd.Points.Count; renderDict["line_segments"] = rd.Lines.Count / 2; renderDict["mesh_facets"] = rd.Meshes.Any() ? rd.Meshes.Select(x => x.TriangleIndices.Count / 3).Aggregate((a, b) => a + b) : 0; renderDict["time"] = ellapsedTime; renderDict["manager_type"] = this.GetType().ToString(); var renderData = JsonConvert.SerializeObject(renderDict); InstrumentationLogger.LogInfo("Perf-Latency-RenderGeometryGeneration", renderData); //Debug.WriteLine(renderData); }
private void DrawElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { if (obj == null) { return; } if (obj is CurveElement) { DrawCurveElement(node, obj, tag, rd, octree); } else if (obj is ReferencePoint) { DrawReferencePoint(node, obj, rd, octree); } else if (obj is Form) { DrawForm(node, obj, tag, rd, octree); } else if (obj is GeometryElement) { DrawGeometryElement(node, obj, tag, rd, octree); } else if (obj is GeometryObject) { DrawGeometryObject(node, obj, tag, rd, octree); } else { var elem = obj as Element; if (elem != null) { var o = new Options { DetailLevel = ViewDetailLevel.Medium }; GeometryElement geom = elem.get_Geometry(o); if (geom != null) { DrawGeometryObject(node, geom, tag, rd, octree); } } } }
public RenderDescription AggregateRenderDescriptions() { var descriptions = Visualizations.Values; var rd = new RenderDescription { Points = descriptions.SelectMany(x => x.Points).ToThreadSafeList(), Lines = descriptions.SelectMany(x => x.Lines).ToThreadSafeList(), SelectedPoints = descriptions.SelectMany(x => x.SelectedPoints).ToThreadSafeList(), SelectedLines = descriptions.SelectMany(x => x.SelectedLines).ToThreadSafeList(), XAxisPoints = descriptions.SelectMany(x => x.XAxisPoints).ToThreadSafeList(), YAxisPoints = descriptions.SelectMany(x => x.YAxisPoints).ToThreadSafeList(), ZAxisPoints = descriptions.SelectMany(x => x.ZAxisPoints).ToThreadSafeList(), Meshes = descriptions.SelectMany(x => x.Meshes).ToThreadSafeList(), SelectedMeshes = descriptions.SelectMany(x => x.SelectedMeshes).ToThreadSafeList() }; return(rd); }
private void DrawSolid(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var solid = obj as Solid; if (solid == null) { return; } foreach (Face f in solid.Faces) { DrawFace(node, f, rd, octree); } foreach (Edge edge in solid.Edges) { DrawCurve(node, edge.AsCurve(), tag, rd, octree); } }
private void DrawCurve(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var curve = obj as Curve; if (curve == null) { return; } IList <XYZ> points = curve.Tessellate(); bool selected = node.IsSelected; for (int i = 0; i < points.Count - 1; ++i) { XYZ start = points[i]; XYZ end = points[i + 1]; var startPt = new Point3D(start.X, start.Y, start.Z); var endPt = new Point3D(end.X, end.Y, end.Z); //draw a label at the start of the curve if (node.DisplayLabels && i == 0) { rd.Text.Add(new BillboardTextItem { Text = tag, Position = startPt }); } if (selected) { rd.SelectedLines.Add(startPt); rd.SelectedLines.Add(endPt); } else { rd.Lines.Add(startPt); rd.Lines.Add(endPt); } } }
private void DrawReferencePoint(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var point = obj as ReferencePoint; if (point == null) { return; } if (node.IsSelected) { rd.SelectedPoints.Add(new Point3D(point.GetCoordinateSystem().Origin.X, point.GetCoordinateSystem().Origin.Y, point.GetCoordinateSystem().Origin.Z)); } else { rd.Points.Add(new Point3D(point.GetCoordinateSystem().Origin.X, point.GetCoordinateSystem().Origin.Y, point.GetCoordinateSystem().Origin.Z)); } }
private void DrawContainers(Value val, RenderDescription rd) { if (val.IsList) { foreach (Value v in ((Value.List)val).Item) { DrawContainers(v, rd); } } if (val.IsContainer) { var drawable = ((Value.Container)val).Item; if (drawable is XYZ) { dynRevitTransactionNode.DrawXYZ(rd, drawable); } else if (drawable is GeometryObject) { dynRevitTransactionNode.DrawGeometryObject(rd, drawable); } } }
public VisualizationEventArgs(RenderDescription description, string viewId) { Description = description; Id = viewId; }
public static void DrawLibGGraphicItem(NodeModel node, object geom, RenderDescription rd, Octree.OctreeSearch.Octree octree) { var selected = DynamoSelection.Instance.Selection.Contains(node); var g = geom as GraphicItem; if (g is CoordinateSystem) { #region draw coordinate systems var line_strip_vertices = g.line_strip_vertices_threadsafe(); for (int i = 0; i < line_strip_vertices.Count; i += 6) { var p1 = new Point3D( line_strip_vertices[i], line_strip_vertices[i + 1], line_strip_vertices[i + 2]); var p2 = new Point3D( line_strip_vertices[i + 3], line_strip_vertices[i + 4], line_strip_vertices[i + 5]); if (i < 6) { rd.XAxisPoints.Add(p1); rd.XAxisPoints.Add(p2); } else if (i >= 6 && i < 12) { rd.YAxisPoints.Add(p1); rd.YAxisPoints.Add(p2); } else { rd.ZAxisPoints.Add(p1); rd.ZAxisPoints.Add(p2); } } #endregion } else { #region draw points var point_vertices = g.point_vertices_threadsafe(); for (int i = 0; i < point_vertices.Count; i += 3) { if (selected) { rd.SelectedPoints.Add(new Point3D(point_vertices[i], point_vertices[i + 1], point_vertices[i + 2])); } else { rd.Points.Add(new Point3D(point_vertices[i], point_vertices[i + 1], point_vertices[i + 2])); } } #endregion #region draw lines SizeTList num_line_strip_vertices = g.num_line_strip_vertices_threadsafe(); FloatList line_strip_vertices = g.line_strip_vertices_threadsafe(); int counter = 0; foreach (uint num_verts in num_line_strip_vertices) { for (int i = 0; i < num_verts; ++i) { var p = new Point3D( line_strip_vertices[counter], line_strip_vertices[counter + 1], line_strip_vertices[counter + 2]); if (selected) { rd.SelectedLines.Add(p); } else { rd.Lines.Add(p); } counter += 3; if (i == 0 || i == num_verts - 1) { continue; } if (selected) { rd.SelectedLines.Add(p); } else { rd.Lines.Add(p); } } } #endregion #region draw surface //var sw = new Stopwatch(); //sw.Start(); var builder = new MeshBuilder(); var points = new Point3DCollection(); var tex = new PointCollection(); var norms = new Vector3DCollection(); var tris = new List <int>(); FloatList triangle_vertices = g.triangle_vertices_threadsafe(); FloatList triangle_normals = g.triangle_normals_threadsafe(); for (int i = 0; i < triangle_vertices.Count; i += 3) { var new_point = new Point3D(triangle_vertices[i], triangle_vertices[i + 1], triangle_vertices[i + 2]); var normal = new Vector3D(triangle_normals[i], triangle_normals[i + 1], triangle_normals[i + 2]); //find a matching point //compare the angle between the normals //to discern a 'break' angle for adjacent faces //int foundIndex = -1; //for (int j = 0; j < points.Count; j++) //{ // var testPt = points[j]; // var testNorm = norms[j]; // var ang = Vector3D.AngleBetween(normal, testNorm); // if (new_point.X == testPt.X && // new_point.Y == testPt.Y && // new_point.Z == testPt.Z && // ang > 90.0000) // { // foundIndex = j; // break; // } //} //if (foundIndex != -1) //{ // tris.Add(foundIndex); // continue; //} tris.Add(points.Count); points.Add(new_point); norms.Add(normal); tex.Add(new System.Windows.Point(0, 0)); octree.AddNode(new_point.X, new_point.Y, new_point.Z, node.GUID.ToString()); } //builder.AddTriangles(points, norms, tex); builder.Append(points, tris, norms, tex); //sw.Stop(); //Debug.WriteLine(string.Format("{0} elapsed for drawing geometry.", sw.Elapsed)); //don't add empty meshes if (builder.Positions.Count > 0) { if (selected) { rd.SelectedMeshes.Add(builder.ToMesh(true)); } else { rd.Meshes.Add(builder.ToMesh(true)); } } #endregion } }
public Visualization() { RequiresUpdate = false; Description = new RenderDescription(); Geometry = new List <object>(); }
private void DrawUndrawable(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree) { //TODO: write a message, throw an exception, draw a question mark }
void DrawPython(Value val, RenderDescription rd) { DrawContainers(val, rd); }