Example #1
0
        protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            var element = default(DB.Element);

            if (!DA.GetData("Element", ref element))
            {
                return;
            }

            var detailLevel = DB.ViewDetailLevel.Undefined;

            DA.GetData(1, ref detailLevel);
            if (detailLevel == DB.ViewDetailLevel.Undefined)
            {
                detailLevel = DB.ViewDetailLevel.Coarse;
            }

            var relativeTolerance = 0.5;

            if (DA.GetData(2, ref relativeTolerance))
            {
                if (0.0 > relativeTolerance || relativeTolerance > 1.0)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"Parameter '{Params.Input[2].Name}' range is [0.0, 1.0].");
                    return;
                }
            }

            var meshingParameters = !double.IsNaN(relativeTolerance) ? new Rhino.Geometry.MeshingParameters(relativeTolerance, Revit.VertexTolerance) : null;

            Types.GeometricElement.BuildPreview(element, meshingParameters, detailLevel, out var materials, out var meshes, out var wires);

            for (int m = 0; m < meshes.Length; ++m)
            {
                meshes[m] = MeshDecoder.FromRawMesh(meshes[m], UnitConverter.NoScale);
            }

            DA.SetDataList(0, meshes?.Select((x) => new GH_Mesh(x)));
            DA.SetDataList(1, materials?.Select((x) => new GH_Material(x)));
            DA.SetDataList(2, wires?.Select((x) => new GH_Curve(x)));
        }
        protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            var element = default(DB.Element);

            if (!DA.GetData("Element", ref element))
            {
                return;
            }

            var detailLevel = DB.ViewDetailLevel.Undefined;

            DA.GetData(1, ref detailLevel);
            if (detailLevel == DB.ViewDetailLevel.Undefined)
            {
                detailLevel = DB.ViewDetailLevel.Coarse;
            }

            var relativeTolerance = 0.5;

            if (DA.GetData(2, ref relativeTolerance))
            {
                if (0.0 > relativeTolerance || relativeTolerance > 1.0)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"Parameter '{Params.Input[2].Name}' range is [0.0, 1.0].");
                    return;
                }
            }

            var meshingParameters = !double.IsNaN(relativeTolerance) ? new Rhino.Geometry.MeshingParameters(relativeTolerance, Revit.VertexTolerance) : null;

            Types.GeometricElement.BuildPreview(element, meshingParameters, detailLevel, out var materials, out var meshes, out var wires);

            for (int m = 0; m < meshes?.Length; ++m)
            {
                meshes[m] = MeshDecoder.FromRawMesh(meshes[m], UnitConverter.NoScale);
            }

            var outMesh    = new Mesh();
            var dictionary = Convert.Display.PreviewConverter.ZipByMaterial(materials, meshes, outMesh);

            if (dictionary is null)
            {
                // In case ZipByMaterial fails we just return the unclasified preview meshes
                DA.SetDataList(0, meshes?.Select(x => new GH_Mesh(x)));
                DA.SetDataList(1, materials?.Select(x => new Types.Material(x)));
            }
            else
            {
                // On success we return the classified set of meshes.
                if (outMesh.Faces.Count > 0)
                {
                    DA.SetDataList(0, dictionary.Values.Select(x => new GH_Mesh(x)).Concat(Enumerable.Repeat(new GH_Mesh(outMesh), 1)));
                    DA.SetDataList(1, dictionary.Keys.Select(x => new Types.Material(x)).Concat(Enumerable.Repeat(new Types.Material(), 1)));
                }
                else
                {
                    DA.SetDataList(0, dictionary.Values.Select(x => new GH_Mesh(x)));
                    DA.SetDataList(1, dictionary.Keys.Select(x => new Types.Material(x)));
                }
            }

            DA.SetDataList(2, wires?.Select(x => new GH_Curve(x)));
        }