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)
by an offset specified in tuple delta. by an offset specified in tuple delta.
...@@ -106,7 +110,7 @@ class showstl(wx.Window): ...@@ -106,7 +110,7 @@ class showstl(wx.Window):
del dc del dc
else: else:
event.Skip() event.Skip()
def rotate_shape(self, angle): def rotate_shape(self, angle):
"""rotates acive shape """rotates acive shape
positive angle is clockwise positive angle is clockwise
...@@ -146,133 +150,134 @@ class showstl(wx.Window): ...@@ -146,133 +150,134 @@ 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)
self.Layout() self.Layout()
#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:
...@@ -390,76 +392,75 @@ class stlwin(wx.Frame): ...@@ -390,76 +392,75 @@ class stlwin(wx.Frame):
for part in parts: for part in parts:
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__':
app = wx.App(False) app = wx.App(False)
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
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,
...@@ -24,9 +25,9 @@ class GLPanel(wx.Panel): ...@@ -24,9 +25,9 @@ class GLPanel(wx.Panel):
#init gl canvas data #init gl canvas data
self.GLinitialized = False self.GLinitialized = False
attribList = (glcanvas.WX_GL_RGBA, # RGBA attribList = (glcanvas.WX_GL_RGBA, # RGBA
glcanvas.WX_GL_DOUBLEBUFFER, # Double Buffered glcanvas.WX_GL_DOUBLEBUFFER, # Double Buffered
glcanvas.WX_GL_DEPTH_SIZE, 24) # 24 bit glcanvas.WX_GL_DEPTH_SIZE, 24) # 24 bit
# Create the canvas # Create the canvas
self.sizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer = wx.BoxSizer(wx.HORIZONTAL)
self.canvas = glcanvas.GLCanvas(self, attribList=attribList) self.canvas = glcanvas.GLCanvas(self, attribList=attribList)
...@@ -34,7 +35,7 @@ class GLPanel(wx.Panel): ...@@ -34,7 +35,7 @@ class GLPanel(wx.Panel):
self.SetSizer(self.sizer) self.SetSizer(self.sizer)
#self.sizer.Fit(self) #self.sizer.Fit(self)
self.Layout() self.Layout()
# bind events # bind events
self.canvas.Bind(wx.EVT_ERASE_BACKGROUND, self.processEraseBackgroundEvent) self.canvas.Bind(wx.EVT_ERASE_BACKGROUND, self.processEraseBackgroundEvent)
self.canvas.Bind(wx.EVT_SIZE, self.processSizeEvent) self.canvas.Bind(wx.EVT_SIZE, self.processSizeEvent)
...@@ -56,7 +57,7 @@ class GLPanel(wx.Panel): ...@@ -56,7 +57,7 @@ class GLPanel(wx.Panel):
#========================================================================== #==========================================================================
def processEraseBackgroundEvent(self, event): def processEraseBackgroundEvent(self, event):
'''Process the erase background event.''' '''Process the erase background event.'''
pass # Do nothing, to avoid flashing on MSWin pass # Do nothing, to avoid flashing on MSWin
def processSizeEvent(self, event): def processSizeEvent(self, event):
'''Process the resize event.''' '''Process the resize event.'''
...@@ -74,15 +75,15 @@ class GLPanel(wx.Panel): ...@@ -74,15 +75,15 @@ class GLPanel(wx.Panel):
def processPaintEvent(self, event): def processPaintEvent(self, event):
'''Process the drawing event.''' '''Process the drawing event.'''
self.canvas.SetCurrent() self.canvas.SetCurrent()
# This is a 'perfect' time to initialize OpenGL ... only if we need to # This is a 'perfect' time to initialize OpenGL ... only if we need to
if not self.GLinitialized: if not self.GLinitialized:
self.OnInitGL() self.OnInitGL()
self.GLinitialized = True self.GLinitialized = True
self.OnDraw() self.OnDraw()
event.Skip() event.Skip()
def Destroy(self): def Destroy(self):
#clean up the pyglet OpenGL context #clean up the pyglet OpenGL context
#self.pygletcontext.destroy() #self.pygletcontext.destroy()
...@@ -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)
...@@ -108,42 +109,40 @@ class GLPanel(wx.Panel): ...@@ -108,42 +109,40 @@ class GLPanel(wx.Panel):
glEnable(GL_CULL_FACE) glEnable(GL_CULL_FACE)
# Uncomment this line for a wireframe view # Uncomment this line for a wireframe view
#glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) #glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
# Simple light setup. On Windows GL_LIGHT0 is enabled by default, # Simple light setup. On Windows GL_LIGHT0 is enabled by default,
# but this is not the case on Linux or Mac, so remember to always # but this is not the case on Linux or Mac, so remember to always
# include it. # include it.
glEnable(GL_LIGHTING) glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0) glEnable(GL_LIGHT0)
glEnable(GL_LIGHT1) glEnable(GL_LIGHT1)
# Define a simple function to create ctypes arrays of floats: # Define a simple function to create ctypes arrays of floats:
def vec(*args): def vec(*args):
return (GLfloat * len(args))(*args) return (GLfloat * len(args))(*args)
glLightfv(GL_LIGHT0, GL_POSITION, vec(.5, .5, 1, 0)) glLightfv(GL_LIGHT0, GL_POSITION, vec(.5, .5, 1, 0))
glLightfv(GL_LIGHT0, GL_SPECULAR, vec(.5, .5, 1, 1)) glLightfv(GL_LIGHT0, GL_SPECULAR, vec(.5, .5, 1, 1))
glLightfv(GL_LIGHT0, GL_DIFFUSE, vec(1, 1, 1, 1)) glLightfv(GL_LIGHT0, GL_DIFFUSE, vec(1, 1, 1, 1))
glLightfv(GL_LIGHT1, GL_POSITION, vec(1, 0, .5, 0)) glLightfv(GL_LIGHT1, GL_POSITION, vec(1, 0, .5, 0))
glLightfv(GL_LIGHT1, GL_DIFFUSE, vec(.5, .5, .5, 1)) glLightfv(GL_LIGHT1, GL_DIFFUSE, vec(.5, .5, .5, 1))
glLightfv(GL_LIGHT1, GL_SPECULAR, vec(1, 1, 1, 1)) glLightfv(GL_LIGHT1, GL_SPECULAR, vec(1, 1, 1, 1))
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,43 +150,43 @@ class GLPanel(wx.Panel): ...@@ -151,43 +150,43 @@ 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()
self.update_object_resize() self.update_object_resize()
def OnDraw(self, *args, **kwargs): def OnDraw(self, *args, **kwargs):
"""Draw the window.""" """Draw the window."""
#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
self.SwapBuffers() self.SwapBuffers()
#========================================================================== #==========================================================================
# To be implemented by a sub class # To be implemented by a sub class
#========================================================================== #==========================================================================
def create_objects(self): def create_objects(self):
'''create opengl objects when opengl is initialized''' '''create opengl objects when opengl is initialized'''
pass pass
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
def draw_objects(self): def draw_objects(self):
'''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,234 +199,249 @@ class stlview(object): ...@@ -200,234 +199,249 @@ 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))
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):
def __init__(self, lines, batch, w=0.5, h=0.5): def __init__(self, lines, batch, w=0.5, h=0.5):
# 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): def vrot(v, axis, angle):
kxv=stltool.cross(axis,v) kxv = stltool.cross(axis, v)
kdv=sum(map(lambda x,y:x*y,axis,v)) kdv = sum(map(lambda x, y: x * y, 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) 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:vrot(x,axis,angle),points)
points=map(lambda x:[x[0],x[1],htw*x[2]],points) points = map(lambda x: vrot(x, axis, angle), points)
points = map(lambda x: [x[0], x[1], htw * x[2]], points)
def vadd(v,o):
return map(sum,zip(v,o)) def vadd(v, o):
spoints=map(lambda x:vadd(S,x),points) return map(sum, zip(v, o))
epoints=map(lambda x:vadd(E,x),points) spoints = map(lambda x: vadd(S, x), points)
return spoints,epoints,S,E epoints = map(lambda x: vadd(E, x), points)
return spoints, epoints, S, E
def transform(self,line):
line=line.split(";")[0] def transform(self, line):
cur=self.prev[:] line = line.split(";")[0]
if len(line)>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)]
p2 = [p2x, p2y, project_to_sphere(TRACKBALLSIZE, p2x, p2y)]
a = stltool.cross(p2, p1)
p1=[p1x,p1y,project_to_sphere(TRACKBALLSIZE,p1x,p1y)] d = map(lambda x, y: x - y, p1, p2)
p2=[p2x,p2y,project_to_sphere(TRACKBALLSIZE,p2x,p2y)] t = math.sqrt(sum(map(lambda x: x * x, d))) / (2.0 * TRACKBALLSIZE)
a=stltool.cross(p2,p1)
d=map(lambda x,y:x-y,p1,p2)
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],
...@@ -435,40 +449,39 @@ def mulquat(q1,rq): ...@@ -435,40 +449,39 @@ 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)
by an offset specified in tuple delta. by an offset specified in tuple delta.
...@@ -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,70 +520,69 @@ class TestGlPanel(GLPanel): ...@@ -507,70 +520,69 @@ 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
positive angle is clockwise positive angle is clockwise
...@@ -582,40 +594,40 @@ class TestGlPanel(GLPanel): ...@@ -582,40 +594,40 @@ 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:
pass pass
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"""
keycode = event.GetKeyCode() keycode = event.GetKeyCode()
...@@ -644,67 +656,65 @@ class TestGlPanel(GLPanel): ...@@ -644,67 +656,65 @@ class TestGlPanel(GLPanel):
if keycode == 93: if keycode == 93:
self.rotate_shape(angle) self.rotate_shape(angle)
event.Skip() event.Skip()
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
def draw_objects(self): def draw_objects(self):
'''called in the middle of ondraw after the buffer has been cleared''' '''called in the middle of ondraw after the buffer has been cleared'''
if self.vpmat is None: if self.vpmat is None:
return return
if not self.initialized: if not self.initialized:
self.create_objects() self.create_objects()
#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):
m = self.models[""]
def setlayerindex(self,z): mlk = sorted(m.gc.layers.keys())
m=self.models[""] if z > 0 and self.modelindex < len(mlk) - 1:
mlk=sorted(m.gc.layers.keys()) self.modelindex += 1
if z>0 and self.modelindex<len(mlk)-1: if z < 0 and self.modelindex > 0:
self.modelindex+=1 self.modelindex -= 1
if z<0 and self.modelindex>0: m.curlayer = mlk[self.modelindex]
self.modelindex-=1 wx.CallAfter(self.SetTitle, "Gcode view, shift to move. Layer %d, Z = %f" % (self.modelindex, m.curlayer))
m.curlayer=mlk[self.modelindex]
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