def __init__(self, parent): super(batchRunWindow, self).__init__(parent, title='Cura - Batch run') self.list = [] self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles, meshLoader.loadSupportedExtensions())) wx.EVT_CLOSE(self, self.OnClose) self.panel = wx.Panel(self, -1) self.SetSizer(wx.BoxSizer(wx.VERTICAL)) self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND) self.sizer = wx.GridBagSizer(2,2) self.panel.SetSizer(self.sizer) self.listbox = wx.ListBox(self.panel, -1, choices=[]) self.addButton = wx.Button(self.panel, -1, "Add") self.remButton = wx.Button(self.panel, -1, "Remove") self.sliceButton = wx.Button(self.panel, -1, "Prepare all") self.addButton.Bind(wx.EVT_BUTTON, self.OnAddModel) self.remButton.Bind(wx.EVT_BUTTON, self.OnRemModel) self.sliceButton.Bind(wx.EVT_BUTTON, self.OnSlice) self.listbox.Bind(wx.EVT_LISTBOX, self.OnListSelect) self.sizer.Add(self.listbox, (0,0), span=(1,3), flag=wx.EXPAND) self.sizer.Add(self.addButton, (1,0), span=(1,1)) self.sizer.Add(self.remButton, (1,1), span=(1,1)) self.sizer.Add(self.sliceButton, (1,2), span=(1,1)) self.sizer.AddGrowableCol(2) self.sizer.AddGrowableRow(0)
def __init__(self): super(mainWindow, self).__init__(None, title='Cura - ' + version.getVersion()) wx.EVT_CLOSE(self, self.OnClose) # allow dropping any file, restrict later self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles)) # TODO: wxWidgets 2.9.4 has a bug when NSView does not register for dragged types when wx drop target is set. It was fixed in 2.9.5 if sys.platform.startswith('darwin'): try: import objc nswindow = objc.objc_object( c_void_p=self.MacGetTopLevelWindowRef()) view = nswindow.contentView() view.registerForDraggedTypes_([u'NSFilenamesPboardType']) except: pass self.normalModeOnlyItems = [] mruFile = os.path.join(profile.getBasePath(), 'mru_filelist.ini') self.config = wx.FileConfig(appName="Cura", localFilename=mruFile, style=wx.CONFIG_USE_LOCAL_FILE) self.ID_MRU_MODEL1, self.ID_MRU_MODEL2, self.ID_MRU_MODEL3, self.ID_MRU_MODEL4, self.ID_MRU_MODEL5, self.ID_MRU_MODEL6, self.ID_MRU_MODEL7, self.ID_MRU_MODEL8, self.ID_MRU_MODEL9, self.ID_MRU_MODEL10 = [ wx.NewId() for line in xrange(10) ] self.modelFileHistory = wx.FileHistory(10, self.ID_MRU_MODEL1) self.config.SetPath("/ModelMRU") self.modelFileHistory.Load(self.config) self.ID_MRU_PROFILE1, self.ID_MRU_PROFILE2, self.ID_MRU_PROFILE3, self.ID_MRU_PROFILE4, self.ID_MRU_PROFILE5, self.ID_MRU_PROFILE6, self.ID_MRU_PROFILE7, self.ID_MRU_PROFILE8, self.ID_MRU_PROFILE9, self.ID_MRU_PROFILE10 = [ wx.NewId() for line in xrange(10) ] self.profileFileHistory = wx.FileHistory(10, self.ID_MRU_PROFILE1) self.config.SetPath("/ProfileMRU") self.profileFileHistory.Load(self.config) self.menubar = wx.MenuBar() self.fileMenu = wx.Menu() i = self.fileMenu.Append(-1, _("Load model file...\tCTRL+L")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showLoadModel(), i) i = self.fileMenu.Append(-1, _("Save model...\tCTRL+S")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveModel(), i) i = self.fileMenu.Append(-1, _("Reload platform\tF5")) self.Bind(wx.EVT_MENU, lambda e: self.scene.reloadScene(e), i) i = self.fileMenu.Append(-1, _("Clear platform")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnDeleteAll(e), i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Print...\tCTRL+P")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnPrintButton(1), i) i = self.fileMenu.Append(-1, _("Save GCode...")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveGCode(), i) i = self.fileMenu.Append(-1, _("Show slice engine log...")) self.Bind(wx.EVT_MENU, lambda e: self.scene._showEngineLog(), i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Open Profile...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfile, i) i = self.fileMenu.Append(-1, _("Save Profile...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveProfile, i) i = self.fileMenu.Append(-1, _("Load Profile from GCode...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfileFromGcode, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Reset Profile to default")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnResetProfile, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Preferences...\tCTRL+,")) self.Bind(wx.EVT_MENU, self.OnPreferences, i) i = self.fileMenu.Append(-1, _("Machine settings...")) self.Bind(wx.EVT_MENU, self.OnMachineSettings, i) self.fileMenu.AppendSeparator() # Model MRU list modelHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), '&' + _("Recent Model Files"), modelHistoryMenu) self.modelFileHistory.UseMenu(modelHistoryMenu) self.modelFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10) # Profle MRU list profileHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), _("Recent Profile Files"), profileHistoryMenu) self.profileFileHistory.UseMenu(profileHistoryMenu) self.profileFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(wx.ID_EXIT, _("Quit")) self.Bind(wx.EVT_MENU, self.OnQuit, i) self.menubar.Append(self.fileMenu, '&' + _("File")) toolsMenu = wx.Menu() #i = toolsMenu.Append(-1, 'Batch run...') #self.Bind(wx.EVT_MENU, self.OnBatchRun, i) #self.normalModeOnlyItems.append(i) if minecraftImport.hasMinecraft(): i = toolsMenu.Append(-1, _("Minecraft map import...")) self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i) if version.isDevVersion(): i = toolsMenu.Append(-1, _("PID Debugger...")) self.Bind(wx.EVT_MENU, self.OnPIDDebugger, i) i = toolsMenu.Append(-1, _("Copy profile to clipboard")) self.Bind(wx.EVT_MENU, self.onCopyProfileClipboard, i) toolsMenu.AppendSeparator() self.allAtOnceItem = toolsMenu.Append(-1, _("Print all at once"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.allAtOnceItem) self.oneAtATime = toolsMenu.Append(-1, _("Print one at a time"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.oneAtATime) if profile.getPreference('oneAtATime') == 'True': self.oneAtATime.Check(True) else: self.allAtOnceItem.Check(True) self.menubar.Append(toolsMenu, _("Tools")) #Machine menu for machine configuration/tooling self.machineMenu = wx.Menu() self.updateMachineMenu() self.menubar.Append(self.machineMenu, _("Machine")) expertMenu = wx.Menu() i = expertMenu.Append(-1, _("Switch to quickprint..."), kind=wx.ITEM_RADIO) self.switchToQuickprintMenuItem = i self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) i = expertMenu.Append(-1, _("Switch to full settings..."), kind=wx.ITEM_RADIO) self.switchToNormalMenuItem = i self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) expertMenu.AppendSeparator() i = expertMenu.Append(-1, _("Open expert settings...\tCTRL+E")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) expertMenu.AppendSeparator() i = expertMenu.Append(-1, _("Run first run wizard...")) self.Bind(wx.EVT_MENU, self.OnFirstRunWizard, i) self.bedLevelWizardMenuItem = expertMenu.Append( -1, _("Run bed leveling wizard...")) self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, self.bedLevelWizardMenuItem) self.headOffsetWizardMenuItem = expertMenu.Append( -1, _("Run head offset wizard...")) self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, self.headOffsetWizardMenuItem) self.menubar.Append(expertMenu, _("Expert")) helpMenu = wx.Menu() i = helpMenu.Append(-1, _("Online documentation...")) self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('http://daid.github.com/Cura'), i) i = helpMenu.Append(-1, _("Report a problem...")) self.Bind( wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/issues'), i) i = helpMenu.Append(-1, _("Check for update...")) self.Bind(wx.EVT_MENU, self.OnCheckForUpdate, i) if profile.getPreference('use_youmagine') == 'True': i = helpMenu.Append(-1, _("Open YouMagine website...")) self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://www.youmagine.com/'), i) i = helpMenu.Append(-1, _("About Cura...")) self.Bind(wx.EVT_MENU, self.OnAbout, i) self.menubar.Append(helpMenu, _("Help")) self.SetMenuBar(self.menubar) self.splitter = wx.SplitterWindow(self, style=wx.SP_3D | wx.SP_LIVE_UPDATE) self.leftPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.rightPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.splitter.Bind(wx.EVT_SPLITTER_DCLICK, lambda evt: evt.Veto()) ##Gui components## self.simpleSettingsPanel = simpleMode.simpleModePanel( self.leftPane, lambda: self.scene.sceneUpdated()) self.normalSettingsPanel = normalSettingsPanel( self.leftPane, lambda: self.scene.sceneUpdated()) self.leftSizer = wx.BoxSizer(wx.VERTICAL) self.leftSizer.Add(self.simpleSettingsPanel, 1) self.leftSizer.Add(self.normalSettingsPanel, 1, wx.EXPAND) self.leftPane.SetSizer(self.leftSizer) #Preview window self.scene = sceneView.SceneView(self.rightPane) #Main sizer, to position the preview window, buttons and tab control sizer = wx.BoxSizer() self.rightPane.SetSizer(sizer) sizer.Add(self.scene, 1, flag=wx.EXPAND) # Main window sizer sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) sizer.Add(self.splitter, 1, wx.EXPAND) sizer.Layout() self.sizer = sizer self.updateProfileToAllControls() self.SetBackgroundColour( self.normalSettingsPanel.GetBackgroundColour()) self.simpleSettingsPanel.Show(False) self.normalSettingsPanel.Show(False) # Set default window size & position self.SetSize((wx.Display().GetClientArea().GetWidth() / 2, wx.Display().GetClientArea().GetHeight() / 2)) self.Centre() #Timer set; used to check if profile is on the clipboard self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.onTimer) self.timer.Start(1000) self.lastTriedClipboard = profile.getProfileString() # Restore the window position, size & state from the preferences file try: if profile.getPreference('window_maximized') == 'True': self.Maximize(True) else: posx = int(profile.getPreference('window_pos_x')) posy = int(profile.getPreference('window_pos_y')) width = int(profile.getPreference('window_width')) height = int(profile.getPreference('window_height')) if posx > 0 or posy > 0: self.SetPosition((posx, posy)) if width > 0 and height > 0: self.SetSize((width, height)) self.normalSashPos = int( profile.getPreference('window_normal_sash')) except: self.normalSashPos = 0 self.Maximize(True) if self.normalSashPos < self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5: self.normalSashPos = self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5 self.splitter.SplitVertically(self.leftPane, self.rightPane, self.normalSashPos) if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.Centre() if wx.Display.GetFromPoint( (self.GetPositionTuple()[0] + self.GetSizeTuple()[1], self.GetPositionTuple()[1] + self.GetSizeTuple()[1])) < 0: self.Centre() if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.SetSize((800, 600)) self.Centre() self.updateSliceMode() self.scene.SetFocus()
def __init__(self): super(mainWindow, self).__init__(None, title='Cura - ' + version.getVersion()) self.extruderCount = int(profile.getPreference('extruder_amount')) wx.EVT_CLOSE(self, self.OnClose) self.SetDropTarget( dropTarget.FileDropTarget(self.OnDropFiles, meshLoader.supportedExtensions())) self.normalModeOnlyItems = [] mruFile = os.path.join(profile.getBasePath(), 'mru_filelist.ini') self.config = wx.FileConfig(appName="Cura", localFilename=mruFile, style=wx.CONFIG_USE_LOCAL_FILE) self.ID_MRU_MODEL1, self.ID_MRU_MODEL2, self.ID_MRU_MODEL3, self.ID_MRU_MODEL4, self.ID_MRU_MODEL5, self.ID_MRU_MODEL6, self.ID_MRU_MODEL7, self.ID_MRU_MODEL8, self.ID_MRU_MODEL9, self.ID_MRU_MODEL10 = [ wx.NewId() for line in xrange(10) ] self.modelFileHistory = wx.FileHistory(10, self.ID_MRU_MODEL1) self.config.SetPath("/ModelMRU") self.modelFileHistory.Load(self.config) self.ID_MRU_PROFILE1, self.ID_MRU_PROFILE2, self.ID_MRU_PROFILE3, self.ID_MRU_PROFILE4, self.ID_MRU_PROFILE5, self.ID_MRU_PROFILE6, self.ID_MRU_PROFILE7, self.ID_MRU_PROFILE8, self.ID_MRU_PROFILE9, self.ID_MRU_PROFILE10 = [ wx.NewId() for line in xrange(10) ] self.profileFileHistory = wx.FileHistory(10, self.ID_MRU_PROFILE1) self.config.SetPath("/ProfileMRU") self.profileFileHistory.Load(self.config) self.menubar = wx.MenuBar() self.fileMenu = wx.Menu() i = self.fileMenu.Append(-1, 'Load model file...\tCTRL+L') self.Bind(wx.EVT_MENU, lambda e: self._showModelLoadDialog(1), i) i = self.fileMenu.Append(-1, 'Prepare print...\tCTRL+R') self.Bind(wx.EVT_MENU, self.OnSlice, i) i = self.fileMenu.Append(-1, 'Print...\tCTRL+P') self.Bind(wx.EVT_MENU, self.OnPrint, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, 'Open Profile...') self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfile, i) i = self.fileMenu.Append(-1, 'Save Profile...') self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveProfile, i) i = self.fileMenu.Append(-1, 'Load Profile from GCode...') self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfileFromGcode, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, 'Reset Profile to default') self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnResetProfile, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, 'Preferences...\tCTRL+,') self.Bind(wx.EVT_MENU, self.OnPreferences, i) self.fileMenu.AppendSeparator() # Model MRU list modelHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), "&Recent Model Files", modelHistoryMenu) self.modelFileHistory.UseMenu(modelHistoryMenu) self.modelFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10) # Profle MRU list profileHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), "&Recent Profile Files", profileHistoryMenu) self.profileFileHistory.UseMenu(profileHistoryMenu) self.profileFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(wx.ID_EXIT, 'Quit') self.Bind(wx.EVT_MENU, self.OnQuit, i) self.menubar.Append(self.fileMenu, '&File') toolsMenu = wx.Menu() i = toolsMenu.Append(-1, 'Switch to quickprint...') self.switchToQuickprintMenuItem = i self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) i = toolsMenu.Append(-1, 'Switch to full settings...') self.switchToNormalMenuItem = i self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) toolsMenu.AppendSeparator() i = toolsMenu.Append(-1, 'Project planner...') self.Bind(wx.EVT_MENU, self.OnProjectPlanner, i) self.normalModeOnlyItems.append(i) i = toolsMenu.Append(-1, 'Batch run...') self.Bind(wx.EVT_MENU, self.OnBatchRun, i) self.normalModeOnlyItems.append(i) # i = toolsMenu.Append(-1, 'Open SVG (2D) slicer...') # self.Bind(wx.EVT_MENU, self.OnSVGSlicerOpen, i) if minecraftImport.hasMinecraft(): i = toolsMenu.Append(-1, 'Minecraft import...') self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i) self.menubar.Append(toolsMenu, 'Tools') expertMenu = wx.Menu() i = expertMenu.Append(-1, 'Open expert settings...') self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) expertMenu.AppendSeparator() if firmwareInstall.getDefaultFirmware() is not None: i = expertMenu.Append(-1, 'Install default Marlin firmware') self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, i) i = expertMenu.Append(-1, 'Install custom firmware') self.Bind(wx.EVT_MENU, self.OnCustomFirmware, i) expertMenu.AppendSeparator() i = expertMenu.Append(-1, 'Run first run wizard...') self.Bind(wx.EVT_MENU, self.OnFirstRunWizard, i) i = expertMenu.Append(-1, 'Run bed leveling wizard...') self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, i) self.menubar.Append(expertMenu, 'Expert') helpMenu = wx.Menu() i = helpMenu.Append(-1, 'Online documentation...') self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('http://daid.github.com/Cura'), i) i = helpMenu.Append(-1, 'Report a problem...') self.Bind( wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/issues'), i) i = helpMenu.Append(-1, 'Check for update...') self.Bind(wx.EVT_MENU, self.OnCheckForUpdate, i) self.menubar.Append(helpMenu, 'Help') self.SetMenuBar(self.menubar) if profile.getPreference('lastFile') != '': self.filelist = profile.getPreference('lastFile').split(';') self.SetTitle('Cura - %s - %s' % (version.getVersion(), self.filelist[-1])) else: self.filelist = [] self.progressPanelList = [] self.splitter = wx.SplitterWindow(self, style=wx.SP_3D | wx.SP_LIVE_UPDATE) self.leftPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.rightPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.splitter.Bind(wx.EVT_SPLITTER_DCLICK, lambda evt: evt.Veto()) ##Gui components## self.simpleSettingsPanel = simpleMode.simpleModePanel(self.leftPane) self.normalSettingsPanel = normalSettingsPanel(self.leftPane) self.leftSizer = wx.BoxSizer(wx.VERTICAL) self.leftSizer.Add(self.simpleSettingsPanel) self.leftSizer.Add(self.normalSettingsPanel, 1, wx.EXPAND) self.leftPane.SetSizer(self.leftSizer) #Preview window self.preview3d = preview3d.previewPanel(self.rightPane) #Also bind double clicking the 3D preview to load an STL file. #self.preview3d.glCanvas.Bind(wx.EVT_LEFT_DCLICK, lambda e: self._showModelLoadDialog(1), self.preview3d.glCanvas) #Main sizer, to position the preview window, buttons and tab control sizer = wx.BoxSizer() self.rightPane.SetSizer(sizer) sizer.Add(self.preview3d, 1, flag=wx.EXPAND) # Main window sizer sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) sizer.Add(self.splitter, 1, wx.EXPAND) sizer.Layout() self.sizer = sizer if len(self.filelist) > 0: self.preview3d.loadModelFiles(self.filelist) # Update the Model MRU for idx in xrange(0, len(self.filelist)): self.addToModelMRU(self.filelist[idx]) self.updateProfileToControls() self.SetBackgroundColour( self.normalSettingsPanel.GetBackgroundColour()) self.simpleSettingsPanel.Show(False) self.normalSettingsPanel.Show(False) # Set default window size & position self.SetSize((wx.Display().GetClientArea().GetWidth() / 2, wx.Display().GetClientArea().GetHeight() / 2)) self.Centre() # Restore the window position, size & state from the preferences file try: if profile.getPreference('window_maximized') == 'True': self.Maximize(True) else: posx = int(profile.getPreference('window_pos_x')) posy = int(profile.getPreference('window_pos_y')) width = int(profile.getPreference('window_width')) height = int(profile.getPreference('window_height')) if posx > 0 or posy > 0: self.SetPosition((posx, posy)) if width > 0 and height > 0: self.SetSize((width, height)) self.normalSashPos = int( profile.getPreference('window_normal_sash')) except: self.normalSashPos = 0 self.Maximize(True) if self.normalSashPos < self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5: self.normalSashPos = self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5 self.splitter.SplitVertically(self.leftPane, self.rightPane, self.normalSashPos) if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.Centre() if wx.Display.GetFromPoint( (self.GetPositionTuple()[0] + self.GetSizeTuple()[1], self.GetPositionTuple()[1] + self.GetSizeTuple()[1])) < 0: self.Centre() if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.SetSize((800, 600)) self.Centre() self.updateSliceMode() self.Show(True)
def __init__(self): super(projectPlanner, self).__init__(None, title='Cura - Project Planner') wx.EVT_CLOSE(self, self.OnClose) self.panel = wx.Panel(self, -1) self.SetSizer(wx.BoxSizer(wx.VERTICAL)) self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND) self.SetDropTarget( dropTarget.FileDropTarget(self.OnDropFiles, meshLoader.supportedExtensions())) self.list = [] self.selection = None self.printMode = 0 self.alwaysAutoPlace = profile.getPreference( 'planner_always_autoplace') == 'True' self.machineSize = numpy.array([ profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height') ]) self.headSizeMin = numpy.array([ profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'), 0 ]) self.headSizeMax = numpy.array([ profile.getPreferenceFloat('extruder_head_size_max_x'), profile.getPreferenceFloat('extruder_head_size_max_y'), 0 ]) self.extruderOffset = [ numpy.array([0, 0, 0]), numpy.array([ profile.getPreferenceFloat('extruder_offset_x1'), profile.getPreferenceFloat('extruder_offset_y1'), 0 ]), numpy.array([ profile.getPreferenceFloat('extruder_offset_x2'), profile.getPreferenceFloat('extruder_offset_y2'), 0 ]), numpy.array([ profile.getPreferenceFloat('extruder_offset_x3'), profile.getPreferenceFloat('extruder_offset_y3'), 0 ]) ] self.toolbar = toolbarUtil.Toolbar(self.panel) toolbarUtil.NormalButton(self.toolbar, self.OnLoadProject, 'open.png', 'Open project') toolbarUtil.NormalButton(self.toolbar, self.OnSaveProject, 'save.png', 'Save project') self.toolbar.AddSeparator() group = [] toolbarUtil.RadioButton(self.toolbar, group, 'object-3d-on.png', 'object-3d-off.png', '3D view', callback=self.On3DClick).SetValue( self.alwaysAutoPlace) toolbarUtil.RadioButton( self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick).SetValue(not self.alwaysAutoPlace) self.toolbar.AddSeparator() toolbarUtil.NormalButton(self.toolbar, self.OnPreferences, 'preferences.png', 'Project planner preferences') self.toolbar.AddSeparator() 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() self.toolbar2 = toolbarUtil.Toolbar(self.panel) toolbarUtil.NormalButton(self.toolbar2, self.OnAddModel, 'object-add.png', 'Add model') toolbarUtil.NormalButton(self.toolbar2, self.OnRemModel, 'object-remove.png', 'Remove model') self.toolbar2.AddSeparator() toolbarUtil.NormalButton(self.toolbar2, self.OnMoveUp, 'move-up.png', 'Move model up in print list') toolbarUtil.NormalButton(self.toolbar2, self.OnMoveDown, 'move-down.png', 'Move model down in print list') toolbarUtil.NormalButton(self.toolbar2, self.OnCopy, 'copy.png', 'Make a copy of the current selected object') toolbarUtil.NormalButton( self.toolbar2, self.OnSetCustomProfile, 'set-profile.png', 'Set a custom profile to be used to prepare a specific object.') self.toolbar2.AddSeparator() if not self.alwaysAutoPlace: toolbarUtil.NormalButton( self.toolbar2, self.OnAutoPlace, 'autoplace.png', 'Automaticly organize the objects on the platform.') toolbarUtil.NormalButton(self.toolbar2, self.OnSlice, 'slice.png', 'Prepare to project into a gcode file.') self.toolbar2.Realize() sizer = wx.GridBagSizer(2, 2) self.panel.SetSizer(sizer) self.glCanvas = PreviewGLCanvas(self.panel, self) self.listbox = wx.ListBox(self.panel, -1, choices=[]) self.addButton = wx.Button(self.panel, -1, "Add") self.remButton = wx.Button(self.panel, -1, "Remove") self.sliceButton = wx.Button(self.panel, -1, "Prepare") if not self.alwaysAutoPlace: self.autoPlaceButton = wx.Button(self.panel, -1, "Auto Place") sizer.Add(self.toolbar, (0, 0), span=(1, 1), flag=wx.EXPAND | wx.LEFT | wx.RIGHT) sizer.Add(self.toolbar2, (0, 1), span=(1, 2), flag=wx.EXPAND | wx.LEFT | wx.RIGHT) sizer.Add(self.glCanvas, (1, 0), span=(5, 1), flag=wx.EXPAND) sizer.Add(self.listbox, (1, 1), span=(1, 2), flag=wx.EXPAND) sizer.Add(self.addButton, (2, 1), span=(1, 1)) sizer.Add(self.remButton, (2, 2), span=(1, 1)) sizer.Add(self.sliceButton, (3, 1), span=(1, 1)) if not self.alwaysAutoPlace: sizer.Add(self.autoPlaceButton, (3, 2), span=(1, 1)) sizer.AddGrowableCol(0) sizer.AddGrowableRow(1) self.addButton.Bind(wx.EVT_BUTTON, self.OnAddModel) self.remButton.Bind(wx.EVT_BUTTON, self.OnRemModel) self.sliceButton.Bind(wx.EVT_BUTTON, self.OnSlice) if not self.alwaysAutoPlace: self.autoPlaceButton.Bind(wx.EVT_BUTTON, self.OnAutoPlace) self.listbox.Bind(wx.EVT_LISTBOX, self.OnListSelect) panel = wx.Panel(self.panel, -1) sizer.Add(panel, (5, 1), span=(1, 2)) sizer = wx.GridBagSizer(2, 2) panel.SetSizer(sizer) self.rotateToolButton = openglGui.glButton(self.glCanvas, 1, 'Rotate', (0, 1), self.OnRotateSelect) self.scaleToolButton = openglGui.glButton(self.glCanvas, 2, 'Scale', (0, 2), self.OnScaleSelect) self.SetSize((800, 600)) self.tool = previewTools.toolInfo(self.glCanvas)
def __init__(self): super(mainWindow, self).__init__(None, title='Cura-BCN3D-' + version.getVersion() + '-beta2') wx.EVT_CLOSE(self, self.OnClose) # allow dropping any file, restrict later self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles)) # TODO: wxWidgets 2.9.4 has a bug when NSView does not register for dragged types when wx drop target is set. It was fixed in 2.9.5 if sys.platform.startswith('darwin'): try: import objc nswindow = objc.objc_object( c_void_p=self.MacGetTopLevelWindowRef()) view = nswindow.contentView() view.registerForDraggedTypes_([u'NSFilenamesPboardType']) except: pass self.normalModeOnlyItems = [] mruFile = os.path.join(profile.getBasePath(), 'mru_filelist.ini') self.config = wx.FileConfig(appName="Cura", localFilename=mruFile, style=wx.CONFIG_USE_LOCAL_FILE) self.ID_MRU_MODEL1, self.ID_MRU_MODEL2, self.ID_MRU_MODEL3, self.ID_MRU_MODEL4, self.ID_MRU_MODEL5, self.ID_MRU_MODEL6, self.ID_MRU_MODEL7, self.ID_MRU_MODEL8, self.ID_MRU_MODEL9, self.ID_MRU_MODEL10 = [ wx.NewId() for line in xrange(10) ] self.modelFileHistory = wx.FileHistory(10, self.ID_MRU_MODEL1) self.config.SetPath("/ModelMRU") self.modelFileHistory.Load(self.config) self.ID_MRU_PROFILE1, self.ID_MRU_PROFILE2, self.ID_MRU_PROFILE3, self.ID_MRU_PROFILE4, self.ID_MRU_PROFILE5, self.ID_MRU_PROFILE6, self.ID_MRU_PROFILE7, self.ID_MRU_PROFILE8, self.ID_MRU_PROFILE9, self.ID_MRU_PROFILE10 = [ wx.NewId() for line in xrange(10) ] self.profileFileHistory = wx.FileHistory(10, self.ID_MRU_PROFILE1) self.config.SetPath("/ProfileMRU") self.profileFileHistory.Load(self.config) #Now we create the different menu options, the first one is the options displayed by the 'File' button self.menubar = wx.MenuBar() self.fileMenu = wx.Menu() i = self.fileMenu.Append(-1, _("Load model file...\tCTRL+L")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showLoadModel(), i) i = self.fileMenu.Append(-1, _("Load Draudi file...\tCTRL+D")) self.Bind(wx.EVT_MENU, self.OnLoadDraudiModel, i) i = self.fileMenu.Append(-1, _("Save model...\tCTRL+S")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveModel(), i) i = self.fileMenu.Append(-1, _("Reload platform\tF5")) self.Bind(wx.EVT_MENU, lambda e: self.scene.reloadScene(e), i) i = self.fileMenu.Append(-1, _("Clear platform\tCTRL+Q")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnDeleteAll(e), i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Print...\tCTRL+P")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnPrintButton(1), i) i = self.fileMenu.Append(-1, _("Save GCode...\tCTRL+G")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveGCode(), i) i = self.fileMenu.Append(-1, _("Show slice engine log...")) self.Bind(wx.EVT_MENU, lambda e: self.scene._showEngineLog(), i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Open Profile...\tCTRL+C")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnLoadConfigurations(), i) i = self.fileMenu.Append(-1, _("Save Profile...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveProfile, i) if version.isDevVersion(): i = self.fileMenu.Append(-1, "Save difference from default...") self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveDifferences, i) i = self.fileMenu.Append(-1, _("Load Profile from GCode...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfileFromGcode, i) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(-1, _("Preferences...\tCTRL+,")) self.Bind(wx.EVT_MENU, self.OnPreferences, i) i = self.fileMenu.Append(-1, _("Machine settings...")) self.Bind(wx.EVT_MENU, self.OnMachineSettings, i) self.fileMenu.AppendSeparator() # Model MRU list modelHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), '&' + _("Recent Model Files"), modelHistoryMenu) self.modelFileHistory.UseMenu(modelHistoryMenu) self.modelFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10) # Profle MRU list profileHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), _("Recent Profile Files"), profileHistoryMenu) self.profileFileHistory.UseMenu(profileHistoryMenu) self.profileFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10) self.fileMenu.AppendSeparator() i = self.fileMenu.Append(wx.ID_EXIT, _("Quit")) self.Bind(wx.EVT_MENU, self.OnQuit, i) #Here we set the name of the menubar, which in this case is 'File' self.menubar.Append(self.fileMenu, '&' + _("File")) #The next menu option is 'Tools' toolsMenu = wx.Menu() #At BCN3D we do not recommend printing one at a time and we have set a message to come up #in case a user does choose that option. self.allAtOnceItem = toolsMenu.Append(-1, _("Print all at once"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.allAtOnceItem) self.oneAtATime = toolsMenu.Append(-1, _("Print one at a time"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.oneAtATime) if profile.getPreference('oneAtATime') == 'True': self.oneAtATime.Check(True) else: self.allAtOnceItem.Check(True) #We name this menu option self.menubar.Append(toolsMenu, _("Tools")) #Machine menu for machine configuration/tooling self.machineMenu = wx.Menu() self.updateMachineMenu() self.menubar.Append(self.machineMenu, _("Machine")) #we switch between panels expertMenu = wx.Menu() i = expertMenu.Append(-1, _("Switch to quickprint..."), kind=wx.ITEM_RADIO) self.switchToQuickprintMenuItem = i self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) i = expertMenu.Append(-1, _("Switch to full settings..."), kind=wx.ITEM_RADIO) self.switchToNormalMenuItem = i self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) expertMenu.AppendSeparator() #Open a series of settings that you are not normally able to see i = expertMenu.Append(-1, _("Open expert settings...\tCTRL+E")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) expertMenu.AppendSeparator() self.bedLevelWizardMenuItem = expertMenu.Append( -1, _("Run bed leveling wizard...")) self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, self.bedLevelWizardMenuItem) self.headOffsetWizardMenuItem = expertMenu.Append( -1, _("Run head offset wizard...")) self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, self.headOffsetWizardMenuItem) #give the menu bar a name, in this case 'Expert' self.menubar.Append(expertMenu, _("Expert")) helpMenu = wx.Menu() i = helpMenu.Append(-1, _("Online documentation...")) self.Bind( wx.EVT_MENU, lambda e: webbrowser.open( 'http://www.bcn3dtechnologies.com/es/forum'), i) if sys.platform.startswith('win'): i = helpMenu.Append(-1, _("Report a problem...")) self.Bind( wx.EVT_MENU, lambda e: webbrowser.open( 'https://github.com/BCN3D/BCN3D-Cura-Windows/issues'), i) elif sys.platform.startswith('darwin'): i = helpMenu.Append(-1, _("Report a problem...")) self.Bind( wx.EVT_MENU, lambda e: webbrowser.open( 'https://github.com/BCN3D/BCN3D-Cura-Mac/issues'), i) i = helpMenu.Append(-1, _("Check for update...")) self.Bind(wx.EVT_MENU, self.OnCheckForUpdate, i) i = helpMenu.Append(-1, _("About Cura...")) self.Bind(wx.EVT_MENU, self.OnAbout, i) self.menubar.Append(helpMenu, _("Help")) self.SetMenuBar(self.menubar) self.splitter = wx.SplitterWindow(self, style=wx.SP_3D | wx.SP_LIVE_UPDATE) self.leftPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.rightPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.splitter.Bind(wx.EVT_SPLITTER_DCLICK, lambda evt: evt.Veto()) #Preview window self.scene = sceneView.SceneView(self.rightPane) ##Gui components## #We want two different simple modes, one for BCN3D users and the default cura one for other machines #Currently working on this, will be available soon #machine_type = profile.getMachineSetting('machine_type') #if machine_type == 'BCN3DSigma': # self.simpleSettingsPanel = simpleModeSigma(self.leftPane, self.scene.sceneUpdated) #else: #call to the different panels self.simpleSettingsPanel = simpleMode.simpleModePanel( self.leftPane, self.scene.sceneUpdated) self.normalSettingsPanel = normalSettingsPanel(self.leftPane, self.scene.sceneUpdated) #Simple panel will be fix while you can change the size for advanced panel self.leftSizer = wx.BoxSizer(wx.VERTICAL) self.leftSizer.Add(self.simpleSettingsPanel, 1) self.leftSizer.Add(self.normalSettingsPanel, 1, wx.EXPAND) self.leftPane.SetSizer(self.leftSizer) #Main sizer, to position the preview window, buttons and tab control sizer = wx.BoxSizer() self.rightPane.SetSizer(sizer) sizer.Add(self.scene, 1, flag=wx.EXPAND) # Main window sizer sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) sizer.Add(self.splitter, 1, wx.EXPAND) sizer.Layout() self.sizer = sizer self.updateProfileToAllControls() self.SetBackgroundColour( self.normalSettingsPanel.GetBackgroundColour()) self.simpleSettingsPanel.Show(False) self.normalSettingsPanel.Show(False) # Set default window size & position self.SetSize((wx.Display().GetClientArea().GetWidth() / 2, wx.Display().GetClientArea().GetHeight() / 2)) self.Centre() #Timer set; used to check if profile is on the clipboard self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.onTimer) #self.timer.Start(1000) self.lastTriedClipboard = profile.getProfileString() # Restore the window position, size & state from the preferences file try: if profile.getPreference('window_maximized') == 'True': self.Maximize(True) else: posx = int(profile.getPreference('window_pos_x')) posy = int(profile.getPreference('window_pos_y')) width = int(profile.getPreference('window_width')) height = int(profile.getPreference('window_height')) if posx > 0 or posy > 0: self.SetPosition((posx, posy)) if width > 0 and height > 0: self.SetSize((width, height)) self.normalSashPos = int( profile.getPreference('window_normal_sash')) except: self.normalSashPos = 0 self.Maximize(True) if self.normalSashPos < self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5: self.normalSashPos = self.normalSettingsPanel.printPanel.GetBestSize( )[0] + 5 self.splitter.SplitVertically(self.leftPane, self.rightPane, self.normalSashPos) if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.Centre() if wx.Display.GetFromPoint( (self.GetPositionTuple()[0] + self.GetSizeTuple()[1], self.GetPositionTuple()[1] + self.GetSizeTuple()[1])) < 0: self.Centre() if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.SetSize((800, 600)) self.Centre() self.updateSliceMode() self.scene.SetFocus() self.dialogframe = None if Publisher is not None: Publisher().subscribe(self.onPluginUpdate, "pluginupdate") pluginCount = self.normalSettingsPanel.pluginPanel.GetActivePluginCount( ) if pluginCount == 1: self.scene.notification.message( "Warning: 1 plugin from the previous session is still active.") if pluginCount > 1: self.scene.notification.message( "Warning: %i plugins from the previous session are still active." % pluginCount)
def __init__(self): # 软件标题 super(mainWindow, self).__init__(None, title='Tianjin DaGe Technology Co.Ltd') wx.EVT_CLOSE(self, self.OnClose) # allow dropping any file, restrict later self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles)) # TODO: wxWidgets 2.9.4 has a bug when NSView does not register for dragged types when wx drop target is set. It was fixed in 2.9.5 if sys.platform.startswith('darwin'): try: import objc nswindow = objc.objc_object(c_void_p=self.MacGetTopLevelWindowRef()) view = nswindow.contentView() view.registerForDraggedTypes_([u'NSFilenamesPboardType']) except: pass self.normalModeOnlyItems = [] mruFile = os.path.join(profile.getBasePath(), 'mru_filelist.ini') self.config = wx.FileConfig(appName="Cura", localFilename=mruFile, style=wx.CONFIG_USE_LOCAL_FILE) self.ID_MRU_MODEL1, self.ID_MRU_MODEL2, self.ID_MRU_MODEL3, self.ID_MRU_MODEL4, self.ID_MRU_MODEL5, self.ID_MRU_MODEL6, self.ID_MRU_MODEL7, self.ID_MRU_MODEL8, self.ID_MRU_MODEL9, self.ID_MRU_MODEL10 = [wx.NewId() for line in xrange(10)] self.modelFileHistory = wx.FileHistory(10, self.ID_MRU_MODEL1) self.config.SetPath("/ModelMRU") self.modelFileHistory.Load(self.config) self.ID_MRU_PROFILE1, self.ID_MRU_PROFILE2, self.ID_MRU_PROFILE3, self.ID_MRU_PROFILE4, self.ID_MRU_PROFILE5, self.ID_MRU_PROFILE6, self.ID_MRU_PROFILE7, self.ID_MRU_PROFILE8, self.ID_MRU_PROFILE9, self.ID_MRU_PROFILE10 = [wx.NewId() for line in xrange(10)] self.profileFileHistory = wx.FileHistory(10, self.ID_MRU_PROFILE1) self.config.SetPath("/ProfileMRU") self.profileFileHistory.Load(self.config) self.menubar = wx.MenuBar() # 添加菜单栏 #file的菜单,第一个 self.fileMenu = wx.Menu() i = self.fileMenu.Append(-1, _("Load model file...\tCTRL+L")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showLoadModel(), i) i = self.fileMenu.Append(-1, _("Save model...\tCTRL+S")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveModel(), i) i = self.fileMenu.Append(-1, _("Reload platform\tF5")) self.Bind(wx.EVT_MENU, lambda e: self.scene.reloadScene(e), i) i = self.fileMenu.Append(-1, _("Clear platform\tCTRL+D")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnDeleteAll(e), i) self.fileMenu.AppendSeparator() #分割线 i = self.fileMenu.Append(-1, _("Print...\tCTRL+P")) self.Bind(wx.EVT_MENU, lambda e: self.scene.OnPrintButton(1), i) i = self.fileMenu.Append(-1, _("Save GCode...\tCTRL+G")) self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveGCode(), i) i = self.fileMenu.Append(-1, _("Show slice engine log...")) self.Bind(wx.EVT_MENU, lambda e: self.scene._showEngineLog(), i) self.fileMenu.AppendSeparator() #分割线 i = self.fileMenu.Append(-1, _("Open Profile...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfile, i) i = self.fileMenu.Append(-1, _("Save Profile...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveProfile, i) if version.isDevVersion(): i = self.fileMenu.Append(-1, "Save difference from default...") self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnSaveDifferences, i) i = self.fileMenu.Append(-1, _("Load Profile from GCode...")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnLoadProfileFromGcode, i) # self.fileMenu.AppendSeparator() ## Disabled the reset profile option, as it resets to global defaults, not machine defaults. # i = self.fileMenu.Append(-1, _("Reset Profile to default")) # self.normalModeOnlyItems.append(i) # self.Bind(wx.EVT_MENU, self.OnResetProfile, i) self.fileMenu.AppendSeparator() #分割线 i = self.fileMenu.Append(-1, _("Preferences...\tCTRL+,")) self.Bind(wx.EVT_MENU, self.OnPreferences, i) i = self.fileMenu.Append(-1, _("Machine settings...")) self.Bind(wx.EVT_MENU, self.OnMachineSettings, i) self.fileMenu.AppendSeparator() # Model MRU list 模型历史记录 modelHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), '&' + _("Recent Model Files"), modelHistoryMenu) self.modelFileHistory.UseMenu(modelHistoryMenu) self.modelFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10) # Profile MRU list 轮廓历史记录 profileHistoryMenu = wx.Menu() self.fileMenu.AppendMenu(wx.NewId(), _("Recent Profile Files"), profileHistoryMenu) self.profileFileHistory.UseMenu(profileHistoryMenu) self.profileFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10) self.fileMenu.AppendSeparator() #分割线 i = self.fileMenu.Append(wx.ID_EXIT, _("Quit")) self.Bind(wx.EVT_MENU, self.OnQuit, i) self.menubar.Append(self.fileMenu, '&' + _("File")) # Tools菜单,第二个 toolsMenu = wx.Menu() #i = toolsMenu.Append(-1, 'Batch run...') #self.Bind(wx.EVT_MENU, self.OnBatchRun, i) #self.normalModeOnlyItems.append(i) # 不懂这两个判断语句的作用 if minecraftImport.hasMinecraft(): i = toolsMenu.Append(-1, _("Minecraft map import...")) self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i) if version.isDevVersion(): i = toolsMenu.Append(-1, _("PID Debugger...")) self.Bind(wx.EVT_MENU, self.OnPIDDebugger, i) i = toolsMenu.Append(-1, _("Auto Firmware Update...")) self.Bind(wx.EVT_MENU, self.OnAutoFirmwareUpdate, i) #i = toolsMenu.Append(-1, _("Copy profile to clipboard")) #self.Bind(wx.EVT_MENU, self.onCopyProfileClipboard,i) toolsMenu.AppendSeparator() #分割线 self.allAtOnceItem = toolsMenu.Append(-1, _("Print all at once"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.allAtOnceItem) self.oneAtATime = toolsMenu.Append(-1, _("Print one at a time"), kind=wx.ITEM_RADIO) self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.oneAtATime) if profile.getPreference('oneAtATime') == 'True': self.oneAtATime.Check(True) else: self.allAtOnceItem.Check(True) self.menubar.Append(toolsMenu, _("Tools")) #Machine menu for machine configuration/tooling # 机器配置和工具 机器菜单。第三个 self.machineMenu = wx.Menu() self.updateMachineMenu() self.menubar.Append(self.machineMenu, _("Machine")) # Expert菜单 第四个 expertMenu = wx.Menu() i = expertMenu.Append(-1, _("Switch to quickprint..."), kind=wx.ITEM_RADIO) self.switchToQuickprintMenuItem = i self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) i = expertMenu.Append(-1, _("Switch to full settings..."), kind=wx.ITEM_RADIO) self.switchToNormalMenuItem = i self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) expertMenu.AppendSeparator() i = expertMenu.Append(-1, _("Open expert settings...\tCTRL+E")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) expertMenu.AppendSeparator() self.bedLevelWizardMenuItem = expertMenu.Append(-1, _("Run bed leveling wizard...")) self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, self.bedLevelWizardMenuItem) self.headOffsetWizardMenuItem = expertMenu.Append(-1, _("Run head offset wizard...")) self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, self.headOffsetWizardMenuItem) self.menubar.Append(expertMenu, _("Expert")) # help菜单 第五个 helpMenu = wx.Menu() i = helpMenu.Append(-1, _("Online documentation...")) self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('http://daid.github.com/Cura'), i) i = helpMenu.Append(-1, _("Report a problem...")) self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/issues'), i) i = helpMenu.Append(-1, _("Check for update...")) self.Bind(wx.EVT_MENU, self.OnCheckForUpdate, i) i = helpMenu.Append(-1, _("Open YouMagine website...")) self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://www.youmagine.com/'), i) i = helpMenu.Append(-1, _("About Software...")) self.Bind(wx.EVT_MENU, self.OnAbout, i) self.menubar.Append(helpMenu, _("Help")) self.SetMenuBar(self.menubar) ##################################以上5个菜单,全部结束########################### self.splitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_LIVE_UPDATE) # 将界面划分为两个子界面,一个是3D效果的 self.leftPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.rightPane = wx.Panel(self.splitter, style=wx.BORDER_NONE) self.splitter.Bind(wx.EVT_SPLITTER_DCLICK, lambda evt: evt.Veto()) #Preview window # 第一次调用该模块 # 该函数还有关于OpenGL的知识,需要学习掌握 self.scene = sceneView.SceneView(self.rightPane) # 将右边的界面传到该函数,实现预览功能 ##Gui components## # 第一次调用simpleMode # 将左边的界面传入,实现相关的功能 self.simpleSettingsPanel = simpleMode.simpleModePanel(self.leftPane, self.scene.sceneUpdated) # 调用simpleMode.py的功能 self.normalSettingsPanel = normalSettingsPanel(self.leftPane, self.scene.sceneUpdated) # BoxSizer # Google翻译一个框分级机背后的基本想法是,窗口将最多以相当简单的基本几何形状布置,通常在一排或一列或任几个层次结构。 self.leftSizer = wx.BoxSizer(wx.VERTICAL) self.leftSizer.Add(self.simpleSettingsPanel, 1) self.leftSizer.Add(self.normalSettingsPanel, 1, wx.EXPAND) self.leftPane.SetSizer(self.leftSizer) #Main sizer, to position the preview window, buttons and tab control # 主要的大小选择器,定位预览窗口,按钮,标签管理 sizer = wx.BoxSizer() self.rightPane.SetSizer(sizer) sizer.Add(self.scene, 1, flag=wx.EXPAND) # Main window sizer # 主要窗口的大小选择器 sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) sizer.Add(self.splitter, 1, wx.EXPAND) sizer.Layout() self.sizer = sizer self.updateProfileToAllControls() self.SetBackgroundColour(self.normalSettingsPanel.GetBackgroundColour()) self.simpleSettingsPanel.Show(False) self.normalSettingsPanel.Show(False) # Set default window size & position # 设置默认的窗口大小和坐标 self.SetSize((wx.Display().GetClientArea().GetWidth()/2,wx.Display().GetClientArea().GetHeight()/2)) self.Centre() #Timer set; used to check if profile is on the clipboard # Timer 设置,用来检查轮廓图是否在剪贴板上 self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.onTimer) #self.timer.Start(1000) self.lastTriedClipboard = profile.getProfileString() # Restore the window position, size & state from the preferences file # 从参数选择文件中,还原窗口位置,大小,状态, try: if profile.getPreference('window_maximized') == 'True': # 最大 self.Maximize(True) else: posx = int(profile.getPreference('window_pos_x')) posy = int(profile.getPreference('window_pos_y')) width = int(profile.getPreference('window_width')) height = int(profile.getPreference('window_height')) if posx > 0 or posy > 0: self.SetPosition((posx,posy)) # 设置x,y坐标 if width > 0 and height > 0: self.SetSize((width,height)) # 设置宽,高 self.normalSashPos = int(profile.getPreference('window_normal_sash')) # 设置正常 except: self.normalSashPos = 0 self.Maximize(True) if self.normalSashPos < self.normalSettingsPanel.printPanel.GetBestSize()[0] + 5: self.normalSashPos = self.normalSettingsPanel.printPanel.GetBestSize()[0] + 5 self.splitter.SplitVertically(self.leftPane, self.rightPane, self.normalSashPos) if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.Centre() if wx.Display.GetFromPoint((self.GetPositionTuple()[0] + self.GetSizeTuple()[1], self.GetPositionTuple()[1] + self.GetSizeTuple()[1])) < 0: self.Centre() if wx.Display.GetFromPoint(self.GetPosition()) < 0: self.SetSize((800,600)) self.Centre() self.updateSliceMode() self.scene.SetFocus() self.dialogframe = None if Publisher is not None: Publisher().subscribe(self.onPluginUpdate, "pluginupdate") pluginCount = self.normalSettingsPanel.pluginPanel.GetActivePluginCount() if pluginCount == 1: self.scene.notification.message("Warning: 1 plugin from the previous session is still active.") if pluginCount > 1: self.scene.notification.message("Warning: %i plugins from the previous session are still active." % pluginCount)