X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Cura%2Fgui%2FsceneView.py;h=5974fd8b674ec483fd4e22d382d8f52fe01d7fd3;hb=103989f26ff3dfa1b4b3308bd4bd02d0627351f7;hp=6b235257b9b9a812de7cf27591c25c5ee9550b34;hpb=6c49c57b430d0f3c8773aa916eae4ab601452615;p=cura.git diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index 6b235257..5974fd8b 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -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)