chiark / gitweb /
Added comments
[cura.git] / Cura / gui / sceneView.py
index 6b235257b9b9a812de7cf27591c25c5ee9550b34..5974fd8b674ec483fd4e22d382d8f52fe01d7fd3 100644 (file)
@@ -8,7 +8,7 @@ import os
 import traceback
 import threading
 import math
-import glob
+import platform
 
 import OpenGL
 OpenGL.ERROR_CHECKING = False
@@ -28,6 +28,7 @@ from Cura.gui.util import previewTools
 from Cura.gui.util import opengl
 from Cura.gui.util import openglGui
 from Cura.gui.tools import youmagineGui
+from Cura.gui.tools import imageToMesh
 
 class SceneView(openglGui.glGuiPanel):
        def __init__(self, parent):
@@ -151,7 +152,7 @@ class SceneView(openglGui.glGuiPanel):
                gcodeFilename = None
                if len(filenames) == 1:
                        filename = filenames[0]
-                       ext = filename[filename.rfind('.'):].lower()
+                       ext = os.path.splitext(filename)[1].lower()
                        if ext == '.g' or ext == '.gcode':
                                gcodeFilename = filename
                                mainWindow.addToModelMRU(filename)
@@ -170,11 +171,11 @@ class SceneView(openglGui.glGuiPanel):
                                        # directory: queue all included files and directories
                                        filenames.extend(os.path.join(filename, f) for f in os.listdir(filename))
                                else:
-                                       ext = filename[filename.rfind('.'):].lower()
+                                       ext = os.path.splitext(filename)[1].lower()
                                        if ext == '.ini':
                                                profile.loadProfile(filename)
                                                mainWindow.addToProfileMRU(filename)
-                                       elif ext in meshLoader.loadSupportedExtensions():
+                                       elif ext in meshLoader.loadSupportedExtensions() or ext in imageToMesh.supportedExtensions():
                                                scene_filenames.append(filename)
                                                mainWindow.addToModelMRU(filename)
                                        else:
@@ -196,7 +197,7 @@ class SceneView(openglGui.glGuiPanel):
        def showLoadModel(self, button = 1):
                if button == 1:
                        dlg=wx.FileDialog(self, _("Open 3D model"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)
-                       dlg.SetWildcard(meshLoader.loadWildcardFilter() + "|GCode file (*.gcode)|*.g;*.gcode;*.G;*.GCODE")
+                       dlg.SetWildcard(meshLoader.loadWildcardFilter() + imageToMesh.wildcardList() + "|GCode file (*.gcode)|*.g;*.gcode;*.G;*.GCODE")
                        if dlg.ShowModal() != wx.ID_OK:
                                dlg.Destroy()
                                return
@@ -254,8 +255,11 @@ class SceneView(openglGui.glGuiPanel):
                        self._slicer.submitSliceInfoOnline()
 
        def showSaveGCode(self):
+               if len(self._scene._objectList) < 1:
+                       return
                dlg=wx.FileDialog(self, _("Save toolpath"), os.path.dirname(profile.getPreference('lastFile')), style=wx.FD_SAVE)
-               dlg.SetFilename(self._scene._objectList[0].getName()+'.gcode')
+               filename = self._scene._objectList[0].getName() + '.gcode'
+               dlg.SetFilename(filename)
                dlg.SetWildcard('Toolpath (*.gcode)|*.gcode;*.g')
                if dlg.ShowModal() != wx.ID_OK:
                        dlg.Destroy()
@@ -418,7 +422,7 @@ class SceneView(openglGui.glGuiPanel):
                if self._focusObj is None:
                        return
                obj = self._focusObj
-               dlg = wx.NumberEntryDialog(self, "How many copies do you want?", "Copies", "Multiply", 1, 1, 100)
+               dlg = wx.NumberEntryDialog(self, _("How many copies do you want?"), _("Number of copies"), _("Multiply"), 1, 1, 100)
                if dlg.ShowModal() != wx.ID_OK:
                        dlg.Destroy()
                        return
@@ -456,6 +460,9 @@ class SceneView(openglGui.glGuiPanel):
                        return
                self._focusObj.setPosition(numpy.array([0.0, 0.0]))
                self._scene.pushFree()
+               newViewPos = numpy.array([self._focusObj.getPosition()[0], self._focusObj.getPosition()[1], self._focusObj.getSize()[2] / 2])
+               self._animView = openglGui.animation(self, self._viewTarget.copy(), newViewPos, 0.5)
+               self.sceneUpdated()
 
        def _splitCallback(self, progress):
                print progress
@@ -499,11 +506,16 @@ class SceneView(openglGui.glGuiPanel):
                        self._gcodeVBOs = []
                if ready:
                        self.printButton.setProgressBar(None)
-                       cost = self._slicer.getFilamentCost()
-                       if cost is not None:
-                               self.printButton.setBottomText('%s\n%s\n%s' % (self._slicer.getPrintTime(), self._slicer.getFilamentAmount(), cost))
-                       else:
-                               self.printButton.setBottomText('%s\n%s' % (self._slicer.getPrintTime(), self._slicer.getFilamentAmount()))
+                       text = '%s' % (self._slicer.getPrintTime())
+                       for e in xrange(0, int(profile.getMachineSetting('extruder_amount'))):
+                               amount = self._slicer.getFilamentAmount(e)
+                               if amount is None:
+                                       continue
+                               text += '\n%s' % (amount)
+                               cost = self._slicer.getFilamentCost(e)
+                               if cost is not None:
+                                       text += '\n%s' % (cost)
+                       self.printButton.setBottomText(text)
                        self._gcode = gcodeInterpreter.gcode()
                        self._gcodeFilename = self._slicer.getGCodeFilename()
                else:
@@ -515,7 +527,7 @@ class SceneView(openglGui.glGuiPanel):
                self._gcode.load(self._gcodeFilename)
 
        def _gcodeLoadCallback(self, progress):
-               if self._gcode is None:
+               if not self or self._gcode is None:
                        return True
                if len(self._gcode.layerList) % 15 == 0:
                        time.sleep(0.1)
@@ -529,7 +541,12 @@ class SceneView(openglGui.glGuiPanel):
        def loadScene(self, fileList):
                for filename in fileList:
                        try:
-                               objList = meshLoader.loadMeshes(filename)
+                               ext = os.path.splitext(filename)[1].lower()
+                               if ext in imageToMesh.supportedExtensions():
+                                       imageToMesh.convertImageDialog(self, filename).Show()
+                                       objList = []
+                               else:
+                                       objList = meshLoader.loadMeshes(filename)
                        except:
                                traceback.print_exc()
                        else:
@@ -564,7 +581,7 @@ class SceneView(openglGui.glGuiPanel):
                        self.updateProfileToControls()
                        self.updateToolButtons()
                if zoom and obj is not None:
-                       newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getMaximum()[2] / 2])
+                       newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getSize()[2] / 2])
                        self._animView = openglGui.animation(self, self._viewTarget.copy(), newViewPos, 0.5)
                        newZoom = obj.getBoundaryCircle() * 6
                        if newZoom > numpy.max(self._machineSize) * 3:
