Пример #1
0
        static internal IEnumerable <GeometryObject> ToHost(this Rhino.Geometry.Mesh mesh)
        {
            List <XYZ> faceVertices = new List <XYZ>(4);

            var builder = new TessellatedShapeBuilder();

            builder.Target   = TessellatedShapeBuilderTarget.AnyGeometry;
            builder.Fallback = TessellatedShapeBuilderFallback.Mesh;

            Rhino.Geometry.Mesh[] pieces = mesh.DisjointMeshCount > 1 ?
                                           mesh.SplitDisjointPieces() :
                                           new Rhino.Geometry.Mesh[] { mesh };

            foreach (var piece in pieces)
            {
                piece.Faces.ConvertNonPlanarQuadsToTriangles(Revit.ModelAbsolutePlanarTolerance, RhinoMath.UnsetValue, 5);

                bool isOriented  = false;
                bool hasBoundary = false;
                bool isSolid     = piece.IsClosed && piece.IsManifold(true, out isOriented, out hasBoundary) && isOriented;
                var  vertices    = piece.Vertices.ToPoint3dArray();

                builder.OpenConnectedFaceSet(isSolid);
                foreach (var face in piece.Faces)
                {
                    faceVertices.Add(vertices[face.A].ToHost());
                    faceVertices.Add(vertices[face.B].ToHost());
                    faceVertices.Add(vertices[face.C].ToHost());
                    if (face.IsQuad)
                    {
                        faceVertices.Add(vertices[face.D].ToHost());
                    }

                    builder.AddFace(new TessellatedFace(faceVertices, ElementId.InvalidElementId));
                    faceVertices.Clear();
                }
                builder.CloseConnectedFaceSet();
            }

            IList <GeometryObject> objects = null;

            try
            {
                builder.Build();
                objects = builder.GetBuildResult().GetGeometricalObjects();
            }
            catch (Autodesk.Revit.Exceptions.ApplicationException e)
            {
                Debug.Fail(e.Source, e.Message);
                objects = new List <GeometryObject>();
            }

            return(objects);
        }