1 from __future__ import absolute_import
6 from wx import glcanvas
9 OpenGL.ERROR_CHECKING = False
10 from OpenGL.GLU import *
11 from OpenGL.GL import *
13 from Cura.gui.util import toolbarUtil
14 from Cura.gui.util import opengl
15 from Cura.util import util3d
16 from Cura.util import svg
17 from Cura.util import profile
18 from Cura.util import version
20 class flatSlicerWindow(wx.Frame):
23 super(flatSlicerWindow, self).__init__(None, title='Cura - ' + version.getVersion())
25 self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height'))
29 wx.EVT_CLOSE(self, self.OnClose)
30 self.panel = wx.Panel(self, -1)
31 self.SetSizer(wx.BoxSizer(wx.VERTICAL))
32 self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)
34 self.toolbar = toolbarUtil.Toolbar(self.panel)
36 toolbarUtil.NormalButton(self.toolbar, self.OnOpenSVG, 'open.png', 'Open SVG')
37 self.toolbar.AddSeparator()
39 toolbarUtil.RadioButton(self.toolbar, group, 'object-3d-on.png', 'object-3d-off.png', '3D view', callback=self.On3DClick)
40 toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick).SetValue(True)
41 self.toolbar.AddSeparator()
42 toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png', 'Close project planner')
44 self.toolbar.Realize()
46 sizer = wx.GridBagSizer(2,2)
47 self.panel.SetSizer(sizer)
48 self.preview = PreviewGLCanvas(self.panel, self)
50 sizer.Add(self.toolbar, (0,0), span=(1,1), flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
51 sizer.Add(self.preview, (1,0), span=(5,1), flag=wx.EXPAND)
53 sizer.AddGrowableCol(0)
54 sizer.AddGrowableRow(1)
56 self.SetSize((600,400))
66 self.preview.pitch = 60
67 self.preview.zoom = 300
68 self.preview.view3D = True
69 self.preview.Refresh()
72 self.preview.view3D = False
73 self.preview.zoom = self.machineSize.x / 2 + 10
74 self.preview.offsetX = 0
75 self.preview.offsetY = 0
76 self.preview.Refresh()
78 def OnOpenSVG(self, e):
79 dlg=wx.FileDialog(self, "Open SVG file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
80 dlg.SetWildcard("SVG files (*.svg)|*.svg;*.SVG")
81 if dlg.ShowModal() == wx.ID_OK:
82 self.filename = dlg.GetPath()
83 self.svg = svg.SVG(self.filename)
84 self.svg.center(complex(profile.getPreferenceFloat('machine_width')/2, profile.getPreferenceFloat('machine_depth')/2))
85 self.preview.Refresh()
88 class PreviewGLCanvas(glcanvas.GLCanvas):
89 def __init__(self, parent, realParent):
90 attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24, glcanvas.WX_GL_STENCIL_SIZE, 8)
91 glcanvas.GLCanvas.__init__(self, parent, attribList = attribList)
92 self.parent = realParent
93 self.context = glcanvas.GLContext(self)
94 wx.EVT_PAINT(self, self.OnPaint)
95 wx.EVT_SIZE(self, self.OnSize)
96 wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
97 wx.EVT_LEFT_DOWN(self, self.OnMouseLeftDown)
98 wx.EVT_MOTION(self, self.OnMouseMotion)
99 wx.EVT_MOUSEWHEEL(self, self.OnMouseWheel)
102 self.zoom = self.parent.machineSize.x / 2 + 10
106 self.allowDrag = False
108 def OnMouseLeftDown(self,e):
109 self.allowDrag = True
111 def OnMouseMotion(self,e):
112 if self.allowDrag and e.Dragging() and e.LeftIsDown():
114 self.yaw += e.GetX() - self.oldX
115 self.pitch -= e.GetY() - self.oldY
121 self.offsetX += float(e.GetX() - self.oldX) * self.zoom / self.GetSize().GetHeight() * 2
122 self.offsetY -= float(e.GetY() - self.oldY) * self.zoom / self.GetSize().GetHeight() * 2
125 self.allowDrag = False
126 if e.Dragging() and e.RightIsDown():
128 self.zoom += e.GetY() - self.oldY
135 def OnMouseWheel(self,e):
137 self.zoom *= 1.0 - float(e.GetWheelRotation() / e.GetWheelDelta()) / 10.0
142 def OnEraseBackground(self,event):
143 #Workaround for windows background redraw flicker.
146 def OnSize(self,event):
149 def OnPaint(self,event):
150 dc = wx.PaintDC(self)
151 self.SetCurrent(self.context)
152 opengl.InitGL(self, self.view3D, self.zoom)
154 glTranslate(0,0,-self.zoom)
155 glRotate(-self.pitch, 1,0,0)
156 glRotate(self.yaw, 0,0,1)
157 if False: #self.parent.triangleMesh != None:
158 glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2)
160 glScale(1.0/self.zoom, 1.0/self.zoom, 1.0)
161 glTranslate(self.offsetX, self.offsetY, 0.0)
162 glTranslate(-self.parent.machineSize.x/2, -self.parent.machineSize.y/2, 0)
168 machineSize = self.parent.machineSize
169 opengl.DrawMachine(machineSize)
171 if self.parent.svg != None:
172 for path in self.parent.svg.paths:
173 glColor3f(1.0,0.8,0.6)
174 glBegin(GL_LINE_STRIP)
176 glVertex3f(p.real, p.imag, 1)