Merge pull request #20169 from phaseloop/vcarve-speed
[CAM] Improve Vcarve path generation speed on complex shapes
This commit is contained in:
@@ -284,29 +284,34 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
|
||||
)
|
||||
obj.setEditorMode("BaseShapes", 2) # hide
|
||||
|
||||
obj.addProperty(
|
||||
"App::PropertyBool",
|
||||
"OptimizeMovements",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Optimize movements"),
|
||||
)
|
||||
if not hasattr(obj, "OptimizeMovements"):
|
||||
|
||||
obj.addProperty(
|
||||
"App::PropertyBool",
|
||||
"FinishingPass",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Add finishing pass"),
|
||||
)
|
||||
obj.addProperty(
|
||||
"App::PropertyBool",
|
||||
"OptimizeMovements",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Optimize movements"),
|
||||
)
|
||||
obj.OptimizeMovements = False
|
||||
|
||||
obj.addProperty(
|
||||
"App::PropertyDistance",
|
||||
"FinishingPassZOffset",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Finishing pass Z offset"),
|
||||
)
|
||||
if not hasattr(obj, "FinishingPass"):
|
||||
obj.addProperty(
|
||||
"App::PropertyBool",
|
||||
"FinishingPass",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Add finishing pass"),
|
||||
)
|
||||
obj.FinishingPass = False
|
||||
|
||||
obj.FinishingPass = False
|
||||
obj.FinishingPassZOffset = "0.00"
|
||||
if not hasattr(obj, "FinishingPassZOffset"):
|
||||
obj.addProperty(
|
||||
"App::PropertyDistance",
|
||||
"FinishingPassZOffset",
|
||||
"Path",
|
||||
QT_TRANSLATE_NOOP("App::Property", "Finishing pass Z offset"),
|
||||
)
|
||||
|
||||
obj.FinishingPassZOffset = "0.00"
|
||||
|
||||
def initOperation(self, obj):
|
||||
"""initOperation(obj) ... create vcarve specific properties."""
|
||||
@@ -334,7 +339,7 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
|
||||
)
|
||||
|
||||
obj.Colinear = 10.0
|
||||
obj.Discretize = 0.01
|
||||
obj.Discretize = 0.25
|
||||
obj.Tolerance = Path.Preferences.defaultGeometryTolerance()
|
||||
self.setupAdditionalProperties(obj)
|
||||
|
||||
@@ -350,6 +355,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))
|
||||
@@ -390,12 +401,17 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
|
||||
e.Color = PRIMARY
|
||||
else:
|
||||
e.Color = SECONDARY
|
||||
vd.colorExterior(EXTERIOR1)
|
||||
vd.colorExterior(
|
||||
EXTERIOR2,
|
||||
lambda v: not f.isInside(v.toPoint(f.BoundBox.ZMin), obj.Tolerance, True),
|
||||
)
|
||||
|
||||
# filter our colinear edged so there are fewer ones
|
||||
# to iterate over in colorExterior which is slow
|
||||
vd.colorColinear(COLINEAR, obj.Colinear)
|
||||
|
||||
vd.colorExterior(EXTERIOR1)
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user