From ddfd386b73d4de62d08c861d10c26e0717144352 Mon Sep 17 00:00:00 2001 From: daid Date: Thu, 29 Mar 2012 11:01:33 +0200 Subject: [PATCH 1/2] Make GCode reader store paths per layer --- Cura/gui/preview3d.py | 136 +++++++++++++++++----------------- Cura/util/gcodeInterpreter.py | 26 +++---- 2 files changed, 79 insertions(+), 83 deletions(-) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 311d49a1..4aa6792c 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -259,7 +259,7 @@ class previewPanel(wx.Panel): def updateToolbar(self): self.layerSpin.Show(self.gcode != None) if self.gcode != None: - self.layerSpin.SetRange(1, self.gcode.layerCount) + self.layerSpin.SetRange(1, len(self.gcode.layerList)) self.toolbar.Realize() def OnViewChange(self, e): @@ -442,77 +442,73 @@ class PreviewGLCanvas(glcanvas.GLCanvas): lineWidth = float(profile.getProfileSetting('nozzle_size')) / 2 curLayerNum = 0 - for path in self.parent.gcode.pathList: - if path.layerNr != curLayerNum: - prevLayerZ = curLayerZ - curLayerZ = path.list[1].z - curLayerNum = path.layerNr - layerThickness = curLayerZ - prevLayerZ - - c = 1.0 - if path.layerNr != self.parent.layerSpin.GetValue(): - if path.layerNr < self.parent.layerSpin.GetValue(): - c = 0.9 - (self.parent.layerSpin.GetValue() - path.layerNr) * 0.1 - if c < 0.4: - c = 0.4 - else: - break - if path.type == 'move': - glColor3f(0,0,c) - if path.type == 'extrude': - if path.pathType == 'FILL': - glColor3f(c/2,c/2,0) - elif path.pathType == 'WALL-INNER': - glColor3f(0,c,0) - else: - glColor3f(c,0,0) - if path.type == 'retract': - glColor3f(0,c,c) - if c > 0.4 and path.type == 'extrude': - for i in xrange(0, len(path.list)-1): - v0 = path.list[i] - v1 = path.list[i+1] - - # Calculate line width from ePerDistance (needs layer thickness and filament diameter) - dist = (v0 - v1).vsize() - if dist > 0 and layerThickness > 0: - extrusionMMperDist = (v1.e - v0.e) / (v0 - v1).vsize() - lineWidth = extrusionMMperDist * filamentArea / layerThickness / 2 - - normal = (v0 - v1).cross(util3d.Vector3(0,0,1)) - normal.normalize() - v2 = v0 + normal * lineWidth - v3 = v1 + normal * lineWidth - v0 = v0 - normal * lineWidth - v1 = v1 - normal * lineWidth - - glBegin(GL_QUADS) - if path.pathType == 'FILL': #Remove depth buffer fighting on infill/wall overlap - glVertex3f(v0.x, v0.y, v0.z - 0.02) - glVertex3f(v1.x, v1.y, v1.z - 0.02) - glVertex3f(v3.x, v3.y, v3.z - 0.02) - glVertex3f(v2.x, v2.y, v2.z - 0.02) + for layer in self.parent.gcode.layerList: + for path in layer: + c = 1.0 + if curLayerNum != self.parent.layerSpin.GetValue(): + if curLayerNum < self.parent.layerSpin.GetValue(): + c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1 + if c < 0.4: + c = 0.4 else: - glVertex3f(v0.x, v0.y, v0.z - 0.01) - glVertex3f(v1.x, v1.y, v1.z - 0.01) - glVertex3f(v3.x, v3.y, v3.z - 0.01) - glVertex3f(v2.x, v2.y, v2.z - 0.01) - glEnd() + break + if path.type == 'move': + glColor3f(0,0,c) + if path.type == 'extrude': + if path.pathType == 'FILL': + glColor3f(c/2,c/2,0) + elif path.pathType == 'WALL-INNER': + glColor3f(0,c,0) + else: + glColor3f(c,0,0) + if path.type == 'retract': + glColor3f(0,c,c) + if c > 0.4 and path.type == 'extrude': + for i in xrange(0, len(path.list)-1): + v0 = path.list[i] + v1 = path.list[i+1] + + # Calculate line width from ePerDistance (needs layer thickness and filament diameter) + dist = (v0 - v1).vsize() + if dist > 0 and layerThickness > 0: + extrusionMMperDist = (v1.e - v0.e) / (v0 - v1).vsize() + lineWidth = extrusionMMperDist * filamentArea / layerThickness / 2 + + normal = (v0 - v1).cross(util3d.Vector3(0,0,1)) + normal.normalize() + v2 = v0 + normal * lineWidth + v3 = v1 + normal * lineWidth + v0 = v0 - normal * lineWidth + v1 = v1 - normal * lineWidth + + glBegin(GL_QUADS) + if path.pathType == 'FILL': #Remove depth buffer fighting on infill/wall overlap + glVertex3f(v0.x, v0.y, v0.z - 0.02) + glVertex3f(v1.x, v1.y, v1.z - 0.02) + glVertex3f(v3.x, v3.y, v3.z - 0.02) + glVertex3f(v2.x, v2.y, v2.z - 0.02) + else: + glVertex3f(v0.x, v0.y, v0.z - 0.01) + glVertex3f(v1.x, v1.y, v1.z - 0.01) + glVertex3f(v3.x, v3.y, v3.z - 0.01) + glVertex3f(v2.x, v2.y, v2.z - 0.01) + glEnd() - #for v in path['list']: - # glBegin(GL_TRIANGLE_FAN) - # glVertex3f(v.x, v.y, v.z - 0.001) - # for i in xrange(0, 16+1): - # if path['pathType'] == 'FILL': #Remove depth buffer fighting on infill/wall overlap - # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02) - # else: - # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01) - # glEnd() - else: - glBegin(GL_LINE_STRIP) - for v in path.list: - glVertex3f(v.x, v.y, v.z) - glEnd() + #for v in path['list']: + # glBegin(GL_TRIANGLE_FAN) + # glVertex3f(v.x, v.y, v.z - 0.001) + # for i in xrange(0, 16+1): + # if path['pathType'] == 'FILL': #Remove depth buffer fighting on infill/wall overlap + # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02) + # else: + # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01) + # glEnd() + else: + glBegin(GL_LINE_STRIP) + for v in path.list: + glVertex3f(v.x, v.y, v.z) + glEnd() + curLayerNum += 1 glEndList() if self.viewMode == "GCode" or self.viewMode == "Mixed": glCallList(self.gcodeDisplayList) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 71e26f0c..347eabed 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -9,17 +9,15 @@ import os from util import util3d class gcodePath(): - def __init__(self, newType, pathType, layerNr, startPoint): + def __init__(self, newType, pathType, startPoint): self.type = newType self.pathType = pathType self.list = [startPoint] - self.layerNr = layerNr class gcode(): def __init__(self): self.regMatch = {} - self.layerCount = 0 - self.pathList = [] + self.layerList = [] self.extrusionAmount = 0 self.totalMoveTimeMinute = 0 self.progressCallback = None @@ -34,21 +32,22 @@ class gcode(): totalExtrusion = 0.0 maxExtrusion = 0.0 totalMoveTimeMinute = 0.0 - pathList = [] scale = 1.0 posAbs = True feedRate = 3600 pathType = 'CUSTOM'; - layerNr = 0; #Note layer 0 will be the start code. startCodeDone = False - currentPath = gcodePath('move', pathType, layerNr, pos.copy()) + currentLayer = [] + currentPath = gcodePath('move', pathType, pos.copy()) currentPath.list[0].e = totalExtrusion - pathList.append(currentPath) + currentLayer.append(currentPath) for line in gcodeFile: if filePos != gcodeFile.tell(): filePos = gcodeFile.tell() if self.progressCallback != None: self.progressCallback(float(filePos) / float(fileSize)) + + #Parse Cura_SF comments if line.startswith(';TYPE:'): pathType = line[6:].strip() if pathType != "CUSTOM": @@ -91,8 +90,10 @@ class gcode(): pos.z = z * scale else: pos.z += z * scale + #Check if we have a new layer. if oldPos.z != pos.z and startCodeDone: - layerNr += 1 + self.layerList.append(currentLayer) + currentLayer = [] if f is not None: feedRate = f if x is not None or y is not None or z is not None: @@ -116,8 +117,8 @@ class gcode(): if totalExtrusion > maxExtrusion: maxExtrusion = totalExtrusion if currentPath.type != moveType or currentPath.pathType != pathType: - currentPath = gcodePath(moveType, pathType, layerNr, currentPath.list[-1]) - pathList.append(currentPath) + currentPath = gcodePath(moveType, pathType, currentPath.list[-1]) + currentLayer.append(currentPath) newPos = pos.copy() newPos.e = totalExtrusion currentPath.list.append(newPos) @@ -183,8 +184,7 @@ class gcode(): else: print "Unknown M code:" + str(M) gcodeFile.close() - self.layerCount = layerNr - self.pathList = pathList + self.layerList.append(currentLayer) self.extrusionAmount = maxExtrusion self.totalMoveTimeMinute = totalMoveTimeMinute print "Extruded a total of: %d mm of filament" % (self.extrusionAmount) From ab6430c843a9d4a44c40df7c6ffd22e2fe6430e3 Mon Sep 17 00:00:00 2001 From: daid Date: Thu, 29 Mar 2012 14:45:14 +0200 Subject: [PATCH 2/2] Added simple mode dialog --- Cura/gui/mainWindow.py | 16 ++- Cura/gui/preview3d.py | 2 +- Cura/gui/simpleMode.py | 287 +++++++++++++++++++++++++++++++++++++++++ Cura/util/profile.py | 1 + 4 files changed, 304 insertions(+), 2 deletions(-) create mode 100644 Cura/gui/simpleMode.py diff --git a/Cura/gui/mainWindow.py b/Cura/gui/mainWindow.py index 20eb44d0..9839d409 100644 --- a/Cura/gui/mainWindow.py +++ b/Cura/gui/mainWindow.py @@ -13,6 +13,7 @@ from gui import preferencesDialog from gui import configWizard from gui import machineCom from gui import printWindow +from gui import simpleMode from util import profile def main(): @@ -22,7 +23,10 @@ def main(): wx.MessageBox('The MacOS version of Cura is experimental.\nThere are still UI/usability bugs. Check the issue list at:\nhttps://github.com/daid/Cura/issues\nfor details.\nPlease report any extra issue you find.', 'MacOS Warning', wx.OK | wx.ICON_INFORMATION) configWizard.configWizard() profile.putPreference("wizardDone", "True") - mainWindow() + if profile.getPreference('startMode') == 'Simple': + simpleMode.simpleModeWindow() + else: + mainWindow() app.MainLoop() class mainWindow(configBase.configWindowBase): @@ -49,6 +53,11 @@ class mainWindow(configBase.configWindowBase): self.Bind(wx.EVT_MENU, self.OnQuit, i) menubar.Append(fileMenu, '&File') + simpleMenu = wx.Menu() + i = simpleMenu.Append(-1, 'Switch to simple mode...') + self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) + menubar.Append(simpleMenu, 'Simple') + expertMenu = wx.Menu() i = expertMenu.Append(-1, 'Open expert settings...') self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) @@ -218,6 +227,11 @@ class mainWindow(configBase.configWindowBase): prefDialog.Centre() prefDialog.Show(True) + def OnSimpleSwitch(self, e): + profile.putPreference('startMode', 'Simple') + simpleMode.simpleModeWindow() + self.Close() + def OnDefaultMarlinFirmware(self, e): machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 4aa6792c..e553198a 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -37,7 +37,7 @@ class previewPanel(wx.Panel): self.loadingProgressAmount = 0 self.loadThread = None self.machineSize = util3d.Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height'))) - self.machineCenter = util3d.Vector3(0, 0, 0) + self.machineCenter = util3d.Vector3(float(profile.getProfileSetting('machine_center_x')), float(profile.getProfileSetting('machine_center_y')), 0) self.toolbar = wx.ToolBar( self, -1 ) self.toolbar.SetToolBitmapSize( ( 21, 21 ) ) diff --git a/Cura/gui/simpleMode.py b/Cura/gui/simpleMode.py new file mode 100644 index 00000000..003a79d6 --- /dev/null +++ b/Cura/gui/simpleMode.py @@ -0,0 +1,287 @@ +from __future__ import absolute_import +import __init__ + +import wx, os, platform, types, webbrowser + +from gui import configBase +from gui import preview3d +from gui import sliceProgessPanel +from gui import validators +from gui import preferencesDialog +from gui import configWizard +from gui import machineCom +from gui import printWindow +from util import profile + +class simpleModeWindow(configBase.configWindowBase): + "Main user interface window for simple mode" + def __init__(self): + super(simpleModeWindow, self).__init__(title='Cura - Simple mode') + + wx.EVT_CLOSE(self, self.OnClose) + + menubar = wx.MenuBar() + fileMenu = wx.Menu() + i = fileMenu.Append(-1, 'Load model file...') + self.Bind(wx.EVT_MENU, self.OnLoadModel, i) + fileMenu.AppendSeparator() + i = fileMenu.Append(-1, 'Preferences...') + self.Bind(wx.EVT_MENU, self.OnPreferences, i) + fileMenu.AppendSeparator() + i = fileMenu.Append(wx.ID_EXIT, 'Quit') + self.Bind(wx.EVT_MENU, self.OnQuit, i) + menubar.Append(fileMenu, '&File') + + expertMenu = wx.Menu() + i = expertMenu.Append(-1, 'Switch to Normal mode...') + self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) + expertMenu.AppendSeparator() + i = expertMenu.Append(-1, 'ReRun first run wizard...') + self.Bind(wx.EVT_MENU, self.OnFirstRunWizard, i) + menubar.Append(expertMenu, 'Expert') + + helpMenu = wx.Menu() + i = helpMenu.Append(-1, 'Online documentation...') + self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/wiki'), i) + i = helpMenu.Append(-1, 'Report a problem...') + self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/issues'), i) + menubar.Append(helpMenu, 'Help') + self.SetMenuBar(menubar) + + self.lastPath = "" + self.filename = profile.getPreference('lastFile') + self.progressPanelList = [] + + #Preview window + self.preview3d = preview3d.previewPanel(self) + + configPanel = wx.Panel(self) + self.printTypeNormal = wx.RadioButton(configPanel, -1, 'Normal quality print', style=wx.RB_GROUP) + self.printTypeLow = wx.RadioButton(configPanel, -1, 'Fast low quality print') + self.printTypeHigh = wx.RadioButton(configPanel, -1, 'High quality print') + self.printTypeJoris = wx.RadioButton(configPanel, -1, 'Thin walled cup or vase') + + self.printMaterialPLA = wx.RadioButton(configPanel, -1, 'PLA', style=wx.RB_GROUP) + self.printMaterialABS = wx.RadioButton(configPanel, -1, 'ABS') + self.printMaterialDiameter = wx.TextCtrl(configPanel, -1, profile.getProfileSetting('filament_diameter')) + + self.printSupport = wx.CheckBox(configPanel, -1, 'Print support structure') + + sizer = wx.GridBagSizer() + configPanel.SetSizer(sizer) + + sb = wx.StaticBox(configPanel, label="Select a print type:") + boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) + boxsizer.Add(self.printTypeNormal) + boxsizer.Add(self.printTypeLow) + boxsizer.Add(self.printTypeHigh) + boxsizer.Add(self.printTypeJoris) + sizer.Add(boxsizer, (0,0), flag=wx.EXPAND) + + sb = wx.StaticBox(configPanel, label="Material:") + boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) + boxsizer.Add(self.printMaterialPLA) + boxsizer.Add(self.printMaterialABS) + boxsizer.Add(wx.StaticText(configPanel, -1, 'Diameter:')) + boxsizer.Add(self.printMaterialDiameter) + sizer.Add(boxsizer, (1,0), flag=wx.EXPAND) + + sb = wx.StaticBox(configPanel, label="Other:") + boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) + boxsizer.Add(self.printSupport) + sizer.Add(boxsizer, (2,0), flag=wx.EXPAND) + + # load and slice buttons. + loadButton = wx.Button(self, -1, 'Load Model') + sliceButton = wx.Button(self, -1, 'Slice to GCode') + printButton = wx.Button(self, -1, 'Print GCode') + self.Bind(wx.EVT_BUTTON, self.OnLoadModel, loadButton) + self.Bind(wx.EVT_BUTTON, self.OnSlice, sliceButton) + self.Bind(wx.EVT_BUTTON, self.OnPrint, printButton) + #Also bind double clicking the 3D preview to load an STL file. + self.preview3d.glCanvas.Bind(wx.EVT_LEFT_DCLICK, self.OnLoadModel, self.preview3d.glCanvas) + + #Main sizer, to position the preview window, buttons and tab control + sizer = wx.GridBagSizer() + self.SetSizer(sizer) + sizer.Add(configPanel, (0,0), span=(1,1), flag=wx.EXPAND) + sizer.Add(self.preview3d, (0,1), span=(1,3), flag=wx.EXPAND) + sizer.AddGrowableCol(2) + sizer.AddGrowableRow(0) + sizer.Add(loadButton, (1,1), flag=wx.RIGHT, border=5) + sizer.Add(sliceButton, (1,2), flag=wx.RIGHT, border=5) + sizer.Add(printButton, (1,3), flag=wx.RIGHT, border=5) + self.sizer = sizer + + if self.filename != "None": + self.preview3d.loadModelFile(self.filename) + self.lastPath = os.path.split(self.filename)[0] + + self.updateProfileToControls() + + self.Fit() + self.SetMinSize(self.GetSize()) + self.Centre() + self.Show(True) + + def OnPreferences(self, e): + prefDialog = preferencesDialog.preferencesDialog(self) + prefDialog.Centre() + prefDialog.Show(True) + + def OnDefaultMarlinFirmware(self, e): + machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")) + + def OnCustomFirmware(self, e): + dlg=wx.FileDialog(self, "Open firmware to upload", self.lastPath, style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) + dlg.SetWildcard("HEX file (*.hex)|*.hex;*.HEX") + if dlg.ShowModal() == wx.ID_OK: + filename = dlg.GetPath() + if not(os.path.exists(filename)): + return + #For some reason my Ubuntu 10.10 crashes here. + machineCom.InstallFirmware(filename) + + def OnFirstRunWizard(self, e): + configWizard.configWizard() + self.updateProfileToControls() + + def OnLoadModel(self, e): + dlg=wx.FileDialog(self, "Open file to print", self.lastPath, style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) + dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL") + if dlg.ShowModal() == wx.ID_OK: + self.filename=dlg.GetPath() + profile.putPreference('lastFile', self.filename) + if not(os.path.exists(self.filename)): + return + self.lastPath = os.path.split(self.filename)[0] + self.preview3d.loadModelFile(self.filename) + self.preview3d.setViewMode("Model - Normal") + dlg.Destroy() + + def OnSlice(self, e): + if self.filename == None: + return + put = profile.putProfileSetting + get = profile.getProfileSetting + + put('layer_height', '0.2') + put('wall_thickness', '0.8') + put('solid_layer_thickness', '0.6') + put('fill_density', '20') + put('skirt_line_count', '1') + put('skirt_gap', '6.0') + put('print_speed', '50') + put('print_temperature', '0') + put('support', 'None') + #put('machine_center_x', '100') + #put('machine_center_y', '100') + #put('retraction_min_travel', '5.0') + #put('retraction_speed', '13.5') + #put('retraction_amount', '0.0') + #put('retraction_extra', '0.0') + put('travel_speed', '150') + put('max_z_speed', '1.0') + put('bottom_layer_speed', '25') + put('cool_min_layer_time', '10') + #put('model_scale', '1.0') + #put('flip_x', 'False') + #put('flip_y', 'False') + #put('flip_z', 'False') + #put('model_rotate_base', '0') + #put('model_multiply_x', '1') + #put('model_multiply_y', '1') + put('extra_base_wall_thickness', '0.0') + put('sequence', 'Loops > Perimeter > Infill') + put('force_first_layer_sequence', 'True') + put('infill_type', 'Line') + put('solid_top', 'True') + put('fill_overlap', '15') + put('support_rate', '100') + put('support_distance', '0.5') + put('joris', 'False') + put('cool_min_feedrate', '5') + put('bridge_speed', '100') + put('bridge_material_amount', '100') + put('raft_margin', '5') + put('raft_base_material_amount', '100') + put('raft_interface_material_amount', '100') + + if self.printSupport.GetValue(): + put('support', 'Exterior Only') + + nozzle_size = float(get('nozzle_size')) + if self.printTypeNormal.GetValue(): + put('wall_thickness', nozzle_size * 2.0) + put('layer_height', '0.2') + put('fill_density', '20') + elif self.printTypeLow.GetValue(): + put('wall_thickness', nozzle_size * 1.0) + put('layer_height', '0.3') + put('fill_density', '10') + put('print_speed', '80') + elif self.printTypeHigh.GetValue(): + put('wall_thickness', nozzle_size * 3.0) + put('layer_height', '0.1') + put('fill_density', '30') + put('bottom_layer_speed', '15') + elif self.printTypeJoris.GetValue(): + put('wall_thickness', nozzle_size * 1.5) + put('layer_height', '0.2') + put('fill_density', '0') + put('joris', 'True') + put('extra_base_wall_thickness', '15.0') + put('sequence', 'Infill > Loops > Perimeter') + put('force_first_layer_sequence', 'False') + put('solid_top', 'False') + put('support', 'None') + + put('filament_diameter', self.printMaterialDiameter.GetValue()) + if self.printMaterialPLA.GetValue(): + put('filament_density', '1.00') + put('enable_raft', 'False') + else: + put('filament_density', '0.85') + put('enable_raft', 'True') + + profile.saveGlobalProfile(profile.getDefaultProfilePath()) + + #Create a progress panel and add it to the window. The progress panel will start the Skein operation. + spp = sliceProgessPanel.sliceProgessPanel(self, self, self.filename) + self.sizer.Add(spp, (len(self.progressPanelList)+2,0), span=(1,4), flag=wx.EXPAND) + self.sizer.Layout() + newSize = self.GetSize(); + newSize.IncBy(0, spp.GetSize().GetHeight()) + self.SetSize(newSize) + self.progressPanelList.append(spp) + + def OnPrint(self, e): + printWindow.printWindow() + + def OnNormalSwitch(self, e): + from gui import mainWindow + profile.putPreference('startMode', 'Normal') + mainWindow.mainWindow() + self.Close() + + def removeSliceProgress(self, spp): + self.progressPanelList.remove(spp) + newSize = self.GetSize(); + newSize.IncBy(0, -spp.GetSize().GetHeight()) + self.SetSize(newSize) + self.sizer.Remove(spp) + spp.Destroy() + for spp in self.progressPanelList: + self.sizer.Remove(spp) + i = 2 + for spp in self.progressPanelList: + self.sizer.Add(spp, (i,0), span=(1,4), flag=wx.EXPAND) + i += 1 + self.sizer.Layout() + + def OnQuit(self, e): + self.Close() + + def OnClose(self, e): + profile.saveGlobalProfile(profile.getDefaultProfilePath()) + self.Destroy() diff --git a/Cura/util/profile.py b/Cura/util/profile.py index d5239620..daa82541 100644 --- a/Cura/util/profile.py +++ b/Cura/util/profile.py @@ -61,6 +61,7 @@ profileDefaultSettings = { } preferencesDefaultSettings = { 'wizardDone': 'False', + 'startMode': 'Simple', 'lastFile': 'None', 'machine_width': '205', 'machine_depth': '205',