From 4a1fd13ff578b43a742bb00afd642371dc1e6a39 Mon Sep 17 00:00:00 2001 From: daid Date: Tue, 31 Jul 2012 16:39:31 +0200 Subject: [PATCH] Added border view option for 3D view. --- Cura/gui/opengl.py | 19 +++++++++++++++++-- Cura/gui/preview3d.py | 18 +++++++++++++++++- Cura/gui/toolbarUtil.py | 5 ++++- Cura/images/view-border-off.png | Bin 0 -> 867 bytes Cura/images/view-border-on.png | Bin 0 -> 902 bytes 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 Cura/images/view-border-off.png create mode 100644 Cura/images/view-border-on.png diff --git a/Cura/gui/opengl.py b/Cura/gui/opengl.py index c227600..bf89bf8 100644 --- a/Cura/gui/opengl.py +++ b/Cura/gui/opengl.py @@ -47,7 +47,7 @@ def InitGL(window, view3D, zoom): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) def DrawMachine(machineSize): - glColor3f(1,1,1) + glColor3f(1.0,1.0,1.0) glLineWidth(4) glDisable(GL_LIGHTING) glBegin(GL_LINE_LOOP) @@ -56,6 +56,7 @@ def DrawMachine(machineSize): glVertex3f(machineSize.x, machineSize.y, 0) glVertex3f(0, machineSize.y, 0) glEnd() + glColor3f(0.7,0.7,0.7) glLineWidth(2) glBegin(GL_LINES) for i in xrange(0, int(machineSize.x), 10): @@ -203,7 +204,21 @@ def DrawBox(vMin, vMax): glVertex3f(vMin[0], vMax[1], vMax[2]) glEnd() -def DrawSTL(mesh): +def DrawMeshOutline(mesh): + glEnable(GL_CULL_FACE) + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes) + + glCullFace(GL_FRONT) + glLineWidth(3) + glPolygonMode(GL_BACK, GL_LINE) + glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount) + glPolygonMode(GL_BACK, GL_FILL) + glCullFace(GL_BACK) + + glDisableClientState(GL_VERTEX_ARRAY) + +def DrawMesh(mesh): glEnable(GL_CULL_FACE) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 27605a3..26ebe04 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -76,6 +76,9 @@ class previewPanel(wx.Panel): toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick) self.toolbar.AddSeparator() + self.showBorderButton = toolbarUtil.ToggleButton(self.toolbar, '', 'view-border-on.png', 'view-border-off.png', 'Show model borders', callback=self.OnViewChange) + self.toolbar.AddSeparator() + group = [] self.normalViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-normal-on.png', 'view-normal-off.png', 'Normal model view', callback=self.OnViewChange) self.transparentViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-transparent-on.png', 'view-transparent-off.png', 'Transparent model view', callback=self.OnViewChange) @@ -331,6 +334,7 @@ class previewPanel(wx.Panel): self.glCanvas.viewMode = "GCode" elif self.mixedViewButton.GetValue(): self.glCanvas.viewMode = "Mixed" + self.glCanvas.drawBorders = self.showBorderButton.GetValue() self.updateToolbar() self.glCanvas.Refresh() @@ -533,7 +537,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): if obj.dirty: obj.dirty = False glNewList(obj.displayList, GL_COMPILE) - opengl.DrawSTL(obj.mesh) + opengl.DrawMesh(obj.mesh) glEndList() if self.viewMode == "Transparent" or self.viewMode == "Mixed": @@ -593,11 +597,23 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glDisable(GL_STENCIL_TEST) glEnable(GL_DEPTH_TEST) + + if self.drawBorders: + #Fix the depth buffer for the outline drawing. + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) + self.drawModel(obj) + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) elif self.viewMode == "Normal": glLightfv(GL_LIGHT0, GL_DIFFUSE, self.objColor[self.parent.objectList.index(obj)]) glLightfv(GL_LIGHT0, GL_AMBIENT, map(lambda x: x / 5, self.objColor[self.parent.objectList.index(obj)])) glEnable(GL_LIGHTING) self.drawModel(obj) + + if self.drawBorders and (self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray"): + glEnable(GL_DEPTH_TEST) + glDisable(GL_LIGHTING) + glColor3f(1,1,1) + opengl.DrawMeshOutline(obj.mesh) glPopMatrix() if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray": diff --git a/Cura/gui/toolbarUtil.py b/Cura/gui/toolbarUtil.py index e49d77c..64dc984 100644 --- a/Cura/gui/toolbarUtil.py +++ b/Cura/gui/toolbarUtil.py @@ -94,6 +94,8 @@ class ToggleButton(buttons.GenBitmapToggleButton): def OnButton(self, event): self.SetBitmap(self.GetValue()) + if self.callback != None: + self.callback() event.Skip() def OnButtonProfile(self, event): @@ -103,7 +105,8 @@ class ToggleButton(buttons.GenBitmapToggleButton): else: self.SetBitmap(False) profile.putProfileSetting(self.profileSetting, 'False') - self.callback() + if self.callback != None: + self.callback() event.Skip() def OnMouseEnter(self, event): diff --git a/Cura/images/view-border-off.png b/Cura/images/view-border-off.png new file mode 100644 index 0000000000000000000000000000000000000000..30192055794f3f3b27b6d81880cb2578d681ec4c GIT binary patch literal 867 zcmV-p1DyPcP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iylA z4kR`wzO)zs00QGlL_t(I%YBp0OJfHV#edI4LxQzBY78-vfCFkoG?cjZqYT*o0a6gA z>$bEYOe{qgLc41x;#;*MU3Sy11y@pV(N#cEViS{y7_G+7Oh{hdd-rzHj*G$eEHCH$ z7Wdv`@E=-VUmsP~Z&md@5qY(^xR`m$XS_QwO*5#fUy8`*iA18aR;zJ%c=$$De^k}i zsZ^@`B)~MyR^U?+NsWw*JWnQ*SeC`!-X6WZy&N4KQ7jfuRP}q;bvIX5R_Xwrf5R_; z&2TvU#q{*_vv@p?<2V$HMNHGgFboC;28c$ZowjX%RIOG&oSK^YYiDQYPs23LpH=l` zGMO|wIyxv63heLiQ>)deR4M?Bjg9f}@IWLIAsi0VY&OZ~^ITnB{olq8jaG|*GHjH7-h(I7Wf2aC85|s>*=zz}Sr)Zg?eYGO;~*lm zsH)%N@!6KSe8Y1cQ+#P2m$bTJOqP5Le<14SOt_DTqD-roDnM`(0OiXZhcgODTE|Ext z)6-LqkB{Go$WN;JdTnj(?8!1MFE5X}uKNw}$;`}*QK?kO=kr`&U;kzp#&_v-I`hA6 te5<9Ur57UdwW@yLy6$>9onCp$_c!sem56azjgtTX002ovPDHLkV1kK`kuv}Q literal 0 HcmV?d00001 diff --git a/Cura/images/view-border-on.png b/Cura/images/view-border-on.png new file mode 100644 index 0000000000000000000000000000000000000000..2d27e29602357dcb076030971180e0256e51720a GIT binary patch literal 902 zcmV;119|+3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iylA z4kS6Z0jY@q00Ra|L_t(I%YBniXq$B$#y@YGw=oH&NsBSYS-WMDbft#5?WXgfR&cfR z&p`Cz^q`Ab5T+d-v^aEP!M(Drtf^~FQ<8Q`P1mGvlV6he z`}HvGL8{O3%frLN^L!tR|G>QPD0Hd2QDd-#T0ItbZS}-#iji(U(=^rRa`F zBVK)l>kHqntLQ29*!C3B>wyKk6{hL5ZBdEWnUoNBX+Xnc@FUw=gE zjfb0V`GMyT+*B1Hof!QDk!O06Pg+%LkSo70a`DnMuIsY0vI4-+&=A#XmA-8W z(mTTR`L9r(yTHck!l%~EnUU7c`#<(C=F5C__D5>98kI_ga=A>gSY&K$j7TIxKA$I_ z&r>Ruc<7$(?22Xi?d%tApNhDOMMHx0_xBSB1c=3Aq*5v3@i>J-fm|-f($W&8QiGcuGJe0GV(~`kj^j|NR0sqDgu-F8)ka0| zt0yR+Dl{4mLZJ|uOom`E$lBT(j^j|P)v#@w&dyHS?KZ8ZBCQtUdEGwsJOIS=Xti3@ z>vfDVBoYad$t2BY698ijuIq00Z;Yaz;8T&H&$bB$gBW8l#?WXqFvif^+lz>7iU8Oh zFt`o0?cudO<5N%0&HwNL-Q-9mH6QITId zUO0IBXU%GUadqyy0bje?bLT*so}Qceb9J4KdV|^7Spv3?LnC{6?Cu!Vs}AMdnbv?A}8*9J6G6p zOj9Q_gX+nfD)Q9!{m)tTYdMy)7cuVQmlnLc|Jc0qzia#lKOG+!R*^Rl*`p#S?>##A c)>gc~00}dxeDgoQX#fBK07*qoM6N<$f;q3dB>(^b literal 0 HcmV?d00001