Merge pull request #3933 from sliptonic/bug/vcarvedepth

Path:  improve vcarve to add coolant mode and set z depth from base object
This commit is contained in:
sliptonic
2020-10-06 09:01:51 -05:00
committed by GitHub
3 changed files with 38 additions and 24 deletions

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>140</height>
<height>197</height>
</rect>
</property>
<property name="windowTitle">
@@ -23,12 +23,13 @@
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="1">
<widget class="QComboBox" name="toolController">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The tool and its settings to be used for this operation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@@ -36,8 +37,15 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="toolController">
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Coolant Mode</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="coolantController">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The tool and its settings to be used for this operation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>

View File

@@ -47,7 +47,7 @@ TWIN = 2
COLINEAR = 3
SECONDARY = 5
if True:
if False:
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule(PathLog.thisModule())
else:
@@ -58,6 +58,7 @@ else:
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)
VD = []
@@ -66,7 +67,7 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
def opFeatures(self, obj):
'''opFeatures(obj) ... return all standard features and edges based geomtries'''
return PathOp.FeatureTool | PathOp.FeatureHeights | PathOp.FeatureBaseFaces
return PathOp.FeatureTool | PathOp.FeatureHeights | PathOp.FeatureBaseFaces | PathOp.FeatureCoolant
def setupAdditionalProperties(self, obj):
if not hasattr(obj, 'BaseShapes'):
@@ -107,34 +108,36 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
for wire in wires:
PathLog.debug('discretize value: {}'.format(obj.Discretize))
pts = wire.discretize(QuasiDeflection=obj.Discretize)
ptv = [FreeCAD.Vector(p[0], p[1]) for p in pts]
ptv = [FreeCAD.Vector(p.x, p.y) for p in pts]
ptv.append(ptv[0])
for i in range(len(pts)):
vd.addSegment(ptv[i], ptv[i+1])
def calculate_depth(MIC):
def calculate_depth(MIC, baselevel=0):
# given a maximum inscribed circle (MIC) and tool angle,
# return depth of cut.
# return depth of cut relative to baselevel.
r = obj.ToolController.Tool.Diameter / 2
toolangle = obj.ToolController.Tool.CuttingEdgeAngle
maxdepth = r / math.tan(math.radians(toolangle/2))
maxdepth = baselevel - r / math.tan(math.radians(toolangle/2))
d = round(MIC / math.tan(math.radians(toolangle / 2)), 4)
d = baselevel - round(MIC / math.tan(math.radians(toolangle / 2)), 4)
PathLog.debug('baselevel value: {} depth: {}'.format(baselevel, d))
return d if d <= maxdepth else maxdepth
def getEdges(vd, color=[PRIMARY]):
if type(color) == int:
color = [color]
geomList = []
bblevel = self.model[0].Shape.BoundBox.ZMin
for e in vd.Edges:
if e.Color not in color:
continue
if e.toGeom() is None:
continue
p1 = e.Vertices[0].toGeom(calculate_depth(0-e.getDistances()[0]))
p2 = e.Vertices[-1].toGeom(calculate_depth(0-e.getDistances()[-1]))
p1 = e.Vertices[0].toGeom(calculate_depth(e.getDistances()[0], bblevel))
p2 = e.Vertices[-1].toGeom(calculate_depth(e.getDistances()[-1], bblevel))
newedge = Part.Edge(Part.Vertex(p1), Part.Vertex(p2))
newedge.fixTolerance(obj.Tolerance, Part.Vertex)
@@ -248,9 +251,9 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
PathLog.track()
if not hasattr(obj.ToolController.Tool, "CuttingEdgeAngle"):
FreeCAD.Console.PrintError(
translate("Path_Vcarve", "VCarve requires an engraving \
cutter with CuttingEdgeAngle") + "\n")
FreeCAD.Console.PrintError(
translate("Path_Vcarve", "VCarve requires an engraving \
cutter with CuttingEdgeAngle") + "\n")
if obj.ToolController.Tool.CuttingEdgeAngle >= 180.0:
FreeCAD.Console.PrintError(
@@ -279,9 +282,9 @@ class ObjectVcarve(PathEngraveBase.ObjectOp):
except Exception as e:
PathLog.error(e)
traceback.print_exc()
PathLog.error(translate('PathVcarve',
'The Job Base Object has no engraveable element.\
Engraving operation will produce no output.'))
PathLog.error(translate('PathVcarve', 'The Job Base Object has \
no engraveable element. Engraving \
operation will produce no output.'))
def opUpdateDepths(self, obj, ignoreErrors=False):
'''updateDepths(obj) ... engraving is always done at \

View File

@@ -124,12 +124,14 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage):
if obj.Threshold != self.form.threshold.value():
obj.Threshold = self.form.threshold.value()
self.updateToolController(obj, self.form.toolController)
self.updateCoolant(obj, self.form.coolantController)
def setFields(self, obj):
'''setFields(obj) ... transfers obj's property values to UI'''
self.form.discretize.setValue(obj.Discretize)
self.form.threshold.setValue(obj.Threshold)
self.setupToolController(obj, self.form.toolController)
self.setupCoolant(obj, self.form.coolantController)
def getSignalsForUpdate(self, obj):
'''getSignalsForUpdate(obj) ... return list of signals for updating obj'''
@@ -137,6 +139,7 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage):
signals.append(self.form.discretize.editingFinished)
signals.append(self.form.threshold.editingFinished)
signals.append(self.form.toolController.currentIndexChanged)
signals.append(self.form.coolantController.currentIndexChanged)
return signals
def taskPanelBaseGeometryPage(self, obj, features):