@@ -597,7 +614,7 @@ class SceneView(openglGui.glGuiPanel):
                        self.scaleZmmctrl.setValue(round(size[2], 2))
 
        def OnKeyChar(self, keyCode):
-               if keyCode == wx.WXK_DELETE or keyCode == wx.WXK_NUMPAD_DELETE:
+               if keyCode == wx.WXK_DELETE or keyCode == wx.WXK_NUMPAD_DELETE or (keyCode == wx.WXK_BACK and platform.system() == "Darwin"):
                        if self._selectedObj is not None:
                                self._deleteObject(self._selectedObj)
                                self.QueueRefresh()
@@ -896,7 +913,7 @@ void main(void)
        gl_FragColor = vec4(gl_Color.xyz * light_amount, 1.0-intensity);
 }
                                """)
-                       if self._objectShader == None or not self._objectShader.isValid():
+                       if self._objectShader is None or not self._objectShader.isValid():
                                self._objectShader = opengl.GLFakeShader()
                                self._objectOverhangShader = opengl.GLFakeShader()
                                self._objectLoadShader = None
@@ -1265,6 +1282,7 @@ void main(void)
                        glVertex3f(-size[0] / 2, -size[1] / 2+10, 0)
                        glEnd()
 
+               #Cornerpoints for big blue square
                v0 = [ size[0] / 2, size[1] / 2, size[2]]
                v1 = [ size[0] / 2,-size[1] / 2, size[2]]
                v2 = [-size[0] / 2, size[1] / 2, size[2]]
@@ -1286,6 +1304,7 @@ void main(void)
                glDrawArrays(GL_QUADS, 12, 8)
                glDisableClientState(GL_VERTEX_ARRAY)
 
+               #Draw checkerboard
                sx = self._machineSize[0]
                sy = self._machineSize[1]
                for x in xrange(-int(sx/20)-1, int(sx / 20) + 1):
@@ -1298,6 +1317,7 @@ void main(void)
                                y1 = max(min(y1, sy/2), -sy/2)
                                x2 = max(min(x2, sx/2), -sx/2)
                                y2 = max(min(y2, sy/2), -sy/2)
+                               #Black or "white"  checker
                                if (x & 1) == (y & 1):
                                        glColor4ub(5, 171, 231, 127)
                                else:
@@ -1308,7 +1328,7 @@ void main(void)
                                glVertex3f(x2, y2, -0.02)
                                glVertex3f(x1, y2, -0.02)
                                glEnd()
-
+               #if UM2, draw bat-area zone for head. THe head can't stop there, because its bat-area.
                glDisable(GL_BLEND)
                glDisable(GL_CULL_FACE)