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)); }