2012-01-23 11:36:49 +00:00
|
|
|
# This file is part of the Printrun suite.
|
2012-08-08 06:39:50 +00:00
|
|
|
#
|
2012-01-23 11:36:49 +00:00
|
|
|
# Printrun is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
2012-08-08 06:39:50 +00:00
|
|
|
#
|
2012-01-23 11:36:49 +00:00
|
|
|
# Printrun is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
2012-08-08 06:39:50 +00:00
|
|
|
#
|
2012-01-23 11:36:49 +00:00
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with Printrun. If not, see <http://www.gnu.org/licenses/>.
|
2012-08-08 07:38:48 +00:00
|
|
|
import wx, time
|
2012-07-31 08:51:17 +00:00
|
|
|
|
|
|
|
from printrun_utils import imagefile
|
|
|
|
|
2012-04-22 23:32:42 +00:00
|
|
|
ID_ABOUT = 101
|
|
|
|
ID_EXIT = 110
|
2011-06-21 16:52:11 +00:00
|
|
|
class window(wx.Frame):
|
2012-08-08 07:58:09 +00:00
|
|
|
def __init__(self, f, size = (600, 600), build_dimensions = [200, 200, 100, 0, 0, 0], grid = (10, 50), extrusion_width = 0.5):
|
|
|
|
wx.Frame.__init__(self, None, title = "Gcode view, shift to move view, mousewheel to set layer", size = (size[0], size[1]))
|
2012-08-08 07:38:48 +00:00
|
|
|
self.p = gviz(self, size = size, build_dimensions = build_dimensions, grid = grid, extrusion_width = extrusion_width)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-05-08 13:53:33 +00:00
|
|
|
vbox = wx.BoxSizer(wx.VERTICAL)
|
2012-08-08 07:38:48 +00:00
|
|
|
toolbar = wx.ToolBar(self, -1, style = wx.TB_HORIZONTAL | wx.NO_BORDER)
|
2012-07-31 08:51:17 +00:00
|
|
|
toolbar.AddSimpleTool(1, wx.Image(imagefile('zoom_in.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Zoom In [+]', '')
|
|
|
|
toolbar.AddSimpleTool(2, wx.Image(imagefile('zoom_out.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Zoom Out [-]', '')
|
2012-05-08 13:53:33 +00:00
|
|
|
toolbar.AddSeparator()
|
2012-07-31 08:51:17 +00:00
|
|
|
toolbar.AddSimpleTool(3, wx.Image(imagefile('arrow_up.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Move Up a Layer [U]', '')
|
|
|
|
toolbar.AddSimpleTool(4, wx.Image(imagefile('arrow_down.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Move Down a Layer [D]', '')
|
2012-08-08 07:38:48 +00:00
|
|
|
toolbar.AddSimpleTool(5, wx.EmptyBitmap(16, 16), 'Reset view', '')
|
2012-05-08 13:53:33 +00:00
|
|
|
toolbar.AddSeparator()
|
|
|
|
#toolbar.AddSimpleTool(5, wx.Image('./images/inject.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Insert Code at start of this layer', '')
|
|
|
|
toolbar.Realize()
|
2012-08-08 07:38:48 +00:00
|
|
|
vbox.Add(toolbar, 0, border = 5)
|
2012-05-08 13:53:33 +00:00
|
|
|
self.SetSizer(vbox)
|
2012-08-08 07:38:48 +00:00
|
|
|
self.Bind(wx.EVT_TOOL, lambda x:self.p.zoom(200, 200, 1.2), id = 1)
|
|
|
|
self.Bind(wx.EVT_TOOL, lambda x:self.p.zoom(200, 200, 1/1.2), id = 2)
|
|
|
|
self.Bind(wx.EVT_TOOL, lambda x:self.p.layerup(), id = 3)
|
|
|
|
self.Bind(wx.EVT_TOOL, lambda x:self.p.layerdown(), id = 4)
|
|
|
|
self.Bind(wx.EVT_TOOL, self.resetview, id = 5)
|
|
|
|
#self.Bind(wx.EVT_TOOL, lambda x:self.p.inject(), id = 5)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
|
|
|
|
2012-04-20 11:25:28 +00:00
|
|
|
self.CreateStatusBar(1);
|
|
|
|
self.SetStatusText("Layer number and Z position show here when you scroll");
|
2012-08-08 07:58:09 +00:00
|
|
|
#self.bu = wx.Button(self.p,-1, "U", pos = (0, 100), size = (40, 140))
|
|
|
|
#self.bd = wx.Button(self.p,-1, "D", pos = (0, 140), size = (40, 140))
|
|
|
|
#self.bi = wx.Button(self.p,-1, "+", pos = (40, 100), size = (40, 140))
|
|
|
|
#self.bo = wx.Button(self.p,-1, "-", pos = (40, 140), size = (40, 140))
|
2012-08-08 07:38:48 +00:00
|
|
|
#self.bs = wx.Button(self.p, -1, "Inject", pos = (85, 103), size = (50, 20))
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-05-08 13:53:33 +00:00
|
|
|
#self.bu.SetToolTip(wx.ToolTip("Move up one layer"))
|
|
|
|
#self.bd.SetToolTip(wx.ToolTip("Move down one layer"))
|
|
|
|
#self.bi.SetToolTip(wx.ToolTip("Zoom view in"))
|
|
|
|
#self.bo.SetToolTip(wx.ToolTip("Zoom view out"))
|
|
|
|
#self.bs.SetToolTip(wx.ToolTip("Insert Code at start of this layer"))
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
#self.bu.Bind(wx.EVT_BUTTON, lambda x:self.p.layerup())
|
|
|
|
#self.bd.Bind(wx.EVT_BUTTON, lambda x:self.p.layerdown())
|
|
|
|
#self.bi.Bind(wx.EVT_BUTTON, lambda x:self.p.zoom(200, 200, 1.2))
|
|
|
|
#self.bo.Bind(wx.EVT_BUTTON, lambda x:self.p.zoom(200, 200, 1/1.2))
|
|
|
|
#self.bs.Bind(wx.EVT_BUTTON, lambda x:self.p.inject())
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
s = time.time()
|
2011-06-22 12:54:59 +00:00
|
|
|
#print time.time()-s
|
2012-08-08 07:58:09 +00:00
|
|
|
self.initpos = [0, 0]
|
2012-08-08 07:38:48 +00:00
|
|
|
self.p.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
#self.bu.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
#self.bd.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
#self.bi.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
#self.bo.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
self.Bind(wx.EVT_KEY_DOWN, self.key)
|
|
|
|
self.p.Bind(wx.EVT_MOUSEWHEEL, self.zoom)
|
|
|
|
self.Bind(wx.EVT_MOUSEWHEEL, self.zoom)
|
|
|
|
self.p.Bind(wx.EVT_MOUSE_EVENTS, self.mouse)
|
|
|
|
self.Bind(wx.EVT_MOUSE_EVENTS, self.mouse)
|
|
|
|
|
|
|
|
def resetview(self, event):
|
2012-08-08 07:58:09 +00:00
|
|
|
self.p.translate = [0.0, 0.0]
|
2012-08-08 07:38:48 +00:00
|
|
|
self.p.scale = self.p.basescale
|
2012-08-08 07:58:09 +00:00
|
|
|
self.p.zoom(0, 0, 1.0)
|
2012-08-08 07:38:48 +00:00
|
|
|
|
|
|
|
def mouse(self, event):
|
2011-07-15 07:15:12 +00:00
|
|
|
if event.ButtonUp(wx.MOUSE_BTN_LEFT):
|
|
|
|
if(self.initpos is not None):
|
2012-08-08 07:38:48 +00:00
|
|
|
self.initpos = None
|
2011-07-15 07:15:12 +00:00
|
|
|
elif event.Dragging():
|
2012-08-08 07:38:48 +00:00
|
|
|
e = event.GetPositionTuple()
|
2012-08-08 07:58:09 +00:00
|
|
|
if self.initpos is None or not hasattr(self, "basetrans"):
|
2012-08-08 07:38:48 +00:00
|
|
|
self.initpos = e
|
|
|
|
self.basetrans = self.p.translate
|
2012-08-08 07:58:09 +00:00
|
|
|
#print self.p.translate, e, self.initpos
|
2011-07-15 07:15:12 +00:00
|
|
|
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()
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-07-15 07:15:12 +00:00
|
|
|
else:
|
|
|
|
event.Skip()
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
def key(self, event):
|
2012-05-08 13:53:33 +00:00
|
|
|
# Keycode definitions
|
2012-08-08 07:58:09 +00:00
|
|
|
kup = [85, 315] # Up keys
|
|
|
|
kdo = [68, 317] # Down Keys
|
|
|
|
kzi = [388, 316, 61] # Zoom In Keys
|
|
|
|
kzo = [390, 314, 45] # Zoom Out Keys
|
2012-08-08 07:38:48 +00:00
|
|
|
x = event.GetKeyCode()
|
2012-05-08 13:53:33 +00:00
|
|
|
#print "Key event - "+str(x)
|
|
|
|
#if event.ShiftDown():
|
2012-08-08 07:38:48 +00:00
|
|
|
cx, cy = self.p.translate
|
|
|
|
# if x == wx.WXK_UP:
|
|
|
|
# self.p.zoom(cx, cy, 1.2)
|
|
|
|
# if x == wx.WXK_DOWN:
|
|
|
|
# self.p.zoom(cx, cy, 1/1.2)
|
2012-05-08 13:53:33 +00:00
|
|
|
#else:
|
2012-08-08 07:38:48 +00:00
|
|
|
# if x == wx.WXK_UP:
|
2012-05-08 13:53:33 +00:00
|
|
|
# self.p.layerup()
|
2012-08-08 07:38:48 +00:00
|
|
|
# if x == wx.WXK_DOWN:
|
2012-05-08 13:53:33 +00:00
|
|
|
# self.p.layerdown()
|
|
|
|
if x in kup:
|
|
|
|
self.p.layerup()
|
|
|
|
if x in kdo:
|
|
|
|
self.p.layerdown()
|
|
|
|
if x in kzi:
|
2012-08-08 07:38:48 +00:00
|
|
|
self.p.zoom(cx, cy, 1.2)
|
2012-05-08 13:53:33 +00:00
|
|
|
if x in kzo:
|
|
|
|
self.p.zoom(cx, cy, 1/1.2)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
#print p.lines.keys()
|
2011-06-26 17:46:03 +00:00
|
|
|
def zoom(self, event):
|
2012-08-08 07:38:48 +00:00
|
|
|
z = event.GetWheelRotation()
|
2011-07-10 09:57:11 +00:00
|
|
|
if event.ShiftDown():
|
|
|
|
if z > 0: self.p.layerdown()
|
|
|
|
elif z < 0: self.p.layerup()
|
|
|
|
else:
|
2012-08-08 07:58:09 +00:00
|
|
|
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)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
class gviz(wx.Panel):
|
2012-08-08 07:58:09 +00:00
|
|
|
def __init__(self, parent, size = (200, 200), build_dimensions = [200, 200, 100, 0, 0, 0], grid = (10, 50), extrusion_width = 0.5):
|
|
|
|
wx.Panel.__init__(self, parent,-1, size = (size[0], size[1]))
|
2012-08-08 07:38:48 +00:00
|
|
|
self.parent = parent
|
|
|
|
self.size = size
|
|
|
|
self.build_dimensions = build_dimensions
|
|
|
|
self.grid = grid
|
2012-08-08 07:58:09 +00:00
|
|
|
self.lastpos = [0, 0, 0, 0, 0, 0, 0]
|
2012-08-08 07:38:48 +00:00
|
|
|
self.hilightpos = self.lastpos[:]
|
|
|
|
self.Bind(wx.EVT_PAINT, self.paint)
|
|
|
|
self.Bind(wx.EVT_SIZE, self.resize)
|
2012-08-08 07:58:09 +00:00
|
|
|
self.lines = {}
|
|
|
|
self.pens = {}
|
|
|
|
self.arcs = {}
|
|
|
|
self.arcpens = {}
|
|
|
|
self.layers = []
|
2012-08-08 07:38:48 +00:00
|
|
|
self.layerindex = 0
|
|
|
|
self.filament_width = extrusion_width # set it to 0 to disable scaling lines with zoom
|
2012-08-08 07:58:09 +00:00
|
|
|
self.basescale = [min(float(size[0])/build_dimensions[0], float(size[1])/build_dimensions[1])]*2
|
2012-08-08 07:38:48 +00:00
|
|
|
self.scale = self.basescale
|
|
|
|
penwidth = max(1.0, self.filament_width*((self.scale[0]+self.scale[1])/2.0))
|
2012-08-08 07:58:09 +00:00
|
|
|
self.translate = [0.0, 0.0]
|
|
|
|
self.mainpen = wx.Pen(wx.Colour(0, 0, 0), penwidth)
|
|
|
|
self.arcpen = wx.Pen(wx.Colour(255, 0, 0), penwidth)
|
|
|
|
self.travelpen = wx.Pen(wx.Colour(10, 80, 80), 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.travelpen, self.hlpen]+self.fades
|
2012-08-08 07:38:48 +00:00
|
|
|
self.showall = 0
|
2012-08-08 07:58:09 +00:00
|
|
|
self.hilight = []
|
|
|
|
self.hilightarcs = []
|
2012-08-08 07:38:48 +00:00
|
|
|
self.dirty = 1
|
2012-08-08 07:58:09 +00:00
|
|
|
self.blitmap = wx.EmptyBitmap(self.GetClientSize()[0], self.GetClientSize()[1],-1)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-05-08 13:53:33 +00:00
|
|
|
def inject(self):
|
|
|
|
#import pdb; pdb.set_trace()
|
|
|
|
print"Inject code here..."
|
|
|
|
print "Layer "+str(self.layerindex +1)+" - Z = "+str(self.layers[self.layerindex])+" mm"
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
def clear(self):
|
2012-08-08 07:58:09 +00:00
|
|
|
self.lastpos = [0, 0, 0, 0, 0, 0, 0]
|
|
|
|
self.lines = {}
|
|
|
|
self.pens = {}
|
|
|
|
self.arcs = {}
|
|
|
|
self.arcpens = {}
|
|
|
|
self.layers = []
|
|
|
|
self.hilight = []
|
|
|
|
self.hilightarcs = []
|
2012-08-08 07:38:48 +00:00
|
|
|
self.layerindex = 0
|
|
|
|
self.showall = 0
|
|
|
|
self.dirty = 1
|
2012-08-08 06:39:50 +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
|
2012-04-20 11:52:31 +00:00
|
|
|
# Display layer info on statusbar (Jezmy)
|
2012-08-08 07:58:09 +00:00
|
|
|
self.parent.SetStatusText("Layer "+str(self.layerindex +1)+" - Going Up - Z = "+str(self.layers[self.layerindex])+" mm", 0)
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
2011-06-21 16:52:11 +00:00
|
|
|
self.Refresh()
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
def layerdown(self):
|
|
|
|
if(self.layerindex>0):
|
2012-08-08 06:39:50 +00:00
|
|
|
self.layerindex-=1
|
2012-04-20 11:52:31 +00:00
|
|
|
# Display layer info on statusbar (Jezmy)
|
2012-08-08 07:58:09 +00:00
|
|
|
self.parent.SetStatusText("Layer "+str(self.layerindex + 1)+" - Going Down - Z = "+str(self.layers[self.layerindex])+ " mm", 0)
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
2011-06-21 16:52:11 +00:00
|
|
|
self.Refresh()
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
def setlayer(self, layer):
|
2011-06-22 10:21:04 +00:00
|
|
|
try:
|
2012-08-08 07:38:48 +00:00
|
|
|
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)
|
2012-08-08 07:38:48 +00:00
|
|
|
self.showall = 0
|
2011-06-22 10:21:04 +00:00
|
|
|
except:
|
|
|
|
pass
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
def resize(self, event):
|
|
|
|
size = self.GetClientSize()
|
2012-09-05 09:21:02 +00:00
|
|
|
size = [max(1.0, size[0]), max(1.0, size[1])]
|
|
|
|
self.size = [max(1.0, self.size[0]), max(1.0, self.size[1])]
|
2012-08-08 07:58:09 +00:00
|
|
|
newsize = min(float(size[0])/self.size[0], float(size[1])/self.size[1])
|
2012-08-08 07:38:48 +00:00
|
|
|
self.size = self.GetClientSize()
|
2012-08-08 07:58:09 +00:00
|
|
|
wx.CallAfter(self.zoom, 0, 0, newsize)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-22 10:21:04 +00:00
|
|
|
|
2012-08-08 07:58:09 +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]
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-07-10 09:57:11 +00:00
|
|
|
self.translate = [ x - (x-self.translate[0]) * factor,
|
|
|
|
y - (y-self.translate[1]) * factor]
|
2012-08-08 07:38:48 +00:00
|
|
|
penwidth = max(1.0, self.filament_width*((self.scale[0]+self.scale[1])/2.0))
|
2011-07-26 12:47:47 +00:00
|
|
|
for pen in self.penslist:
|
|
|
|
pen.SetWidth(penwidth)
|
2012-08-08 07:38:48 +00:00
|
|
|
#self.dirty = 1
|
2011-06-29 20:17:53 +00:00
|
|
|
self.repaint()
|
|
|
|
self.Refresh()
|
2012-08-08 06:39:50 +00:00
|
|
|
|
|
|
|
|
2011-06-29 20:17:53 +00:00
|
|
|
def repaint(self):
|
2012-08-08 07:58:09 +00:00
|
|
|
self.blitmap = wx.EmptyBitmap(self.GetClientSize()[0], self.GetClientSize()[1],-1)
|
2012-08-08 07:38:48 +00:00
|
|
|
dc = wx.MemoryDC()
|
2011-06-29 20:17:53 +00:00
|
|
|
dc.SelectObject(self.blitmap)
|
2012-08-08 07:38:48 +00:00
|
|
|
dc.SetBackground(wx.Brush((250, 250, 200)))
|
2011-06-21 16:52:11 +00:00
|
|
|
dc.Clear()
|
2012-08-08 07:38:48 +00:00
|
|
|
dc.SetPen(wx.Pen(wx.Colour(180, 180, 150)))
|
2011-08-07 20:00:13 +00:00
|
|
|
for grid_unit in self.grid:
|
|
|
|
if grid_unit > 0:
|
2011-12-11 09:11:47 +00:00
|
|
|
for x in xrange(int(self.build_dimensions[0]/grid_unit)+1):
|
2012-08-08 07:58:09 +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.build_dimensions[1])
|
2011-12-11 09:11:47 +00:00
|
|
|
for y in xrange(int(self.build_dimensions[1]/grid_unit)+1):
|
2012-08-08 07:58:09 +00:00
|
|
|
dc.DrawLine(self.translate[0], self.translate[1]+y*self.scale[1]*grid_unit, self.translate[0]+self.scale[0]*self.build_dimensions[0], self.translate[1]+y*self.scale[1]*grid_unit)
|
|
|
|
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()
|
2012-08-08 07:38:48 +00:00
|
|
|
dc.SetBrush(wx.Brush((43, 144, 255)))
|
2012-08-08 07:58:09 +00:00
|
|
|
dc.DrawRectangle(self.size[0]-15, 0, 15, self.size[1])
|
2012-08-08 07:38:48 +00:00
|
|
|
dc.SetBrush(wx.Brush((0, 255, 0)))
|
2011-06-24 23:28:36 +00:00
|
|
|
if len(self.layers):
|
2012-08-08 07:58:09 +00:00
|
|
|
dc.DrawRectangle(self.size[0]-14, (1.0-(1.0*(self.layerindex+1))/len(self.layers))*self.size[1], 13, self.size[1]-1)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
def _drawlines(lines, pens):
|
2011-11-07 09:38:51 +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],)
|
2012-08-08 07:38:48 +00:00
|
|
|
scaled_lines = map(_scaler, lines)
|
2011-11-07 09:38:51 +00:00
|
|
|
dc.DrawLineList(scaled_lines, pens)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
def _drawarcs(arcs, pens):
|
2011-11-07 09:38:51 +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],
|
|
|
|
self.scale[0]*x[4]+self.translate[0],
|
|
|
|
self.scale[1]*x[5]+self.translate[1],)
|
2012-08-08 07:38:48 +00:00
|
|
|
scaled_arcs = map(_scaler, arcs)
|
2011-11-07 09:38:51 +00:00
|
|
|
for i in range(len(scaled_arcs)):
|
|
|
|
dc.SetPen(pens[i] if type(pens).__name__ == 'list' else pens)
|
|
|
|
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
|
|
dc.DrawArc(*scaled_arcs[i])
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-21 16:52:11 +00:00
|
|
|
if self.showall:
|
2012-08-08 07:58:09 +00:00
|
|
|
l = []
|
2011-06-21 16:52:11 +00:00
|
|
|
for i in self.layers:
|
2012-08-08 07:38:48 +00:00
|
|
|
dc.DrawLineList(l, self.fades[0])
|
2011-11-07 09:38:51 +00:00
|
|
|
_drawlines(self.lines[i], self.pens[i])
|
|
|
|
_drawarcs(self.arcs[i], self.arcpens[i])
|
2011-06-21 16:52:11 +00:00
|
|
|
return
|
|
|
|
if self.layerindex<len(self.layers) and self.layers[self.layerindex] in self.lines.keys():
|
2012-08-08 07:58:09 +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-11-07 09:38:51 +00:00
|
|
|
_drawlines(self.lines[self.layers[layer_i]], self.fades[self.layerindex-layer_i-1])
|
|
|
|
_drawarcs(self.arcs[self.layers[layer_i]], self.fades[self.layerindex-layer_i-1])
|
|
|
|
_drawlines(self.lines[self.layers[self.layerindex]], self.pens[self.layers[self.layerindex]])
|
|
|
|
_drawarcs(self.arcs[self.layers[self.layerindex]], self.arcpens[self.layers[self.layerindex]])
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
_drawlines(self.hilight, self.hlpen)
|
|
|
|
_drawarcs(self.hilightarcs, self.hlpen)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-06-29 20:17:53 +00:00
|
|
|
dc.SelectObject(wx.NullBitmap)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:38:48 +00:00
|
|
|
def paint(self, event):
|
|
|
|
dc = wx.PaintDC(self)
|
2011-06-29 20:17:53 +00:00
|
|
|
if(self.dirty):
|
|
|
|
self.repaint()
|
2012-08-08 07:38:48 +00:00
|
|
|
self.dirty = 0
|
|
|
|
sz = self.GetClientSize()
|
2012-08-08 07:58:09 +00:00
|
|
|
dc.DrawBitmap(self.blitmap, 0, 0)
|
2011-06-21 16:52:11 +00:00
|
|
|
del dc
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:58:09 +00:00
|
|
|
def addfile(self, gcodes = []):
|
2011-12-03 22:05:30 +00:00
|
|
|
self.clear()
|
|
|
|
for i in gcodes:
|
|
|
|
self.addgcode(i)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-08-08 07:58:09 +00:00
|
|
|
def addgcode(self, gcode = "M105", hilight = 0):
|
2012-08-08 07:38:48 +00:00
|
|
|
gcode = gcode.split("*")[0]
|
|
|
|
gcode = gcode.split(";")[0]
|
2011-11-07 09:38:51 +00:00
|
|
|
gcode = gcode.lower().strip().split()
|
|
|
|
if len(gcode) == 0:
|
|
|
|
return
|
2011-12-07 11:22:45 +00:00
|
|
|
if gcode[0][0] == 'n':
|
|
|
|
gcode.pop(0)
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
def _readgcode():
|
2012-08-08 07:38:48 +00:00
|
|
|
target = self.lastpos[:]
|
2012-05-03 08:02:39 +00:00
|
|
|
target[5]=0.0
|
|
|
|
target[6]=0.0
|
2011-06-22 11:40:27 +00:00
|
|
|
if hilight:
|
2012-08-08 07:38:48 +00:00
|
|
|
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:])
|
2011-11-07 09:38:51 +00:00
|
|
|
elif i[0]=="i":
|
|
|
|
target[5]=float(i[1:])
|
|
|
|
elif i[0]=="j":
|
|
|
|
target[6]=float(i[1:])
|
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]]=[]
|
2011-11-07 09:38:51 +00:00
|
|
|
self.arcs[target[2]]=[]
|
|
|
|
self.arcpens[target[2]]=[]
|
2011-06-22 11:40:27 +00:00
|
|
|
self.layers+=[target[2]]
|
2011-11-07 09:38:51 +00:00
|
|
|
return target
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
def _y(y):
|
2011-12-11 09:11:47 +00:00
|
|
|
return self.build_dimensions[1]-(y-self.build_dimensions[4])
|
2011-12-10 14:04:53 +00:00
|
|
|
def _x(x):
|
2011-12-11 09:11:47 +00:00
|
|
|
return x-self.build_dimensions[3]
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
start_pos = self.hilightpos[:] if hilight else self.lastpos[:]
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2012-02-06 20:46:08 +00:00
|
|
|
if gcode[0] in [ "g0", "g1" ]:
|
2011-11-07 09:38:51 +00:00
|
|
|
target = _readgcode()
|
2011-12-10 14:04:53 +00:00
|
|
|
line = [ _x(start_pos[0]), _y(start_pos[1]), _x(target[0]), _y(target[1]) ]
|
2011-11-07 09:38:51 +00:00
|
|
|
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
|
2011-06-22 11:40:27 +00:00
|
|
|
else:
|
2011-11-13 22:08:06 +00:00
|
|
|
self.hilight += [line]
|
2011-11-07 09:38:51 +00:00
|
|
|
self.hilightpos = target
|
|
|
|
self.dirty = 1
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
if gcode[0] in [ "g2", "g3" ]:
|
|
|
|
target = _readgcode()
|
|
|
|
arc = []
|
2011-12-10 14:04:53 +00:00
|
|
|
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
|
2011-11-07 09:38:51 +00:00
|
|
|
if gcode[0] == "g2": # clockwise, reverse endpoints
|
|
|
|
arc[0], arc[1], arc[2], arc[3] = arc[2], arc[3], arc[0], arc[1]
|
2012-08-08 06:39:50 +00:00
|
|
|
|
2011-11-07 09:38:51 +00:00
|
|
|
if not hilight:
|
|
|
|
self.arcs[ target[2] ] += [arc]
|
2011-11-07 12:04:21 +00:00
|
|
|
self.arcpens[ target[2] ] += [self.arcpen]
|
2011-11-07 09:38:51 +00:00
|
|
|
self.lastpos = target
|
|
|
|
else:
|
2011-11-13 22:08:06 +00:00
|
|
|
self.hilightarcs += [arc]
|
2011-11-07 09:38:51 +00:00
|
|
|
self.hilightpos = target
|
|
|
|
self.dirty = 1
|
2012-08-08 06:39:50 +00:00
|
|
|
|
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()
|