From 382f22459c1072adf51cbc9e3d18f4efd5c09056 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 7 Nov 2011 10:38:51 +0100 Subject: [PATCH 1/9] Support for G2/G3 arcs in preview window --- gviz.py | 111 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 84 insertions(+), 27 deletions(-) diff --git a/gviz.py b/gviz.py index 97cb1b0..608d3c3 100755 --- a/gviz.py +++ b/gviz.py @@ -58,12 +58,14 @@ class gviz(wx.Panel): self.size=size self.bedsize=bedsize self.grid=grid - self.lastpos=[0,0,0,0,0] + self.lastpos=[0,0,0,0,0,0,0] self.hilightpos=self.lastpos[:] self.Bind(wx.EVT_PAINT,self.paint) self.Bind(wx.EVT_SIZE,lambda *e:(wx.CallAfter(self.repaint),wx.CallAfter(self.Refresh))) self.lines={} self.pens={} + self.arcs={} + self.arcpens={} self.layers=[] self.layerindex=0 self.filament_width=extrusion_width # set it to 0 to disable scaling lines with zoom @@ -77,11 +79,12 @@ class gviz(wx.Panel): self.penslist=[self.mainpen,self.travelpen,self.hlpen]+self.fades self.showall=0 self.hilight=[] + self.hilightarcs=[] self.dirty=1 self.blitmap=wx.EmptyBitmap(self.GetClientSize()[0],self.GetClientSize()[1],-1) def clear(self): - self.lastpos=[0,0,0,0,0] + self.lastpos=[0,0,0,0,0,0,0] self.lines={} self.pens={} self.layers=[] @@ -143,27 +146,48 @@ class gviz(wx.Panel): dc.SetBrush(wx.Brush((0,255,0))) if len(self.layers): dc.DrawRectangle(self.size[0]-14,(1.0-(1.0*(self.layerindex+1))/len(self.layers))*self.size[1],13,self.size[1]-1) - def scaler(x): - return (self.scale[0]*x[0]+self.translate[0], - self.scale[1]*x[1]+self.translate[1], - self.scale[0]*x[2]+self.translate[0], - self.scale[1]*x[3]+self.translate[1],) + + def _drawlines(lines,pens): + def _scaler(x): + return (self.scale[0]*x[0]+self.translate[0], + self.scale[1]*x[1]+self.translate[1], + self.scale[0]*x[2]+self.translate[0], + self.scale[1]*x[3]+self.translate[1],) + scaled_lines = map(_scaler,lines) + dc.DrawLineList(scaled_lines, pens) + + def _drawarcs(arcs,pens): + def _scaler(x): + return (self.scale[0]*x[0]+self.translate[0], + self.scale[1]*x[1]+self.translate[1], + self.scale[0]*x[2]+self.translate[0], + self.scale[1]*x[3]+self.translate[1], + self.scale[0]*x[4]+self.translate[0], + self.scale[1]*x[5]+self.translate[1],) + scaled_arcs = map(_scaler,arcs) + for i in range(len(scaled_arcs)): + dc.SetPen(pens[i] if type(pens).__name__ == 'list' else pens) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.DrawArc(*scaled_arcs[i]) + if self.showall: l=[] for i in self.layers: dc.DrawLineList(l,self.fades[0]) - l=map(scaler,self.lines[i]) - dc.DrawLineList(l,self.pens[i]) + _drawlines(self.lines[i], self.pens[i]) + _drawarcs(self.arcs[i], self.arcpens[i]) return if self.layerindex Date: Mon, 7 Nov 2011 13:04:21 +0100 Subject: [PATCH 2/9] Paint arcs in red colour to warn that they won't be printed by most firmwares --- gviz.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gviz.py b/gviz.py index 608d3c3..d5e3bfb 100755 --- a/gviz.py +++ b/gviz.py @@ -73,6 +73,7 @@ class gviz(wx.Panel): penwidth = max(1.0,self.filament_width*((self.scale[0]+self.scale[1])/2.0)) self.translate=[0.0,0.0] self.mainpen=wx.Pen(wx.Colour(0,0,0),penwidth) + self.arcpen=wx.Pen(wx.Colour(255,0,0),penwidth) self.travelpen=wx.Pen(wx.Colour(10,80,80),penwidth) self.hlpen=wx.Pen(wx.Colour(200,50,50),penwidth) self.fades=[wx.Pen(wx.Colour(250-0.6**i*100,250-0.6**i*100,200-0.4**i*50),penwidth) for i in xrange(6)] @@ -262,7 +263,7 @@ class gviz(wx.Panel): if not hilight: self.arcs[ target[2] ] += [arc] - self.arcpens[ target[2] ] += [self.mainpen] + self.arcpens[ target[2] ] += [self.arcpen] self.lastpos = target else: self.hilightarcs += arc From a3c03d49a1b5f1057573701a915a6b9929e6eb38 Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 13:37:53 +0100 Subject: [PATCH 3/9] Added loading of OpenSCAD files feature + corrected file wildcard when exporting --- plater.py | 163 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 103 insertions(+), 60 deletions(-) diff --git a/plater.py b/plater.py index 06bfe2d..9df82b1 100755 --- a/plater.py +++ b/plater.py @@ -2,6 +2,12 @@ import wx,time,random,threading,os,math import stltool +def translate(l): return l + +def rotate(l): return l + +def import_stl(s): return s + class stlwrap: def __init__(self,obj,name=None): self.obj=obj @@ -16,12 +22,14 @@ class stlwrap: class showstl(wx.Window): def __init__(self,parent,size,pos): wx.Window.__init__(self,parent,size=size,pos=pos) - self.l=wx.ListBox(self,size=(300,130),pos=(0,size[1]-130)) + self.l=wx.ListBox(self,size=(300,155),pos=(0,size[1]-155)) + self.lb=wx.Button(self,label="Load",pos=(300,size[1]-155)) self.eb=wx.Button(self,label="Export",pos=(300,size[1]-130)) self.sb=wx.Button(self,label="Snap to Z=0",pos=(300,size[1]-105)) self.cb=wx.Button(self,label="Put at 100,100",pos=(300,size[1]-80)) self.db=wx.Button(self,label="Delete",pos=(300,size[1]-55)) self.ab=wx.Button(self,label="Auto",pos=(300,size[1]-30)) + self.lb.Bind(wx.EVT_BUTTON,self.load) self.eb.Bind(wx.EVT_BUTTON,self.export) self.sb.Bind(wx.EVT_BUTTON,self.snap) self.cb.Bind(wx.EVT_BUTTON,self.center) @@ -64,9 +72,40 @@ class showstl(wx.Window): self.l.Select(self.l.GetCount()-1) self.Refresh() + def load(self,event): + dlg=wx.FileDialog(self,"Pick file to load",self.basedir,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) + dlg.SetWildcard("OpenSCAD files (;*.scad;)") + if(dlg.ShowModal() == wx.ID_OK): + name=dlg.GetPath() + print("Path: %s" % (name)) + lf=open(name) + s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf] + lf.close() + + for i in s: + parts = i.split() + translate_list = eval(parts[0]) + rotate_list = eval(parts[1]) + stl_file = eval(parts[2]) + + print("translate([%s,%s,%s]) rotate([%s,%s,%s]) import_slt('%s');" % (translate_list[0], translate_list[1], translate_list[2], rotate_list[0], rotate_list[1], rotate_list[2], stl_file)) + + newname=os.path.split(stl_file.lower())[1] + c=1 + while newname in self.models: + newname=os.path.split(stl_file.lower())[1] + newname=newname+"(%d)"%c + c+=1 + stl_path = os.path.join(os.path.split(name)[0:len(os.path.split(stl_file))-1]) + print("STL file: %s" % (stl_file)) + print("STL path: %s" % (stl_path)) + stl_full_path = os.path.join(stl_path[0],str(stl_file)) + print("STL full path: %s" % (stl_full_path)) + self.load_stl(stl_full_path,stl_file) + def export(self,event): dlg=wx.FileDialog(self,"Pick file to save to",self.basedir,style=wx.FD_SAVE) - dlg.SetWildcard("STL files (;*.stl;)") + dlg.SetWildcard("OpenSCAD files (;*.scad;)") if(dlg.ShowModal() == wx.ID_OK): name=dlg.GetPath() sf=open(name.replace(".","_")+".scad","w") @@ -137,65 +176,69 @@ class showstl(wx.Window): #print name if name.lower().endswith(".stl"): #Filter out the path, just show the STL filename. - newname=os.path.split(name.lower())[1] - c=1 - while newname in self.models: - newname=os.path.split(name.lower())[1] - newname=newname+"(%d)"%c - c+=1 - self.models[newname]=stltool.stl(name) - self.models[newname].offsets=[0,0,0] - self.models[newname].rot=0 - self.models[newname].filename=name - minx,miny,minz,maxx,maxy,maxz=(10000,10000,10000,0,0,0) - for i in self.models[newname].facets: - for j in i[1]: - if j[0]maxx: - maxx=j[0] - if j[1]>maxy: - maxy=j[1] - if j[2]>maxz: - maxz=j[2] - self.models[newname].dims=[minx,maxx,miny,maxy,minz,maxz] - #if minx<0: - # self.models[newname].offsets[0]=-minx - #if miny<0: - # self.models[newname].offsets[1]=-miny - self.models[newname].bitmap=wx.EmptyBitmap(800,800,32) - dc=wx.MemoryDC() - dc.SelectObject(self.models[newname].bitmap) - dc.SetBackground(wx.Brush((0,0,0,0))) - dc.SetBrush(wx.Brush((0,0,0,255))) - #dc.DrawRectangle(-1,-1,10000,10000) - dc.SetBrush(wx.Brush(wx.Colour(128,255,128))) - dc.SetPen(wx.Pen(wx.Colour(128,128,128))) - m=self.models[newname] - #m.offsets=[10,10,0] - print m.offsets,m.dims - scale=2 - 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]]) - #if(time.time()-t)>5: - # break - dc.SelectObject(wx.NullBitmap) - m.bitmap.SetMask(wx.Mask(m.bitmap,wx.Colour(0,0,0,255))) - - #print time.time()-t - self.l.Append(newname) - i=self.l.GetSelection() - if i==wx.NOT_FOUND: - self.l.Select(0) - - self.l.Select(self.l.GetCount()-1) + self.load_stl(name,name) self.Refresh() #print time.time()-t + + def load_stl(self,path,name): + newname=os.path.split(name.lower())[1] + c=1 + while newname in self.models: + newname=os.path.split(name.lower())[1] + newname=newname+"(%d)"%c + c+=1 + self.models[newname]=stltool.stl(path) + self.models[newname].offsets=[0,0,0] + self.models[newname].rot=0 + self.models[newname].filename=name + minx,miny,minz,maxx,maxy,maxz=(10000,10000,10000,0,0,0) + for i in self.models[newname].facets: + for j in i[1]: + if j[0]maxx: + maxx=j[0] + if j[1]>maxy: + maxy=j[1] + if j[2]>maxz: + maxz=j[2] + self.models[newname].dims=[minx,maxx,miny,maxy,minz,maxz] + #if minx<0: + # self.models[newname].offsets[0]=-minx + #if miny<0: + # self.models[newname].offsets[1]=-miny + self.models[newname].bitmap=wx.EmptyBitmap(800,800,32) + dc=wx.MemoryDC() + dc.SelectObject(self.models[newname].bitmap) + dc.SetBackground(wx.Brush((0,0,0,0))) + dc.SetBrush(wx.Brush((0,0,0,255))) + #dc.DrawRectangle(-1,-1,10000,10000) + dc.SetBrush(wx.Brush(wx.Colour(128,255,128))) + dc.SetPen(wx.Pen(wx.Colour(128,128,128))) + m=self.models[newname] + #m.offsets=[10,10,0] + print m.offsets,m.dims + scale=2 + 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]]) + #if(time.time()-t)>5: + # break + dc.SelectObject(wx.NullBitmap) + m.bitmap.SetMask(wx.Mask(m.bitmap,wx.Colour(0,0,0,255))) + #print time.time()-t + self.l.Append(newname) + i=self.l.GetSelection() + if i==wx.NOT_FOUND: + self.l.Select(0) + + self.l.Select(self.l.GetCount()-1) + + def move(self,event): if event.ButtonUp(wx.MOUSE_BTN_LEFT): if(self.initpos is not None): @@ -297,11 +340,11 @@ class showstl(wx.Window): #s.export() class stlwin(wx.Frame): - def __init__(self,size=(400,530)): + def __init__(self,size=(400,555)): wx.Frame.__init__(self,None,title="Right-click to add a file",size=size) self.SetIcon(wx.Icon("plater.ico",wx.BITMAP_TYPE_ICO)) self.SetClientSize(size) - self.s=showstl(self,(400,530),(0,0)) + self.s=showstl(self,(400,555),(0,0)) if __name__ == '__main__': app = wx.App(False) From 0837508b744efb9b73faf11becaf3f21c6b0bd54 Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 14:25:24 +0100 Subject: [PATCH 4/9] Removed print statement + clear model list when loading file (probably should add a dirty flag as well to avoid accidentally overriding changes) --- plater.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/plater.py b/plater.py index 9df82b1..1299cff 100755 --- a/plater.py +++ b/plater.py @@ -75,9 +75,9 @@ class showstl(wx.Window): def load(self,event): dlg=wx.FileDialog(self,"Pick file to load",self.basedir,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) dlg.SetWildcard("OpenSCAD files (;*.scad;)") + self.models={} if(dlg.ShowModal() == wx.ID_OK): name=dlg.GetPath() - print("Path: %s" % (name)) lf=open(name) s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf] lf.close() @@ -88,8 +88,6 @@ class showstl(wx.Window): rotate_list = eval(parts[1]) stl_file = eval(parts[2]) - print("translate([%s,%s,%s]) rotate([%s,%s,%s]) import_slt('%s');" % (translate_list[0], translate_list[1], translate_list[2], rotate_list[0], rotate_list[1], rotate_list[2], stl_file)) - newname=os.path.split(stl_file.lower())[1] c=1 while newname in self.models: @@ -97,11 +95,8 @@ class showstl(wx.Window): newname=newname+"(%d)"%c c+=1 stl_path = os.path.join(os.path.split(name)[0:len(os.path.split(stl_file))-1]) - print("STL file: %s" % (stl_file)) - print("STL path: %s" % (stl_path)) stl_full_path = os.path.join(stl_path[0],str(stl_file)) - print("STL full path: %s" % (stl_full_path)) - self.load_stl(stl_full_path,stl_file) + self.load_stl(stl_full_path,stl_file,translate_list,rotate_list[2]) def export(self,event): dlg=wx.FileDialog(self,"Pick file to save to",self.basedir,style=wx.FD_SAVE) @@ -180,7 +175,7 @@ class showstl(wx.Window): self.Refresh() #print time.time()-t - def load_stl(self,path,name): + def load_stl(self,path,name,offset=[0,0,0],rotation=0): newname=os.path.split(name.lower())[1] c=1 while newname in self.models: @@ -188,8 +183,8 @@ class showstl(wx.Window): newname=newname+"(%d)"%c c+=1 self.models[newname]=stltool.stl(path) - self.models[newname].offsets=[0,0,0] - self.models[newname].rot=0 + self.models[newname].offsets=offset + self.models[newname].rot=rotation self.models[newname].filename=name minx,miny,minz,maxx,maxy,maxz=(10000,10000,10000,0,0,0) for i in self.models[newname].facets: From b644182af13a1700e838cca942f7af54705c974f Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 15:19:52 +0100 Subject: [PATCH 5/9] Restore STL file wildcard for export --- plater.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plater.py b/plater.py index 1299cff..181232b 100755 --- a/plater.py +++ b/plater.py @@ -100,7 +100,7 @@ class showstl(wx.Window): def export(self,event): dlg=wx.FileDialog(self,"Pick file to save to",self.basedir,style=wx.FD_SAVE) - dlg.SetWildcard("OpenSCAD files (;*.scad;)") + dlg.SetWildcard("STL files (;*.stl;)") if(dlg.ShowModal() == wx.ID_OK): name=dlg.GetPath() sf=open(name.replace(".","_")+".scad","w") From 6785eb657a99dcb7c007242bd7bc477ce452689b Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 15:45:24 +0100 Subject: [PATCH 6/9] Run everything through right, distinguish on extension to delegate to load_stl & load_scad --- plater.py | 86 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/plater.py b/plater.py index 181232b..92c1bad 100755 --- a/plater.py +++ b/plater.py @@ -29,7 +29,7 @@ class showstl(wx.Window): self.cb=wx.Button(self,label="Put at 100,100",pos=(300,size[1]-80)) self.db=wx.Button(self,label="Delete",pos=(300,size[1]-55)) self.ab=wx.Button(self,label="Auto",pos=(300,size[1]-30)) - self.lb.Bind(wx.EVT_BUTTON,self.load) + self.lb.Bind(wx.EVT_BUTTON,self.right) self.eb.Bind(wx.EVT_BUTTON,self.export) self.sb.Bind(wx.EVT_BUTTON,self.snap) self.cb.Bind(wx.EVT_BUTTON,self.center) @@ -72,32 +72,6 @@ class showstl(wx.Window): self.l.Select(self.l.GetCount()-1) self.Refresh() - def load(self,event): - dlg=wx.FileDialog(self,"Pick file to load",self.basedir,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) - dlg.SetWildcard("OpenSCAD files (;*.scad;)") - self.models={} - if(dlg.ShowModal() == wx.ID_OK): - name=dlg.GetPath() - lf=open(name) - s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf] - lf.close() - - for i in s: - parts = i.split() - translate_list = eval(parts[0]) - rotate_list = eval(parts[1]) - stl_file = eval(parts[2]) - - newname=os.path.split(stl_file.lower())[1] - c=1 - while newname in self.models: - newname=os.path.split(stl_file.lower())[1] - newname=newname+"(%d)"%c - c+=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)) - self.load_stl(stl_full_path,stl_file,translate_list,rotate_list[2]) - def export(self,event): dlg=wx.FileDialog(self,"Pick file to save to",self.basedir,style=wx.FD_SAVE) dlg.SetWildcard("STL files (;*.stl;)") @@ -157,25 +131,53 @@ class showstl(wx.Window): self.models[i].offsets[0] += centreoffset[0] self.models[i].offsets[1] += centreoffset[1] self.Refresh() - + def right(self,event): - dlg=wx.FileDialog(self,"Open file to print",self.basedir,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) - dlg.SetWildcard("STL files (;*.stl;)") + 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") if(dlg.ShowModal() == wx.ID_OK): name=dlg.GetPath() - if not(os.path.exists(name)): - return - path = os.path.split(name)[0] - self.basedir=path - t=time.time() - #print name - if name.lower().endswith(".stl"): - #Filter out the path, just show the STL filename. - self.load_stl(name,name) - self.Refresh() - #print time.time()-t + if (name.lower().endswith(".stl")): + self.load_stl(event,name) + elif (name.lower().endswith(".scad")): + self.load_scad(event,name) + + def load_scad(self,event,name): + lf=open(name) + s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf] + lf.close() - def load_stl(self,path,name,offset=[0,0,0],rotation=0): + self.models={} + for i in s: + parts = i.split() + translate_list = eval(parts[0]) + rotate_list = eval(parts[1]) + stl_file = eval(parts[2]) + + newname=os.path.split(stl_file.lower())[1] + c=1 + while newname in self.models: + newname=os.path.split(stl_file.lower())[1] + newname=newname+"(%d)"%c + c+=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)) + self.load_stl_into_model(stl_full_path,stl_file,translate_list,rotate_list[2]) + + def load_stl(self,event,name): + if not(os.path.exists(name)): + return + path = os.path.split(name)[0] + self.basedir=path + t=time.time() + #print name + if name.lower().endswith(".stl"): + #Filter out the path, just show the STL filename. + self.load_stl_into_model(name,name) + self.Refresh() + #print time.time()-t + + def load_stl_into_model(self,path,name,offset=[0,0,0],rotation=0): newname=os.path.split(name.lower())[1] c=1 while newname in self.models: From 06a69074a44c3ea4e74621efdbe83fd2108237a1 Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 16:01:15 +0100 Subject: [PATCH 7/9] Added clear button; don't clear model when loading scad file --- plater.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/plater.py b/plater.py index 92c1bad..e9f4366 100755 --- a/plater.py +++ b/plater.py @@ -22,13 +22,15 @@ class stlwrap: class showstl(wx.Window): def __init__(self,parent,size,pos): wx.Window.__init__(self,parent,size=size,pos=pos) - self.l=wx.ListBox(self,size=(300,155),pos=(0,size[1]-155)) + self.l=wx.ListBox(self,size=(300,180),pos=(0,size[1]-180)) + self.cl=wx.Button(self,label="Clear",pos=(300,size[1]-180)) self.lb=wx.Button(self,label="Load",pos=(300,size[1]-155)) self.eb=wx.Button(self,label="Export",pos=(300,size[1]-130)) self.sb=wx.Button(self,label="Snap to Z=0",pos=(300,size[1]-105)) self.cb=wx.Button(self,label="Put at 100,100",pos=(300,size[1]-80)) self.db=wx.Button(self,label="Delete",pos=(300,size[1]-55)) self.ab=wx.Button(self,label="Auto",pos=(300,size[1]-30)) + self.cl.Bind(wx.EVT_BUTTON,self.clear) self.lb.Bind(wx.EVT_BUTTON,self.right) self.eb.Bind(wx.EVT_BUTTON,self.export) self.sb.Bind(wx.EVT_BUTTON,self.snap) @@ -147,7 +149,6 @@ class showstl(wx.Window): s=[i.replace("\n","").replace("\r","").replace(";","") for i in lf] lf.close() - self.models={} for i in s: parts = i.split() translate_list = eval(parts[0]) @@ -235,6 +236,12 @@ class showstl(wx.Window): self.l.Select(self.l.GetCount()-1) + 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?', + wx.YES_NO | wx.ICON_QUESTION) + if (result == 2): + self.models={} + self.Refresh() def move(self,event): if event.ButtonUp(wx.MOUSE_BTN_LEFT): @@ -337,11 +344,11 @@ class showstl(wx.Window): #s.export() class stlwin(wx.Frame): - def __init__(self,size=(400,555)): + def __init__(self,size=(400,580)): wx.Frame.__init__(self,None,title="Right-click to add a file",size=size) self.SetIcon(wx.Icon("plater.ico",wx.BITMAP_TYPE_ICO)) self.SetClientSize(size) - self.s=showstl(self,(400,555),(0,0)) + self.s=showstl(self,(400,580),(0,0)) if __name__ == '__main__': app = wx.App(False) From cfb0b815a74ee7dd7a799e8428dd9a76c317f4f6 Mon Sep 17 00:00:00 2001 From: Steven Devijver Date: Tue, 8 Nov 2011 16:17:16 +0100 Subject: [PATCH 8/9] Also clear ListBox when clearing grid --- plater.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plater.py b/plater.py index e9f4366..506cd9b 100755 --- a/plater.py +++ b/plater.py @@ -241,6 +241,7 @@ class showstl(wx.Window): wx.YES_NO | wx.ICON_QUESTION) if (result == 2): self.models={} + self.l.Clear() self.Refresh() def move(self,event): From 1ce9f3a5364175f42d686e0ceb36e0d480d3de4a Mon Sep 17 00:00:00 2001 From: Keegi Date: Tue, 8 Nov 2011 22:48:28 +0200 Subject: [PATCH 9/9] workaround for buttons appearing in empty custom button slots on linux attempt to fix panel context menu not appearing on empty slot --- pronterface.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/pronterface.py b/pronterface.py index 9e042c9..9997cf3 100755 --- a/pronterface.py +++ b/pronterface.py @@ -657,12 +657,16 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if 0.3*rr+0.59*gg+0.11*bb < 60: b.SetForegroundColour("#ffffff") except: - b=wx.Button(self.panel,-1,"") - b.Freeze() + b=wx.StaticText(self.panel,-1,"",size=(72,20),style=wx.ALIGN_CENTRE+wx.ST_NO_AUTORESIZE) #+wx.SIMPLE_BORDER + #b.Freeze() + b.Disable() b.custombutton=i b.properties=btndef - b.Bind(wx.EVT_BUTTON,self.procbutton) - b.Bind(wx.EVT_MOUSE_EVENTS,self.editbutton) + if btndef is not None: + b.Bind(wx.EVT_BUTTON,self.procbutton) + b.Bind(wx.EVT_MOUSE_EVENTS,self.editbutton) + else: + b.Bind(wx.EVT_BUTTON,lambda e:e.Skip()) self.custombuttonbuttons.append(b) if i<4: ubs.Add(b) @@ -817,18 +821,24 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if hasattr(obj,"custombutton"): self.dragging = wx.Button(self.panel,-1,obj.GetLabel()) self.dragging.SetBackgroundColour(obj.GetBackgroundColour()) + self.dragging.SetForegroundColour(obj.GetForegroundColour()) self.dragging.sourcebutton = obj self.dragging.Raise() self.dragging.Disable() self.dragging.SetPosition(self.panel.ScreenToClient(scrpos)) for b in self.custombuttonbuttons: - if b.IsFrozen(): b.Thaw() + #if b.IsFrozen(): b.Thaw() + if b.properties is None: + b.Enable() + # b.SetStyle(wx.ALIGN_CENTRE+wx.ST_NO_AUTORESIZE+wx.SIMPLE_BORDER) self.last_drag_dest = obj self.dragging.label = obj.s_label = obj.GetLabel() self.dragging.bgc = obj.s_bgc = obj.GetBackgroundColour() + self.dragging.fgc = obj.s_fgc = obj.GetForegroundColour() else: # dragging in progress self.dragging.SetPosition(self.panel.ScreenToClient(scrpos)) + wx.CallAfter(self.dragging.Refresh) btns = self.custombuttonbuttons dst = None src = self.dragging.sourcebutton @@ -856,16 +866,21 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if dst is not self.last_drag_dest: if self.last_drag_dest is not None: self.last_drag_dest.SetBackgroundColour(self.last_drag_dest.s_bgc) + self.last_drag_dest.SetForegroundColour(self.last_drag_dest.s_fgc) self.last_drag_dest.SetLabel(self.last_drag_dest.s_label) if dst is not None and dst is not src: dst.s_bgc = dst.GetBackgroundColour() + dst.s_fgc = dst.GetForegroundColour() dst.s_label = dst.GetLabel() src.SetBackgroundColour(dst.GetBackgroundColour()) + src.SetForegroundColour(dst.GetForegroundColour()) src.SetLabel(dst.GetLabel()) dst.SetBackgroundColour(drg.bgc) + dst.SetForegroundColour(drg.fgc) dst.SetLabel(drg.label) else: src.SetBackgroundColour(drg.bgc) + src.SetForegroundColour(drg.fgc) src.SetLabel(drg.label) self.last_drag_dest = dst elif hasattr(self,"dragging") and not e.ButtonIsDown(wx.MOUSE_BTN_LEFT):