private RenderPackage PackageRenderData(IGraphicItem gItem) { var renderPackage = new RenderPackage(); gItem.Tessellate(renderPackage, -1.0, this.watch3dModel.ViewModel.VisualizationManager.MaxTesselationDivisions); renderPackage.ItemsCount++; return(renderPackage); }
protected override void HandleTaskExecutionCore() { if (nodeGuid == Guid.Empty) { throw new InvalidOperationException( "UpdateRenderPackageAsyncTask.Initialize not called"); } var data = from varName in drawableIds select engineController.GetMirror(varName) into mirror where mirror != null select mirror.GetData(); var labelMap = new List <string>(); foreach (var mirrorData in data) { AddToLabelMap(mirrorData, labelMap, previewIdentifierName); } int count = 0; foreach (var drawableId in drawableIds) { var graphItems = engineController.GetGraphicItems(drawableId); if (graphItems == null) { continue; } foreach (var graphicItem in graphItems) { var package = new RenderPackage(isNodeSelected, displayLabels) { Tag = labelMap.Count > count ? labelMap[count] : "?", }; try { graphicItem.Tessellate(package, tol: -1.0, maxGridLines: maxTesselationDivisions); } catch (Exception e) { System.Diagnostics.Debug.WriteLine( "PushGraphicItemIntoPackage: " + e); } package.ItemsCount++; renderPackages.Add(package); count++; } } }
private void ConvertMeshes(RenderPackage p, ICollection <Point3D> points, ICollection <Vector3D> norms, ICollection <int> tris) { for (int i = 0; i < p.TriangleVertices.Count; i += 3) { var new_point = new Point3D(p.TriangleVertices[i], p.TriangleVertices[i + 1], p.TriangleVertices[i + 2]); var normal = new Vector3D(p.TriangleNormals[i], p.TriangleNormals[i + 1], p.TriangleNormals[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); } if (tris.Count > 0) { MeshCount++; } }
private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, ref List <string> labelMap, ref int count) { if (mirrorData.IsNull) { return; } if (mirrorData.IsCollection) { foreach (var el in mirrorData.GetElements()) { GetRenderPackagesFromMirrorData(el, ref labelMap, ref count); } } else { var graphicItem = mirrorData.Data as IGraphicItem; if (graphicItem == null) { return; } var package = new RenderPackage(isNodeSelected, displayLabels) { Tag = labelMap.Count > count ? labelMap[count] : "?", }; try { graphicItem.Tessellate( package, tol: -1.0, maxGridLines: maxTesselationDivisions); } catch (Exception e) { System.Diagnostics.Debug.WriteLine( "PushGraphicItemIntoPackage: " + e); } package.ItemsCount++; renderPackages.Add(package); count++; } }
public static IList <GeometryObject> ToRevitType(this Autodesk.DesignScript.Geometry.Surface srf, bool performHostUnitConversion = true) { var rp = new RenderPackage(); if (performHostUnitConversion) { var newSrf = srf.InHostUnits(); newSrf.Tessellate(rp); newSrf.Dispose(); } else { srf.Tessellate(rp); } var tsb = new TessellatedShapeBuilder(); tsb.OpenConnectedFaceSet(false); var v = rp.TriangleVertices; for (int i = 0; i < v.Count; i += 9) { var a = new XYZ(v[i], v[i + 1], v[i + 2]); var b = new XYZ(v[i + 3], v[i + 4], v[i + 5]); var c = new XYZ(v[i + 6], v[i + 7], v[i + 8]); var face = new TessellatedFace(new List <XYZ>() { a, b, c }, MaterialsManager.Instance.DynamoMaterialId); tsb.AddFace(face); } tsb.CloseConnectedFaceSet(); var result = tsb.Build(TessellatedShapeBuilderTarget.Mesh, TessellatedShapeBuilderFallback.Salvage, ElementId.InvalidElementId); return(result.GetGeometricalObjects()); }
private void ConvertPoints(RenderPackage p, ICollection <Point3D> pointColl, ICollection <BillboardTextItem> text) { for (int i = 0; i < p.PointVertices.Count; i += 3) { var pos = new Point3D( p.PointVertices[i], p.PointVertices[i + 1], p.PointVertices[i + 2]); pointColl.Add(pos); if (p.DisplayLabels) { text.Add(new BillboardTextItem { Text = CleanTag(p.Tag), Position = pos }); } } }
private void Tesselate(Autodesk.DesignScript.Geometry.Curve curve, ref List <GeometryObject> geoms) { // use the ASM tesselation of the curve var pkg = new RenderPackage(); curve.Tessellate(pkg, 0.1); // get necessary info to enumerate and convert the lines var lineCount = pkg.LineStripVertices.Count - 3; var verts = pkg.LineStripVertices; // we scale the tesselation rather than the curve var conv = UnitConverter.DynamoToHostFactor; // add the revit Lines to geometry collection for (var i = 0; i < lineCount; i += 3) { var xyz0 = new XYZ(verts[i] * conv, verts[i + 1] * conv, verts[i + 2] * conv); var xyz1 = new XYZ(verts[i + 3] * conv, verts[i + 4] * conv, verts[i + 5] * conv); geoms.Add(Autodesk.Revit.DB.Line.CreateBound(xyz0, xyz1)); } }
private void ConvertMeshes(RenderPackage p, ICollection <Point3D> points, ICollection <Vector3D> norms, ICollection <int> tris) { for (int i = 0; i < p.TriangleVertices.Count; i += 3) { var new_point = new Point3D(p.TriangleVertices[i], p.TriangleVertices[i + 1], p.TriangleVertices[i + 2]); var normal = new Vector3D(p.TriangleNormals[i], p.TriangleNormals[i + 1], p.TriangleNormals[i + 2]); tris.Add(points.Count); points.Add(new_point); norms.Add(normal); } if (tris.Count > 0) { MeshCount++; } }
private void ConvertLines(RenderPackage p, ICollection <Point3D> lineColl, ICollection <Point3D> redLines, ICollection <Point3D> greenLines, ICollection <Point3D> blueLines, ICollection <BillboardTextItem> text) { int idx = 0; int color_idx = 0; int outerCount = 0; foreach (var count in p.LineStripVertexCounts) { for (int i = 0; i < count; ++i) { var point = new Point3D(p.LineStripVertices[idx], p.LineStripVertices[idx + 1], p.LineStripVertices[idx + 2]); if (i == 0 && outerCount == 0 && p.DisplayLabels) { text.Add(new BillboardTextItem { Text = CleanTag(p.Tag), Position = point }); } if (i != 0 && i != count - 1) { lineColl.Add(point); } bool isAxis = false; var startColor = Color.FromRgb( p.LineStripVertexColors[color_idx], p.LineStripVertexColors[color_idx + 1], p.LineStripVertexColors[color_idx + 2]); if (startColor == Color.FromRgb(255, 0, 0)) { redLines.Add(point); isAxis = true; } else if (startColor == Color.FromRgb(0, 255, 0)) { greenLines.Add(point); isAxis = true; } else if (startColor == Color.FromRgb(0, 0, 255)) { blueLines.Add(point); isAxis = true; } if (!isAxis) { lineColl.Add(point); } idx += 3; color_idx += 4; } outerCount++; } }