diff --git a/FlatCAMApp.py b/FlatCAMApp.py
index d671362d..89dd97db 100644
--- a/FlatCAMApp.py
+++ b/FlatCAMApp.py
@@ -824,7 +824,7 @@ class App(QtCore.QObject):
"excellon_toolchangexy": "0.0, 0.0",
"excellon_startz": None,
"excellon_endz": 0.5,
- "excellon_feedrate_rapid": 3.14961,
+ "excellon_feedrate_rapid": 31.4961,
"excellon_z_pdepth": -0.02,
"excellon_feedrate_probe": 3.14961,
"excellon_f_plunge": False,
diff --git a/FlatCAMObj.py b/FlatCAMObj.py
index 0edccd21..96d2e4ca 100644
--- a/FlatCAMObj.py
+++ b/FlatCAMObj.py
@@ -5521,11 +5521,11 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
self.ui.t_time_entry.setDisabled(True)
# if time is more than 1 then we have minutes, else we have seconds
if self.routing_time > 1:
- self.ui.t_time_entry.set_value('%.4f' % float(self.routing_time))
+ self.ui.t_time_entry.set_value('%.4f' % math.ceil(float(self.routing_time)))
self.ui.units_time_label.setText('min')
else:
time_r = self.routing_time * 60
- self.ui.t_time_entry.set_value('%.4f' % float(time_r))
+ self.ui.t_time_entry.set_value('%.4f' % math.ceil(float(time_r)))
self.ui.units_time_label.setText('sec')
self.ui.units_time_label.setDisabled(True)
except AttributeError:
@@ -5985,6 +5985,12 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
visible = visible if visible else self.options['plot']
+ if self.ui.annotation_cb.get_value() and self.ui.plot_cb.get_value():
+ self.text_col.enabled = True
+ else:
+ self.text_col.enabled = False
+ self.annotation.redraw()
+
try:
if self.multitool is False: # single tool usage
self.plot2(tooldia=float(self.options["tooldia"]), obj=self, visible=visible, kind=kind)
@@ -5999,12 +6005,6 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
self.shapes.clear(update=True)
self.annotation.clear(update=True)
- if self.ui.annotation_cb.get_value() and self.ui.plot_cb.get_value():
- self.text_col.enabled = True
- else:
- self.text_col.enabled = False
- self.annotation.redraw()
-
def on_annotation_change(self):
if self.ui.annotation_cb.get_value():
self.text_col.enabled = True
diff --git a/README.md b/README.md
index 3b552973..a9e574fa 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing.
- added estimated time of routing for the CNCJob and added travelled distance parameter for geometry, too
- fixed error when creating CNCJob due of having the annotations disabled from preferences but the plot2() function from camlib.CNCJob class still performed operations who yielded TypeError exceptions
+- coded a more accurate way to estimate the job time in CNCJob, taking into consideration if there is a usage of multi depth which generate more passes
+- another fix (final one) for the Exception generated by the annotations set not to show in Preferences
17.08.2019
diff --git a/camlib.py b/camlib.py
index ca12694d..b2fef14f 100644
--- a/camlib.py
+++ b/camlib.py
@@ -5290,7 +5290,10 @@ class CNCjob(Geometry):
self.oldx = 0.0
self.oldy = 0.0
- measured_distance = 0
+ measured_distance = 0.0
+ measured_down_distance = 0.0
+ measured_up_to_zero_distance = 0.0
+ measured_lift_distance = 0.0
current_platform = platform.architecture()[0]
if current_platform == '64bit':
@@ -5387,8 +5390,16 @@ class CNCjob(Geometry):
gcode += self.doformat(p.rapid_code, x=locx, y=locy)
gcode += self.doformat(p.down_code, x=locx, y=locy)
+
+ measured_down_distance += abs(self.z_cut) + abs(self.z_move)
+
if self.f_retract is False:
gcode += self.doformat(p.up_to_zero_code, x=locx, y=locy)
+ measured_up_to_zero_distance += abs(self.z_cut)
+ measured_lift_distance += abs(self.z_move)
+ else:
+ measured_lift_distance += abs(self.z_cut) + abs(self.z_move)
+
gcode += self.doformat(p.lift_code, x=locx, y=locy)
measured_distance += abs(distance_euclidian(locx, locy, self.oldx, self.oldy))
self.oldx = locx
@@ -5482,10 +5493,19 @@ class CNCjob(Geometry):
for k in node_list:
locx = locations[k][0]
locy = locations[k][1]
+
gcode += self.doformat(p.rapid_code, x=locx, y=locy)
gcode += self.doformat(p.down_code, x=locx, y=locy)
+
+ measured_down_distance += abs(self.z_cut) + abs(self.z_move)
+
if self.f_retract is False:
gcode += self.doformat(p.up_to_zero_code, x=locx, y=locy)
+ measured_up_to_zero_distance += abs(self.z_cut)
+ measured_lift_distance += abs(self.z_move)
+ else:
+ measured_lift_distance += abs(self.z_cut) + abs(self.z_move)
+
gcode += self.doformat(p.lift_code, x=locx, y=locy)
measured_distance += abs(distance_euclidian(locx, locy, self.oldx, self.oldy))
self.oldx = locx
@@ -5542,8 +5562,16 @@ class CNCjob(Geometry):
for point in self.optimized_travelling_salesman(altPoints):
gcode += self.doformat(p.rapid_code, x=point[0], y=point[1])
gcode += self.doformat(p.down_code, x=point[0], y=point[1])
+
+ measured_down_distance += abs(self.z_cut) + abs(self.z_move)
+
if self.f_retract is False:
gcode += self.doformat(p.up_to_zero_code, x=point[0], y=point[1])
+ measured_up_to_zero_distance += abs(self.z_cut)
+ measured_lift_distance += abs(self.z_move)
+ else:
+ measured_lift_distance += abs(self.z_cut) + abs(self.z_move)
+
gcode += self.doformat(p.lift_code, x=point[0], y=point[1])
measured_distance += abs(distance_euclidian(point[0], point[1], self.oldx, self.oldy))
self.oldx = point[0]
@@ -5562,7 +5590,15 @@ class CNCjob(Geometry):
log.debug("The total travel distance including travel to end position is: %s" %
str(measured_distance) + '\n')
self.travel_distance = measured_distance
- # self.routing_time = measured_distance / self.z_feedrate
+
+ # I use the value of self.feedrate_rapid for the feadrate in case of the measure_lift_distance and for
+ # traveled_time because it is not always possible to determine the feedrate that the CNC machine uses
+ # for G0 move (the fastest speed available to the CNC router). Although self.feedrate_rapids is used only with
+ # Marlin postprocessor and derivatives.
+ self.routing_time = (measured_down_distance + measured_up_to_zero_distance) / self.feedrate
+ lift_time = measured_lift_distance / self.feedrate_rapid
+ traveled_time = measured_distance / self.feedrate_rapid
+ self.routing_time += lift_time + traveled_time
self.gcode = gcode
return 'OK'
@@ -5766,16 +5802,28 @@ class CNCjob(Geometry):
# ---------- Single depth/pass --------
if not multidepth:
+ # calculate the cut distance
+ total_cut = total_cut + geo.length
+
self.gcode += self.create_gcode_single_pass(geo, extracut, tolerance)
# --------- Multi-pass ---------
else:
+ # calculate the cut distance
+ # due of the number of cuts (multi depth) it has to multiplied by the number of cuts
+ nr_cuts = 0
+ depth = abs(self.z_cut)
+ while depth > 0:
+ nr_cuts += 1
+ depth -= float(self.z_depthpercut)
+
+ total_cut += (geo.length * nr_cuts)
+
self.gcode += self.create_gcode_multi_pass(geo, extracut, tolerance,
postproc=p, current_point=current_pt)
# calculate the total distance
total_travel = total_travel + abs(distance(pt1=current_pt, pt2=pt))
- total_cut = total_cut + geo.length
current_pt = geo.coords[-1]
pt, geo = storage.nearest(current_pt) # Next
@@ -5784,8 +5832,10 @@ class CNCjob(Geometry):
log.debug("Finishing G-Code... %s paths traced." % path_count)
- self.travel_distance = total_travel + total_cut
- self.routing_time = total_cut / self.feedrate
+ # add move to end position
+ total_travel += abs(distance_euclidian(current_pt[0], current_pt[1], 0, 0))
+ self.travel_distance += total_travel + total_cut
+ self.routing_time += total_cut / self.feedrate
# Finish
self.gcode += self.doformat(p.spindle_stop_code)
@@ -6039,16 +6089,27 @@ class CNCjob(Geometry):
# ---------- Single depth/pass --------
if not multidepth:
+ # calculate the cut distance
+ total_cut += geo.length
self.gcode += self.create_gcode_single_pass(geo, extracut, tolerance)
# --------- Multi-pass ---------
else:
+ # calculate the cut distance
+ # due of the number of cuts (multi depth) it has to multiplied by the number of cuts
+ nr_cuts = 0
+ depth = abs(self.z_cut)
+ while depth > 0:
+ nr_cuts += 1
+ depth -= float(self.z_depthpercut)
+
+ total_cut += (geo.length * nr_cuts)
+
self.gcode += self.create_gcode_multi_pass(geo, extracut, tolerance,
postproc=p, current_point=current_pt)
- # calculate the total distance
- total_travel = total_travel + abs(distance(pt1=current_pt, pt2=pt))
- total_cut = total_cut + geo.length
+ # calculate the travel distance
+ total_travel += abs(distance(pt1=current_pt, pt2=pt))
current_pt = geo.coords[-1]
pt, geo = storage.nearest(current_pt) # Next
@@ -6057,8 +6118,10 @@ class CNCjob(Geometry):
log.debug("Finishing G-Code... %s paths traced." % path_count)
- self.travel_distance = total_travel + total_cut
- self.routing_time = total_cut / self.feedrate
+ # add move to end position
+ total_travel += abs(distance_euclidian(current_pt[0], current_pt[1], 0, 0))
+ self.travel_distance += total_travel + total_cut
+ self.routing_time += total_cut / self.feedrate
# Finish
self.gcode += self.doformat(p.spindle_stop_code)
diff --git a/flatcamGUI/ObjectUI.py b/flatcamGUI/ObjectUI.py
index b2f2628a..003ae039 100644
--- a/flatcamGUI/ObjectUI.py
+++ b/flatcamGUI/ObjectUI.py
@@ -1403,15 +1403,15 @@ class CNCObjectUI(ObjectUI):
)
self.units_label = QtWidgets.QLabel()
- self.t_time_label = QtWidgets.QLabel(_("Estimated time.:"))
- self.t_distance_label.setToolTip(
- _("This is the estimated time to do the routing.\n"
- "In current units.")
+ self.t_time_label = QtWidgets.QLabel(_("Estimated time:"))
+ self.t_time_label.setToolTip(
+ _("This is the estimated time to do the routing/drilling,\n"
+ "without the time spent in ToolChange events.")
)
self.t_time_entry = FCEntry()
self.t_time_entry.setToolTip(
- _("This is the estimated time to do the routing.\n"
- "In current units.")
+ _("This is the estimated time to do the routing/drilling,\n"
+ "without the time spent in ToolChange events.")
)
self.units_time_label = QtWidgets.QLabel()