Commit 03b42581 authored by kliment's avatar kliment

Merge pull request #146 from AxTheB/export

Reformat for pep8 conformance
parents 34e035cf 95aaa81b
#!/usr/bin/env python #!/usr/bin/env python
import wx,time,random,threading,os,math import wx
import stltool import time
import random
import threading
import os
import math
import sys import sys
import stltool
glview=False glview = False
if "-nogl" not in sys.argv: if "-nogl" not in sys.argv:
try: try:
import stlview import stlview
glview=True glview = True
except: except:
pass pass
def evalme(s): def evalme(s):
return eval(s[s.find("(")+1:s.find(")")]) return eval(s[s.find("(") + 1:s.find(")")])
class stlwrap: class stlwrap:
def __init__(self,obj,name=None): def __init__(self, obj, name=None):
self.obj=obj self.obj = obj
self.name=name self.name = name
if name is None: if name is None:
self.name=obj.name self.name = obj.name
def __repr__(self): def __repr__(self):
return self.name return self.name
class showstl(wx.Window): class showstl(wx.Window):
def __init__(self,parent,size,pos): def __init__(self, parent, size, pos):
wx.Window.__init__(self,parent,size=size,pos=pos) wx.Window.__init__(self, parent, size=size, pos=pos)
#self.SetBackgroundColour((0,0,0)) #self.SetBackgroundColour((0, 0, 0))
#wx.FutureCall(200,self.paint) #wx.FutureCall(200, self.paint)
self.i=0 self.i = 0
self.parent=parent self.parent = parent
self.previ=0 self.previ = 0
self.Bind(wx.EVT_MOUSEWHEEL,self.rot) self.Bind(wx.EVT_MOUSEWHEEL, self.rot)
self.Bind(wx.EVT_MOUSE_EVENTS,self.move) self.Bind(wx.EVT_MOUSE_EVENTS, self.move)
self.Bind(wx.EVT_PAINT,self.repaint) self.Bind(wx.EVT_PAINT, self.repaint)
self.Bind(wx.EVT_KEY_DOWN, self.keypress) self.Bind(wx.EVT_KEY_DOWN, self.keypress)
#self.s=stltool.stl("sphere.stl").scale([2,1,1]) #self.s = stltool.stl("sphere.stl").scale([2, 1, 1])
self.triggered=0 self.triggered = 0
self.initpos=None self.initpos = None
self.prevsel=-1 self.prevsel = -1
def drawmodel(self,m,scale): def drawmodel(self, m, scale):
m.bitmap=wx.EmptyBitmap(800,800,32) m.bitmap = wx.EmptyBitmap(800, 800, 32)
dc=wx.MemoryDC() dc = wx.MemoryDC()
dc.SelectObject(m.bitmap) dc.SelectObject(m.bitmap)
dc.SetBackground(wx.Brush((0,0,0,0))) dc.SetBackground(wx.Brush((0, 0, 0, 0)))
dc.SetBrush(wx.Brush((0,0,0,255))) dc.SetBrush(wx.Brush((0, 0, 0, 255)))
#dc.DrawRectangle(-1,-1,10000,10000) #dc.DrawRectangle(-1, -1, 10000, 10000)
dc.SetBrush(wx.Brush(wx.Colour(128,255,128))) dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128)))
dc.SetPen(wx.Pen(wx.Colour(128,128,128))) dc.SetPen(wx.Pen(wx.Colour(128, 128, 128)))
#m.offsets=[10,10,0] #m.offsets = [10, 10, 0]
#print m.offsets,m.dims #print m.offsets, m.dims
for i in m.facets:#random.sample(m.facets,min(100000,len(m.facets))): for i in m.facets: # random.sample(m.facets, min(100000, len(m.facets))):
dc.DrawPolygon([wx.Point(400+scale*p[0],(400-scale*p[1])) for p in i[1]]) dc.DrawPolygon([wx.Point(400 + scale * p[0], (400 - scale * p[1])) for p in i[1]])
#if(time.time()-t)>5: #if(time.time()-t)>5:
# break # break
dc.SelectObject(wx.NullBitmap) dc.SelectObject(wx.NullBitmap)
m.bitmap.SetMask(wx.Mask(m.bitmap,wx.Colour(0,0,0,255))) m.bitmap.SetMask(wx.Mask(m.bitmap, wx.Colour(0, 0, 0, 255)))
def move_shape(self, delta): def move_shape(self, delta):
"""moves shape (selected in l, which is list ListBox of shapes) """moves shape (selected in l, which is list ListBox of shapes)
...@@ -146,110 +150,111 @@ class showstl(wx.Window): ...@@ -146,110 +150,111 @@ class showstl(wx.Window):
event.Skip() event.Skip()
def rotateafter(self): def rotateafter(self):
if(self.i!=self.previ): if(self.i != self.previ):
i=self.parent.l.GetSelection() i = self.parent.l.GetSelection()
if i != wx.NOT_FOUND: if i != wx.NOT_FOUND:
#o=self.models[self.l.GetItemText(i)].offsets #o = self.models[self.l.GetItemText(i)].offsets
self.parent.models[self.parent.l.GetString(i)].rot-=5*(self.i-self.previ) self.parent.models[self.parent.l.GetString(i)].rot -= 5 * (self.i - self.previ)
#self.models[self.l.GetItemText(i)].offsets=o #self.models[self.l.GetItemText(i)].offsets = o
self.previ=self.i self.previ = self.i
self.Refresh() self.Refresh()
def cr(self): def cr(self):
time.sleep(0.01) time.sleep(0.01)
wx.CallAfter(self.rotateafter) wx.CallAfter(self.rotateafter)
self.triggered=0 self.triggered = 0
def rot(self, event): def rot(self, event):
z=event.GetWheelRotation() z = event.GetWheelRotation()
s=self.parent.l.GetSelection() s = self.parent.l.GetSelection()
if self.prevsel!=s: if self.prevsel != s:
self.i=0 self.i = 0
self.prevsel=s self.prevsel = s
if z < 0: if z < 0:
self.rotate_shape(-1) self.rotate_shape(-1)
else: else:
self.rotate_shape(1) self.rotate_shape(1)
def repaint(self,event): def repaint(self, event):
dc=wx.PaintDC(self) dc = wx.PaintDC(self)
self.paint(dc=dc) self.paint(dc=dc)
def paint(self,coord1="x",coord2="y",dc=None): def paint(self, coord1="x", coord2="y", dc=None):
coords={"x":0,"y":1,"z":2} coords = {"x": 0, "y": 1, "z": 2}
if dc is None: if dc is None:
dc=wx.ClientDC(self) dc = wx.ClientDC(self)
offset=[0,0] offset = [0, 0]
scale=2 scale = 2
dc.SetPen(wx.Pen(wx.Colour(100,100,100))) dc.SetPen(wx.Pen(wx.Colour(100, 100, 100)))
for i in xrange(20): for i in xrange(20):
dc.DrawLine(0,i*scale*10,400,i*scale*10) dc.DrawLine(0, i * scale * 10, 400, i * scale * 10)
dc.DrawLine(i*scale*10,0,i*scale*10,400) dc.DrawLine(i * scale * 10, 0, i * scale * 10, 400)
dc.SetPen(wx.Pen(wx.Colour(0,0,0))) dc.SetPen(wx.Pen(wx.Colour(0, 0, 0)))
for i in xrange(4): for i in xrange(4):
dc.DrawLine(0,i*scale*50,400,i*scale*50) dc.DrawLine(0, i * scale * 50, 400, i * scale * 50)
dc.DrawLine(i*scale*50,0,i*scale*50,400) dc.DrawLine(i * scale * 50, 0, i * scale * 50, 400)
dc.SetBrush(wx.Brush(wx.Colour(128,255,128))) dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128)))
dc.SetPen(wx.Pen(wx.Colour(128,128,128))) dc.SetPen(wx.Pen(wx.Colour(128, 128, 128)))
t=time.time() t = time.time()
dcs=wx.MemoryDC() dcs = wx.MemoryDC()
for m in self.parent.models.values(): for m in self.parent.models.values():
b=m.bitmap b = m.bitmap
#print b #print b
im=b.ConvertToImage() im = b.ConvertToImage()
#print im #print im
imgc = wx.Point( im.GetWidth()/2,im.GetHeight()/2 ) imgc = wx.Point(im.GetWidth() / 2, im.GetHeight() / 2)
#print math.radians(5*(self.i-self.previ)) #print math.radians(5*(self.i-self.previ))
im= im.Rotate( math.radians(m.rot), imgc, 0) im = im.Rotate(math.radians(m.rot), imgc, 0)
bm=wx.BitmapFromImage(im) bm = wx.BitmapFromImage(im)
dcs.SelectObject(bm) dcs.SelectObject(bm)
bsz=bm.GetSize() bsz = bm.GetSize()
dc.Blit(scale*m.offsets[0]-bsz[0]/2,400-(scale*m.offsets[1]+bsz[1]/2),bsz[0],bsz[1],dcs,0,0,useMask=1) dc.Blit(scale * m.offsets[0] - bsz[0] / 2, 400 - (scale * m.offsets[1] + bsz[1] / 2), bsz[0], bsz[1], dcs, 0, 0, useMask=1)
#for i in m.facets:#random.sample(m.facets,min(100000,len(m.facets))): #for i in m.facets:#random.sample(m.facets, min(100000, len(m.facets))):
# dc.DrawPolygon([wx.Point(offset[0]+scale*m.offsets[0]+scale*p[0],400-(offset[1]+scale*m.offsets[1]+scale*p[1])) for p in i[1]]) # dc.DrawPolygon([wx.Point(offset[0]+scale*m.offsets[0]+scale*p[0], 400-(offset[1]+scale*m.offsets[1]+scale*p[1])) for p in i[1]])
#if(time.time()-t)>5: #if(time.time()-t)>5:
# break # break
del dc del dc
#print time.time()-t #print time.time()-t
#s.export() #s.export()
class stlwin(wx.Frame): class stlwin(wx.Frame):
def __init__(self,size=(800,580),callback=None,parent=None): def __init__(self, size=(800, 580), callback=None, parent=None):
wx.Frame.__init__(self,parent,title="Plate building tool",size=size) wx.Frame.__init__(self, parent, title="Plate building tool", size=size)
self.SetIcon(wx.Icon("plater.ico",wx.BITMAP_TYPE_ICO)) self.SetIcon(wx.Icon("plater.ico", wx.BITMAP_TYPE_ICO))
self.mainsizer = wx.BoxSizer(wx.HORIZONTAL) self.mainsizer = wx.BoxSizer(wx.HORIZONTAL)
self.panel=wx.Panel(self,-1,size=(150,600),pos=(0,0)) self.panel = wx.Panel(self, -1, size=(150, 600), pos=(0, 0))
self.panel.SetBackgroundColour((10,10,10)) self.panel.SetBackgroundColour((10, 10, 10))
self.l=wx.ListBox(self.panel,size=(300,180),pos=(0,30)) self.l = wx.ListBox(self.panel, size=(300, 180), pos=(0, 30))
self.cl=wx.Button(self.panel,label="Clear",pos=(0,205)) self.cl = wx.Button(self.panel, label="Clear", pos=(0, 205))
self.lb=wx.Button(self.panel,label="Load",pos=(0,0)) self.lb = wx.Button(self.panel, label="Load", pos=(0, 0))
if(callback is None): if(callback is None):
self.eb=wx.Button(self.panel,label="Export",pos=(100,0)) self.eb = wx.Button(self.panel, label="Export", pos=(100, 0))
self.eb.Bind(wx.EVT_BUTTON,self.export) self.eb.Bind(wx.EVT_BUTTON, self.export)
else: else:
self.eb=wx.Button(self.panel,label="Done",pos=(100,0)) self.eb = wx.Button(self.panel, label="Done", pos=(100, 0))
self.eb.Bind(wx.EVT_BUTTON,lambda e:self.done(e,callback)) self.eb.Bind(wx.EVT_BUTTON, lambda e: self.done(e, callback))
self.eb=wx.Button(self.panel,label="Cancel",pos=(200,0)) self.eb = wx.Button(self.panel, label="Cancel", pos=(200, 0))
self.eb.Bind(wx.EVT_BUTTON,lambda e:self.Destroy()) self.eb.Bind(wx.EVT_BUTTON, lambda e: self.Destroy())
self.sb=wx.Button(self.panel,label="Snap to Z=0",pos=(00,255)) self.sb = wx.Button(self.panel, label="Snap to Z = 0", pos=(00, 255))
self.cb=wx.Button(self.panel,label="Put at 100,100",pos=(0,280)) self.cb = wx.Button(self.panel, label="Put at 100, 100", pos=(0, 280))
self.db=wx.Button(self.panel,label="Delete",pos=(0,305)) self.db = wx.Button(self.panel, label="Delete", pos=(0, 305))
self.ab=wx.Button(self.panel,label="Auto",pos=(0,330)) self.ab = wx.Button(self.panel, label="Auto", pos=(0, 330))
self.cl.Bind(wx.EVT_BUTTON,self.clear) self.cl.Bind(wx.EVT_BUTTON, self.clear)
self.lb.Bind(wx.EVT_BUTTON,self.right) self.lb.Bind(wx.EVT_BUTTON, self.right)
self.sb.Bind(wx.EVT_BUTTON,self.snap) self.sb.Bind(wx.EVT_BUTTON, self.snap)
self.cb.Bind(wx.EVT_BUTTON,self.center) self.cb.Bind(wx.EVT_BUTTON, self.center)
self.db.Bind(wx.EVT_BUTTON,self.delete) self.db.Bind(wx.EVT_BUTTON, self.delete)
self.ab.Bind(wx.EVT_BUTTON,self.autoplate) self.ab.Bind(wx.EVT_BUTTON, self.autoplate)
self.basedir="." self.basedir = "."
self.models={} self.models = {}
self.SetBackgroundColour((10,10,10)) self.SetBackgroundColour((10, 10, 10))
self.mainsizer.Add(self.panel) self.mainsizer.Add(self.panel)
#self.mainsizer.AddSpacer(10) #self.mainsizer.AddSpacer(10)
if glview: if glview:
self.s=stlview.TestGlPanel(self,(580,580)) self.s = stlview.TestGlPanel(self, (580, 580))
else: else:
self.s=showstl(self,(580,580),(0,0)) self.s = showstl(self, (580, 580), (0, 0))
self.mainsizer.Add(self.s, 1, wx.EXPAND) self.mainsizer.Add(self.s, 1, wx.EXPAND)
self.SetSizer(self.mainsizer) self.SetSizer(self.mainsizer)
#self.mainsizer.Fit(self) #self.mainsizer.Fit(self)
...@@ -257,22 +262,22 @@ class stlwin(wx.Frame): ...@@ -257,22 +262,22 @@ class stlwin(wx.Frame):
#self.SetClientSize(size) #self.SetClientSize(size)
def autoplate(self,event): def autoplate(self, event):
print "Autoplating" print "Autoplating"
separation = 2 separation = 2
bedsize = [200,200,100] bedsize = [200, 200, 100]
cursor = [0,0,0] cursor = [0, 0, 0]
newrow = 0 newrow = 0
max = [0,0] max = [0, 0]
for i in self.models: for i in self.models:
self.models[i].offsets[2]=-1.0*self.models[i].dims[4] self.models[i].offsets[2] = -1.0 * self.models[i].dims[4]
x = abs(self.models[i].dims[0] - self.models[i].dims[1]) x = abs(self.models[i].dims[0] - self.models[i].dims[1])
y = abs(self.models[i].dims[2] - self.models[i].dims[3]) y = abs(self.models[i].dims[2] - self.models[i].dims[3])
centre = [x/2, y/2] centre = [x / 2, y / 2]
centreoffset = [self.models[i].dims[0] + centre[0], self.models[i].dims[2] + centre[1]] centreoffset = [self.models[i].dims[0] + centre[0], self.models[i].dims[2] + centre[1]]
if (cursor[0]+x+separation) >= bedsize[0]: if (cursor[0] + x + separation) >= bedsize[0]:
cursor[0] = 0 cursor[0] = 0
cursor[1] += newrow+separation cursor[1] += newrow + separation
newrow = 0 newrow = 0
if (newrow == 0) or (newrow < y): if (newrow == 0) or (newrow < y):
newrow = y newrow = y
...@@ -280,103 +285,100 @@ class stlwin(wx.Frame): ...@@ -280,103 +285,100 @@ class stlwin(wx.Frame):
# Good job, it confused the hell out of me. # Good job, it confused the hell out of me.
self.models[i].offsets[0] = cursor[0] + centre[0] - centreoffset[0] self.models[i].offsets[0] = cursor[0] + centre[0] - centreoffset[0]
self.models[i].offsets[1] = cursor[1] + centre[1] - centreoffset[1] self.models[i].offsets[1] = cursor[1] + centre[1] - centreoffset[1]
if (max[0] == 0) or (max[0] < (cursor[0]+x)): if (max[0] == 0) or (max[0] < (cursor[0] + x)):
max[0] = cursor[0]+x max[0] = cursor[0] + x
if (max[1] == 0) or (max[1] < (cursor[1]+x)): if (max[1] == 0) or (max[1] < (cursor[1] + x)):
max[1] = cursor[1]+x max[1] = cursor[1] + x
cursor[0] += x+separation cursor[0] += x + separation
if (cursor[1]+y) >= bedsize[1]: if (cursor[1] + y) >= bedsize[1]:
print "Bed full, sorry sir :(" print "Bed full, sorry sir :("
self.Refresh() self.Refresh()
return return
centreoffset = [(bedsize[0]-max[0])/2,(bedsize[1]-max[1])/2] centreoffset = [(bedsize[0] - max[0]) / 2, (bedsize[1] - max[1]) / 2]
for i in self.models: for i in self.models:
self.models[i].offsets[0] += centreoffset[0] self.models[i].offsets[0] += centreoffset[0]
self.models[i].offsets[1] += centreoffset[1] self.models[i].offsets[1] += centreoffset[1]
self.Refresh() self.Refresh()
def clear(self, event):
def clear(self,event):
result = wx.MessageBox('Are you sure you want to clear the grid? All unsaved changes will be lost.', 'Clear the grid?', result = wx.MessageBox('Are you sure you want to clear the grid? All unsaved changes will be lost.', 'Clear the grid?',
wx.YES_NO | wx.ICON_QUESTION) wx.YES_NO | wx.ICON_QUESTION)
if (result == 2): if (result == 2):
self.models={} self.models = {}
self.l.Clear() self.l.Clear()
self.Refresh() self.Refresh()
def center(self,event): def center(self, event):
i=self.l.GetSelection() i = self.l.GetSelection()
if i != -1: if i != -1:
m=self.models[self.l.GetString(i)] m = self.models[self.l.GetString(i)]
m.offsets=[100,100,m.offsets[2]] m.offsets = [100, 100, m.offsets[2]]
self.Refresh() self.Refresh()
def snap(self,event): def snap(self, event):
i=self.l.GetSelection() i = self.l.GetSelection()
if i != -1: if i != -1:
m=self.models[self.l.GetString(i)] m = self.models[self.l.GetString(i)]
m.offsets[2]=-1.0*min(m.facetsminz)[0] m.offsets[2] = -1.0 * min(m.facetsminz)[0]
#print m.offsets[2] #print m.offsets[2]
self.Refresh() self.Refresh()
def delete(self,event): def delete(self, event):
i=self.l.GetSelection() i = self.l.GetSelection()
if i != -1: if i != -1:
del self.models[self.l.GetString(i)] del self.models[self.l.GetString(i)]
self.l.Delete(i) self.l.Delete(i)
self.l.Select(self.l.GetCount()-1) self.l.Select(self.l.GetCount() - 1)
self.Refresh() self.Refresh()
def done(self,event,cb): def done(self, event, cb):
import os,time
try: try:
os.mkdir("tempstl") os.mkdir("tempstl")
except: except:
pass pass
name="tempstl/"+str(int(time.time())%10000)+".stl" name = "tempstl/" + str(int(time.time()) % 10000) + ".stl"
self.writefiles(name) self.writefiles(name)
if cb is not None: if cb is not None:
cb(name) cb(name)
self.Destroy() self.Destroy()
def export(self, event):
def export(self,event): dlg = wx.FileDialog(self, "Pick file to save to", self.basedir, style=wx.FD_SAVE)
dlg=wx.FileDialog(self,"Pick file to save to",self.basedir,style=wx.FD_SAVE)
dlg.SetWildcard("STL files (;*.stl;)") dlg.SetWildcard("STL files (;*.stl;)")
if(dlg.ShowModal() == wx.ID_OK): if(dlg.ShowModal() == wx.ID_OK):
name=dlg.GetPath() name = dlg.GetPath()
self.writefiles(name) self.writefiles(name)
def writefiles(self,name): def writefiles(self, name):
sf=open(name.replace(".","_")+".scad","w") sf = open(name.replace(".", "_") + ".scad", "w")
facets=[] facets = []
for i in self.models.values(): for i in self.models.values():
r=i.rot r = i.rot
o=i.offsets o = i.offsets
sf.write('translate([%s,%s,%s]) rotate([0,0,%s]) import_stl("%s");\n'%(str(o[0]),str(o[1]),str(o[2]),r,os.path.split(i.filename)[1])) sf.write('translate([%s, %s, %s]) rotate([0, 0, %s]) import_stl("%s");\n' % (str(o[0]), str(o[1]), str(o[2]), r, os.path.split(i.filename)[1]))
if r != 0: if r != 0:
i=i.rotate([0,0,r]) i = i.rotate([0, 0, r])
if o != [0,0,0]: if o != [0, 0, 0]:
i=i.translate([o[0],o[1],o[2]]) i = i.translate([o[0], o[1], o[2]])
facets+=i.facets facets += i.facets
sf.close() sf.close()
stltool.emitstl(name,facets,"plater_export") stltool.emitstl(name, facets, "plater_export")
print "wrote ",name print "wrote ", name
def right(self,event): def right(self, event):
dlg=wx.FileDialog(self,"Pick file to load",self.basedir,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) dlg = wx.FileDialog(self, "Pick file to load", self.basedir, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
dlg.SetWildcard("STL files (;*.stl;)|*.stl|OpenSCAD files (;*.scad;)|*.scad") dlg.SetWildcard("STL files (;*.stl;)|*.stl|OpenSCAD files (;*.scad;)|*.scad")
if(dlg.ShowModal() == wx.ID_OK): if(dlg.ShowModal() == wx.ID_OK):
name=dlg.GetPath() name = dlg.GetPath()
if (name.lower().endswith(".stl")): if (name.lower().endswith(".stl")):
self.load_stl(event,name) self.load_stl(event, name)
elif (name.lower().endswith(".scad")): elif (name.lower().endswith(".scad")):
self.load_scad(event,name) self.load_scad(event, name)
def load_scad(self,event,name): def load_scad(self, event, name):
lf=open(name) lf = open(name)
s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf if "stl" in i] s = [i.replace("\n", "").replace("\r", "").replace(";", "") for i in lf if "stl" in i]
lf.close() lf.close()
for i in s: for i in s:
...@@ -391,70 +393,70 @@ class stlwin(wx.Frame): ...@@ -391,70 +393,70 @@ class stlwin(wx.Frame):
if 'import' in part: if 'import' in part:
stl_file = evalme(part) stl_file = evalme(part)
newname=os.path.split(stl_file.lower())[1] newname = os.path.split(stl_file.lower())[1]
c=1 c = 1
while newname in self.models: while newname in self.models:
newname=os.path.split(stl_file.lower())[1] newname = os.path.split(stl_file.lower())[1]
newname=newname+"(%d)"%c newname = newname + "(%d)" % c
c+=1 c += 1
stl_path = os.path.join(os.path.split(name)[0:len(os.path.split(stl_file))-1]) stl_path = os.path.join(os.path.split(name)[0:len(os.path.split(stl_file)) - 1])
stl_full_path = os.path.join(stl_path[0],str(stl_file)) stl_full_path = os.path.join(stl_path[0], str(stl_file))
self.load_stl_into_model(stl_full_path,stl_file,translate_list,rotate_list[2]) self.load_stl_into_model(stl_full_path, stl_file, translate_list, rotate_list[2])
def load_stl(self,event,name): def load_stl(self, event, name):
if not(os.path.exists(name)): if not(os.path.exists(name)):
return return
path = os.path.split(name)[0] path = os.path.split(name)[0]
self.basedir=path self.basedir = path
t=time.time() t = time.time()
#print name #print name
if name.lower().endswith(".stl"): if name.lower().endswith(".stl"):
#Filter out the path, just show the STL filename. #Filter out the path, just show the STL filename.
self.load_stl_into_model(name,name) self.load_stl_into_model(name, name)
self.Refresh() self.Refresh()
#print time.time()-t #print time.time()-t
def load_stl_into_model(self,path,name,offset=[0,0,0],rotation=0,scale=[1.0,1.0,1.0]): def load_stl_into_model(self, path, name, offset=[0, 0, 0], rotation=0, scale=[1.0, 1.0, 1.0]):
newname=os.path.split(name.lower())[1] newname = os.path.split(name.lower())[1]
c=1 c = 1
while newname in self.models: while newname in self.models:
newname=os.path.split(name.lower())[1] newname = os.path.split(name.lower())[1]
newname=newname+"(%d)"%c newname = newname + "(%d)" % c
c+=1 c += 1
self.models[newname]=stltool.stl(path) self.models[newname] = stltool.stl(path)
self.models[newname].offsets=offset self.models[newname].offsets = offset
self.models[newname].rot=rotation self.models[newname].rot = rotation
self.models[newname].scale=scale self.models[newname].scale = scale
self.models[newname].filename=name self.models[newname].filename = name
minx,miny,minz,maxx,maxy,maxz=(10000,10000,10000,0,0,0) minx, miny, minz, maxx, maxy, maxz = (10000, 10000, 10000, 0, 0, 0)
for i in self.models[newname].facets: for i in self.models[newname].facets:
for j in i[1]: for j in i[1]:
if j[0]<minx: if j[0] < minx:
minx=j[0] minx = j[0]
if j[1]<miny: if j[1] < miny:
miny=j[1] miny = j[1]
if j[2]<minz: if j[2] < minz:
minz=j[2] minz = j[2]
if j[0]>maxx: if j[0] > maxx:
maxx=j[0] maxx = j[0]
if j[1]>maxy: if j[1] > maxy:
maxy=j[1] maxy = j[1]
if j[2]>maxz: if j[2] > maxz:
maxz=j[2] maxz = j[2]
self.models[newname].dims=[minx,maxx,miny,maxy,minz,maxz] self.models[newname].dims = [minx, maxx, miny, maxy, minz, maxz]
#if minx<0: #if minx < 0:
# self.models[newname].offsets[0]=-minx # self.models[newname].offsets[0] = -minx
#if miny<0: #if miny < 0:
# self.models[newname].offsets[1]=-miny # self.models[newname].offsets[1] = -miny
self.s.drawmodel(self.models[newname],2) self.s.drawmodel(self.models[newname], 2)
#print time.time()-t #print time.time() - t
self.l.Append(newname) self.l.Append(newname)
i=self.l.GetSelection() i = self.l.GetSelection()
if i==wx.NOT_FOUND: if i == wx.NOT_FOUND:
self.l.Select(0) self.l.Select(0)
self.l.Select(self.l.GetCount()-1) self.l.Select(self.l.GetCount() - 1)
if __name__ == '__main__': if __name__ == '__main__':
...@@ -462,4 +464,3 @@ if __name__ == '__main__': ...@@ -462,4 +464,3 @@ if __name__ == '__main__':
main = stlwin() main = stlwin()
main.Show() main.Show()
app.MainLoop() app.MainLoop()
#!/usr/bin/python #!/usr/bin/python
import os import os
import wx,math,stltool import math
import stltool
import wx
from wx import glcanvas from wx import glcanvas
import time import time
import threading import threading
...@@ -8,11 +10,10 @@ import threading ...@@ -8,11 +10,10 @@ import threading
import pyglet import pyglet
pyglet.options['shadow_window'] = False pyglet.options['shadow_window'] = False
pyglet.options['debug_gl'] = False pyglet.options['debug_gl'] = False
from pyglet import gl
from pyglet.gl import * from pyglet.gl import *
class GLPanel(wx.Panel):
class GLPanel(wx.Panel):
'''A simple class for using OpenGL with wxPython.''' '''A simple class for using OpenGL with wxPython.'''
def __init__(self, parent, id, pos=wx.DefaultPosition, def __init__(self, parent, id, pos=wx.DefaultPosition,
...@@ -95,12 +96,12 @@ class GLPanel(wx.Panel): ...@@ -95,12 +96,12 @@ class GLPanel(wx.Panel):
def OnInitGL(self): def OnInitGL(self):
'''Initialize OpenGL for use in the window.''' '''Initialize OpenGL for use in the window.'''
#create a pyglet context for this panel #create a pyglet context for this panel
self.pmat=(GLdouble * 16)() self.pmat = (GLdouble * 16)()
self.mvmat=(GLdouble * 16)() self.mvmat = (GLdouble * 16)()
self.pygletcontext = Context(current_context) self.pygletcontext = Context(current_context)
self.pygletcontext.set_current() self.pygletcontext.set_current()
self.dist=1000 self.dist = 1000
self.vpmat=None self.vpmat = None
#normal gl init #normal gl init
glClearColor(0, 0, 0, 1) glClearColor(0, 0, 0, 1)
glColor3f(1, 0, 0) glColor3f(1, 0, 0)
...@@ -130,20 +131,18 @@ class GLPanel(wx.Panel): ...@@ -130,20 +131,18 @@ class GLPanel(wx.Panel):
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.5, 0, 0.3, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.5, 0, 0.3, 1))
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(1, 1, 1, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(1, 1, 1, 1))
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50) glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50)
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, vec(0,0.1,0,0.9)) glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, vec(0, 0.1, 0, 0.9))
#create objects to draw #create objects to draw
#self.create_objects() #self.create_objects()
def OnReshape(self, width, height): def OnReshape(self, width, height):
'''Reshape the OpenGL viewport based on the dimensions of the window.''' '''Reshape the OpenGL viewport based on the dimensions of the window.'''
if not self.GLinitialized: if not self.GLinitialized:
self.OnInitGL() self.OnInitGL()
self.GLinitialized = True self.GLinitialized = True
self.pmat=(GLdouble * 16)() self.pmat = (GLdouble * 16)()
self.mvmat=(GLdouble * 16)() self.mvmat = (GLdouble * 16)()
glViewport(0, 0, width, height) glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION) glMatrixMode(GL_PROJECTION)
glLoadIdentity() glLoadIdentity()
...@@ -151,12 +150,11 @@ class GLPanel(wx.Panel): ...@@ -151,12 +150,11 @@ class GLPanel(wx.Panel):
glMatrixMode(GL_MODELVIEW) glMatrixMode(GL_MODELVIEW)
glLoadIdentity() glLoadIdentity()
#pyglet stuff #pyglet stuff
self.vpmat=(GLint * 4)(0,0,*list(self.GetClientSize())) self.vpmat = (GLint * 4)(0, 0, *list(self.GetClientSize()))
glGetDoublev(GL_PROJECTION_MATRIX,self.pmat) glGetDoublev(GL_PROJECTION_MATRIX, self.pmat)
glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat)
#glMatrixMode(GL_PROJECTION) #glMatrixMode(GL_PROJECTION)
# Wrap text to the width of the window # Wrap text to the width of the window
if self.GLinitialized: if self.GLinitialized:
self.pygletcontext.set_current() self.pygletcontext.set_current()
...@@ -167,7 +165,7 @@ class GLPanel(wx.Panel): ...@@ -167,7 +165,7 @@ class GLPanel(wx.Panel):
#clear the context #clear the context
self.canvas.SetCurrent() self.canvas.SetCurrent()
self.pygletcontext.set_current() self.pygletcontext.set_current()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
#draw objects #draw objects
self.draw_objects() self.draw_objects()
#update screen #update screen
...@@ -188,6 +186,7 @@ class GLPanel(wx.Panel): ...@@ -188,6 +186,7 @@ class GLPanel(wx.Panel):
'''called in the middle of ondraw after the buffer has been cleared''' '''called in the middle of ondraw after the buffer has been cleared'''
pass pass
class stlview(object): class stlview(object):
def __init__(self, facets, batch): def __init__(self, facets, batch):
# Create the vertex and normal arrays. # Create the vertex and normal arrays.
...@@ -200,11 +199,11 @@ class stlview(object): ...@@ -200,11 +199,11 @@ class stlview(object):
normals.extend(i[0]) normals.extend(i[0])
# Create a list of triangle indices. # Create a list of triangle indices.
indices = range(3*len(facets))#[[3*i,3*i+1,3*i+2] for i in xrange(len(facets))] indices = range(3 * len(facets)) # [[3*i,3*i+1,3*i+2] for i in xrange(len(facets))]
#print indices[:10] #print indices[:10]
self.vertex_list = batch.add_indexed(len(vertices)//3, self.vertex_list = batch.add_indexed(len(vertices) // 3,
GL_TRIANGLES, GL_TRIANGLES,
None,#group, None, # group,
indices, indices,
('v3f/static', vertices), ('v3f/static', vertices),
('n3f/static', normals)) ('n3f/static', normals))
...@@ -212,8 +211,9 @@ class stlview(object): ...@@ -212,8 +211,9 @@ class stlview(object):
def delete(self): def delete(self):
self.vertex_list.delete() self.vertex_list.delete()
def vdiff(v,o):
return [x[0]-x[1] for x in zip(v,o)] def vdiff(v, o):
return [x[0] - x[1] for x in zip(v, o)]
class gcview(object): class gcview(object):
...@@ -221,213 +221,227 @@ class gcview(object): ...@@ -221,213 +221,227 @@ class gcview(object):
# Create the vertex and normal arrays. # Create the vertex and normal arrays.
vertices = [] vertices = []
normals = [] normals = []
self.prev=[0.001,0.001,0.001,0.001] self.prev = [0.001, 0.001, 0.001, 0.001]
self.fline=1 self.fline = 1
self.vlists=[] self.vlists = []
self.layers={} self.layers = {}
t0=time.time() t0 = time.time()
lines=[self.transform(i) for i in lines] lines = [self.transform(i) for i in lines]
lines=[i for i in lines if i is not None] lines = [i for i in lines if i is not None]
print "transformed lines in %fs"%(time.time()-t0) print "transformed lines in %fs" % (time.time() - t0)
t0=time.time() t0 = time.time()
layertemp={} layertemp = {}
lasth=None lasth = None
counter=0 counter = 0
if len(lines)==0: if len(lines) == 0:
return return
for i in lines: for i in lines:
counter+=1 counter += 1
if i[0][2] not in layertemp: if i[0][2] not in layertemp:
layertemp[i[0][2]]=[[],[]] layertemp[i[0][2]] = [[], []]
if lasth is not None: if lasth is not None:
self.layers[lasth]=pyglet.graphics.Batch() self.layers[lasth] = pyglet.graphics.Batch()
lt=layertemp[lasth][0] lt = layertemp[lasth][0]
indices = range(len(layertemp[lasth][0])//3)#[[3*i,3*i+1,3*i+2] for i in xrange(len(facets))] indices = range(len(layertemp[lasth][0]) // 3) # [[3*i,3*i+1,3*i+2] for i in xrange(len(facets))]
self.vlists.append(self.layers[lasth].add_indexed(len(layertemp[lasth][0])//3, self.vlists.append(self.layers[lasth].add_indexed(len(layertemp[lasth][0]) // 3,
GL_TRIANGLES, GL_TRIANGLES,
None,#group, None, # group,
indices, indices,
('v3f/static', layertemp[lasth][0]), ('v3f/static', layertemp[lasth][0]),
('n3f/static', layertemp[lasth][1]))) ('n3f/static', layertemp[lasth][1])))
lasth=i[0][2] lasth = i[0][2]
spoints,epoints,S,E=self.genline(i,h,w) spoints, epoints, S, E = self.genline(i, h, w)
verticestoadd=[[spoints[(j+1)%8],epoints[(j)%8],spoints[j],epoints[j],spoints[(j+1)%8],epoints[(j+1)%8]] for j in xrange(8)] verticestoadd = [[
normalstoadd=[map(vdiff,v,[S,E,S,E,S,E]) for v in verticestoadd] spoints[(j + 1) % 8],
v1=[] epoints[(j) % 8],
map(v1.extend,verticestoadd) spoints[j],
v2=[] epoints[j],
map(v2.extend,v1) spoints[(j + 1) % 8],
n1=[] epoints[(j + 1) % 8]
map(n1.extend,normalstoadd) ] for j in xrange(8)]
n2=[] normalstoadd = [map(vdiff, v, [S, E, S, E, S, E]) for v in verticestoadd]
map(n2.extend,n1) v1 = []
map(v1.extend, verticestoadd)
layertemp[i[0][2]][0]+=v2 v2 = []
vertices+=v2 map(v2.extend, v1)
layertemp[i[0][2]][1]+=n2 n1 = []
normals+=n2 map(n1.extend, normalstoadd)
print "appended lines in %fs"%(time.time()-t0) n2 = []
t0=time.time() map(n2.extend, n1)
layertemp[i[0][2]][0] += v2
vertices += v2
layertemp[i[0][2]][1] += n2
normals += n2
print "appended lines in %fs" % (time.time() - t0)
t0 = time.time()
# Create a list of triangle indices. # Create a list of triangle indices.
indices = range(3*16*len(lines))#[[3*i,3*i+1,3*i+2] for i in xrange(len(facets))] indices = range(3 * 16 * len(lines)) # [[3*i,3*i+1,3*i+2] for i in xrange(len(facets))]
self.vlists.append(batch.add_indexed(len(vertices)//3, self.vlists.append(batch.add_indexed(len(vertices) // 3,
GL_TRIANGLES, GL_TRIANGLES,
None,#group, None, # group,
indices, indices,
('v3f/static', vertices), ('v3f/static', vertices),
('n3f/static', normals))) ('n3f/static', normals)))
if lasth is not None: if lasth is not None:
self.layers[lasth]=pyglet.graphics.Batch() self.layers[lasth] = pyglet.graphics.Batch()
indices = range(len(layertemp[lasth][0]))#[[3*i,3*i+1,3*i+2] for i in xrange(len(facets))] indices = range(len(layertemp[lasth][0])) # [[3*i,3*i+1,3*i+2] for i in xrange(len(facets))]
self.vlists.append(self.layers[lasth].add_indexed(len(layertemp[lasth][0])//3, self.vlists.append(self.layers[lasth].add_indexed(len(layertemp[lasth][0]) // 3,
GL_TRIANGLES, GL_TRIANGLES,
None,#group, None, # group,
indices, indices,
('v3f/static', layertemp[lasth][0]), ('v3f/static', layertemp[lasth][0]),
('n3f/static', layertemp[lasth][1]))) ('n3f/static', layertemp[lasth][1])))
def genline(self, i, h, w):
def genline(self,i,h,w): S = i[0][:3]
S=i[0][:3] E = i[1][:3]
E=i[1][:3] v = map(lambda x, y: x - y, E, S)
v=map(lambda x,y:x-y,E,S) vlen = math.sqrt(float(sum(map(lambda a: a * a, v[:3]))))
vlen=math.sqrt(float(sum(map(lambda a:a*a, v[:3]))))
if vlen == 0:
if vlen==0: vlen = 0.01
vlen=0.01 sq2 = math.sqrt(2.0) / 2.0
sq2=math.sqrt(2.0)/2.0 htw = float(h) / w
htw=float(h)/w d = w / 2.0
d=w/2.0 if i[1][3] == i[0][3]:
if i[1][3]==i[0][3]: d = 0.05
d=0.05 points = [[d, 0, 0],
points=[[d,0,0], [sq2 * d, sq2 * d, 0],
[sq2*d,sq2*d,0], [0, d, 0],
[0,d,0], [-sq2 * d, sq2 * d, 0],
[-sq2*d,sq2*d,0], [-d, 0, 0],
[-d,0,0], [-sq2 * d, -sq2 * d, 0],
[-sq2*d,-sq2*d,0], [0, -d, 0],
[0,-d,0], [sq2 * d, -sq2 * d, 0]
[sq2*d,-sq2*d,0]
] ]
axis=stltool.cross([0,0,1],v) axis = stltool.cross([0, 0, 1], v)
alen=math.sqrt(float(sum(map(lambda a:a*a, v[:3])))) alen = math.sqrt(float(sum(map(lambda a: a * a, v[:3]))))
if alen>0: if alen > 0:
axis=map(lambda m:m/alen,axis) axis = map(lambda m: m / alen, axis)
angle=math.acos(v[2]/vlen) angle = math.acos(v[2] / vlen)
def vrot(v,axis,angle):
kxv=stltool.cross(axis,v) def vrot(v, axis, angle):
kdv=sum(map(lambda x,y:x*y,axis,v)) kxv = stltool.cross(axis, v)
return map(lambda x,y,z:x*math.cos(angle)+y*math.sin(angle)+z*kdv*(1.0-math.cos(angle)),v,kxv,axis) kdv = sum(map(lambda x, y: x * y, axis, v))
points=map(lambda x:vrot(x,axis,angle),points) return map(lambda x, y, z: x * math.cos(angle) + y * math.sin(angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis)
points=map(lambda x:[x[0],x[1],htw*x[2]],points)
points = map(lambda x: vrot(x, axis, angle), points)
def vadd(v,o): points = map(lambda x: [x[0], x[1], htw * x[2]], points)
return map(sum,zip(v,o))
spoints=map(lambda x:vadd(S,x),points) def vadd(v, o):
epoints=map(lambda x:vadd(E,x),points) return map(sum, zip(v, o))
return spoints,epoints,S,E spoints = map(lambda x: vadd(S, x), points)
epoints = map(lambda x: vadd(E, x), points)
def transform(self,line): return spoints, epoints, S, E
line=line.split(";")[0]
cur=self.prev[:] def transform(self, line):
if len(line)>0: line = line.split(";")[0]
cur = self.prev[:]
if len(line) > 0:
if "G1" in line or "G0" in line or "G92" in line: if "G1" in line or "G0" in line or "G92" in line:
if("X" in line): if("X" in line):
cur[0]=float(line.split("X")[1].split(" ")[0]) cur[0] = float(line.split("X")[1].split(" ")[0])
if("Y" in line): if("Y" in line):
cur[1]=float(line.split("Y")[1].split(" ")[0]) cur[1] = float(line.split("Y")[1].split(" ")[0])
if("Z" in line): if("Z" in line):
cur[2]=float(line.split("Z")[1].split(" ")[0]) cur[2] = float(line.split("Z")[1].split(" ")[0])
if("E" in line): if("E" in line):
cur[3]=float(line.split("E")[1].split(" ")[0]) cur[3] = float(line.split("E")[1].split(" ")[0])
if self.prev==cur: if self.prev == cur:
return None return None
if self.fline or "G92" in line: if self.fline or "G92" in line:
self.prev=cur self.prev = cur
self.fline=0 self.fline = 0
return None return None
else: else:
r=[self.prev,cur] r = [self.prev, cur]
self.prev=cur self.prev = cur
return r return r
def delete(self): def delete(self):
for i in self.vlists: for i in self.vlists:
i.delete() i.delete()
self.vlists=[] self.vlists = []
def trackball(p1x, p1y, p2x, p2y, r): def trackball(p1x, p1y, p2x, p2y, r):
TRACKBALLSIZE=r TRACKBALLSIZE = r
#float a[3]; /* Axis of rotation */ #float a[3]; /* Axis of rotation */
#float phi; /* how much to rotate about axis */ #float phi; /* how much to rotate about axis */
#float p1[3], p2[3], d[3]; #float p1[3], p2[3], d[3];
#float t; #float t;
if (p1x == p2x and p1y == p2y): if (p1x == p2x and p1y == p2y):
return [0.0,0.0,0.0,1.0] return [0.0, 0.0, 0.0, 1.0]
p1=[p1x,p1y,project_to_sphere(TRACKBALLSIZE,p1x,p1y)] p1 = [p1x, p1y, project_to_sphere(TRACKBALLSIZE, p1x, p1y)]
p2=[p2x,p2y,project_to_sphere(TRACKBALLSIZE,p2x,p2y)] p2 = [p2x, p2y, project_to_sphere(TRACKBALLSIZE, p2x, p2y)]
a=stltool.cross(p2,p1) a = stltool.cross(p2, p1)
d=map(lambda x,y:x-y,p1,p2) d = map(lambda x, y: x - y, p1, p2)
t = math.sqrt(sum(map(lambda x:x*x, d))) / (2.0*TRACKBALLSIZE) t = math.sqrt(sum(map(lambda x: x * x, d))) / (2.0 * TRACKBALLSIZE)
if (t > 1.0): t = 1.0 if (t > 1.0):
if (t < -1.0): t = -1.0 t = 1.0
if (t < -1.0):
t = -1.0
phi = 2.0 * math.asin(t) phi = 2.0 * math.asin(t)
return axis_to_quat(a,phi) return axis_to_quat(a, phi)
def vec(*args): def vec(*args):
return (GLfloat * len(args))(*args) return (GLfloat * len(args))(*args)
def axis_to_quat(a,phi):
def axis_to_quat(a, phi):
#print a, phi #print a, phi
lena=math.sqrt(sum(map(lambda x:x*x, a))) lena = math.sqrt(sum(map(lambda x: x * x, a)))
q=map(lambda x:x*(1/lena),a) q = map(lambda x: x * (1 / lena), a)
q=map(lambda x:x*math.sin(phi/2.0),q) q = map(lambda x: x * math.sin(phi / 2.0), q)
q.append(math.cos(phi/2.0)) q.append(math.cos(phi / 2.0))
return q return q
def build_rotmatrix(q): def build_rotmatrix(q):
m=(GLdouble * 16)() m = (GLdouble * 16)()
m[0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]) m[0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2])
m[1] = 2.0 * (q[0] * q[1] - q[2] * q[3]); m[1] = 2.0 * (q[0] * q[1] - q[2] * q[3])
m[2] = 2.0 * (q[2] * q[0] + q[1] * q[3]); m[2] = 2.0 * (q[2] * q[0] + q[1] * q[3])
m[3] = 0.0; m[3] = 0.0
m[4] = 2.0 * (q[0] * q[1] + q[2] * q[3]); m[4] = 2.0 * (q[0] * q[1] + q[2] * q[3])
m[5]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]); m[5] = 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0])
m[6] = 2.0 * (q[1] * q[2] - q[0] * q[3]); m[6] = 2.0 * (q[1] * q[2] - q[0] * q[3])
m[7] = 0.0; m[7] = 0.0
m[8] = 2.0 * (q[2] * q[0] - q[1] * q[3]); m[8] = 2.0 * (q[2] * q[0] - q[1] * q[3])
m[9] = 2.0 * (q[1] * q[2] + q[0] * q[3]); m[9] = 2.0 * (q[1] * q[2] + q[0] * q[3])
m[10] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]); m[10] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0])
m[11] = 0.0; m[11] = 0.0
m[12] = 0.0; m[12] = 0.0
m[13] = 0.0; m[13] = 0.0
m[14] = 0.0; m[14] = 0.0
m[15] = 1.0; m[15] = 1.0
return m return m
def project_to_sphere(r, x, y): def project_to_sphere(r, x, y):
d = math.sqrt(x*x + y*y) d = math.sqrt(x * x + y * y)
if (d < r * 0.70710678118654752440): if (d < r * 0.70710678118654752440):
return math.sqrt(r*r - d*d) return math.sqrt(r * r - d * d)
else: else:
t = r / 1.41421356237309504880 t = r / 1.41421356237309504880
return t*t / d return t * t / d
def mulquat(q1,rq):
def mulquat(q1, rq):
return [q1[3] * rq[0] + q1[0] * rq[3] + q1[1] * rq[2] - q1[2] * rq[1], return [q1[3] * rq[0] + q1[0] * rq[3] + q1[1] * rq[2] - q1[2] * rq[1],
q1[3] * rq[1] + q1[1] * rq[3] + q1[2] * rq[0] - q1[0] * rq[2], q1[3] * rq[1] + q1[1] * rq[3] + q1[2] * rq[0] - q1[0] * rq[2],
q1[3] * rq[2] + q1[2] * rq[3] + q1[0] * rq[1] - q1[1] * rq[0], q1[3] * rq[2] + q1[2] * rq[3] + q1[0] * rq[1] - q1[1] * rq[0],
...@@ -436,38 +450,37 @@ def mulquat(q1,rq): ...@@ -436,38 +450,37 @@ def mulquat(q1,rq):
class TestGlPanel(GLPanel): class TestGlPanel(GLPanel):
def __init__(self, parent, size,id=wx.ID_ANY,): def __init__(self, parent, size, id=wx.ID_ANY):
super(TestGlPanel, self).__init__(parent, id, wx.DefaultPosition, size, 0) super(TestGlPanel, self).__init__(parent, id, wx.DefaultPosition, size, 0)
self.batches=[] self.batches = []
self.rot=0 self.rot = 0
self.canvas.Bind(wx.EVT_MOUSE_EVENTS,self.move) self.canvas.Bind(wx.EVT_MOUSE_EVENTS, self.move)
self.canvas.Bind(wx.EVT_LEFT_DCLICK,self.double) self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.double)
self.initialized=1 self.initialized = 1
self.canvas.Bind(wx.EVT_MOUSEWHEEL,self.wheel) self.canvas.Bind(wx.EVT_MOUSEWHEEL, self.wheel)
self.parent=parent self.parent = parent
self.initpos=None self.initpos = None
self.dist=200 self.dist = 200
self.bedsize=[200,200] self.bedsize = [200, 200]
self.transv=[0, 0, -self.dist] self.transv = [0, 0, -self.dist]
self.basequat=[0,0,0,1] self.basequat = [0, 0, 0, 1]
wx.CallAfter(self.forceresize) wx.CallAfter(self.forceresize)
self.mousepos=[0,0] self.mousepos = [0, 0]
def double(self, event): def double(self, event):
p=event.GetPositionTuple() p = event.GetPositionTuple()
sz=self.GetClientSize() sz = self.GetClientSize()
v=map(lambda m,w,b:b*m/w,p,sz,self.bedsize) v = map(lambda m, w, b: b * m / w, p, sz, self.bedsize)
v[1]=self.bedsize[1]-v[1] v[1] = self.bedsize[1] - v[1]
v+=[300] v += [300]
print v print v
self.add_file("../prusa/metric-prusa/x-end-idler.stl",v) self.add_file("../prusa/metric-prusa/x-end-idler.stl", v)
def forceresize(self): def forceresize(self):
self.SetClientSize((self.GetClientSize()[0],self.GetClientSize()[1]+1)) self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] + 1))
self.SetClientSize((self.GetClientSize()[0],self.GetClientSize()[1]-1)) self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] - 1))
threading.Thread(target=self.update).start() threading.Thread(target=self.update).start()
self.initialized=0 self.initialized = 0
def move_shape(self, delta): def move_shape(self, delta):
"""moves shape (selected in l, which is list ListBox of shapes) """moves shape (selected in l, which is list ListBox of shapes)
...@@ -497,8 +510,8 @@ class TestGlPanel(GLPanel): ...@@ -497,8 +510,8 @@ class TestGlPanel(GLPanel):
with shift move viewport with shift move viewport
""" """
if event.Dragging() and event.LeftIsDown(): if event.Dragging() and event.LeftIsDown():
if self.initpos==None: if self.initpos == None:
self.initpos=event.GetPositionTuple() self.initpos = event.GetPositionTuple()
else: else:
if not event.ShiftDown(): if not event.ShiftDown():
currentpos = event.GetPositionTuple() currentpos = event.GetPositionTuple()
...@@ -507,69 +520,68 @@ class TestGlPanel(GLPanel): ...@@ -507,69 +520,68 @@ class TestGlPanel(GLPanel):
-(currentpos[1] - self.initpos[1]) -(currentpos[1] - self.initpos[1])
) )
self.move_shape(delta) self.move_shape(delta)
self.initpos=None self.initpos = None
return return
#print self.initpos #print self.initpos
p1=self.initpos p1 = self.initpos
self.initpos=None self.initpos = None
p2=event.GetPositionTuple() p2 = event.GetPositionTuple()
sz=self.GetClientSize() sz = self.GetClientSize()
p1x=(float(p1[0])-sz[0]/2)/(sz[0]/2) p1x = (float(p1[0]) - sz[0] / 2) / (sz[0] / 2)
p1y=-(float(p1[1])-sz[1]/2)/(sz[1]/2) p1y = -(float(p1[1]) - sz[1] / 2) / (sz[1] / 2)
p2x=(float(p2[0])-sz[0]/2)/(sz[0]/2) p2x = (float(p2[0]) - sz[0] / 2) / (sz[0] / 2)
p2y=-(float(p2[1])-sz[1]/2)/(sz[1]/2) p2y = -(float(p2[1]) - sz[1] / 2) / (sz[1] / 2)
#print p1x,p1y,p2x,p2y #print p1x,p1y,p2x,p2y
quat=trackball(p1x, p1y, p2x, p2y, -self.transv[2]/250.0) quat = trackball(p1x, p1y, p2x, p2y, -self.transv[2] / 250.0)
if self.rot: if self.rot:
self.basequat=mulquat(self.basequat,quat) self.basequat = mulquat(self.basequat, quat)
#else: #else:
glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat)
#self.basequat=quatx #self.basequat = quatx
mat=build_rotmatrix(self.basequat) mat = build_rotmatrix(self.basequat)
glLoadIdentity() glLoadIdentity()
glTranslatef(self.transv[0],self.transv[1],0) glTranslatef(self.transv[0], self.transv[1], 0)
glTranslatef(0,0,self.transv[2]) glTranslatef(0, 0, self.transv[2])
glMultMatrixd(mat) glMultMatrixd(mat)
glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat)
self.rot=1 self.rot = 1
elif event.ButtonUp(wx.MOUSE_BTN_LEFT): elif event.ButtonUp(wx.MOUSE_BTN_LEFT):
if self.initpos is not None: if self.initpos is not None:
self.initpos=None self.initpos = None
elif event.ButtonUp(wx.MOUSE_BTN_RIGHT): elif event.ButtonUp(wx.MOUSE_BTN_RIGHT):
if self.initpos is not None: if self.initpos is not None:
self.initpos=None self.initpos = None
elif event.Dragging() and event.RightIsDown() and event.ShiftDown(): elif event.Dragging() and event.RightIsDown() and event.ShiftDown():
if self.initpos is None: if self.initpos is None:
self.initpos=event.GetPositionTuple() self.initpos = event.GetPositionTuple()
else: else:
p1=self.initpos p1 = self.initpos
p2=event.GetPositionTuple() p2 = event.GetPositionTuple()
sz=self.GetClientSize() sz = self.GetClientSize()
p1=list(p1) p1 = list(p1)
p2=list(p2) p2 = list(p2)
p1[1]*=-1 p1[1] *= -1
p2[1]*=-1 p2[1] *= -1
self.transv=map(lambda x,y,z,c:c-self.dist*(x-y)/z, list(p1)+[0], list(p2)+[0], list(sz)+[1], self.transv) self.transv = map(lambda x, y, z, c: c - self.dist * (x - y) / z, list(p1) + [0], list(p2) + [0], list(sz) + [1], self.transv)
glLoadIdentity() glLoadIdentity()
glTranslatef(self.transv[0],self.transv[1],0) glTranslatef(self.transv[0], self.transv[1], 0)
glTranslatef(0,0,self.transv[2]) glTranslatef(0, 0, self.transv[2])
if(self.rot): if(self.rot):
glMultMatrixd(build_rotmatrix(self.basequat)) glMultMatrixd(build_rotmatrix(self.basequat))
glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat)
self.rot=1 self.rot = 1
self.initpos=None self.initpos = None
else: else:
#mouse is moving without a button press #mouse is moving without a button press
p=event.GetPositionTuple() p = event.GetPositionTuple()
sz=self.GetClientSize() sz = self.GetClientSize()
v=map(lambda m,w,b:b*m/w,p,sz,self.bedsize) v = map(lambda m, w, b: b * m / w, p, sz, self.bedsize)
v[1]=self.bedsize[1]-v[1] v[1] = self.bedsize[1] - v[1]
self.mousepos=v self.mousepos = v
def rotate_shape(self, angle): def rotate_shape(self, angle):
"""rotates acive shape """rotates acive shape
...@@ -582,17 +594,17 @@ class TestGlPanel(GLPanel): ...@@ -582,17 +594,17 @@ class TestGlPanel(GLPanel):
model = self.parent.models[name] model = self.parent.models[name]
model.rot += angle model.rot += angle
def wheel(self,event): def wheel(self, event):
"""react to mouse wheel actions: """react to mouse wheel actions:
rotate object rotate object
with shift zoom viewport with shift zoom viewport
""" """
z=event.GetWheelRotation() z = event.GetWheelRotation()
angle=10 angle = 10
if not event.ShiftDown(): if not event.ShiftDown():
i=self.parent.l.GetSelection() i = self.parent.l.GetSelection()
if i<0: if i < 0:
try: try:
self.parent.setlayerindex(z) self.parent.setlayerindex(z)
except: except:
...@@ -600,21 +612,21 @@ class TestGlPanel(GLPanel): ...@@ -600,21 +612,21 @@ class TestGlPanel(GLPanel):
return return
if z > 0: if z > 0:
self.rotate_shape(angle/2) self.rotate_shape(angle / 2)
else: else:
self.rotate_shape(-angle/2) self.rotate_shape(-angle / 2)
return return
if z > 0: if z > 0:
self.transv[2]+=angle self.transv[2] += angle
else: else:
self.transv[2]-=angle self.transv[2] -= angle
glLoadIdentity() glLoadIdentity()
glTranslatef(*self.transv) glTranslatef(*self.transv)
if(self.rot): if(self.rot):
glMultMatrixd(build_rotmatrix(self.basequat)) glMultMatrixd(build_rotmatrix(self.basequat))
glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) glGetDoublev(GL_MODELVIEW_MATRIX, self.mvmat)
self.rot=1 self.rot = 1
def keypress(self, event): def keypress(self, event):
"""gets keypress events and moves/rotates acive shape""" """gets keypress events and moves/rotates acive shape"""
...@@ -647,50 +659,48 @@ class TestGlPanel(GLPanel): ...@@ -647,50 +659,48 @@ class TestGlPanel(GLPanel):
def update(self): def update(self):
while(1): while(1):
dt=0.05 dt = 0.05
time.sleep(0.05) time.sleep(0.05)
try: try:
wx.CallAfter(self.Refresh) wx.CallAfter(self.Refresh)
except: except:
return return
def anim(self,obj): def anim(self, obj):
g=50*9.8 g = 50 * 9.8
v=20 v = 20
dt=0.05 dt = 0.05
basepos=obj.offsets[2] basepos = obj.offsets[2]
obj.offsets[2]+=obj.animoffset obj.offsets[2] += obj.animoffset
while obj.offsets[2]>-1: while obj.offsets[2] > -1:
time.sleep(dt) time.sleep(dt)
obj.offsets[2]-=v*dt obj.offsets[2] -= v * dt
v+=g*dt v += g * dt
if(obj.offsets[2]<0): if(obj.offsets[2] < 0):
obj.scale[2]*=1-3*dt obj.scale[2] *= 1 - 3 * dt
#return #return
v=v/4 v = v / 4
while obj.offsets[2]<basepos: while obj.offsets[2] < basepos:
time.sleep(dt) time.sleep(dt)
obj.offsets[2]+=v*dt obj.offsets[2] += v * dt
v-=g*dt v -= g * dt
obj.scale[2]*=1+5*dt obj.scale[2] *= 1 + 5 * dt
obj.scale[2]=1.0 obj.scale[2] = 1.0
def create_objects(self): def create_objects(self):
'''create opengl objects when opengl is initialized''' '''create opengl objects when opengl is initialized'''
self.initialized=1 self.initialized = 1
wx.CallAfter(self.Refresh) wx.CallAfter(self.Refresh)
def drawmodel(self,m,n): def drawmodel(self, m, n):
batch = pyglet.graphics.Batch() batch = pyglet.graphics.Batch()
stl = stlview(m.facets, batch=batch) stl = stlview(m.facets, batch=batch)
m.batch=batch m.batch = batch
m.animoffset=300 m.animoffset = 300
#print m #print m
#threading.Thread(target=self.anim,args=(m,)).start() #threading.Thread(target = self.anim, args = (m, )).start()
wx.CallAfter(self.Refresh) wx.CallAfter(self.Refresh)
def update_object_resize(self): def update_object_resize(self):
'''called when the window recieves only if opengl is initialized''' '''called when the window recieves only if opengl is initialized'''
pass pass
...@@ -704,7 +714,7 @@ class TestGlPanel(GLPanel): ...@@ -704,7 +714,7 @@ class TestGlPanel(GLPanel):
#glLoadIdentity() #glLoadIdentity()
#print list(self.pmat) #print list(self.pmat)
if self.rot==1: if self.rot == 1:
glLoadIdentity() glLoadIdentity()
glMultMatrixd(self.mvmat) glMultMatrixd(self.mvmat)
else: else:
...@@ -712,74 +722,74 @@ class TestGlPanel(GLPanel): ...@@ -712,74 +722,74 @@ class TestGlPanel(GLPanel):
glTranslatef(*self.transv) glTranslatef(*self.transv)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1))
glBegin(GL_LINES) glBegin(GL_LINES)
glNormal3f(0,0,1) glNormal3f(0, 0, 1)
rows=10 rows = 10
cols=10 cols = 10
zheight=50 zheight = 50
for i in xrange(-rows,rows+1): for i in xrange(-rows, rows + 1):
if i%5==0: if i % 5 == 0:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1))
else: else:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1))
glVertex3f(10*-cols, 10*i,0) glVertex3f(10 * -cols, 10 * i, 0)
glVertex3f(10*cols, 10*i,0) glVertex3f(10 * cols, 10 * i, 0)
for i in xrange(-cols,cols+1): for i in xrange(-cols, cols + 1):
if i%5==0: if i % 5 == 0:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1))
else: else:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1))
glVertex3f(10*i, 10*-rows,0) glVertex3f(10 * i, 10 * -rows, 0)
glVertex3f(10*i, 10*rows,0) glVertex3f(10 * i, 10 * rows, 0)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.6, 0.6, 0.6, 1))
glVertex3f(10*-cols, 10*-rows,0) glVertex3f(10 * -cols, 10 * -rows, 0)
glVertex3f(10*-cols, 10*-rows,zheight) glVertex3f(10 * -cols, 10 * -rows, zheight)
glVertex3f(10*cols, 10*rows,0) glVertex3f(10 * cols, 10 * rows, 0)
glVertex3f(10*cols, 10*rows,zheight) glVertex3f(10 * cols, 10 * rows, zheight)
glVertex3f(10*cols, 10*-rows,0) glVertex3f(10 * cols, 10 * -rows, 0)
glVertex3f(10*cols, 10*-rows,zheight) glVertex3f(10 * cols, 10 * -rows, zheight)
glVertex3f(10*-cols, 10*rows,0) glVertex3f(10 * -cols, 10 * rows, 0)
glVertex3f(10*-cols, 10*rows,zheight) glVertex3f(10 * -cols, 10 * rows, zheight)
glVertex3f(10*-cols, 10*rows,zheight) glVertex3f(10 * -cols, 10 * rows, zheight)
glVertex3f(10*cols, 10*rows,zheight) glVertex3f(10 * cols, 10 * rows, zheight)
glVertex3f(10*cols, 10*rows,zheight) glVertex3f(10 * cols, 10 * rows, zheight)
glVertex3f(10*cols, 10*-rows,zheight) glVertex3f(10 * cols, 10 * -rows, zheight)
glVertex3f(10*cols, 10*-rows,zheight) glVertex3f(10 * cols, 10 * -rows, zheight)
glVertex3f(10*-cols, 10*-rows,zheight) glVertex3f(10 * -cols, 10 * -rows, zheight)
glVertex3f(10*-cols, 10*-rows,zheight) glVertex3f(10 * -cols, 10 * -rows, zheight)
glVertex3f(10*-cols, 10*rows,zheight) glVertex3f(10 * -cols, 10 * rows, zheight)
glEnd() glEnd()
glPushMatrix() glPushMatrix()
glTranslatef(self.mousepos[0]-self.bedsize[0]/2,self.mousepos[1]-self.bedsize[1]/2,0) glTranslatef(self.mousepos[0] - self.bedsize[0] / 2, self.mousepos[1] - self.bedsize[1] / 2, 0)
glBegin(GL_TRIANGLES) glBegin(GL_TRIANGLES)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 0, 0, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 0, 0, 1))
glNormal3f(0,0,1) glNormal3f(0, 0, 1)
glVertex3f(2,2,0) glVertex3f(2, 2, 0)
glVertex3f(-2,2,0) glVertex3f(-2, 2, 0)
glVertex3f(-2,-2,0) glVertex3f(-2, -2, 0)
glVertex3f(2,-2,0) glVertex3f(2, -2, 0)
glVertex3f(2,2,0) glVertex3f(2, 2, 0)
glVertex3f(-2,-2,0) glVertex3f(-2, -2, 0)
glEnd() glEnd()
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.3, 0.7, 0.5, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.3, 0.7, 0.5, 1))
#glTranslatef(0,40,0) #glTranslatef(0, 40, 0)
glPopMatrix() glPopMatrix()
glPushMatrix() glPushMatrix()
glTranslatef(-100,-100,0) glTranslatef(-100, -100, 0)
for i in self.parent.models.values(): for i in self.parent.models.values():
glPushMatrix() glPushMatrix()
glTranslatef(*(i.offsets)) glTranslatef(*(i.offsets))
glRotatef(i.rot,0.0,0.0,1.0) glRotatef(i.rot, 0.0, 0.0, 1.0)
glScalef(*i.scale) glScalef(*i.scale)
try: try:
if i.curlayer in i.gc.layers: if i.curlayer in i.gc.layers:
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.13, 0.37, 0.25, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.13, 0.37, 0.25, 1))
[i.gc.layers[j].draw() for j in i.gc.layers.keys() if j<i.curlayer] [i.gc.layers[j].draw() for j in i.gc.layers.keys() if j < i.curlayer]
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.5, 0.6, 0.9, 1)) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.5, 0.6, 0.9, 1))
b=i.gc.layers[i.curlayer] b = i.gc.layers[i.curlayer]
b.draw() b.draw()
else: else:
i.batch.draw() i.batch.draw()
...@@ -788,69 +798,69 @@ class TestGlPanel(GLPanel): ...@@ -788,69 +798,69 @@ class TestGlPanel(GLPanel):
glPopMatrix() glPopMatrix()
glPopMatrix() glPopMatrix()
#print "drawn batch" #print "drawn batch"
class GCFrame(wx.Frame): class GCFrame(wx.Frame):
'''A simple class for using OpenGL with wxPython.''' '''A simple class for using OpenGL with wxPython.'''
def __init__(self, parent, ID, title, pos=wx.DefaultPosition, def __init__(self, parent, ID, title, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE): size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE):
super(GCFrame, self).__init__(parent, ID, title, pos, (size[0]+150,size[1]), style) super(GCFrame, self).__init__(parent, ID, title, pos, (size[0] + 150, size[1]), style)
class d: class d:
def GetSelection(self): def GetSelection(self):
return -1 return wx.NOT_FOUND
self.p=self self.p = self
m=d() m = d()
m.offsets=[0,0,0] m.offsets = [0, 0, 0]
m.rot=0 m.rot = 0
m.curlayer=0.0 m.curlayer = 0.0
m.scale=[1.,1.,1.] m.scale = [1.0, 1.0, 1.0]
m.batch=pyglet.graphics.Batch() m.batch = pyglet.graphics.Batch()
m.gc=gcview([], batch=m.batch) m.gc = gcview([], batch=m.batch)
self.models={"":m} self.models = {"": m}
self.l=d() self.l = d()
self.modelindex=0 self.modelindex = 0
self.GLPanel1 = TestGlPanel(self,size) self.GLPanel1 = TestGlPanel(self, size)
def addfile(self,gcode=[]): def addfile(self, gcode=[]):
self.models[""].gc.delete() self.models[""].gc.delete()
self.models[""].gc=gcview(gcode, batch=self.models[""].batch) self.models[""].gc = gcview(gcode, batch=self.models[""].batch)
def clear(self): def clear(self):
self.models[""].gc.delete() self.models[""].gc.delete()
self.models[""].gc=gcview([], batch=self.models[""].batch) self.models[""].gc = gcview([], batch=self.models[""].batch)
def Show(self, arg=True):
def Show(self,arg=True): wx.Frame.Show(self, arg)
wx.Frame.Show(self,arg) self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] + 1))
self.SetClientSize((self.GetClientSize()[0],self.GetClientSize()[1]+1)) self.SetClientSize((self.GetClientSize()[0], self.GetClientSize()[1] - 1))
self.SetClientSize((self.GetClientSize()[0],self.GetClientSize()[1]-1))
self.Refresh() self.Refresh()
wx.FutureCall(500,self.GLPanel1.forceresize) wx.FutureCall(500, self.GLPanel1.forceresize)
#threading.Thread(target=self.update).start() #threading.Thread(target = self.update).start()
#self.initialized=0 #self.initialized = 0
def setlayerindex(self,z): def setlayerindex(self, z):
m=self.models[""] m = self.models[""]
mlk=sorted(m.gc.layers.keys()) mlk = sorted(m.gc.layers.keys())
if z>0 and self.modelindex<len(mlk)-1: if z > 0 and self.modelindex < len(mlk) - 1:
self.modelindex+=1 self.modelindex += 1
if z<0 and self.modelindex>0: if z < 0 and self.modelindex > 0:
self.modelindex-=1 self.modelindex -= 1
m.curlayer=mlk[self.modelindex] m.curlayer = mlk[self.modelindex]
wx.CallAfter(self.SetTitle,"Gcode view, shift to move. Layer %d, Z=%f"%(self.modelindex,m.curlayer)) wx.CallAfter(self.SetTitle, "Gcode view, shift to move. Layer %d, Z = %f" % (self.modelindex, m.curlayer))
def main(): def main():
app = wx.App(redirect=False) app = wx.App(redirect=False)
frame = GCFrame(None, wx.ID_ANY, 'Gcode view, shift to move view, mousewheel to set layer', size=(400,400)) frame = GCFrame(None, wx.ID_ANY, 'Gcode view, shift to move view, mousewheel to set layer', size=(400, 400))
frame.addfile(list(open("carriage dump_export.gcode"))) frame.addfile(list(open("carriage dump_export.gcode")))
#frame = wx.Frame(None, -1, "GL Window", size=(400,400)) #frame = wx.Frame(None, -1, "GL Window", size=(400, 400))
#panel = TestGlPanel(frame) #panel = TestGlPanel(frame)
#frame.Show(True) #frame.Show(True)
#app.MainLoop() #app.MainLoop()
app.Destroy() app.Destroy()
if __name__=="__main__": if __name__ == "__main__":
import cProfile import cProfile
print cProfile.run("main()") print cProfile.run("main()")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment