-from __future__ import absolute_import
__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
import wx
import os
import webbrowser
+import sys
+
from Cura.gui import configBase
from Cura.gui import expertConfig
from Cura.gui import firmwareInstall
from Cura.gui import simpleMode
from Cura.gui import sceneView
+from Cura.gui import aboutWindow
from Cura.gui.util import dropTarget
#from Cura.gui.tools import batchRun
from Cura.gui.tools import pidDebugger
def __init__(self):
super(mainWindow, self).__init__(None, title='Cura - ' + version.getVersion())
- self.extruderCount = int(profile.getMachineSetting('extruder_amount'))
-
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.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.showPrintWindow(), i)
+ 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._showSliceLog(), i)
+ self.Bind(wx.EVT_MENU, lambda e: self.scene._showEngineLog(), i)
self.fileMenu.AppendSeparator()
i = self.fileMenu.Append(-1, _("Open Profile..."))
# Model MRU list
modelHistoryMenu = wx.Menu()
- self.fileMenu.AppendMenu(wx.NewId(), _("&Recent Model Files"), modelHistoryMenu)
+ 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.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"))
+ 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, 'Batch run...')
#self.Bind(wx.EVT_MENU, self.OnBatchRun, i)
#self.normalModeOnlyItems.append(i)
if minecraftImport.hasMinecraft():
- i = toolsMenu.Append(-1, _("Minecraft import..."))
+ i = toolsMenu.Append(-1, _("Minecraft map import..."))
self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i)
if version.isDevVersion():
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.menubar.Append(self.machineMenu, _("Machine"))
expertMenu = wx.Menu()
- i = expertMenu.Append(-1, _("Open expert settings..."))
+ 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)
- i = expertMenu.Append(-1, _("Run bed leveling wizard..."))
- self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, i)
- if self.extruderCount > 1:
- i = expertMenu.Append(-1, _("Run head offset wizard..."))
- self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, 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"))
self.Centre()
self.updateSliceMode()
+ self.scene.SetFocus()
def onTimer(self, e):
#Check if there is something in the clipboard
profileString = ""
try:
if not wx.TheClipboard.IsOpened():
- wx.TheClipboard.Open()
+ if not wx.TheClipboard.Open():
+ return
do = wx.TextDataObject()
if wx.TheClipboard.GetData(do):
profileString = do.GetText()
for i in self.normalModeOnlyItems:
i.Enable(not isSimple)
- self.switchToQuickprintMenuItem.Enable(not isSimple)
- self.switchToNormalMenuItem.Enable(isSimple)
+ if isSimple:
+ self.switchToQuickprintMenuItem.Check()
+ else:
+ self.switchToNormalMenuItem.Check()
# Set splitter sash position & size
if isSimple:
self.splitter.SetSashPosition(self.normalSashPos, True)
# Enabled sash
self.splitter.SetSashSize(4)
+ self.defaultFirmwareInstallMenuItem.Enable(firmwareInstall.getDefaultFirmware() is not None)
+ if profile.getMachineSetting('machine_type') == 'ultimaker2':
+ self.bedLevelWizardMenuItem.Enable(False)
+ self.headOffsetWizardMenuItem.Enable(False)
+ if int(profile.getMachineSetting('extruder_amount')) < 2:
+ self.headOffsetWizardMenuItem.Enable(False)
self.scene.updateProfileToControls()
+ self.scene._scene.pushFree()
+
+ def onOneAtATimeSwitch(self, e):
+ profile.putPreference('oneAtATime', self.oneAtATime.IsChecked())
+ if self.oneAtATime.IsChecked() and profile.getMachineSettingFloat('extruder_head_size_height') < 1:
+ wx.MessageBox(_('For "One at a time" printing, you need to have entered the correct head size and gantry height in the machine settings'), _('One at a time warning'), wx.OK | wx.ICON_WARNING)
+ self.scene.updateProfileToControls()
+ self.scene._scene.pushFree()
+ self.scene.sceneUpdated()
def OnPreferences(self, e):
prefDialog = preferencesDialog.preferencesDialog(self)
prefDialog.Centre()
prefDialog.Show()
+ prefDialog.Raise()
+ wx.CallAfter(prefDialog.Show)
def OnMachineSettings(self, e):
prefDialog = preferencesDialog.machineSettingsDialog(self)
prefDialog.Centre()
prefDialog.Show()
+ prefDialog.Raise()
def OnDropFiles(self, files):
if len(files) > 0:
- profile.setPluginConfig([])
self.updateProfileToAllControls()
self.scene.loadFiles(files)
#Add a menu item for each machine configuration.
for n in xrange(0, profile.getMachineCount()):
- i = self.machineMenu.Append(n, profile.getMachineSetting('machine_name', n).title(), kind=wx.ITEM_RADIO)
+ i = self.machineMenu.Append(n + 0x1000, profile.getMachineSetting('machine_name', n).title(), kind=wx.ITEM_RADIO)
if n == int(profile.getPreferenceFloat('active_machine')):
i.Check(True)
- self.Bind(wx.EVT_MENU, lambda e: self.OnSelectMachine(e.GetId()), i)
+ self.Bind(wx.EVT_MENU, lambda e: self.OnSelectMachine(e.GetId() - 0x1000), i)
self.machineMenu.AppendSeparator()
- i = self.machineMenu.Append(-1, _("Add new machine..."))
- self.Bind(wx.EVT_MENU, self.OnAddNewMachine, i)
+
+ i = self.machineMenu.Append(-1, _("Machine settings..."))
+ self.Bind(wx.EVT_MENU, self.OnMachineSettings, i)
#Add tools for machines.
self.machineMenu.AppendSeparator()
- i = self.machineMenu.Append(-1, _("Install custom firmware"))
+
+ self.defaultFirmwareInstallMenuItem = self.machineMenu.Append(-1, _("Install default firmware..."))
+ self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, self.defaultFirmwareInstallMenuItem)
+
+ i = self.machineMenu.Append(-1, _("Install custom firmware..."))
self.Bind(wx.EVT_MENU, self.OnCustomFirmware, i)
- i = self.machineMenu.Append(-1, _("Install default Marlin firmware"))
- self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, i)
def OnLoadProfile(self, e):
dlg=wx.FileDialog(self, _("Select profile file to load"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
self.Show()
self.reloadSettingPanels()
- def OnAddNewMachine(self, e):
- self.Hide()
- profile.setActiveMachine(profile.getMachineCount())
- configWizard.configWizard(True)
- self.Show()
- self.reloadSettingPanels()
- self.updateMachineMenu()
-
def OnSelectMachine(self, index):
profile.setActiveMachine(index)
self.reloadSettingPanels()
wx.MessageBox(_("You are running the latest version of Cura!"), _("Awesome!"), wx.ICON_INFORMATION)
def OnAbout(self, e):
- info = wx.AboutDialogInfo()
- info.SetName("Cura")
- info.SetDescription("""
-End solution for Open Source Fused Filament Fabrication 3D printing.
-* Cura is the graphical User Interface.
-* CuraEngine is the slicer/gcode generator.
-Cura and the CuraEngine are licensed AGPLv3.
- """)
- info.SetWebSite('http://software.ultimaker.com/')
- info.SetCopyright(_("Copyright (C) David Braam"))
- info.SetLicence("""
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-""")
- wx.AboutBox(info)
+ aboutBox = aboutWindow.aboutWindow()
+ aboutBox.Centre()
+ aboutBox.Show()
def OnClose(self, e):
- profile.saveProfile(profile.getDefaultProfilePath())
+ profile.saveProfile(profile.getDefaultProfilePath(), True)
# Save the window position, size & state from the preferences file
profile.putPreference('window_maximized', self.IsMaximized())
#HACK: Set the paint function of the glCanvas to nothing so it won't keep refreshing. Which can keep wxWidgets from quiting.
print "Closing down"
self.scene.OnPaint = lambda e : e
- self.scene._slicer.cleanup()
+ self.scene._engine.cleanup()
self.Destroy()
def OnQuit(self, e):
#Plugin page
self.pluginPanel = pluginPanel.pluginPanel(self.nb, callback)
- if len(self.pluginPanel.pluginList) > 0:
- self.nb.AddPage(self.pluginPanel, _("Plugins"))
- else:
- self.pluginPanel.Show(False)
+ self.nb.AddPage(self.pluginPanel, _("Plugins"))
#Alteration page
if profile.getMachineSetting('gcode_flavor') == 'UltiGCode':
n += 1 + len(profile.getSettingsForCategory(category, title))
if n > count / 2:
p = right
- configBase.TitleRow(p, title)
+ configBase.TitleRow(p, _(title))
for s in profile.getSettingsForCategory(category, title):
configBase.SettingRow(p, s.getName())