From 2079a992780851d0ea7dd02b776c30d090f63ecf Mon Sep 17 00:00:00 2001 From: Christopher Keller Date: Mon, 28 Nov 2011 07:44:29 -0800 Subject: [PATCH 1/2] Added Estimated time left, and total time, for non-SD Printing. They get more and more accurate until the end. --- pronterface.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pronterface.py b/pronterface.py index fcff0dd..ef30bb6 100755 --- a/pronterface.py +++ b/pronterface.py @@ -1088,7 +1088,15 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.sdprinting: string+= _(" SD printing:%04.2f %%") % (self.percentdone,) if self.p.printing: + secondselapsed = int(time.time()-self.starttime) + fractioncomplete = float(self.p.queueindex)/len(self.p.mainqueue) + secondsestimate = secondselapsed/fractioncomplete + secondsremain = secondsestimate - secondselapsed string+= _(" Printing:%04.2f %%") % (100*float(self.p.queueindex)/len(self.p.mainqueue),) + string+= _(" Estimated:%02.0f") % (int(secondsremain/60),) + string+= _(":%02.0f") % (int(secondsremain%60),) + string+= _(" of %02.0f") % (int(secondsestimate/60),) + string+= _(":%02.0f Remaining") % (int(secondsestimate%60),) wx.CallAfter(self.status.SetStatusText,string) wx.CallAfter(self.gviz.Refresh) if(self.monitor and self.p.online): From 02f14d509006950e0cba79ad2beded28609d542d Mon Sep 17 00:00:00 2001 From: Kliment Yanev Date: Mon, 28 Nov 2011 18:15:59 +0100 Subject: [PATCH 2/2] Fix comment stripping in duration estimation --- pronsole.py | 3 +- stlview.py | 348 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 292 insertions(+), 59 deletions(-) diff --git a/pronsole.py b/pronsole.py index 3e6c507..1be8371 100755 --- a/pronsole.py +++ b/pronsole.py @@ -94,7 +94,8 @@ def estimate_duration(g): feedrate = 0 X_last_position = 0 Y_last_position = 0 - for i.split(";")[0] in g: + for i in g: + i=i.split(";")[0] if "G1" in i and ("X" in i or "Y" in i or "F" in i or "E" in i): parts = i.split(" ") X = get_coordinate_value("X", parts[1:]) diff --git a/stlview.py b/stlview.py index 3877455..d6cd912 100644 --- a/stlview.py +++ b/stlview.py @@ -189,7 +189,6 @@ class GLPanel(wx.Panel): pass class stlview(object): - list = None def __init__(self, facets, batch): # Create the vertex and normal arrays. vertices = [] @@ -213,6 +212,154 @@ class stlview(object): def delete(self): self.vertex_list.delete() +class gcview(object): + def __init__(self, lines, batch, w=0.5, h=0.5): + # Create the vertex and normal arrays. + vertices = [] + normals = [] + self.prev=[0.001,0.001,0.001,0.001] + self.fline=1 + f=open("20cube_export.gcode") + lines=list(f) + f.close() + self.layers={} + lines=[self.transform(i) for i in lines] + lines=[i for i in lines if i is not None] + layertemp={} + lasth=None + for i in lines: + if i[0][2] not in layertemp: + layertemp[i[0][2]]=[[],[]] + if lasth is not None: + 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))] + self.layers[lasth].add_indexed(len(layertemp[lasth][0])//3, + GL_TRIANGLES, + None,#group, + indices, + ('v3f/static', layertemp[lasth][0]), + ('n3f/static', layertemp[lasth][1])) + lasth=i[0][2] + def vdiff(v,o): + return map(lambda x,y:x-y,v,o) + + spoints,epoints,S,E=self.genline(i,h,w) + for j in xrange(8): + + layertemp[i[0][2]][0].extend(spoints[(j+1)%8]) + layertemp[i[0][2]][1].extend(vdiff(spoints[(j+1)%8],S)) + layertemp[i[0][2]][0].extend(epoints[(j)%8]) + layertemp[i[0][2]][1].extend(vdiff(epoints[(j)%8],E)) + layertemp[i[0][2]][0].extend(spoints[j]) + layertemp[i[0][2]][1].extend(vdiff(spoints[j],S)) + layertemp[i[0][2]][0].extend(epoints[(j)]) + layertemp[i[0][2]][1].extend(vdiff(epoints[(j)],E)) + layertemp[i[0][2]][0].extend(spoints[(j+1)%8]) + layertemp[i[0][2]][1].extend(vdiff(spoints[j],S)) + layertemp[i[0][2]][0].extend(epoints[(j+1)%8]) + layertemp[i[0][2]][1].extend(vdiff(epoints[(j+1)%8],E)) + + vertices.extend(spoints[(j+1)%8]) + normals.extend(vdiff(spoints[(j+1)%8],S)) + vertices.extend(epoints[(j)%8]) + normals.extend(vdiff(epoints[(j)%8],E)) + vertices.extend(spoints[j]) + normals.extend(vdiff(spoints[j],S)) + vertices.extend(epoints[(j)]) + normals.extend(vdiff(epoints[(j)],E)) + vertices.extend(spoints[(j+1)%8]) + normals.extend(vdiff(spoints[j],S)) + vertices.extend(epoints[(j+1)%8]) + normals.extend(vdiff(epoints[(j+1)%8],E)) + # 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))] + #print indices[:10] + self.vertex_list = batch.add_indexed(len(vertices)//3, + GL_TRIANGLES, + None,#group, + indices, + ('v3f/static', vertices), + ('n3f/static', normals)) + if lasth is not None: + 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))] + self.layers[lasth].add_indexed(len(layertemp[lasth][0])//3, + GL_TRIANGLES, + None,#group, + indices, + ('v3f/static', layertemp[lasth][0]), + ('n3f/static', layertemp[lasth][1])) + + + def genline(self,i,h,w): + S=i[0][:3] + E=i[1][:3] + v=map(lambda x,y:x-y,E,S) + vlen=math.sqrt(float(sum(map(lambda a:a*a, v[:3])))) + + if vlen==0: + vlen=0.01 + sq2=math.sqrt(2.0)/2.0 + htw=float(h)/w + d=w/2.0 + if i[1][3]==i[0][3]: + d=0.05 + points=[[d,0,0], + [sq2*d,sq2*d,0], + [0,d,0], + [-sq2*d,sq2*d,0], + [-d,0,0], + [-sq2*d,-sq2*d,0], + [0,-d,0], + [sq2*d,-sq2*d,0] + ] + axis=stltool.cross([0,0,1],v) + alen=math.sqrt(float(sum(map(lambda a:a*a, v[:3])))) + if alen>0: + axis=map(lambda m:m/alen,axis) + angle=math.acos(v[2]/vlen) + def vrot(v,axis,angle): + kxv=stltool.cross(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) + 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(lambda x,y:x+y,v,o) + spoints=map(lambda x:vadd(S,x),points) + epoints=map(lambda x:vadd(E,x),points) + return spoints,epoints,S,E + + def transform(self,line): + line=line.split(";")[0] + cur=self.prev[:] + if len(line)>0: + if "G1" in line or "G0" in line or "G92" in line: + if("X" in line): + cur[0]=float(line.split("X")[1].split(" ")[0]) + if("Y" in line): + cur[1]=float(line.split("Y")[1].split(" ")[0]) + if("Z" in line): + cur[2]=float(line.split("Z")[1].split(" ")[0]) + if("E" in line): + cur[3]=float(line.split("E")[1].split(" ")[0]) + if self.prev==cur: + return None + if self.fline or "G92" in line: + self.prev=cur + self.fline=0 + return None + else: + r=[self.prev,cur] + self.prev=cur + return r + + + def delete(self): + self.vertex_list.delete() + + def trackball(p1x, p1y, p2x, p2y, r): TRACKBALLSIZE=r #float a[3]; /* Axis of rotation */ @@ -284,21 +431,35 @@ def mulquat(q1,rq): q1[3] * rq[2] + q1[2] * rq[3] + q1[0] * rq[1] - q1[1] * rq[0], q1[3] * rq[3] - q1[0] * rq[0] - q1[1] * rq[1] - q1[2] * rq[2]] + class TestGlPanel(GLPanel): - def __init__(self, parent, id=wx.ID_ANY, pos=(10, 10)): - super(TestGlPanel, self).__init__(parent, id, wx.DefaultPosition, wx.DefaultSize, 0) + def __init__(self, parent, size,id=wx.ID_ANY,): + super(TestGlPanel, self).__init__(parent, id, wx.DefaultPosition, size, 0) self.batches=[] self.rot=0 self.canvas.Bind(wx.EVT_MOUSE_EVENTS,self.move) + self.canvas.Bind(wx.EVT_LEFT_DCLICK,self.double) self.initialized=1 self.canvas.Bind(wx.EVT_MOUSEWHEEL,self.wheel) + self.parent=parent self.initp=None - self.selected=0 self.dist=200 + self.bedsize=[200,200] self.transv=[0, 0, -self.dist] self.basequat=[0,0,0,1] wx.CallAfter(self.forceresize) + self.mousepos=[0,0] + + def double(self, event): + p=event.GetPositionTuple() + sz=self.GetClientSize() + v=map(lambda m,w,b:b*m/w,p,sz,self.bedsize) + v[1]=self.bedsize[1]-v[1] + v+=[300] + print v + self.add_file("../prusa/metric-prusa/x-end-idler.stl",v) + def forceresize(self): self.SetClientSize((self.GetClientSize()[0],self.GetClientSize()[1]+1)) @@ -311,15 +472,17 @@ class TestGlPanel(GLPanel): if self.initp==None: self.initp=event.GetPositionTuple() else: - if event.ShiftDown(): - if self.selected<0: + if not event.ShiftDown(): + i=self.parent.l.GetSelection() + if i<0: return p1=list(self.initp) p1[1]*=-1 self.initp=None p2=list(event.GetPositionTuple()) p2[1]*=-1 - self.batches[self.selected][0]=map(lambda old,new,original:original+(new-old), list(p1)+[0],list(p2)+[0],self.batches[0][0]) + m=self.parent.models[self.parent.l.GetString(i)] + m.offsets=map(lambda old,new,original:original+(new-old), list(p1)+[0],list(p2)+[0],m.offsets) return #print self.initp p1=self.initp @@ -339,8 +502,8 @@ class TestGlPanel(GLPanel): #self.basequat=quatx mat=build_rotmatrix(self.basequat) glLoadIdentity() - #glTranslatef(-self.transv[0],-self.transv[1],-self.transv[2]) - glTranslatef(*self.transv) + glTranslatef(self.transv[0],self.transv[1],0) + glTranslatef(0,0,self.transv[2]) glMultMatrixd(mat) glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) self.rot=1 @@ -351,8 +514,9 @@ class TestGlPanel(GLPanel): elif event.ButtonUp(wx.MOUSE_BTN_RIGHT): if self.initp is not None: self.initp=None + - elif event.Dragging() and event.RightIsDown(): + elif event.Dragging() and event.RightIsDown() and event.ShiftDown(): if self.initp is None: self.initp=event.GetPositionTuple() else: @@ -367,24 +531,35 @@ class TestGlPanel(GLPanel): 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() - glTranslatef(*self.transv) + glTranslatef(self.transv[0],self.transv[1],0) + glTranslatef(0,0,self.transv[2]) if(self.rot): glMultMatrixd(build_rotmatrix(self.basequat)) glGetDoublev(GL_MODELVIEW_MATRIX,self.mvmat) self.rot=1 self.initp=None - + else: + #mouse is moving without a button press + p=event.GetPositionTuple() + sz=self.GetClientSize() + v=map(lambda m,w,b:b*m/w,p,sz,self.bedsize) + v[1]=self.bedsize[1]-v[1] + self.mousepos=v + def wheel(self,event): z=event.GetWheelRotation() delta=10 - if event.ShiftDown(): - if self.selected<0: + if not event.ShiftDown(): + i=self.parent.l.GetSelection() + + if i<0: return + m=self.parent.models[self.parent.l.GetString(i)] if z > 0: - self.batches[self.selected][2]+=delta/2 + m.rot+=delta/2 else: - self.batches[self.selected][2]-=delta/2 + m.rot-=delta/2 return if z > 0: self.transv[2]+=delta @@ -407,31 +582,44 @@ class TestGlPanel(GLPanel): wx.CallAfter(self.Refresh) except: return - #continue - global rx, ry, rz - rx += dt * 1 - ry += dt * 80 - rz += dt * 30 - rx %= 360 - ry %= 360 - rz %= 360 - + + def anim(self,obj): + g=50*9.8 + v=20 + dt=0.05 + basepos=obj.offsets[2] + obj.offsets[2]+=obj.animoffset + while obj.offsets[2]>-1: + time.sleep(dt) + obj.offsets[2]-=v*dt + v+=g*dt + if(obj.offsets[2]<0): + obj.scale[2]*=1-3*dt + #return + v=v/4 + while obj.offsets[2]