chiark / gitweb /
Fixed the imports.
[cura.git] / Cura / gui / flatSlicerWindow.py
1 from __future__ import absolute_import
2
3 import wx
4 import os
5
6 from wx import glcanvas
7
8 try:
9         import OpenGL
10         OpenGL.ERROR_CHECKING = False
11         from OpenGL.GLU import *
12         from OpenGL.GL import *
13         hasOpenGLlibs = True
14 except:
15         print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
16         hasOpenGLlibs = False
17
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
24
25 class flatSlicerWindow(wx.Frame):
26         "Cura 2D SVG slicer"
27         def __init__(self):
28                 super(flatSlicerWindow, self).__init__(None, title='Cura - ' + version.getVersion())
29
30                 self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height'))
31                 self.filename = None
32                 self.svg = None
33
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())
39
40                 self.toolbar = toolbarUtil.Toolbar(self.panel)
41
42                 toolbarUtil.NormalButton(self.toolbar, self.OnOpenSVG, 'open.png', 'Open SVG')
43                 self.toolbar.AddSeparator()
44                 group = []
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')
49                 
50                 self.toolbar.Realize()
51                 
52                 sizer = wx.GridBagSizer(2,2)
53                 self.panel.SetSizer(sizer)
54                 self.preview = PreviewGLCanvas(self.panel, self)
55
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)
58
59                 sizer.AddGrowableCol(0)
60                 sizer.AddGrowableRow(1)
61
62                 self.SetSize((600,400))
63
64         def OnClose(self, e):
65                 self.Destroy()
66
67         def OnQuit(self, e):
68                 self.Close()
69
70         def On3DClick(self):
71                 self.preview.yaw = 30
72                 self.preview.pitch = 60
73                 self.preview.zoom = 300
74                 self.preview.view3D = True
75                 self.preview.Refresh()
76
77         def OnTopClick(self):
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()
83
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()
92                 dlg.Destroy()
93
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)
106                 self.yaw = 30
107                 self.pitch = 60
108                 self.zoom = self.parent.machineSize.x / 2 + 10
109                 self.offsetX = 0
110                 self.offsetY = 0
111                 self.view3D = False
112                 self.allowDrag = False
113         
114         def OnMouseLeftDown(self,e):
115                 self.allowDrag = True
116         
117         def OnMouseMotion(self,e):
118                 if self.allowDrag and e.Dragging() and e.LeftIsDown():
119                         if self.view3D:
120                                 self.yaw += e.GetX() - self.oldX
121                                 self.pitch -= e.GetY() - self.oldY
122                                 if self.pitch > 170:
123                                         self.pitch = 170
124                                 if self.pitch < 10:
125                                         self.pitch = 10
126                         else:
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
129                         self.Refresh()
130                 else:
131                         self.allowDrag = False
132                 if e.Dragging() and e.RightIsDown():
133                         if self.view3D:
134                                 self.zoom += e.GetY() - self.oldY
135                                 if self.zoom < 1:
136                                         self.zoom = 1
137                         self.Refresh()
138                 self.oldX = e.GetX()
139                 self.oldY = e.GetY()
140         
141         def OnMouseWheel(self,e):
142                 if self.view3D:
143                         self.zoom *= 1.0 - float(e.GetWheelRotation() / e.GetWheelDelta()) / 10.0
144                         if self.zoom < 1.0:
145                                 self.zoom = 1.0
146                         self.Refresh()
147         
148         def OnEraseBackground(self,event):
149                 #Workaround for windows background redraw flicker.
150                 pass
151         
152         def OnSize(self,event):
153                 self.Refresh()
154
155         def OnPaint(self,event):
156                 dc = wx.PaintDC(self)
157                 if not hasOpenGLlibs:
158                         dc.Clear()
159                         dc.DrawText("No PyOpenGL installation found.\nNo preview window available.", 10, 10)
160                         return
161                 self.SetCurrent(self.context)
162                 opengl.InitGL(self, self.view3D, self.zoom)
163                 if self.view3D:
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)
169                 else:
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)
173
174                 self.OnDraw()
175                 self.SwapBuffers()
176
177         def OnDraw(self):
178                 machineSize = self.parent.machineSize
179                 opengl.DrawMachine(machineSize)
180                 
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)
185                                 for p in path:
186                                         glVertex3f(p.real, p.imag, 1)
187                                 glEnd()
188                 
189                 glFlush()
190
191 def main():
192         app = wx.App(False)
193         flatSlicerWindow().Show(True)
194         app.MainLoop()
195
196 if __name__ == '__main__':
197         main()
198