From: Daid Date: Thu, 21 Jun 2012 15:41:10 +0000 (+0200) Subject: Add support to slice as 1 large object with the project planner. Fixed #98 X-Git-Tag: 12.07~36^2~4 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0a151cefcfdedbfa60c1e459f7e0de056626e48c;p=cura.git Add support to slice as 1 large object with the project planner. Fixed #98 --- diff --git a/Cura/gui/expertConfig.py b/Cura/gui/expertConfig.py index 9ab2f1c3..3e409eed 100644 --- a/Cura/gui/expertConfig.py +++ b/Cura/gui/expertConfig.py @@ -68,7 +68,9 @@ class expertConfigWindow(configBase.configWindowBase): configBase.TitleRow(right, "Dwindle") c = configBase.SettingRow(right, "Enable dwindle", 'enable_dwindle', False, 'Dwindle is used to slow down near the end of a printed line, and reducing the amount of filament printed near the end. This to release the preasure on the printer head.') c = configBase.SettingRow(right, "Pent up volume (mm3)", 'dwindle_pent_up_volume', '0.4', 'Amount of plastic inside the nozzle under pressure. This normally comes out as ooze after printing.') + validators.validFloat(c, 0.0001) c = configBase.SettingRow(right, "Slow down volume (mm3)", 'dwindle_slowdown_volume', '5.0', 'Amount of printing volume that is used to slow down to release the pressure.') + validators.validFloat(c, 0.0001) main.Fit() self.Fit() diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index 5ab1250c..c7fecfd8 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -138,6 +138,7 @@ class projectPlanner(wx.Frame): self.list = [] self.selection = None + self.printMode = 0 self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height')) self.headSizeMin = util3d.Vector3(profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'),0) @@ -163,6 +164,10 @@ class projectPlanner(wx.Frame): toolbarUtil.NormalButton(self.toolbar, self.OnCutMesh, 'cut-mesh.png', 'Cut a plate STL into multiple STL files, and add those files to the project.\nNote: Splitting up plates sometimes takes a few minutes.') toolbarUtil.NormalButton(self.toolbar, self.OnSaveCombinedSTL, 'save-combination.png', 'Save all the combined STL files into a single STL file as a plate.') self.toolbar.AddSeparator() + group = [] + self.printOneAtATime = toolbarUtil.RadioButton(self.toolbar, group, 'view-normal-on.png', 'view-normal-off.png', 'Print one object at a time', callback=self.OnPrintTypeChange) + self.printAllAtOnce = toolbarUtil.RadioButton(self.toolbar, group, 'all-at-once-on.png', 'all-at-once-off.png', 'Print all the objects at once', callback=self.OnPrintTypeChange) + self.toolbar.AddSeparator() toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png', 'Close project planner') self.toolbar.Realize() @@ -273,18 +278,27 @@ class projectPlanner(wx.Frame): self.preview.Refresh() dlg.Destroy() + def OnPrintTypeChange(self): + self.printMode = 0 + if self.printAllAtOnce.GetValue(): + self.printMode = 1 + self.preview.Refresh() + def OnSaveCombinedSTL(self, e): dlg=wx.FileDialog(self, "Save as STL", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE) dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL") if dlg.ShowModal() == wx.ID_OK: - output = mesh.mesh() - for item in self.list: - offset = util3d.Vector3(item.centerX, item.centerY, 0) - for f in item.faces: - output.addFace(f.v[0] * item.scale + offset, f.v[1] * item.scale + offset, f.v[2] * item.scale + offset) - stl.saveAsSTL(output, dlg.GetPath()) + self._saveCombinedSTL(dlg.GetPath()) dlg.Destroy() + def _saveCombinedSTL(filename): + output = mesh.mesh() + for item in self.list: + offset = util3d.Vector3(item.centerX, item.centerY, 0) + for f in item.faces: + output.addFace(f.v[0] * item.scale + offset, f.v[1] * item.scale + offset, f.v[2] * item.scale + offset) + stl.saveAsSTL(output, filename) + def OnSaveProject(self, e): dlg=wx.FileDialog(self, "Save project file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE) dlg.SetWildcard("Project files (*.curaproject)|*.curaproject") @@ -485,6 +499,10 @@ class projectPlanner(wx.Frame): if profile.getProfileSetting('support') != 'None': extraSizeMin = extraSizeMin + util3d.Vector3(3.0, 0, 0) extraSizeMax = extraSizeMax + util3d.Vector3(3.0, 0, 0) + + if self.printMode == 1: + extraSizeMin = util3d.Vector3(6.0, 6.0, 0) + extraSizeMax = util3d.Vector3(6.0, 6.0, 0) if extraSizeMin.x > extraSizeMax.x: posX = self.machineSize.x @@ -529,60 +547,81 @@ class projectPlanner(wx.Frame): return (maxX - minX) + (maxY - minY) def OnSlice(self, e): + dlg=wx.FileDialog(self, "Save project gcode file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE) + dlg.SetWildcard("GCode file (*.gcode)|*.gcode") + if dlg.ShowModal() != wx.ID_OK: + dlg.Destroy() + return + resultFilename = dlg.GetPath() + dlg.Destroy() + put = profile.setTempOverride oldProfile = profile.getGlobalProfileString() - - put('model_multiply_x', '1') - put('model_multiply_y', '1') - put('enable_raft', 'False') + put('add_start_end_gcode', 'False') put('gcode_extension', 'project_tmp') - - clearZ = 0 - actionList = [] - for item in self.list: - if item.profile != None and os.path.isfile(item.profile): - profile.loadGlobalProfile(item.profile) - put('machine_center_x', item.centerX - self.extruderOffset[item.extruder].x) - put('machine_center_y', item.centerY - self.extruderOffset[item.extruder].y) - put('model_scale', item.scale) - put('flip_x', item.flipX) - put('flip_y', item.flipY) - put('flip_z', item.flipZ) - put('model_rotate_base', item.rotate) - put('swap_xz', item.swapXZ) - put('swap_yz', item.swapYZ) + if self.printMode == 0: + put('enable_raft', 'False') + + clearZ = 0 + actionList = [] + for item in self.list: + if item.profile != None and os.path.isfile(item.profile): + profile.loadGlobalProfile(item.profile) + put('machine_center_x', item.centerX - self.extruderOffset[item.extruder].x) + put('machine_center_y', item.centerY - self.extruderOffset[item.extruder].y) + put('model_scale', item.scale) + put('flip_x', item.flipX) + put('flip_y', item.flipY) + put('flip_z', item.flipZ) + put('model_rotate_base', item.rotate) + put('swap_xz', item.swapXZ) + put('swap_yz', item.swapYZ) + + action = Action() + action.sliceCmd = sliceRun.getSliceCommand(item.filename) + action.centerX = item.centerX + action.centerY = item.centerY + action.extruder = item.extruder + action.filename = item.filename + clearZ = max(clearZ, item.getMaximum().z * item.scale + 5.0) + action.clearZ = clearZ + action.leaveResultForNextSlice = False + action.usePreviousSlice = False + actionList.append(action) + + if self.list.index(item) > 0 and item.isSameExceptForPosition(self.list[self.list.index(item)-1]): + actionList[-2].leaveResultForNextSlice = True + actionList[-1].usePreviousSlice = True + + if item.profile != None: + profile.loadGlobalProfileFromString(oldProfile) + + else: + self._saveCombinedSTL(resultFilename + "_temp_.stl") + put('model_scale', 1.0) + put('flip_x', False) + put('flip_y', False) + put('flip_z', False) + put('model_rotate_base', 0) + put('swap_xz', False) + put('swap_yz', False) + actionList = [] action = Action() - action.sliceCmd = sliceRun.getSliceCommand(item.filename) - action.centerX = item.centerX - action.centerY = item.centerY - action.extruder = item.extruder - action.filename = item.filename - clearZ = max(clearZ, item.getMaximum().z * item.scale + 5.0) - action.clearZ = clearZ + action.sliceCmd = sliceRun.getSliceCommand(resultFilename + "_temp_.stl") + action.centerX = profile.getProfileSettingFloat('machine_center_x') + action.centerY = profile.getProfileSettingFloat('machine_center_y') + action.extruder = 0 + action.filename = resultFilename + "_temp_.stl" + action.clearZ = 0 action.leaveResultForNextSlice = False action.usePreviousSlice = False actionList.append(action) - - if self.list.index(item) > 0 and item.isSameExceptForPosition(self.list[self.list.index(item)-1]): - actionList[-2].leaveResultForNextSlice = True - actionList[-1].usePreviousSlice = True - - if item.profile != None: - profile.loadGlobalProfileFromString(oldProfile) - + #Restore the old profile. profile.resetTempOverride() - dlg=wx.FileDialog(self, "Save project gcode file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE) - dlg.SetWildcard("GCode file (*.gcode)|*.gcode") - if dlg.ShowModal() != wx.ID_OK: - dlg.Destroy() - return - resultFilename = dlg.GetPath() - dlg.Destroy() - pspw = ProjectSliceProgressWindow(actionList, resultFilename) pspw.extruderOffset = self.extruderOffset pspw.Centre() @@ -716,6 +755,13 @@ class PreviewGLCanvas(glcanvas.GLCanvas): skirtSize = profile.getProfileSettingFloat('skirt_line_count') * profile.calculateEdgeWidth() + profile.getProfileSettingFloat('skirt_gap') extraSizeMin = extraSizeMin + util3d.Vector3(skirtSize, skirtSize, 0) extraSizeMax = extraSizeMax + util3d.Vector3(skirtSize, skirtSize, 0) + if profile.getProfileSetting('support') != 'None': + extraSizeMin = extraSizeMin + util3d.Vector3(3.0, 0, 0) + extraSizeMax = extraSizeMax + util3d.Vector3(3.0, 0, 0) + + if self.parent.printMode == 1: + extraSizeMin = util3d.Vector3(6.0, 6.0, 0) + extraSizeMax = util3d.Vector3(6.0, 6.0, 0) for item in self.parent.list: item.validPlacement = True