diff --git a/pronsole.py b/pronsole.py index 7feea62..78e274b 100755 --- a/pronsole.py +++ b/pronsole.py @@ -2,6 +2,7 @@ import cmd, printcore, sys import glob, os, time import sys, subprocess +from math import sqrt if os.name=="nt": try: import _winreg @@ -80,7 +81,60 @@ def totalelength(g): tot+=cur return tot +def get_coordinate_value(axis, parts): + for i in parts: + if (axis in i): + return float(i[1:]) + return None + + +def estimate_duration(g): + extra_cost_per_movement = 0.02 + total_duration = 0 + feedrate = 0 + X_last_position = 0 + Y_last_position = 0 + for i in g: + if "G1" in i and ("X" in i or "Y" in i or "F" in i or "E" in i): + parts = i.split(" ") + X = get_coordinate_value("X", parts[1:]) + Y = get_coordinate_value("Y", parts[1:]) + F = get_coordinate_value("F", parts[1:]) + E = get_coordinate_value("E", parts[1:]) + if (F is not None): + feedrate = F / 60 + + distance = 0 + if (X is None and Y is None and E is not None): + distance = abs(E) + elif (X is not None and Y is None): + distance = X - X_last_position + X_last_position = X + elif (X is None and Y is not None): + distance = Y - Y_last_position + Y_last_position = Y + elif (X is not None and Y is not None): + X_distance = X - X_last_position + Y_distance = Y - Y_last_position + distance = sqrt(X_distance * X_distance + Y_distance * Y_distance) + X_last_position = X + Y_last_position = Y + + if (feedrate == 0 or distance == 0): continue + + time_for_move = distance / feedrate + acceleration = feedrate / time_for_move + halfway_feedrate = acceleration * time_for_move / 2 + duration = halfway_feedrate * 2 / acceleration + + total_duration += duration + extra_cost_per_movement + + mod_minutes = total_duration % (60 * 60) + mod_seconds = mod_minutes % 60 + + return "{0:02d}h{1:02d}m".format(int((total_duration - mod_minutes) / (60 * 60)), int((mod_minutes - mod_seconds) / 60)) + class Settings: #def _temperature_alias(self): return {"pla":210,"abs":230,"off":0} #def _temperature_validate(self,v): diff --git a/pronterface.py b/pronterface.py index 396e209..4541ba8 100755 --- a/pronterface.py +++ b/pronterface.py @@ -1184,6 +1184,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): print _("the print goes from"),Xmin,_("mm to"),Xmax,_("mm in X\nand is"),Xtot,_("mm wide\n") print _("the print goes from"),Ymin,_("mm to"),Ymax,_("mm in Y\nand is"),Ytot,_("mm wide\n") print _("the print goes from"),Zmin,_("mm to"),Zmax,_("mm in Z\nand is"),Ztot,_("mm high\n") + print _("Estimated duration (pessimistic): "), pronsole.estimate_duration(self.f) self.gviz.clear() self.gwindow.p.clear() for i in self.f: