From e4c9484139dd75eb0c7ba2f455ab2a0cdadafa84 Mon Sep 17 00:00:00 2001 From: PhaseLoop Date: Thu, 13 Mar 2025 19:20:12 +0100 Subject: [PATCH] migrate isInside to isPartOfDomain --- src/Mod/CAM/Path/Op/Vcarve.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Mod/CAM/Path/Op/Vcarve.py b/src/Mod/CAM/Path/Op/Vcarve.py index 72cd651dd2..f908847920 100644 --- a/src/Mod/CAM/Path/Op/Vcarve.py +++ b/src/Mod/CAM/Path/Op/Vcarve.py @@ -343,7 +343,7 @@ class ObjectVcarve(PathEngraveBase.ObjectOp): ) obj.Colinear = 10.0 - obj.Discretize = 0.1 + obj.Discretize = 0.25 obj.Tolerance = Path.Preferences.defaultGeometryTolerance() self.setupAdditionalProperties(obj) @@ -359,6 +359,12 @@ class ObjectVcarve(PathEngraveBase.ObjectOp): wires_by_face = dict() self.voronoiDebugCache = dict() + def is_exterior(vertex, face): + vector = FreeCAD.Vector(vertex.toPoint(face.BoundBox.ZMin)) + (u, v) = face.Surface.parameter(vector) + # isPartOfDomain is faster than face.IsInside(...) + return not face.isPartOfDomain(u, v) + def insert_many_wires(vd, wires): for wire in wires: Path.Log.debug("discretize value: {}".format(obj.Discretize)) @@ -402,16 +408,17 @@ class ObjectVcarve(PathEngraveBase.ObjectOp): else: e.Color = SECONDARY + # filter our colinear edged so there are fewer ones + # to iterate over in colorExterior which is slow vd.colorColinear(COLINEAR, obj.Colinear) - vd.colorTwins(TWIN) vd.colorExterior(EXTERIOR1) - vd.colorExterior( - EXTERIOR2, - lambda v: not f.isInside( - v.toPoint(f.BoundBox.ZMin), obj.Tolerance, True - ), - ) + vd.colorExterior(EXTERIOR2, lambda v: is_exterior(v, f)) + + # if colorTwin is done before colorExterior we seem to have + # much more weird exterior edges needed to be filtered out, + # keep it here to be safe + vd.colorTwins(TWIN) wires = _collectVoronoiWires(vd) wires = _sortVoronoiWires(wires)