Пример #1
0
        public static (Mesh subtract, Mesh intersect) IntersectAndSubtract(Mesh recieveSubtraction, Mesh recieveIntersection, Action <string, double> reporter, CancellationToken cancellationToken)
        {
            if (recieveSubtraction.Faces.Count == 0)
            {
                return(recieveSubtraction, recieveIntersection);
            }
            if (recieveIntersection.Faces.Count == 0)
            {
                return(recieveSubtraction, recieveIntersection);
            }
            reporter?.Invoke("Mesh to Solid A", 0);
            var A = SolidFromMesh(recieveSubtraction);

            reporter?.Invoke("Mesh to Solid B", .2);
            var B = SolidFromMesh(recieveIntersection);

            reporter?.Invoke("BooleanModeller", .4);
            var modeller = new BooleanModeller(A, B, (status, progress0To1) =>
            {
                reporter?.Invoke(status, .4 + progress0To1 * .2);
            }, cancellationToken);

            reporter?.Invoke("Intersection", .6);
            var intersection = modeller.GetIntersection();

            reporter?.Invoke("Difference", .6);
            var difference = modeller.GetDifference();

            reporter?.Invoke("Solid to Mesh", .8);
            var results = (MeshFromSolid(difference), MeshFromSolid(intersection));

            reporter?.Invoke("Solid to Mesh", 1);
            return(results);
        }
Пример #2
0
        public static Mesh Subtract(this Mesh a, Mesh b, Action <string, double> reporter, CancellationToken cancellationToken)
        {
            if (a.Faces.Count == 0)
            {
                return(b);
            }

            if (b.Faces.Count == 0)
            {
                return(a);
            }

            reporter?.Invoke("Mesh to Solid A", 0);
            var A = SolidFromMesh(a);

            reporter?.Invoke("Mesh to Solid B", .2);
            var B = SolidFromMesh(b);

            reporter?.Invoke("BooleanModeller", .4);
            var modeller = new BooleanModeller(A, B, (status, progress0To1) =>
            {
                reporter?.Invoke(status, .4 + progress0To1 * .2);
            }, cancellationToken);

            reporter?.Invoke("Difference", .6);
            var result = modeller.GetDifference();

            reporter?.Invoke("Solid to Mesh", .8);
            var solidMesh = MeshFromSolid(result);

            reporter?.Invoke("Solid to Mesh", 1);
            return(solidMesh);
        }
Пример #3
0
 public static Mesh GetDifference(MeshFilter meshF1, MeshFilter meshF2)
 {
     using (var booleanModeller = new BooleanModeller(meshF1.ToSolidInWCS(), meshF2.ToSolidInWCS()))
     {
         var end = booleanModeller.GetDifference();
         return(OperateAndMerge(end, meshF1.transform));
     }
 }