Moved profile read/write functions to newui. Better seperation of Skeinforge and NewUI. Moved all the defaults to profile.py, instead of all over the place.
This commit is contained in:
parent
ff7782fa14
commit
2fcd59bfb6
8 changed files with 211 additions and 139 deletions
|
@ -7,30 +7,30 @@ from __future__ import absolute_import
|
||||||
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
|
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
|
||||||
import __init__
|
import __init__
|
||||||
|
|
||||||
import ConfigParser
|
|
||||||
import os, sys
|
import os, sys
|
||||||
import types, math
|
import types, math
|
||||||
|
|
||||||
|
from newui import profile
|
||||||
from fabmetheus_utilities import archive
|
from fabmetheus_utilities import archive
|
||||||
|
|
||||||
def DEFSET(setting):
|
def DEFSET(setting):
|
||||||
return setting.value
|
return setting.value
|
||||||
|
|
||||||
def storedSetting(name):
|
def storedSetting(name):
|
||||||
return lambda setting: getProfileSetting(name, setting.value)
|
return lambda setting: profile.getProfileSetting(name)
|
||||||
|
|
||||||
def ifSettingAboveZero(name):
|
def ifSettingAboveZero(name):
|
||||||
return lambda setting: float(getProfileSetting(name, '0.0')) > 0
|
return lambda setting: float(profile.getProfileSetting(name)) > 0
|
||||||
|
|
||||||
def ifSettingIs(name, value, default):
|
def ifSettingIs(name, value):
|
||||||
return lambda setting: getProfileSetting(name, default) == value
|
return lambda setting: profile.getProfileSetting(name) == value
|
||||||
|
|
||||||
def storedPercentSetting(name):
|
def storedPercentSetting(name):
|
||||||
return lambda setting: float(getProfileSetting(name, setting.value * 100)) / 100
|
return lambda setting: float(profile.getProfileSetting(name)) / 100
|
||||||
|
|
||||||
def calculateEdgeWidth(setting):
|
def calculateEdgeWidth(setting):
|
||||||
wallThickness = float(getProfileSetting('wall_thickness'))
|
wallThickness = float(profile.getProfileSetting('wall_thickness'))
|
||||||
nozzleSize = float(getProfileSetting('nozzle_size'))
|
nozzleSize = float(profile.getProfileSetting('nozzle_size'))
|
||||||
|
|
||||||
if wallThickness < nozzleSize:
|
if wallThickness < nozzleSize:
|
||||||
return wallThickness
|
return wallThickness
|
||||||
|
@ -43,13 +43,13 @@ def calculateEdgeWidth(setting):
|
||||||
return lineWidth
|
return lineWidth
|
||||||
|
|
||||||
def calculateShells(setting):
|
def calculateShells(setting):
|
||||||
return calculateShellsImp(float(getProfileSetting('wall_thickness')))
|
return calculateShellsImp(float(profile.getProfileSetting('wall_thickness')))
|
||||||
|
|
||||||
def calculateShellsBase(setting):
|
def calculateShellsBase(setting):
|
||||||
return calculateShellsImp(float(getProfileSetting('wall_thickness')) + float(getProfileSetting('extra_base_wall_thickness', '0')))
|
return calculateShellsImp(float(profile.getProfileSetting('wall_thickness')) + float(profile.getProfileSetting('extra_base_wall_thickness')))
|
||||||
|
|
||||||
def calculateShellsImp(wallThickness):
|
def calculateShellsImp(wallThickness):
|
||||||
nozzleSize = float(getProfileSetting('nozzle_size'))
|
nozzleSize = float(profile.getProfileSetting('nozzle_size'))
|
||||||
|
|
||||||
if wallThickness < nozzleSize:
|
if wallThickness < nozzleSize:
|
||||||
return 0
|
return 0
|
||||||
|
@ -62,19 +62,19 @@ def calculateShellsImp(wallThickness):
|
||||||
return lineCount - 1
|
return lineCount - 1
|
||||||
|
|
||||||
def calculateSolidLayerCount(setting):
|
def calculateSolidLayerCount(setting):
|
||||||
layerHeight = float(getProfileSetting('layer_height'))
|
layerHeight = float(profile.getProfileSetting('layer_height'))
|
||||||
solidThickness = float(getProfileSetting('solid_layer_thickness'))
|
solidThickness = float(profile.getProfileSetting('solid_layer_thickness'))
|
||||||
ret = int(math.ceil(solidThickness / layerHeight - 0.0001))
|
ret = int(math.ceil(solidThickness / layerHeight - 0.0001))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def firstLayerSpeedRatio(setting):
|
def firstLayerSpeedRatio(setting):
|
||||||
bottomSpeed = float(getProfileSetting('bottom_layer_speed'))
|
bottomSpeed = float(profile.getProfileSetting('bottom_layer_speed'))
|
||||||
speed = float(getProfileSetting('print_speed'))
|
speed = float(profile.getProfileSetting('print_speed'))
|
||||||
return bottomSpeed/speed
|
return bottomSpeed/speed
|
||||||
|
|
||||||
def calcSupportDistanceRatio(setting):
|
def calcSupportDistanceRatio(setting):
|
||||||
edgeWidth = calculateEdgeWidth(setting)
|
edgeWidth = calculateEdgeWidth(setting)
|
||||||
distance = float(getProfileSetting('support_distance', '0.5'))
|
distance = float(profile.getProfileSetting('support_distance'))
|
||||||
return distance / edgeWidth
|
return distance / edgeWidth
|
||||||
|
|
||||||
def getSkeinPyPyProfileInformation():
|
def getSkeinPyPyProfileInformation():
|
||||||
|
@ -139,10 +139,10 @@ def getSkeinPyPyProfileInformation():
|
||||||
'Infill_Begin_Rotation_degrees': DEFSET,
|
'Infill_Begin_Rotation_degrees': DEFSET,
|
||||||
'Infill_Begin_Rotation_Repeat_layers': DEFSET,
|
'Infill_Begin_Rotation_Repeat_layers': DEFSET,
|
||||||
'Infill_Odd_Layer_Extra_Rotation_degrees': DEFSET,
|
'Infill_Odd_Layer_Extra_Rotation_degrees': DEFSET,
|
||||||
'Grid_Circular': ifSettingIs('infill_type', 'Grid Circular', 'Line'),
|
'Grid_Circular': ifSettingIs('infill_type', 'Grid Circular'),
|
||||||
'Grid_Hexagonal': ifSettingIs('infill_type', 'Grid Hexagonal', 'Line'),
|
'Grid_Hexagonal': ifSettingIs('infill_type', 'Grid Hexagonal'),
|
||||||
'Grid_Rectangular': ifSettingIs('infill_type', 'Grid Rectangular', 'Line'),
|
'Grid_Rectangular': ifSettingIs('infill_type', 'Grid Rectangular'),
|
||||||
'Line': ifSettingIs('infill_type', 'Line', 'Line'),
|
'Line': ifSettingIs('infill_type', 'Line'),
|
||||||
'Infill_Perimeter_Overlap_ratio': storedPercentSetting('fill_overlap'),
|
'Infill_Perimeter_Overlap_ratio': storedPercentSetting('fill_overlap'),
|
||||||
'Infill_Solidity_ratio': storedPercentSetting('fill_density'),
|
'Infill_Solidity_ratio': storedPercentSetting('fill_density'),
|
||||||
'Infill_Width': storedSetting("nozzle_size"),
|
'Infill_Width': storedSetting("nozzle_size"),
|
||||||
|
@ -380,69 +380,6 @@ def getSkeinPyPyProfileInformation():
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def loadGlobalProfile(filename):
|
|
||||||
"Read a configuration file as global config"
|
|
||||||
global globalProfileParser
|
|
||||||
globalProfileParser = ConfigParser.ConfigParser()
|
|
||||||
globalProfileParser.read(filename)
|
|
||||||
|
|
||||||
def saveGlobalProfile(filename):
|
|
||||||
globalProfileParser.write(open(filename, 'w'))
|
|
||||||
|
|
||||||
def getProfileSetting(name, default = "ERR", section = 'profile'):
|
|
||||||
#Check if we have a configuration file loaded, else load the default.
|
|
||||||
if not globals().has_key('globalProfileParser'):
|
|
||||||
loadGlobalProfile(getDefaultProfilePath())
|
|
||||||
if not globalProfileParser.has_option(section, name):
|
|
||||||
if not globalProfileParser.has_section(section):
|
|
||||||
globalProfileParser.add_section(section)
|
|
||||||
globalProfileParser.set(section, name, str(default))
|
|
||||||
print name + " not found in profile, so using default: " + str(default)
|
|
||||||
return default
|
|
||||||
return globalProfileParser.get(section, name)
|
|
||||||
|
|
||||||
def putProfileSetting(name, value, section = 'profile'):
|
|
||||||
#Check if we have a configuration file loaded, else load the default.
|
|
||||||
if not globals().has_key('globalProfileParser'):
|
|
||||||
loadGlobalProfile(getDefaultProfilePath())
|
|
||||||
if not globalProfileParser.has_section(section):
|
|
||||||
globalProfileParser.add_section(section)
|
|
||||||
globalProfileParser.set(section, name, str(value))
|
|
||||||
|
|
||||||
global globalPreferenceParser
|
|
||||||
globalPreferenceParser = None
|
|
||||||
|
|
||||||
def getPreferencePath():
|
|
||||||
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../preferences.ini"))
|
|
||||||
|
|
||||||
def getPreference(name, default = "ERR"):
|
|
||||||
global globalPreferenceParser
|
|
||||||
if globalPreferenceParser == None:
|
|
||||||
globalPreferenceParser = ConfigParser.ConfigParser()
|
|
||||||
globalPreferenceParser.read(getPreferencePath())
|
|
||||||
if not globalPreferenceParser.has_option('preference', name):
|
|
||||||
if not globalPreferenceParser.has_section('preference'):
|
|
||||||
globalPreferenceParser.add_section('preference')
|
|
||||||
globalPreferenceParser.set('preference', name, str(default))
|
|
||||||
print name + " not found in preferences, so using default: " + str(default)
|
|
||||||
return default
|
|
||||||
return globalPreferenceParser.get('preference', name)
|
|
||||||
|
|
||||||
def putPreference(name, value):
|
|
||||||
#Check if we have a configuration file loaded, else load the default.
|
|
||||||
global globalPreferenceParser
|
|
||||||
if globalPreferenceParser == None:
|
|
||||||
globalPreferenceParser = ConfigParser.ConfigParser()
|
|
||||||
globalPreferenceParser.read(getPreferencePath())
|
|
||||||
if not globalPreferenceParser.has_section('preference'):
|
|
||||||
globalPreferenceParser.add_section('preference')
|
|
||||||
globalPreferenceParser.set('preference', name, str(value))
|
|
||||||
globalPreferenceParser.write(open(getPreferencePath(), 'w'))
|
|
||||||
|
|
||||||
|
|
||||||
def getDefaultProfilePath():
|
|
||||||
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../current_profile.ini"))
|
|
||||||
|
|
||||||
def safeConfigName(name):
|
def safeConfigName(name):
|
||||||
return name.replace("=", "").replace(":", "").replace(" ", "_").replace("(", "").replace(")", "")
|
return name.replace("=", "").replace(":", "").replace(" ", "_").replace("(", "").replace(")", "")
|
||||||
|
|
||||||
|
@ -491,10 +428,10 @@ def getAlterationFile(fileName, allowMagicPrefix = True):
|
||||||
if fileName == 'start.gcode':
|
if fileName == 'start.gcode':
|
||||||
#For the start code, hack the temperature and the steps per E value into it. So the temperature is reached before the start code extrusion.
|
#For the start code, hack the temperature and the steps per E value into it. So the temperature is reached before the start code extrusion.
|
||||||
#We also set our steps per E here, if configured.
|
#We also set our steps per E here, if configured.
|
||||||
eSteps = float(getPreference('steps_per_e', '0'))
|
eSteps = float(profile.getPreference('steps_per_e'))
|
||||||
if eSteps > 0:
|
if eSteps > 0:
|
||||||
prefix += 'M92 E'+str(eSteps)+'\n'
|
prefix += 'M92 E'+str(eSteps)+'\n'
|
||||||
temp = float(getProfileSetting('print_temperature', '0'))
|
temp = float(profile.getProfileSetting('print_temperature'))
|
||||||
if temp > 0:
|
if temp > 0:
|
||||||
prefix += 'M109 S'+str(temp)+'\n'
|
prefix += 'M109 S'+str(temp)+'\n'
|
||||||
elif fileName == 'replace.csv':
|
elif fileName == 'replace.csv':
|
||||||
|
|
|
@ -4,8 +4,6 @@ import __init__
|
||||||
import wx, os, platform, types
|
import wx, os, platform, types
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
|
||||||
|
|
||||||
from newui import configBase
|
from newui import configBase
|
||||||
from newui import preview3d
|
from newui import preview3d
|
||||||
from newui import sliceProgessPanel
|
from newui import sliceProgessPanel
|
||||||
|
|
|
@ -3,9 +3,8 @@ import __init__
|
||||||
|
|
||||||
import wx, os, sys, platform, types
|
import wx, os, sys, platform, types
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
|
||||||
|
|
||||||
from newui import validators
|
from newui import validators
|
||||||
|
from newui import profile
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app = wx.App(False)
|
app = wx.App(False)
|
||||||
|
@ -82,9 +81,9 @@ class configWindowBase(wx.Frame):
|
||||||
"Update the configuration wx controls to show the new configuration settings"
|
"Update the configuration wx controls to show the new configuration settings"
|
||||||
for setting in self.settingControlList:
|
for setting in self.settingControlList:
|
||||||
if setting.type == 'profile':
|
if setting.type == 'profile':
|
||||||
setting.SetValue(settings.getProfileSetting(setting.configName))
|
setting.SetValue(profile.getProfileSetting(setting.configName))
|
||||||
else:
|
else:
|
||||||
setting.SetValue(settings.getPreference(setting.configName))
|
setting.SetValue(profile.getPreference(setting.configName))
|
||||||
|
|
||||||
class TitleRow():
|
class TitleRow():
|
||||||
def __init__(self, panel, name):
|
def __init__(self, panel, name):
|
||||||
|
@ -112,18 +111,18 @@ class SettingRow():
|
||||||
self.type = type
|
self.type = type
|
||||||
|
|
||||||
self.label = wx.StaticText(panel, -1, label)
|
self.label = wx.StaticText(panel, -1, label)
|
||||||
getSettingFunc = settings.getPreference
|
getSettingFunc = profile.getPreference
|
||||||
if self.type == 'profile':
|
if self.type == 'profile':
|
||||||
getSettingFunc = settings.getProfileSetting
|
getSettingFunc = profile.getProfileSetting
|
||||||
if isinstance(defaultValue, types.StringTypes):
|
if isinstance(defaultValue, types.StringTypes):
|
||||||
self.ctrl = wx.TextCtrl(panel, -1, getSettingFunc(configName, defaultValue))
|
self.ctrl = wx.TextCtrl(panel, -1, getSettingFunc(configName))
|
||||||
self.ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
|
self.ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
|
||||||
elif isinstance(defaultValue, types.BooleanType):
|
elif isinstance(defaultValue, types.BooleanType):
|
||||||
self.ctrl = wx.CheckBox(panel, -1, style=wx.ALIGN_RIGHT)
|
self.ctrl = wx.CheckBox(panel, -1, style=wx.ALIGN_RIGHT)
|
||||||
self.SetValue(getSettingFunc(configName, defaultValue))
|
self.SetValue(getSettingFunc(configName))
|
||||||
self.ctrl.Bind(wx.EVT_CHECKBOX, self.OnSettingChange)
|
self.ctrl.Bind(wx.EVT_CHECKBOX, self.OnSettingChange)
|
||||||
else:
|
else:
|
||||||
self.ctrl = wx.ComboBox(panel, -1, getSettingFunc(configName, defaultValue[0]), choices=defaultValue, style=wx.CB_DROPDOWN|wx.CB_READONLY)
|
self.ctrl = wx.ComboBox(panel, -1, getSettingFunc(configName), choices=defaultValue, style=wx.CB_DROPDOWN|wx.CB_READONLY)
|
||||||
self.ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
|
self.ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
|
||||||
|
|
||||||
sizer.Add(self.label, (x,y), flag=wx.ALIGN_CENTER_VERTICAL)
|
sizer.Add(self.label, (x,y), flag=wx.ALIGN_CENTER_VERTICAL)
|
||||||
|
@ -149,9 +148,9 @@ class SettingRow():
|
||||||
|
|
||||||
def OnSettingChange(self, e):
|
def OnSettingChange(self, e):
|
||||||
if self.type == 'profile':
|
if self.type == 'profile':
|
||||||
settings.putProfileSetting(self.configName, self.GetValue())
|
profile.putProfileSetting(self.configName, self.GetValue())
|
||||||
else:
|
else:
|
||||||
settings.putPreference(self.configName, self.GetValue())
|
profile.putPreference(self.configName, self.GetValue())
|
||||||
result = validators.SUCCESS
|
result = validators.SUCCESS
|
||||||
msgs = []
|
msgs = []
|
||||||
for validator in self.validators:
|
for validator in self.validators:
|
||||||
|
|
|
@ -4,8 +4,8 @@ import __init__
|
||||||
import wx, os, platform, types, webbrowser, threading, time, re
|
import wx, os, platform, types, webbrowser, threading, time, re
|
||||||
import wx.wizard
|
import wx.wizard
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
|
||||||
from newui import machineCom
|
from newui import machineCom
|
||||||
|
from newui import profile
|
||||||
|
|
||||||
class InfoPage(wx.wizard.WizardPageSimple):
|
class InfoPage(wx.wizard.WizardPageSimple):
|
||||||
def __init__(self, parent, title):
|
def __init__(self, parent, title):
|
||||||
|
@ -94,19 +94,20 @@ class MachineSelectPage(InfoPage):
|
||||||
|
|
||||||
def StoreData(self):
|
def StoreData(self):
|
||||||
if self.UltimakerRadio.GetValue():
|
if self.UltimakerRadio.GetValue():
|
||||||
settings.putPreference('machine_width', '205')
|
profile.putPreference('machine_width', '205')
|
||||||
settings.putPreference('machine_depth', '205')
|
profile.putPreference('machine_depth', '205')
|
||||||
settings.putPreference('machine_height', '200')
|
profile.putPreference('machine_height', '200')
|
||||||
settings.putProfileSetting('nozzle_size', '0.4')
|
profile.putProfileSetting('nozzle_size', '0.4')
|
||||||
settings.putProfileSetting('machine_center_x', '100')
|
profile.putProfileSetting('machine_center_x', '100')
|
||||||
settings.putProfileSetting('machine_center_y', '100')
|
profile.putProfileSetting('machine_center_y', '100')
|
||||||
else:
|
else:
|
||||||
settings.putPreference('machine_width', '80')
|
profile.putPreference('machine_width', '80')
|
||||||
settings.putPreference('machine_depth', '80')
|
profile.putPreference('machine_depth', '80')
|
||||||
settings.putPreference('machine_height', '60')
|
profile.putPreference('machine_height', '60')
|
||||||
settings.putProfileSetting('nozzle_size', '0.5')
|
profile.putProfileSetting('nozzle_size', '0.5')
|
||||||
settings.putProfileSetting('machine_center_x', '40')
|
profile.putProfileSetting('machine_center_x', '40')
|
||||||
settings.putProfileSetting('machine_center_y', '40')
|
profile.putProfileSetting('machine_center_y', '40')
|
||||||
|
profile.putProfileSetting('wall_thickness', float(profile.getProfileSetting('nozzle_size')) * 2)
|
||||||
|
|
||||||
class FirmwareUpgradePage(InfoPage):
|
class FirmwareUpgradePage(InfoPage):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
@ -299,13 +300,13 @@ class UltimakerCalibrationPage(InfoPage):
|
||||||
self.AddText("The better you have calibrated these values, the better your prints\nwill become.");
|
self.AddText("The better you have calibrated these values, the better your prints\nwill become.");
|
||||||
self.AddSeperator()
|
self.AddSeperator()
|
||||||
self.AddText("First we need the diameter of your filament:");
|
self.AddText("First we need the diameter of your filament:");
|
||||||
self.filamentDiameter = wx.TextCtrl(self, -1, settings.getProfileSetting('filament_diameter', '2.89'))
|
self.filamentDiameter = wx.TextCtrl(self, -1, profile.getProfileSetting('filament_diameter'))
|
||||||
self.GetSizer().Add(self.filamentDiameter, 0, wx.LEFT, 5)
|
self.GetSizer().Add(self.filamentDiameter, 0, wx.LEFT, 5)
|
||||||
self.AddText("If you do not own digital Calipers that can measure\nat least 2 digits then use 2.89mm.\nWhich is the average diameter of most filament.");
|
self.AddText("If you do not own digital Calipers that can measure\nat least 2 digits then use 2.89mm.\nWhich is the average diameter of most filament.");
|
||||||
self.AddText("Note: This value can be changed later at any time.");
|
self.AddText("Note: This value can be changed later at any time.");
|
||||||
|
|
||||||
def StoreData(self):
|
def StoreData(self):
|
||||||
settings.putProfileSetting('filament_diameter', self.filamentDiameter.GetValue())
|
profile.putProfileSetting('filament_diameter', self.filamentDiameter.GetValue())
|
||||||
|
|
||||||
class UltimakerCalibrateStepsPerEPage(InfoPage):
|
class UltimakerCalibrateStepsPerEPage(InfoPage):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
@ -325,7 +326,7 @@ class UltimakerCalibrateStepsPerEPage(InfoPage):
|
||||||
p.GetSizer().Add(self.saveLengthButton, 0)
|
p.GetSizer().Add(self.saveLengthButton, 0)
|
||||||
self.GetSizer().Add(p, 0, wx.LEFT, 5)
|
self.GetSizer().Add(p, 0, wx.LEFT, 5)
|
||||||
self.AddText("This results in the following steps per E:")
|
self.AddText("This results in the following steps per E:")
|
||||||
self.stepsPerEInput = wx.TextCtrl(self, -1, settings.getPreference('steps_per_e', '865.888'))
|
self.stepsPerEInput = wx.TextCtrl(self, -1, profile.getPreference('steps_per_e'))
|
||||||
self.GetSizer().Add(self.stepsPerEInput, 0, wx.LEFT, 5)
|
self.GetSizer().Add(self.stepsPerEInput, 0, wx.LEFT, 5)
|
||||||
self.AddText("You can repeat these steps to get better calibration.")
|
self.AddText("You can repeat these steps to get better calibration.")
|
||||||
self.AddSeperator()
|
self.AddSeperator()
|
||||||
|
@ -393,7 +394,7 @@ class UltimakerCalibrateStepsPerEPage(InfoPage):
|
||||||
break
|
break
|
||||||
|
|
||||||
def StoreData(self):
|
def StoreData(self):
|
||||||
settings.putPreference('steps_per_e', self.stepsPerEInput.GetValue())
|
profile.putPreference('steps_per_e', self.stepsPerEInput.GetValue())
|
||||||
|
|
||||||
class configWizard(wx.wizard.Wizard):
|
class configWizard(wx.wizard.Wizard):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -3,8 +3,6 @@ import __init__
|
||||||
|
|
||||||
import wx, os, platform, types, webbrowser
|
import wx, os, platform, types, webbrowser
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
|
||||||
|
|
||||||
from newui import configBase
|
from newui import configBase
|
||||||
from newui import advancedConfig
|
from newui import advancedConfig
|
||||||
from newui import preview3d
|
from newui import preview3d
|
||||||
|
@ -14,14 +12,15 @@ from newui import validators
|
||||||
from newui import preferencesDialog
|
from newui import preferencesDialog
|
||||||
from newui import configWizard
|
from newui import configWizard
|
||||||
from newui import machineCom
|
from newui import machineCom
|
||||||
|
from newui import profile
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app = wx.App(False)
|
app = wx.App(False)
|
||||||
if settings.getPreference('wizardDone', 'False') == 'False':
|
if profile.getPreference('wizardDone') == 'False':
|
||||||
if os.name == 'darwin':
|
if os.name == 'darwin':
|
||||||
wx.MessageBox('The MacOS version of SkeinPyPy is experimental.\nThere are still UI/usability bugs. Check the issue list at:\nhttps://github.com/daid/SkeinPyPy/issues\nfor details.\nPlease report any extra issue you find.', 'MacOS Warning', wx.OK | wx.ICON_INFORMATION)
|
wx.MessageBox('The MacOS version of SkeinPyPy is experimental.\nThere are still UI/usability bugs. Check the issue list at:\nhttps://github.com/daid/SkeinPyPy/issues\nfor details.\nPlease report any extra issue you find.', 'MacOS Warning', wx.OK | wx.ICON_INFORMATION)
|
||||||
configWizard.configWizard()
|
configWizard.configWizard()
|
||||||
settings.putPreference("wizardDone", "True")
|
profile.putPreference("wizardDone", "True")
|
||||||
mainWindow()
|
mainWindow()
|
||||||
app.MainLoop()
|
app.MainLoop()
|
||||||
|
|
||||||
|
@ -71,7 +70,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
self.SetMenuBar(menubar)
|
self.SetMenuBar(menubar)
|
||||||
|
|
||||||
self.lastPath = ""
|
self.lastPath = ""
|
||||||
self.filename = settings.getPreference('lastFile', "None")
|
self.filename = profile.getPreference('lastFile')
|
||||||
self.progressPanelList = []
|
self.progressPanelList = []
|
||||||
|
|
||||||
#Preview window
|
#Preview window
|
||||||
|
@ -223,7 +222,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
if dlg.ShowModal() == wx.ID_OK:
|
if dlg.ShowModal() == wx.ID_OK:
|
||||||
profileFile = dlg.GetPath()
|
profileFile = dlg.GetPath()
|
||||||
self.lastPath = os.path.split(profileFile)[0]
|
self.lastPath = os.path.split(profileFile)[0]
|
||||||
settings.loadGlobalProfile(profileFile)
|
profile.loadGlobalProfile(profileFile)
|
||||||
self.updateProfileToControls()
|
self.updateProfileToControls()
|
||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
|
@ -233,7 +232,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
if dlg.ShowModal() == wx.ID_OK:
|
if dlg.ShowModal() == wx.ID_OK:
|
||||||
profileFile = dlg.GetPath()
|
profileFile = dlg.GetPath()
|
||||||
self.lastPath = os.path.split(profileFile)[0]
|
self.lastPath = os.path.split(profileFile)[0]
|
||||||
settings.saveGlobalProfile(profileFile)
|
profile.saveGlobalProfile(profileFile)
|
||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
def OnPreferences(self, e):
|
def OnPreferences(self, e):
|
||||||
|
@ -242,7 +241,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
prefDialog.Show(True)
|
prefDialog.Show(True)
|
||||||
|
|
||||||
def OnDefaultMarlinFirmware(self, e):
|
def OnDefaultMarlinFirmware(self, e):
|
||||||
machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"), settings.getPreference('serial_port', 'AUTO'))
|
machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"), profile.getPreference('serial_port'))
|
||||||
|
|
||||||
def OnCustomFirmware(self, e):
|
def OnCustomFirmware(self, e):
|
||||||
dlg=wx.FileDialog(self, "Open firmware to upload", self.lastPath, style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
dlg=wx.FileDialog(self, "Open firmware to upload", self.lastPath, style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
||||||
|
@ -252,7 +251,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
if not(os.path.exists(filename)):
|
if not(os.path.exists(filename)):
|
||||||
return
|
return
|
||||||
#For some reason my Ubuntu 10.10 crashes here.
|
#For some reason my Ubuntu 10.10 crashes here.
|
||||||
machineCom.InstallFirmware(filename, settings.getPreference('serial_port', 'AUTO'))
|
machineCom.InstallFirmware(filename, profile.getPreference('serial_port'))
|
||||||
|
|
||||||
def OnFirstRunWizard(self, e):
|
def OnFirstRunWizard(self, e):
|
||||||
configWizard.configWizard()
|
configWizard.configWizard()
|
||||||
|
@ -263,7 +262,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
dlg.SetWildcard("STL files (*.stl)|*.stl")
|
dlg.SetWildcard("STL files (*.stl)|*.stl")
|
||||||
if dlg.ShowModal() == wx.ID_OK:
|
if dlg.ShowModal() == wx.ID_OK:
|
||||||
self.filename=dlg.GetPath()
|
self.filename=dlg.GetPath()
|
||||||
settings.putPreference('lastFile', self.filename)
|
profile.putPreference('lastFile', self.filename)
|
||||||
if not(os.path.exists(self.filename)):
|
if not(os.path.exists(self.filename)):
|
||||||
return
|
return
|
||||||
self.lastPath = os.path.split(self.filename)[0]
|
self.lastPath = os.path.split(self.filename)[0]
|
||||||
|
@ -273,7 +272,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
def OnSlice(self, e):
|
def OnSlice(self, e):
|
||||||
if self.filename == None:
|
if self.filename == None:
|
||||||
return
|
return
|
||||||
settings.saveGlobalProfile(settings.getDefaultProfilePath())
|
profile.saveGlobalProfile(profile.getDefaultProfilePath())
|
||||||
|
|
||||||
#Create a progress panel and add it to the window. The progress panel will start the Skein operation.
|
#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)
|
spp = sliceProgessPanel.sliceProgessPanel(self, self, self.filename)
|
||||||
|
@ -308,5 +307,5 @@ class mainWindow(configBase.configWindowBase):
|
||||||
self.Close()
|
self.Close()
|
||||||
|
|
||||||
def OnClose(self, e):
|
def OnClose(self, e):
|
||||||
settings.saveGlobalProfile(settings.getDefaultProfilePath())
|
profile.saveGlobalProfile(profile.getDefaultProfilePath())
|
||||||
self.Destroy()
|
self.Destroy()
|
||||||
|
|
|
@ -14,10 +14,11 @@ except:
|
||||||
print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
|
print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
|
||||||
hasOpenGLlibs = False
|
hasOpenGLlibs = False
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
from newui import profile
|
||||||
from newui import gcodeInterpreter
|
from newui import gcodeInterpreter
|
||||||
from newui import util3d
|
from newui import util3d
|
||||||
|
|
||||||
|
from fabmetheus_utilities import settings
|
||||||
from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret
|
from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret
|
||||||
from fabmetheus_utilities.vector3 import Vector3
|
from fabmetheus_utilities.vector3 import Vector3
|
||||||
|
|
||||||
|
@ -32,7 +33,7 @@ class previewPanel(wx.Panel):
|
||||||
self.init = 0
|
self.init = 0
|
||||||
self.triangleMesh = None
|
self.triangleMesh = None
|
||||||
self.gcode = None
|
self.gcode = None
|
||||||
self.machineSize = Vector3(float(settings.getPreference('machine_width', '205')), float(settings.getPreference('machine_depth', '205')), float(settings.getPreference('machine_height', '200')))
|
self.machineSize = Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height')))
|
||||||
self.machineCenter = Vector3(0, 0, 0)
|
self.machineCenter = Vector3(0, 0, 0)
|
||||||
|
|
||||||
self.toolbar = wx.ToolBar( self, -1 )
|
self.toolbar = wx.ToolBar( self, -1 )
|
||||||
|
@ -93,10 +94,12 @@ class previewPanel(wx.Panel):
|
||||||
self.glCanvas.Refresh()
|
self.glCanvas.Refresh()
|
||||||
|
|
||||||
def updateWallLineWidth(self, setting):
|
def updateWallLineWidth(self, setting):
|
||||||
|
#TODO: this shouldn't be needed, you can calculate the line width from the E values combined with the steps_per_E and the filament diameter (reverse volumatric)
|
||||||
self.glCanvas.lineWidth = settings.calculateEdgeWidth(setting)
|
self.glCanvas.lineWidth = settings.calculateEdgeWidth(setting)
|
||||||
|
|
||||||
def updateInfillLineWidth(self, setting):
|
def updateInfillLineWidth(self, setting):
|
||||||
self.glCanvas.infillLineWidth = settings.getProfileSetting('nozzle_size')
|
#TODO: this shouldn't be needed, you can calculate the line width from the E values combined with the steps_per_E and the filament diameter (reverse volumatric)
|
||||||
|
self.glCanvas.infillLineWidth = profile.getProfileSetting('nozzle_size')
|
||||||
|
|
||||||
def loadModelFile(self, filename):
|
def loadModelFile(self, filename):
|
||||||
self.modelFilename = filename
|
self.modelFilename = filename
|
||||||
|
@ -158,18 +161,18 @@ class previewPanel(wx.Panel):
|
||||||
scale = 1.0
|
scale = 1.0
|
||||||
rotate = 0.0
|
rotate = 0.0
|
||||||
try:
|
try:
|
||||||
scale = float(settings.getProfileSetting('model_scale', '1.0'))
|
scale = float(profile.getProfileSetting('model_scale'))
|
||||||
rotate = float(settings.getProfileSetting('model_rotate_base', '0.0')) / 180 * math.pi
|
rotate = float(profile.getProfileSetting('model_rotate_base')) / 180 * math.pi
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
scaleX = scale
|
scaleX = scale
|
||||||
scaleY = scale
|
scaleY = scale
|
||||||
scaleZ = scale
|
scaleZ = scale
|
||||||
if settings.getProfileSetting('flip_x') == 'True':
|
if profile.getProfileSetting('flip_x') == 'True':
|
||||||
scaleX = -scaleX
|
scaleX = -scaleX
|
||||||
if settings.getProfileSetting('flip_y') == 'True':
|
if profile.getProfileSetting('flip_y') == 'True':
|
||||||
scaleY = -scaleY
|
scaleY = -scaleY
|
||||||
if settings.getProfileSetting('flip_z') == 'True':
|
if profile.getProfileSetting('flip_z') == 'True':
|
||||||
scaleZ = -scaleZ
|
scaleZ = -scaleZ
|
||||||
mat00 = math.cos(rotate) * scaleX
|
mat00 = math.cos(rotate) * scaleX
|
||||||
mat01 =-math.sin(rotate) * scaleY
|
mat01 =-math.sin(rotate) * scaleY
|
||||||
|
@ -381,8 +384,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
|
||||||
self.modelDisplayList = glGenLists(1);
|
self.modelDisplayList = glGenLists(1);
|
||||||
if self.parent.modelDirty:
|
if self.parent.modelDirty:
|
||||||
self.parent.modelDirty = False
|
self.parent.modelDirty = False
|
||||||
multiX = int(settings.getProfileSetting('model_multiply_x', '1'))
|
multiX = int(profile.getProfileSetting('model_multiply_x'))
|
||||||
multiY = int(settings.getProfileSetting('model_multiply_y', '1'))
|
multiY = int(profile.getProfileSetting('model_multiply_y'))
|
||||||
modelSize = self.parent.triangleMesh.getCarveCornerMaximum() - self.parent.triangleMesh.getCarveCornerMinimum()
|
modelSize = self.parent.triangleMesh.getCarveCornerMaximum() - self.parent.triangleMesh.getCarveCornerMinimum()
|
||||||
glNewList(self.modelDisplayList, GL_COMPILE)
|
glNewList(self.modelDisplayList, GL_COMPILE)
|
||||||
glPushMatrix()
|
glPushMatrix()
|
||||||
|
|
135
SkeinPyPy/newui/profile.py
Normal file
135
SkeinPyPy/newui/profile.py
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
|
||||||
|
import __init__
|
||||||
|
|
||||||
|
import ConfigParser
|
||||||
|
import os
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
#Single place to store the defaults, so we have a consistent set of default settings.
|
||||||
|
profileDefaultSettings = {
|
||||||
|
'layer_height': '0.2',
|
||||||
|
'wall_thickness': '0.8',
|
||||||
|
'solid_layer_thickness': '0.6',
|
||||||
|
'fill_density': '20',
|
||||||
|
'skirt_line_count': '1',
|
||||||
|
'skirt_gap': '6.0',
|
||||||
|
'print_speed': '50',
|
||||||
|
'print_temperature': '0',
|
||||||
|
'support': 'None',
|
||||||
|
'filament_diameter': '2.89',
|
||||||
|
'filament_density': '1.00',
|
||||||
|
'machine_center_x': '100',
|
||||||
|
'machine_center_y': '100',
|
||||||
|
'nozzle_size': '0.4',
|
||||||
|
'retraction_min_travel': '5.0',
|
||||||
|
'retraction_speed': '13.5',
|
||||||
|
'retraction_amount': '0.0',
|
||||||
|
'retraction_extra': '0.0',
|
||||||
|
'travel_speed': '150',
|
||||||
|
'max_z_speed': '1.0',
|
||||||
|
'bottom_layer_speed': '25',
|
||||||
|
'cool_min_layer_time': '10',
|
||||||
|
'model_scale': '1.0',
|
||||||
|
'flip_x': 'False',
|
||||||
|
'flip_y': 'False',
|
||||||
|
'flip_z': 'False',
|
||||||
|
'model_rotate_base': '0',
|
||||||
|
'model_multiply_x': '1',
|
||||||
|
'model_multiply_y': '1',
|
||||||
|
'extra_base_wall_thickness': '0.0',
|
||||||
|
'sequence': 'Loops > Perimeter > Infill',
|
||||||
|
'force_first_layer_sequence': 'True',
|
||||||
|
'infill_type': 'Line',
|
||||||
|
'solid_top': 'True',
|
||||||
|
'fill_overlap': '15',
|
||||||
|
'support_rate': '100',
|
||||||
|
'support_distance': '0.5',
|
||||||
|
'joris': 'False',
|
||||||
|
}
|
||||||
|
preferencesDefaultSettings = {
|
||||||
|
'wizardDone': 'False',
|
||||||
|
'lastFile': 'None',
|
||||||
|
'machine_width': '205',
|
||||||
|
'machine_depth': '205',
|
||||||
|
'machine_height': '200',
|
||||||
|
'steps_per_e': '0',
|
||||||
|
'serial_port': 'AUTO',
|
||||||
|
'serial_baud': '250000',
|
||||||
|
}
|
||||||
|
|
||||||
|
def getDefaultProfilePath():
|
||||||
|
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../current_profile.ini"))
|
||||||
|
|
||||||
|
def loadGlobalProfile(filename):
|
||||||
|
"Read a configuration file as global config"
|
||||||
|
global globalProfileParser
|
||||||
|
globalProfileParser = ConfigParser.ConfigParser()
|
||||||
|
globalProfileParser.read(filename)
|
||||||
|
|
||||||
|
def saveGlobalProfile(filename):
|
||||||
|
globalProfileParser.write(open(filename, 'w'))
|
||||||
|
|
||||||
|
def getProfileSetting(name):
|
||||||
|
if name in profileDefaultSettings:
|
||||||
|
default = profileDefaultSettings[name]
|
||||||
|
else:
|
||||||
|
print "Missing default setting for: '" + name + "'"
|
||||||
|
profileDefaultSettings[name] = ''
|
||||||
|
default = ''
|
||||||
|
|
||||||
|
#Check if we have a configuration file loaded, else load the default.
|
||||||
|
if not globals().has_key('globalProfileParser'):
|
||||||
|
loadGlobalProfile(getDefaultProfilePath())
|
||||||
|
if not globalProfileParser.has_option('profile', name):
|
||||||
|
if not globalProfileParser.has_section('profile'):
|
||||||
|
globalProfileParser.add_section('profile')
|
||||||
|
globalProfileParser.set('profile', name, str(default))
|
||||||
|
print name + " not found in profile, so using default: " + str(default)
|
||||||
|
return default
|
||||||
|
return globalProfileParser.get('profile', name)
|
||||||
|
|
||||||
|
def putProfileSetting(name, value):
|
||||||
|
#Check if we have a configuration file loaded, else load the default.
|
||||||
|
if not globals().has_key('globalProfileParser'):
|
||||||
|
loadGlobalProfile(getDefaultProfilePath())
|
||||||
|
if not globalProfileParser.has_section('profile'):
|
||||||
|
globalProfileParser.add_section('profile')
|
||||||
|
globalProfileParser.set('profile', name, str(value))
|
||||||
|
|
||||||
|
global globalPreferenceParser
|
||||||
|
globalPreferenceParser = None
|
||||||
|
|
||||||
|
def getPreferencePath():
|
||||||
|
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../preferences.ini"))
|
||||||
|
|
||||||
|
def getPreference(name):
|
||||||
|
if name in preferencesDefaultSettings:
|
||||||
|
default = preferencesDefaultSettings[name]
|
||||||
|
else:
|
||||||
|
print "Missing default setting for: '" + name + "'"
|
||||||
|
preferencesDefaultSettings[name] = ''
|
||||||
|
default = ''
|
||||||
|
|
||||||
|
global globalPreferenceParser
|
||||||
|
if globalPreferenceParser == None:
|
||||||
|
globalPreferenceParser = ConfigParser.ConfigParser()
|
||||||
|
globalPreferenceParser.read(getPreferencePath())
|
||||||
|
if not globalPreferenceParser.has_option('preference', name):
|
||||||
|
if not globalPreferenceParser.has_section('preference'):
|
||||||
|
globalPreferenceParser.add_section('preference')
|
||||||
|
globalPreferenceParser.set('preference', name, str(default))
|
||||||
|
print name + " not found in preferences, so using default: " + str(default)
|
||||||
|
return default
|
||||||
|
return globalPreferenceParser.get('preference', name)
|
||||||
|
|
||||||
|
def putPreference(name, value):
|
||||||
|
#Check if we have a configuration file loaded, else load the default.
|
||||||
|
global globalPreferenceParser
|
||||||
|
if globalPreferenceParser == None:
|
||||||
|
globalPreferenceParser = ConfigParser.ConfigParser()
|
||||||
|
globalPreferenceParser.read(getPreferencePath())
|
||||||
|
if not globalPreferenceParser.has_section('preference'):
|
||||||
|
globalPreferenceParser.add_section('preference')
|
||||||
|
globalPreferenceParser.set('preference', name, str(value))
|
||||||
|
globalPreferenceParser.write(open(getPreferencePath(), 'w'))
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
import __init__
|
import __init__
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
from newui import profile
|
||||||
|
|
||||||
SUCCESS = 0
|
SUCCESS = 0
|
||||||
WARNING = 1
|
WARNING = 1
|
||||||
|
@ -68,7 +68,7 @@ class wallThicknessValidator():
|
||||||
def validate(self):
|
def validate(self):
|
||||||
try:
|
try:
|
||||||
wallThickness = float(self.setting.GetValue())
|
wallThickness = float(self.setting.GetValue())
|
||||||
nozzleSize = float(settings.getProfileSetting('nozzle_size'))
|
nozzleSize = float(profile.getProfileSetting('nozzle_size'))
|
||||||
if wallThickness <= nozzleSize * 0.5:
|
if wallThickness <= nozzleSize * 0.5:
|
||||||
return ERROR, 'Trying to print walls thinner then the half of your nozzle size, this will not produce anything usable'
|
return ERROR, 'Trying to print walls thinner then the half of your nozzle size, this will not produce anything usable'
|
||||||
if wallThickness <= nozzleSize * 0.85:
|
if wallThickness <= nozzleSize * 0.85:
|
||||||
|
|
Loading…
Reference in a new issue