chiark / gitweb /
Added simple mode dialog
authordaid <daid303@gmail.com>
Thu, 29 Mar 2012 12:45:14 +0000 (14:45 +0200)
committerdaid <daid303@gmail.com>
Thu, 29 Mar 2012 12:45:14 +0000 (14:45 +0200)
Cura/gui/mainWindow.py
Cura/gui/preview3d.py
Cura/gui/simpleMode.py [new file with mode: 0644]
Cura/util/profile.py

index 20eb44d06fa01a9711a1dc0e21ded6155b6fe198..9839d409c096699e46fbdbc6ae12d6a93f0ec7f0 100644 (file)
@@ -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"))
 
index 4aa6792c0eb1e851fa347cbbec0c086b0bc77bff..e553198a0ee042387e3a613113881c27b59d8463 100644 (file)
@@ -37,7 +37,7 @@ class previewPanel(wx.Panel):
                self.loadingProgressAmount = 0\r
                self.loadThread = None\r
                self.machineSize = util3d.Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height')))\r
-               self.machineCenter = util3d.Vector3(0, 0, 0)\r
+               self.machineCenter = util3d.Vector3(float(profile.getProfileSetting('machine_center_x')), float(profile.getProfileSetting('machine_center_y')), 0)\r
                \r
                self.toolbar = wx.ToolBar( self, -1 )\r
                self.toolbar.SetToolBitmapSize( ( 21, 21 ) )\r
diff --git a/Cura/gui/simpleMode.py b/Cura/gui/simpleMode.py
new file mode 100644 (file)
index 0000000..003a79d
--- /dev/null
@@ -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()
index d52396209805acbae494ec42400e8f75b42d8eab..daa825412f146446cfb190b27e5ccdeac7c02e83 100644 (file)
@@ -61,6 +61,7 @@ profileDefaultSettings = {
 }\r
 preferencesDefaultSettings = {\r
        'wizardDone': 'False',\r
+       'startMode': 'Simple',\r
        'lastFile': 'None',\r
        'machine_width': '205',\r
        'machine_depth': '205',\r