2011-06-21 16:52:11 +00:00
|
|
|
import wx,time
|
|
|
|
|
|
|
|
class window(wx.Frame):
|
2011-08-07 20:11:35 +00:00
|
|
|
def __init__(self,f,size=(600,600),bedsize=(200,200),grid=(10,50),extrusion_width=0.5):
|
2011-07-31 07:57:15 +00:00
|
|
|
wx.Frame.__init__(self,None,title="Layer view (Use shift+mousewheel to switch layers)",size=(size[0],size[1]))
|
2011-09-02 08:56:07 +00:00
|
|
|
self.p=gviz(self,size=size,bedsize=bedsize,grid=grid,extrusion_width=extrusion_width)
|
2011-06-21 16:52:11 +00:00
|
|
|
s=time.time()
|
2011-06-22 12:54:59 +00:00
|
|
|
for i in f:
|
2011-06-21 16:52:11 +00:00
|
|
|
self.p.addgcode(i)
|
2011-06-22 12:54:59 +00:00
|
|
|
#print time.time()-s
|
2011-07-15 07:15:12 +00:00
|
|
|
self.initpos=[0,0]
|
2011-06-21 16:52:11 +00:00
|
|
|
self.p.Bind(wx.EVT_KEY_DOWN,self.key)
|
2011-06-24 23:28:36 +00:00
|
|
|
self.Bind(wx.EVT_KEY_DOWN,self.key)
|
2011-06-26 17:46:03 +00:00
|
|
|
self.p.Bind(wx.EVT_MOUSEWHEEL,self.zoom)
|
|
|
|
self.Bind(wx.EVT_MOUSEWHEEL,self.zoom)
|
2011-07-15 07:15:12 +00:00
|
|
|
self.p.Bind(wx.EVT_MOUSE_EVENTS,self.mouse)
|
|
|
|
self.Bind(wx.EVT_MOUSE_EVENTS,self.mouse)
|
2011-09-02 08:56:07 +00:00
|
|
|
|
2011-07-15 07:15:12 +00:00
|
|
|
def mouse(self,event):
|
|
|
|
if event.ButtonUp(wx.MOUSE_BTN_LEFT):
|
|
|
|
if(self.initpos is not None):
|
|
|
|
self.initpos=None
|
|
|
|
elif event.Dragging():
|
|
|
|
e=event.GetPositionTuple()
|
2011-07-26 12:47:47 +00:00
|
|
|
if self.initpos is None or not hasattr(self,"basetrans"):
|
2011-07-15 07:15:12 +00:00
|
|
|
self.initpos=e
|
|
|
|
self.basetrans=self.p.translate
|
|
|
|
#print self.p.translate,e,self.initpos
|
|
|
|
self.p.translate = [ self.basetrans[0]+(e[0]-self.initpos[0]),
|
|
|
|
self.basetrans[1]+(e[1]-self.initpos[1]) ]
|
|
|
|
self.p.repaint()
|
|
|
|
self.p.Refresh()
|
|
|
|
|
|
|
|
else:
|
|
|
|
event.Skip()
|
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
def key(self, event):
|
|
|
|
x=event.GetKeyCode()
|
|
|
|
#print x
|
|
|
|
if x==wx.WXK_UP:
|
|
|
|
self.p.layerup()
|
|
|
|
if x==wx.WXK_DOWN:
|
|
|
|
self.p.layerdown()
|
|
|
|
|
|
|
|
#print p.lines.keys()
|
2011-06-26 17:46:03 +00:00
|
|
|
def zoom(self, event):
|
2011-07-10 09:57:11 +00:00
|
|
|
z=event.GetWheelRotation()
|
|
|
|
if event.ShiftDown():
|
|
|
|
if z > 0: self.p.layerdown()
|
|
|
|
elif z < 0: self.p.layerup()
|
|
|
|
else:
|
|
|
|
if z > 0: self.p.zoom(event.GetX(),event.GetY(),1.2)
|
|
|
|
elif z < 0: self.p.zoom(event.GetX(),event.GetY(),1/1.2)
|
2011-06-21 16:52:11 +00:00
|
|
|
|
|
|
|
class gviz(wx.Panel):
|
2011-09-02 08:56:07 +00:00
|
|
|
def __init__(self,parent,size=(200,200),bedsize=(200,200),grid=(10,50),extrusion_width=0.5):
|
|
|
|
wx.Panel.__init__(self,parent,-1,size=(size[0],size[1]))
|
2011-06-22 12:54:59 +00:00
|
|
|
self.size=size
|
2011-06-21 16:52:11 +00:00
|
|
|
self.bedsize=bedsize
|
2011-08-07 20:00:13 +00:00
|
|
|
self.grid=grid
|
2011-06-21 16:52:11 +00:00
|
|
|
self.lastpos=[0,0,0,0,0]
|
2011-06-22 11:40:27 +00:00
|
|
|
self.hilightpos=self.lastpos[:]
|
2011-06-21 16:52:11 +00:00
|
|
|
self.Bind(wx.EVT_PAINT,self.paint)
|
2011-07-26 12:47:47 +00:00
|
|
|
self.Bind(wx.EVT_SIZE,lambda *e:(wx.CallAfter(self.repaint),wx.CallAfter(self.Refresh)))
|
2011-06-21 16:52:11 +00:00
|
|
|
self.lines={}
|
|
|
|
self.pens={}
|
|
|
|
self.layers=[]
|
|
|
|
self.layerindex=0
|
2011-08-07 20:11:35 +00:00
|
|
|
self.filament_width=extrusion_width # set it to 0 to disable scaling lines with zoom
|
2011-09-02 08:56:07 +00:00
|
|
|
self.scale=[min(float(size[0])/bedsize[0],float(size[1])/bedsize[1])]*2
|
2011-07-26 12:47:47 +00:00
|
|
|
penwidth = max(1.0,self.filament_width*((self.scale[0]+self.scale[1])/2.0))
|
|
|
|
self.translate=[0.0,0.0]
|
|
|
|
self.mainpen=wx.Pen(wx.Colour(0,0,0),penwidth)
|
|
|
|
self.hlpen=wx.Pen(wx.Colour(200,50,50),penwidth)
|
|
|
|
self.fades=[wx.Pen(wx.Colour(250-0.6**i*100,250-0.6**i*100,200-0.4**i*50),penwidth) for i in xrange(6)]
|
|
|
|
self.penslist=[self.mainpen,self.hlpen]+self.fades
|
2011-06-21 16:52:11 +00:00
|
|
|
self.showall=0
|
2011-06-22 10:21:04 +00:00
|
|
|
self.hilight=[]
|
2011-06-29 20:17:53 +00:00
|
|
|
self.dirty=1
|
|
|
|
self.blitmap=wx.EmptyBitmap(self.GetClientSize()[0],self.GetClientSize()[1],-1)
|
2011-06-21 16:52:11 +00:00
|
|
|
|
|
|
|
def clear(self):
|
|
|
|
self.lastpos=[0,0,0,0,0]
|
|
|
|
self.lines={}
|
|
|
|
self.pens={}
|
|
|
|
self.layers=[]
|
|
|
|
self.layerindex=0
|
|
|
|
self.showall=0
|
2011-06-29 20:17:53 +00:00
|
|
|
self.dirty=1
|
2011-07-10 09:57:11 +00:00
|
|
|
#self.repaint()
|
2011-06-21 16:52:11 +00:00
|
|
|
def layerup(self):
|
|
|
|
if(self.layerindex+1<len(self.layers)):
|
|
|
|
self.layerindex+=1
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
2011-06-21 16:52:11 +00:00
|
|
|
self.Refresh()
|
|
|
|
|
|
|
|
def layerdown(self):
|
|
|
|
if(self.layerindex>0):
|
|
|
|
self.layerindex-=1
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
2011-06-21 16:52:11 +00:00
|
|
|
self.Refresh()
|
2011-06-22 10:21:04 +00:00
|
|
|
|
|
|
|
def setlayer(self,layer):
|
|
|
|
try:
|
|
|
|
self.layerindex=self.layers.index(layer)
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
2011-06-22 10:21:04 +00:00
|
|
|
wx.CallAfter(self.Refresh)
|
|
|
|
self.showall=0
|
|
|
|
except:
|
|
|
|
pass
|
2011-06-29 20:17:53 +00:00
|
|
|
|
2011-06-22 10:21:04 +00:00
|
|
|
|
2011-06-26 17:46:03 +00:00
|
|
|
def zoom(self,x,y,factor):
|
2011-07-10 09:57:11 +00:00
|
|
|
self.scale = [s * factor for s in self.scale]
|
|
|
|
self.translate = [ x - (x-self.translate[0]) * factor,
|
|
|
|
y - (y-self.translate[1]) * factor]
|
2011-07-26 12:47:47 +00:00
|
|
|
penwidth = max(1.0,self.filament_width*((self.scale[0]+self.scale[1])/2.0))
|
|
|
|
for pen in self.penslist:
|
|
|
|
pen.SetWidth(penwidth)
|
2011-07-10 09:57:11 +00:00
|
|
|
#self.dirty=1
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
|
|
|
self.Refresh()
|
2011-09-02 08:56:07 +00:00
|
|
|
|
2011-06-29 20:17:53 +00:00
|
|
|
def repaint(self):
|
2011-09-02 08:56:07 +00:00
|
|
|
self.blitmap=wx.EmptyBitmap(self.GetClientSize()[0],self.GetClientSize()[1],-1)
|
2011-06-29 20:17:53 +00:00
|
|
|
dc=wx.MemoryDC()
|
|
|
|
dc.SelectObject(self.blitmap)
|
2011-06-21 16:52:11 +00:00
|
|
|
dc.SetBackground(wx.Brush((250,250,200)))
|
|
|
|
dc.Clear()
|
2011-08-07 20:00:13 +00:00
|
|
|
dc.SetPen(wx.Pen(wx.Colour(180,180,150)))
|
|
|
|
for grid_unit in self.grid:
|
|
|
|
if grid_unit > 0:
|
|
|
|
for x in xrange(int(self.bedsize[0]/grid_unit)+1):
|
2011-08-07 20:05:02 +00:00
|
|
|
dc.DrawLine(self.translate[0]+x*self.scale[0]*grid_unit,self.translate[1],self.translate[0]+x*self.scale[0]*grid_unit,self.translate[1]+self.scale[1]*self.bedsize[1])
|
2011-08-07 20:00:13 +00:00
|
|
|
for y in xrange(int(self.bedsize[1]/grid_unit)+1):
|
2011-08-07 20:05:02 +00:00
|
|
|
dc.DrawLine(self.translate[0],self.translate[1]+y*self.scale[1]*grid_unit,self.translate[0]+self.scale[0]*self.bedsize[0],self.translate[1]+y*self.scale[1]*grid_unit)
|
2011-08-07 20:00:13 +00:00
|
|
|
dc.SetPen(wx.Pen(wx.Colour(0,0,0)))
|
2011-06-24 23:28:36 +00:00
|
|
|
if not self.showall:
|
2011-07-26 12:47:47 +00:00
|
|
|
self.size = self.GetSize()
|
2011-06-24 23:28:36 +00:00
|
|
|
dc.SetBrush(wx.Brush((43,144,255)))
|
|
|
|
dc.DrawRectangle(self.size[0]-15,0,15,self.size[1])
|
|
|
|
dc.SetBrush(wx.Brush((0,255,0)))
|
|
|
|
if len(self.layers):
|
|
|
|
dc.DrawRectangle(self.size[0]-14,(1.0-(1.0*(self.layerindex+1))/len(self.layers))*self.size[1],13,self.size[1]-1)
|
2011-06-26 17:46:03 +00:00
|
|
|
def scaler(x):
|
|
|
|
return (self.scale[0]*x[0]+self.translate[0],
|
|
|
|
self.scale[1]*x[1]+self.translate[1],
|
|
|
|
self.scale[0]*x[2]+self.translate[0],
|
|
|
|
self.scale[1]*x[3]+self.translate[1],)
|
2011-06-21 16:52:11 +00:00
|
|
|
if self.showall:
|
|
|
|
l=[]
|
|
|
|
for i in self.layers:
|
|
|
|
dc.DrawLineList(l,self.fades[0])
|
2011-06-26 17:46:03 +00:00
|
|
|
l=map(scaler,self.lines[i])
|
2011-06-21 16:52:11 +00:00
|
|
|
dc.DrawLineList(l,self.pens[i])
|
|
|
|
return
|
|
|
|
if self.layerindex<len(self.layers) and self.layers[self.layerindex] in self.lines.keys():
|
2011-07-28 09:54:06 +00:00
|
|
|
for layer_i in xrange(max(0,self.layerindex-6),self.layerindex):
|
2011-06-21 16:52:11 +00:00
|
|
|
#print i, self.layerindex, self.layerindex-i
|
2011-07-28 09:54:06 +00:00
|
|
|
l=map(scaler,self.lines[self.layers[layer_i]])
|
|
|
|
dc.DrawLineList(l,self.fades[self.layerindex-layer_i-1])
|
2011-06-26 17:46:03 +00:00
|
|
|
l=map(scaler,self.lines[self.layers[self.layerindex]])
|
2011-06-21 16:52:11 +00:00
|
|
|
dc.DrawLineList(l,self.pens[self.layers[self.layerindex]])
|
2011-06-26 17:46:03 +00:00
|
|
|
l=map(scaler,self.hilight)
|
2011-06-22 11:40:27 +00:00
|
|
|
dc.DrawLineList(l,self.hlpen)
|
2011-06-29 20:17:53 +00:00
|
|
|
dc.SelectObject(wx.NullBitmap)
|
|
|
|
|
|
|
|
def paint(self,event):
|
|
|
|
dc=wx.PaintDC(self)
|
|
|
|
if(self.dirty):
|
|
|
|
self.repaint()
|
|
|
|
self.dirty=0
|
|
|
|
sz=self.GetClientSize()
|
|
|
|
dc.DrawBitmap(self.blitmap,0,0)
|
2011-06-21 16:52:11 +00:00
|
|
|
del dc
|
|
|
|
|
2011-06-22 11:40:27 +00:00
|
|
|
def addgcode(self,gcode="M105",hilight=0):
|
|
|
|
gcode=gcode.split("*")[0]
|
2011-06-30 12:05:53 +00:00
|
|
|
gcode=gcode.split(";")[0]
|
2011-06-21 16:52:11 +00:00
|
|
|
if "g1" in gcode.lower():
|
|
|
|
gcode=gcode.lower().split()
|
|
|
|
target=self.lastpos[:]
|
2011-06-22 11:40:27 +00:00
|
|
|
if hilight:
|
|
|
|
target=self.hilightpos[:]
|
2011-06-21 16:52:11 +00:00
|
|
|
for i in gcode:
|
|
|
|
if i[0]=="x":
|
|
|
|
target[0]=float(i[1:])
|
|
|
|
elif i[0]=="y":
|
|
|
|
target[1]=float(i[1:])
|
|
|
|
elif i[0]=="z":
|
|
|
|
target[2]=float(i[1:])
|
|
|
|
elif i[0]=="e":
|
|
|
|
target[3]=float(i[1:])
|
|
|
|
elif i[0]=="f":
|
|
|
|
target[4]=float(i[1:])
|
|
|
|
#draw line
|
2011-06-22 11:40:27 +00:00
|
|
|
if not hilight:
|
|
|
|
if not target[2] in self.lines.keys():
|
|
|
|
self.lines[target[2]]=[]
|
|
|
|
self.pens[target[2]]=[]
|
|
|
|
self.layers+=[target[2]]
|
|
|
|
self.lines[target[2]]+=[(self.lastpos[0],self.bedsize[1]-self.lastpos[1],target[0],self.bedsize[1]-target[1])]
|
|
|
|
self.pens[target[2]]+=[self.mainpen]
|
|
|
|
self.lastpos=target
|
|
|
|
else:
|
|
|
|
self.hilight+=[(self.hilightpos[0],self.bedsize[1]-self.hilightpos[1],target[0],self.bedsize[1]-target[1])]
|
|
|
|
self.hilightpos=target
|
2011-06-29 20:17:53 +00:00
|
|
|
self.dirty=1
|
2011-06-21 16:52:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
app = wx.App(False)
|
2011-07-31 07:57:15 +00:00
|
|
|
#main = window(open("/home/kliment/designs/spinner/arm_export.gcode"))
|
|
|
|
main = window(open("jam.gcode"))
|
2011-06-21 16:52:11 +00:00
|
|
|
main.Show()
|
|
|
|
app.MainLoop()
|
|
|
|
|