diff --git a/gcoder.py b/gcoder.py index 24f43b8..78a22fc 100755 --- a/gcoder.py +++ b/gcoder.py @@ -19,7 +19,7 @@ import re import math import datetime -gcode_parsed_args = ["x", "y", "e", "f", "z", "p"] +gcode_parsed_args = ["x", "y", "e", "f", "z", "p", "i", "j"] class Line(object): @@ -28,6 +28,8 @@ class Line(object): z = None e = None f = None + i = None + j = None relative = False relative_e = False @@ -263,7 +265,6 @@ class GCode(object): #TODO: # get device caps from firmware: max speed, acceleration/axis (including extruder) # calculate the maximum move duration accounting for above ;) - # self.log(".... estimating ....") zs = self.layers.keys() zs.sort() for z in zs: @@ -281,7 +282,7 @@ class GCode(object): x = line.x if line.x != None else lastx y = line.y if line.y != None else lasty e = line.e if line.e != None else laste - f = line.f / 60.0 if line.f != None else lastf # mm/s vs mm/m + f = line.f / 60.0 if line.f != None else lastf # mm/s vs mm/m => divide by 60 # given last feedrate and current feedrate calculate the distance needed to achieve current feedrate. # if travel is longer than req'd distance, then subtract distance to achieve full speed, and add the time it took to get there. diff --git a/printrun/gviz.py b/printrun/gviz.py index 9086b9e..334c5f5 100755 --- a/printrun/gviz.py +++ b/printrun/gviz.py @@ -312,10 +312,70 @@ class gviz(wx.Panel): dc.DrawBitmap(self.blitmap, 0, 0) del dc - def addfile(self, gcodes = []): + def addfile(self, gcode): self.clear() - for i in gcodes: - self.addgcode(i) + self.add_parsed_gcodes(gcode.lines) + + def add_parsed_gcodes(self, lines, hilight = 0): + def _readgcode(): + target = self.lastpos[:] + target[5] = 0.0 + target[6] = 0.0 + if hilight: + target = self.hilightpos[:] + if gline.x != None: target[0] = gline.x + if gline.y != None: target[1] = gline.y + if gline.z != None: target[2] = gline.z + if gline.e != None: target[3] = gline.e + if gline.f != None: target[4] = gline.f + if gline.i != None: target[5] = gline.i + if gline.j != None: target[6] = gline.j + if not hilight: + if not target[2] in self.lines.keys(): + self.lines[target[2]]=[] + self.pens[target[2]]=[] + self.arcs[target[2]]=[] + self.arcpens[target[2]]=[] + self.layers+=[target[2]] + return target + + def _y(y): + return self.build_dimensions[1] - (y - self.build_dimensions[4]) + def _x(x): + return x - self.build_dimensions[3] + + for gline in lines: + start_pos = self.hilightpos[:] if hilight else self.lastpos[:] + + if gline.command in [ "G0", "G1" ]: + target = _readgcode() + line = [ _x(start_pos[0]), _y(start_pos[1]), _x(target[0]), _y(target[1]) ] + if not hilight: + self.lines[ target[2] ] += [line] + self.pens[ target[2] ] += [self.mainpen if target[3] != self.lastpos[3] else self.travelpen] + self.lastpos = target + else: + self.hilight += [line] + self.hilightpos = target + self.dirty = 1 + + if gline.command in [ "G2", "G3" ]: + target = _readgcode() + arc = [] + arc += [ _x(start_pos[0]), _y(start_pos[1]) ] + arc += [ _x(target[0]), _y(target[1]) ] + arc += [ _x(start_pos[0] + target[5]), _y(start_pos[1] + target[6]) ] # center + if gline.command == "G2": # clockwise, reverse endpoints + arc[0], arc[1], arc[2], arc[3] = arc[2], arc[3], arc[0], arc[1] + + if not hilight: + self.arcs[ target[2] ] += [arc] + self.arcpens[ target[2] ] += [self.arcpen] + self.lastpos = target + else: + self.hilightarcs += [arc] + self.hilightpos = target + self.dirty = 1 def addgcode(self, gcode = "M105", hilight = 0): gcode = gcode.split("*")[0]