1 from __future__ import absolute_import
6 from wx import glcanvas
10 OpenGL.ERROR_CHECKING = False
11 from OpenGL.GLU import *
12 from OpenGL.GL import *
15 print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
18 from Cura.gui import toolbarUtil
19 from Cura.gui import opengl
20 from Cura.util import util3d
21 from Cura.util import svg
22 from Cura.util import profile
23 from Cura.util import version
25 class flatSlicerWindow(wx.Frame):
28 super(flatSlicerWindow, self).__init__(None, title='Cura - ' + version.getVersion())
30 self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height'))
34 wx.EVT_CLOSE(self, self.OnClose)
35 self.panel = wx.Panel(self, -1)
36 self.SetSizer(wx.BoxSizer(wx.VERTICAL))
37 self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)
38 #self.SetIcon(icon.getMainIcon())
40 self.toolbar = toolbarUtil.Toolbar(self.panel)
42 toolbarUtil.NormalButton(self.toolbar, self.OnOpenSVG, 'open.png', 'Open SVG')
43 self.toolbar.AddSeparator()
45 toolbarUtil.RadioButton(self.toolbar, group, 'object-3d-on.png', 'object-3d-off.png', '3D view', callback=self.On3DClick)
46 toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick).SetValue(True)
47 self.toolbar.AddSeparator()
48 toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png', 'Close project planner')
50 self.toolbar.Realize()
52 sizer = wx.GridBagSizer(2,2)
53 self.panel.SetSizer(sizer)
54 self.preview = PreviewGLCanvas(self.panel, self)
56 sizer.Add(self.toolbar, (0,0), span=(1,1), flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
57 sizer.Add(self.preview, (1,0), span=(5,1), flag=wx.EXPAND)
59 sizer.AddGrowableCol(0)
60 sizer.AddGrowableRow(1)
62 self.SetSize((600,400))
72 self.preview.pitch = 60
73 self.preview.zoom = 300
74 self.preview.view3D = True
75 self.preview.Refresh()
78 self.preview.view3D = False
79 self.preview.zoom = self.machineSize.x / 2 + 10
80 self.preview.offsetX = 0
81 self.preview.offsetY = 0
82 self.preview.Refresh()
84 def OnOpenSVG(self, e):
85 dlg=wx.FileDialog(self, "Open SVG file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
86 dlg.SetWildcard("SVG files (*.svg)|*.svg;*.SVG")
87 if dlg.ShowModal() == wx.ID_OK:
88 self.filename = dlg.GetPath()
89 self.svg = svg.SVG(self.filename)
90 self.svg.center(complex(profile.getPreferenceFloat('machine_width')/2, profile.getPreferenceFloat('machine_depth')/2))
91 self.preview.Refresh()
94 class PreviewGLCanvas(glcanvas.GLCanvas):
95 def __init__(self, parent, realParent):
96 attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24, glcanvas.WX_GL_STENCIL_SIZE, 8)
97 glcanvas.GLCanvas.__init__(self, parent, attribList = attribList)
98 self.parent = realParent
99 self.context = glcanvas.GLContext(self)
100 wx.EVT_PAINT(self, self.OnPaint)
101 wx.EVT_SIZE(self, self.OnSize)
102 wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
103 wx.EVT_LEFT_DOWN(self, self.OnMouseLeftDown)
104 wx.EVT_MOTION(self, self.OnMouseMotion)
105 wx.EVT_MOUSEWHEEL(self, self.OnMouseWheel)
108 self.zoom = self.parent.machineSize.x / 2 + 10
112 self.allowDrag = False
114 def OnMouseLeftDown(self,e):
115 self.allowDrag = True
117 def OnMouseMotion(self,e):
118 if self.allowDrag and e.Dragging() and e.LeftIsDown():
120 self.yaw += e.GetX() - self.oldX
121 self.pitch -= e.GetY() - self.oldY
127 self.offsetX += float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2
128 self.offsetY -= float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2
131 self.allowDrag = False
132 if e.Dragging() and e.RightIsDown():
134 self.zoom += e.GetY() - self.oldY
141 def OnMouseWheel(self,e):
143 self.zoom *= 1.0 - float(e.GetWheelRotation() / e.GetWheelDelta()) / 10.0
148 def OnEraseBackground(self,event):
149 #Workaround for windows background redraw flicker.
152 def OnSize(self,event):
155 def OnPaint(self,event):
156 dc = wx.PaintDC(self)
157 if not hasOpenGLlibs:
159 dc.DrawText("No PyOpenGL installation found.\nNo preview window available.", 10, 10)
161 self.SetCurrent(self.context)
162 opengl.InitGL(self, self.view3D, self.zoom)
164 glTranslate(0,0,-self.zoom)
165 glRotate(-self.pitch, 1,0,0)
166 glRotate(self.yaw, 0,0,1)
167 if False: #self.parent.triangleMesh != None:
168 glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2)
170 glScale(1.0/self.zoom, 1.0/self.zoom, 1.0)
171 glTranslate(self.offsetX, self.offsetY, 0.0)
172 glTranslate(-self.parent.machineSize.x/2, -self.parent.machineSize.y/2, 0)
178 machineSize = self.parent.machineSize
179 opengl.DrawMachine(machineSize)
181 if self.parent.svg != None:
182 for path in self.parent.svg.paths:
183 glColor3f(1.0,0.8,0.6)
184 glBegin(GL_LINE_STRIP)
186 glVertex3f(p.real, p.imag, 1)
193 flatSlicerWindow().Show(True)
196 if __name__ == '__main__':