示例#1
0
        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++;
                }
            }
        }
示例#3
0
        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++;
            }
        }
示例#4
0
        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());
        }
示例#6
0
        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
                    });
                }
            }
        }
示例#7
0
        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));
            }
        }
示例#8
0
        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++;
            }
        }
示例#9
0
        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++;
            }
        }