Exemplo n.º 1
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            var input  = args[0];
            var result = FSharpList <Value> .Empty;

            if (input.IsList)
            {
                var ptList = (input as Value.List).Item;
                int length = ptList.Length;

                var verts = new List <Vertex3>();

                for (int i = 0; i < length; i++)
                {
                    var pt   = (XYZ)((Value.Container)ptList[i]).Item;
                    var vert = new Vertex3(pt.X, pt.Y, pt.Z);
                    verts.Add(vert);
                }

                // make triangulation
                var triResult = ConvexHull <Vertex3, TriangleFace> .Create(verts);

                _tessellationLines.Clear();
                //_tesselationMeshes.Clear();
                //var mesh = new HelixToolkit.Wpf.Mesh3D();

                // make edges
                foreach (var face in triResult.Faces)
                {
                    // form mesh
                    //mesh.Vertices.Add( face.Vertices[1].ToPoint3D() );
                    //mesh.Vertices.Add( face.Vertices[0].ToPoint3D() );
                    //mesh.Vertices.Add( face.Vertices[2].ToPoint3D() );
                    //mesh.AddFace( new int[3] { mesh.Vertices.Count-1, mesh.Vertices.Count-2, mesh.Vertices.Count-3 });
                    //_tesselationMeshes.Add(mesh);
                    _triangleFaces.AddRange(triResult.Faces);

                    // form lines for use in dynamo or revit
                    var start1 = face.Vertices[0].ToXYZ();
                    var end1   = face.Vertices[1].ToXYZ();

                    var start2 = face.Vertices[1].ToXYZ();
                    var end2   = face.Vertices[2].ToXYZ();

                    var start3 = face.Vertices[2].ToXYZ();
                    var end3   = face.Vertices[0].ToXYZ();

                    if (start1.DistanceTo(end1) > 0.1)
                    {
                        var l1 = this.UIDocument.Application.Application.Create.NewLineBound(start1, end1);
                        _tessellationLines.Add(l1);
                        result = FSharpList <Value> .Cons(Value.NewContainer(l1), result);
                    }

                    if (start2.DistanceTo(end2) > 0.1)
                    {
                        var l1 = this.UIDocument.Application.Application.Create.NewLineBound(start2, end2);
                        _tessellationLines.Add(l1);
                        result = FSharpList <Value> .Cons(Value.NewContainer(l1), result);
                    }

                    if (start3.DistanceTo(end3) > 0.1)
                    {
                        var l1 = this.UIDocument.Application.Application.Create.NewLineBound(start3, end3);
                        _tessellationLines.Add(l1);
                        result = FSharpList <Value> .Cons(Value.NewContainer(l1), result);
                    }
                }

                return(Value.NewList(result));
            }

            return(Value.NewList(result));
        }