From a49194a19ff6ef4ce0cfa1e0bd8b063649bd4a5b Mon Sep 17 00:00:00 2001 From: jezmy Date: Tue, 8 May 2012 14:53:33 +0100 Subject: [PATCH] Updated with tooltips; gviz now has toolbar with icons; fixed binding to print button --- gviz.py | 107 +++++++++++++++++++++++++++++------------- images/arrow_down.png | Bin 0 -> 1166 bytes images/arrow_up.png | Bin 0 -> 1048 bytes images/inject.png | Bin 0 -> 3926 bytes images/zoom_in.png | Bin 0 -> 1739 bytes images/zoom_out.png | Bin 0 -> 1174 bytes pronterface.py | 43 ++++++++++++++--- 7 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 images/arrow_down.png create mode 100644 images/arrow_up.png create mode 100644 images/inject.png create mode 100644 images/zoom_in.png create mode 100644 images/zoom_out.png diff --git a/gviz.py b/gviz.py index 0055a19..cc0fcd8 100755 --- a/gviz.py +++ b/gviz.py @@ -17,35 +17,61 @@ ID_ABOUT = 101 ID_EXIT = 110 class window(wx.Frame): def __init__(self,f,size=(600,600),build_dimensions=[200,200,100,0,0,0],grid=(10,50),extrusion_width=0.5): - wx.Frame.__init__(self,None,title="Gcode view, shift to move view, mousewheel to set layer",size=(size[0],size[1])) + wx.Frame.__init__(self,None,title="Gcode view, shift to move view, mousewheel to set layer",size=(size[0],size[1])) self.p=gviz(self,size=size,build_dimensions=build_dimensions,grid=grid,extrusion_width=extrusion_width) - - # Set up a status bar for displaying info (Jezmy) + + vbox = wx.BoxSizer(wx.VERTICAL) + toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER) + toolbar.AddSimpleTool(1, wx.Image('./images/zoom_in.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Zoom In [+]', '') + toolbar.AddSimpleTool(2, wx.Image('./images/zoom_out.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Zoom Out [-]', '') + toolbar.AddSeparator() + toolbar.AddSimpleTool(3, wx.Image('./images/arrow_up.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Move Up a Layer [U]', '') + toolbar.AddSimpleTool(4, wx.Image('./images/arrow_down.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Move Down a Layer [D]', '') + toolbar.AddSeparator() + #toolbar.AddSimpleTool(5, wx.Image('./images/inject.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Insert Code at start of this layer', '') + toolbar.Realize() + vbox.Add(toolbar, 0, border=5) + self.SetSizer(vbox) + self.Bind(wx.EVT_TOOL, lambda x:self.p.zoom(200,200,1.2), id=1) + self.Bind(wx.EVT_TOOL, lambda x:self.p.zoom(200,200,1/1.2), id=2) + self.Bind(wx.EVT_TOOL, lambda x:self.p.layerup(), id=3) + self.Bind(wx.EVT_TOOL, lambda x:self.p.layerdown(), id=4) + #self.Bind(wx.EVT_TOOL, lambda x:self.p.inject(), id=5) + self.CreateStatusBar(1); self.SetStatusText("Layer number and Z position show here when you scroll"); - self.bu=wx.Button(self.p,-1,"U",pos=(0,0),size=(40,40)) - self.bd=wx.Button(self.p,-1,"D",pos=(0,40),size=(40,40)) - self.bi=wx.Button(self.p,-1,"+",pos=(40,0),size=(40,40)) - self.bo=wx.Button(self.p,-1,"-",pos=(40,40),size=(40,40)) - self.bu.Bind(wx.EVT_BUTTON,lambda x:self.p.layerup()) - self.bd.Bind(wx.EVT_BUTTON,lambda x:self.p.layerdown()) - self.bi.Bind(wx.EVT_BUTTON,lambda x:self.p.zoom(200,200,1.2)) - self.bo.Bind(wx.EVT_BUTTON,lambda x:self.p.zoom(200,200,1/1.2)) + #self.bu=wx.Button(self.p,-1,"U",pos=(0,100),size=(40,140)) + #self.bd=wx.Button(self.p,-1,"D",pos=(0,140),size=(40,140)) + #self.bi=wx.Button(self.p,-1,"+",pos=(40,100),size=(40,140)) + #self.bo=wx.Button(self.p,-1,"-",pos=(40,140),size=(40,140)) + #self.bs=wx.Button(self.p, -1, "Inject", pos=(85, 103), size=(50, 20)) + + #self.bu.SetToolTip(wx.ToolTip("Move up one layer")) + #self.bd.SetToolTip(wx.ToolTip("Move down one layer")) + #self.bi.SetToolTip(wx.ToolTip("Zoom view in")) + #self.bo.SetToolTip(wx.ToolTip("Zoom view out")) + #self.bs.SetToolTip(wx.ToolTip("Insert Code at start of this layer")) + + #self.bu.Bind(wx.EVT_BUTTON,lambda x:self.p.layerup()) + #self.bd.Bind(wx.EVT_BUTTON,lambda x:self.p.layerdown()) + #self.bi.Bind(wx.EVT_BUTTON,lambda x:self.p.zoom(200,200,1.2)) + #self.bo.Bind(wx.EVT_BUTTON,lambda x:self.p.zoom(200,200,1/1.2)) + #self.bs.Bind(wx.EVT_BUTTON,lambda x:self.p.inject()) s=time.time() #print time.time()-s self.initpos=[0,0] self.p.Bind(wx.EVT_KEY_DOWN,self.key) - self.bu.Bind(wx.EVT_KEY_DOWN,self.key) - self.bd.Bind(wx.EVT_KEY_DOWN,self.key) - self.bi.Bind(wx.EVT_KEY_DOWN,self.key) - self.bo.Bind(wx.EVT_KEY_DOWN,self.key) + #self.bu.Bind(wx.EVT_KEY_DOWN,self.key) + #self.bd.Bind(wx.EVT_KEY_DOWN,self.key) + #self.bi.Bind(wx.EVT_KEY_DOWN,self.key) + #self.bo.Bind(wx.EVT_KEY_DOWN,self.key) self.Bind(wx.EVT_KEY_DOWN,self.key) self.p.Bind(wx.EVT_MOUSEWHEEL,self.zoom) self.Bind(wx.EVT_MOUSEWHEEL,self.zoom) self.p.Bind(wx.EVT_MOUSE_EVENTS,self.mouse) self.Bind(wx.EVT_MOUSE_EVENTS,self.mouse) - + def mouse(self,event): if event.ButtonUp(wx.MOUSE_BTN_LEFT): if(self.initpos is not None): @@ -64,22 +90,34 @@ class window(wx.Frame): else: event.Skip() - def key(self, event): + # Keycode definitions + kup=[85, 315] # Up keys + kdo=[68, 317] # Down Keys + kzi=[388, 316, 61] # Zoom In Keys + kzo=[390, 314, 45] # Zoom Out Keys x=event.GetKeyCode() - if event.ShiftDown(): - cx,cy=self.p.translate - if x==wx.WXK_UP: - self.p.zoom(cx,cy,1.2) - if x==wx.WXK_DOWN: - self.p.zoom(cx,cy,1/1.2) - else: - if x==wx.WXK_UP: - self.p.layerup() - if x==wx.WXK_DOWN: - self.p.layerdown() - #print x - + #print "Key event - "+str(x) + #if event.ShiftDown(): + cx,cy=self.p.translate + # if x==wx.WXK_UP: + # self.p.zoom(cx,cy,1.2) + # if x==wx.WXK_DOWN: + # self.p.zoom(cx,cy,1/1.2) + #else: + # if x==wx.WXK_UP: + # self.p.layerup() + # if x==wx.WXK_DOWN: + # self.p.layerdown() + if x in kup: + self.p.layerup() + if x in kdo: + self.p.layerdown() + if x in kzi: + self.p.zoom(cx,cy,1.2) + if x in kzo: + self.p.zoom(cx, cy, 1/1.2) + #print p.lines.keys() def zoom(self, event): z=event.GetWheelRotation() @@ -123,7 +161,12 @@ class gviz(wx.Panel): self.hilightarcs=[] self.dirty=1 self.blitmap=wx.EmptyBitmap(self.GetClientSize()[0],self.GetClientSize()[1],-1) - + + def inject(self): + #import pdb; pdb.set_trace() + print"Inject code here..." + print "Layer "+str(self.layerindex +1)+" - Z = "+str(self.layers[self.layerindex])+" mm" + def clear(self): self.lastpos=[0,0,0,0,0,0,0] self.lines={} @@ -161,7 +204,7 @@ class gviz(wx.Panel): self.showall=0 except: pass - + def resize(self,event): size=self.GetClientSize() newsize=min(float(size[0])/self.size[0],float(size[1])/self.size[1]) diff --git a/images/arrow_down.png b/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..095e401789330f8ae64d7d1976748a24b3740c29 GIT binary patch literal 1166 zcmV;91abR`P)WdKcYATc)}MrC3kGB7YRATc>QFgH3dGaxH4F)%QXmiRIN000McNliru z)CUI$7$K_d$&Ua4010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00ZVp zL_t(|+PzgvY#UV+J@cN&j?+(&Dieo_fS?NmmD()I0)a}Ef&@Y=Sg>Ks9@rtMR6$|W zH6XEO0i=K^6||^nQ$!?a3WbO?X_~63A$DTNpW2?WHbUlkkGotp|#?lkUtG66&fz^>+4VQ+A`s-M-^FD zV01XW>$QvhFTD5!b_k7z3K0exP7oqr4Y1@W$vm$~CRVqxn73^C-^y*nh9 z%Xe{o$wRTC;CKp(!D}I4`96dtz?Am!`QC08brXOfNlaQOIU(-UH0+3log@sDM!;>t zw%`fN2*|e8)_S$*DiDcCM56+6mZ8@UntLS)eGwXZP>W>{@Hc6Mt^&4Aa^8(oBxW;6 z9a2CuGZVFdW(F1oHd|czY^z$Q_QV$c>Oi!Ei#BF#$?xp^0NuK~$pkv5tFEsL5W ztWU_ASYrDb{1=iWag^vWLQ&c5D`Sx%w`q|wH4xU?eJf|ZD)6S$hjQ*DYQ-S``K?{=pCSqwmoZh$rZriNLO6@}m>D{biQ?eyhD+ zIsek&!-+56c=bRpl#eLO*a#FJx=&y#<6<@!(4i1MXCPoEiUp`<<`7Lh0=HUXOl4SP znw)Z++Le#r$L%u{-wJ3$+5s9F&+tmEpGbGJ73?&rw-AUu~a$Slb@?6jtmbC$QsGZ zu42@yU0XbOjUBp6iUh{S69#7I=G{xJFb>Eo4VgJY;^pc_$nw&inn( z9vMnX)toQ(KK-|hh%gf_VRQJrQX0Z5VSFa=%0IsI74lbeeEK5sJ5faQrPvyCbcncE zxHMPr2g)fwd3bmzDSW=<`CJVR1aqn`6Wk!dRs48Q67Z!-&-J z_vnqB8mwjTz%xe=?h&D|;pEd$<$v(~j2)!Uyf?x?R>)1)YR!85^=d3`9=b(BJ*cway^GsJwEW%Y{AyozCJmEo8J~Y z$aCGu?|C(Bu*~ZuiRV9g3(J$c@yDl5yA^+FlLs4Z-s(raB?3I&&TN{Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01EH`01EH{Laa2H00007bV*G`2iye* z03jBHRAG+*00WpwL_t(Y$F-K*Yg|-Ywf+(hX2{TI{r-n2jYGiFngI4)FIvri~>i1FmCc+0IK5WZof|Q z!7{od6RXD_}xbABMmY$&!u1Lw|BBNF}F^l~ePJl>Y1n zqFRt(m-t~OZoW8p=JM>!g`tMEjfgPPC~-vEp{zwIsX`*nL+xRZPEHL~R_B%|uhxWY z1AO2R<8QyvKY97q^$Wv|Yk9?1q|w%)j6)ki8;3TQiV|o}5{8NgI#eQiaB?tO{dt)% z(-j9izYW<2v~p_pO5eovhu5!+G_4gPd}ruv@zF*oMivu8B5`OdXzOszNh+0)-cFOq zwoVS{?A-5^)2%=O$N@S4JT86lOy9`pXRkefvc(reXA?9fVBkh5Y z6jtVOO-Yo}D6Q%3X>QE5P7djE;Vbg<8DJf#c-$zpQ^>wgId_n-0y>1vTwB+peb3%{ z`6PEUA@do9;4oG&)*&=dT=|K)J4Fh2?|e=Bz&b5mhJ^138aDaylUbHN&j32XM{Nb* z+V14n^4ND`#Stk>Xa%GyZY&5EZ9V)%0)BYs7vMJV+l~X{cBTSq40zTE$_N!JM9PA5 zF+ecBhZ3;jcF%LQa!pMWD?}!4T4I1;;;%9eC$gtZS<|dk1FN-*0fG^SwhoIS5-`^7 zAE31m8VFVO21C_F+6opAr5(=xiyatKy|tk-l(i5LA5rTtNHqpkfZG>9M2M`Tv(2ZY zco)0qJp+jPTc{AziX$w;B*90Dr_q zr;eik)R%qe)VBnU3A71t@dBN*)elkZ literal 0 HcmV?d00001 diff --git a/images/inject.png b/images/inject.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea740daba02f37eb90492779cbe00c8b2e5fbf GIT binary patch literal 3926 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 literal 0 HcmV?d00001 diff --git a/images/zoom_in.png b/images/zoom_in.png new file mode 100644 index 0000000000000000000000000000000000000000..95c6e1d8437a40c0da3f4d492d2a94b0e17bc452 GIT binary patch literal 1739 zcmV;+1~mDJP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ?K}keGRCwBAoV#K(10xWA`SOW@mzR&>KM?->@k5r0 ziOHRli(B{ipWn)Ve*gV@|Ngyu&mKQIfBC|xt>;f2d&@v100(#Up{~QO~?X(0AltJ zi30oJ=a26a0)j$or0KL2145fWt(77}4#Wn}_d z!ocwF9|Oa$KmQm$11-36{Wim;>sJ`m^^E<#ef>OZFTa#lXZMjmrXn0AgZhVfA5RVH4p3hO@9RFF340 z_}3o>h9AHGGdzCzmEp;YFW{hJW`g)ekeiu7OG6#V;bIV#l#!QFP<6*;0YCr&Enu?& zxn5XEfPo398yE@<0^AG?yqpXSY`|b){09u)|G&WTz{Cu+1c*VFNeJ^X2#bgV#aJ06 zq-CubAa-K_fB<6o_T#7I4`4DB;O7Oq@Fy@>dRDw*`26Ju!=FFD7`_7&$?so37%C>5 zWcUZM(|=!@SBe}4a9xO(dg!?*8W8MuKy{QmPF13!@F=Hg&r1bUkp zoFW)lu=xNWfLK0%{_=^P>kGrrpWhgm`PmtGxtJI_vt)rm@{i%mx8Dralg}~yWB9`` zrOKLtgPn=tH!yCvIa$F0^7qeAV9EmKkze0`0L{Xh=>P(V>FR}(m;W&^GdzFsl7XES zlpGlt^p!ao3{|-q3{?5R!2-gDnj#G5dLj&lS|Z>i3rfDH`N4J2QingeW-8f#ObHl7~T2nwQ}>FjM^nCe`0SUtPO#9aso{V|elW$>;gg zdP;!h*cDtp00Uv_6-9+4;L^gvIA2IGsAaaR`~ek zC&TlXZy2uMz5|T%{|vWo-(nEtm=q13M=N!{xKb&TZPT@r0zT zlA5N1h}rX}kD>(x1l~V+@&uzy0tg^xWX{`H&u`zjczWIUFCX5qva$03i)IdBdBgns z@1MUPKD_;K@5YrYD;7+jwPL}{))$ZOt;tDGO#SlVHRtKmrCA`^AeFStm}Mm;*BeAb^Ak#@5!>5NJ5VrAwEX#l*xs`1$#tK701;0!SS|05LOA0D!su?}G;qb^tAr zv$M0)7Zel(TOuwl?g32V4`082eHkEtD6#;_lAXVP{Zg{Gx7P(mHp8`R*I0l)lml9@ z5+HymwgB2#_;dgM{T)C{R16IbwSh_Y*V(gYrvpofV*mlf$UsHF!otEMD=V7>wD8TN hM~`-a5+*=^0RT1Pg&o_`{PF+*002ovPDHLkV1nyIIQako literal 0 HcmV?d00001 diff --git a/images/zoom_out.png b/images/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc09125e14263ec7efe7da5cfab20aef25681c6 GIT binary patch literal 1174 zcmV;H1Zn$;P)NyKAq1)?K%*8)Ic`hy!7PW*VZ28SqNt8}`B%dt>5W_*!{md||Rk3_&m^ z1VS_t^d7O=@2wWnqr$Ci?ZaAA z^V{v~Hy{Za(=1|^iddFSK5sBPGtJC&{EOuM`v<-}eJuSrfV?bzzTSozF+p zsSNF{t%Sp2WLY2qjsteNLZMhMFa1c9<|6UWbUJl^zWdB)AJ=sv02%^~!<)Bk zkLnqn-mP2cSicU{C8G!lSxCsTgxe*fHF(+F6`}v-JtR{_BAuIpTCn-tnk9Po;L)zm z?#*WuMWv^^3!l%A_-&zhM?>3%4L7P+bu8 zLvsVT6)0JdHK1r!T?h$0E@p21qK4bwx!0R7OW0g#7 zt6006E6$frzlJO%x;AcLc4`ty64APVf>|V=H)!yAt92KwDQ;UPDZT2%tGWd29N3{m&;Dn2N?PDMYF)oJ5!X))_>x)eu&z* zE`x9`P0eyyd;Hg%rqjx38Ug;TrOWhj)YrMhN)_(XVXKO#bo-%y#+=_$0(Ib%Ofe(N>Zu)9~H-8bo45-iCOe) zmPBG;&CHhdmx>xc>=aBLGJpQGYP*cAs! zC?E+QBopz4MB)?Mkq^JJdly$OUZ7mePXvR(y(dnbSh4uzhY#bwjLcv8F7|29ww>1{ zDjvIBSyy(1$F4XOOf#L+GvCh5PJejv&^tquV^>FC+WTr|*Y=J3;(y=b?%liVR8`&A z-`{_BY;0`V$qEPmH%^^8HK6PIxj-O5EEYr8bs~|-gr;fBPUOdltQE0X>{d7&p7Q(s z1ATpc#N%<2$>a(rPXqv%oSd9!Z*N}}5(