Esempio n. 1
0
	def OnClose(self, e):
		self.parent.headSizeMin = numpy.array([profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'),0])
		self.parent.headSizeMax = numpy.array([profile.getPreferenceFloat('extruder_head_size_max_x'), profile.getPreferenceFloat('extruder_head_size_max_y'),0])
		self.parent.Refresh()

		self.MakeModal(False)
		self.Destroy()
Esempio n. 2
0
	def OnClose(self, e):
		self.parent.headSizeMin = numpy.array([profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'),0])
		self.parent.headSizeMax = numpy.array([profile.getPreferenceFloat('extruder_head_size_max_x'), profile.getPreferenceFloat('extruder_head_size_max_y'),0])
		self.parent.Refresh()

		self.MakeModal(False)
		self.Destroy()
Esempio n. 3
0
	def OnClose(self, e):
		self.parent.headSizeMin = util3d.Vector3(profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'),0)
		self.parent.headSizeMax = util3d.Vector3(profile.getPreferenceFloat('extruder_head_size_max_x'), profile.getPreferenceFloat('extruder_head_size_max_y'),0)
		self.parent.Refresh()

		self.MakeModal(False)
		self.Destroy()
Esempio n. 4
0
	def StoreData(self):
		profile.putPreference('machine_width', self.machineWidth.GetValue())
		profile.putPreference('machine_depth', self.machineDepth.GetValue())
		profile.putPreference('machine_height', self.machineHeight.GetValue())
		profile.putProfileSetting('nozzle_size', self.nozzleSize.GetValue())
		profile.putProfileSetting('machine_center_x', profile.getPreferenceFloat('machine_width') / 2)
		profile.putProfileSetting('machine_center_y', profile.getPreferenceFloat('machine_depth') / 2)
		profile.putProfileSetting('wall_thickness', float(profile.getProfileSettingFloat('nozzle_size')) * 2)
		profile.putPreference('has_heated_bed', str(self.heatedBed.GetValue()))
Esempio n. 5
0
 def getFilamentCost(self, e=0):
     cost_kg = profile.getPreferenceFloat('filament_cost_kg')
     cost_meter = profile.getPreferenceFloat('filament_cost_meter')
     if cost_kg > 0.0 and cost_meter > 0.0:
         return "%.2f / %.2f" % (self.getFilamentWeight(e) * cost_kg,
                                 self._filamentMM[e] / 1000.0 * cost_meter)
     elif cost_kg > 0.0:
         return "%.2f" % (self.getFilamentWeight(e) * cost_kg)
     elif cost_meter > 0.0:
         return "%.2f" % (self._filamentMM[e] / 1000.0 * cost_meter)
     return None
Esempio n. 6
0
    def __init__(self):
        super(flatSlicerWindow,
              self).__init__(None, title='Cura - ' + version.getVersion())

        self.machineSize = util3d.Vector3(
            profile.getPreferenceFloat('machine_width'),
            profile.getPreferenceFloat('machine_depth'),
            profile.getPreferenceFloat('machine_height'))
        self.filename = None
        self.svg = None

        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.SetIcon(icon.getMainIcon())

        self.toolbar = toolbarUtil.Toolbar(self.panel)

        toolbarUtil.NormalButton(self.toolbar, self.OnOpenSVG, 'open.png',
                                 'Open SVG')
        self.toolbar.AddSeparator()
        group = []
        toolbarUtil.RadioButton(self.toolbar,
                                group,
                                'object-3d-on.png',
                                'object-3d-off.png',
                                '3D view',
                                callback=self.On3DClick)
        toolbarUtil.RadioButton(self.toolbar,
                                group,
                                'object-top-on.png',
                                'object-top-off.png',
                                'Topdown view',
                                callback=self.OnTopClick).SetValue(True)
        self.toolbar.AddSeparator()
        toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png',
                                 'Close project planner')

        self.toolbar.Realize()

        sizer = wx.GridBagSizer(2, 2)
        self.panel.SetSizer(sizer)
        self.preview = PreviewGLCanvas(self.panel, self)

        sizer.Add(self.toolbar, (0, 0),
                  span=(1, 1),
                  flag=wx.EXPAND | wx.LEFT | wx.RIGHT)
        sizer.Add(self.preview, (1, 0), span=(5, 1), flag=wx.EXPAND)

        sizer.AddGrowableCol(0)
        sizer.AddGrowableRow(1)

        self.SetSize((600, 400))
Esempio n. 7
0
    def __init__(self, mainWindow, parent, filelist):
        wx.Panel.__init__(self, parent, -1)
        self.mainWindow = mainWindow
        self.filelist = filelist
        self.abort = False

        box = wx.StaticBox(self, -1, filelist[0])
        self.sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(self.sizer, 0, flag=wx.EXPAND)

        self.statusText = wx.StaticText(self, -1, "Starting...")
        self.progressGauge = wx.Gauge(self, -1)
        self.progressGauge.SetRange(10000 * len(filelist))
        self.abortButton = wx.Button(self, -1, "X", style=wx.BU_EXACTFIT)
        self.sizer.Add(self.statusText, 2, flag=wx.ALIGN_CENTER)
        self.sizer.Add(self.progressGauge, 2)
        self.sizer.Add(self.abortButton, 0)

        self.Bind(wx.EVT_BUTTON, self.OnAbort, self.abortButton)

        self.SetSizer(mainSizer)
        self.prevStep = 'start'
        self.totalDoneFactor = 0.0
        self.startTime = time.time()
        if profile.getPreference('save_profile') == 'True':
            profile.saveGlobalProfile(
                self.filelist[0][:self.filelist[0].rfind('.')] +
                "_profile.ini")
        cmdList = []
        for filename in self.filelist:
            idx = self.filelist.index(filename)
            #print filename, idx
            if idx > 0:
                profile.setTempOverride('fan_enabled', 'False')
                profile.setTempOverride('skirt_line_count', '0')
                profile.setTempOverride(
                    'machine_center_x',
                    profile.getProfileSettingFloat('machine_center_x') -
                    profile.getPreferenceFloat('extruder_offset_x%d' % (idx)))
                profile.setTempOverride(
                    'machine_center_y',
                    profile.getProfileSettingFloat('machine_center_y') -
                    profile.getPreferenceFloat('extruder_offset_y%d' % (idx)))
                profile.setTempOverride('alternative_center', self.filelist[0])
            if len(self.filelist) > 1:
                profile.setTempOverride('add_start_end_gcode', 'False')
                profile.setTempOverride('gcode_extension', 'multi_extrude_tmp')
            cmdList.append(sliceRun.getSliceCommand(filename))
        profile.resetTempOverride()
        self.thread = WorkerThread(self, filelist, cmdList)
Esempio n. 8
0
 def StoreData(self):
     profile.putPreference('machine_width', self.machineWidth.GetValue())
     profile.putPreference('machine_depth', self.machineDepth.GetValue())
     profile.putPreference('machine_height', self.machineHeight.GetValue())
     profile.putProfileSetting('nozzle_size', self.nozzleSize.GetValue())
     profile.putProfileSetting(
         'machine_center_x',
         profile.getPreferenceFloat('machine_width') / 2)
     profile.putProfileSetting(
         'machine_center_y',
         profile.getPreferenceFloat('machine_depth') / 2)
     profile.putProfileSetting(
         'wall_thickness',
         float(profile.getProfileSettingFloat('nozzle_size')) * 2)
     profile.putPreference('has_heated_bed', str(self.heatedBed.GetValue()))
Esempio n. 9
0
 def getFilamentWeight(self, e=0):
     #Calculates the weight of the filament in kg
     radius = float(profile.getProfileSetting('filament_diameter')) / 2
     volumeM3 = (self._filamentMM[e] *
                 (math.pi * radius * radius)) / (1000 * 1000 * 1000)
     return volumeM3 * profile.getPreferenceFloat(
         'filament_physical_density')
Esempio n. 10
0
    def __init__(self):
        super(flatSlicerWindow, self).__init__(None, title="Cura - " + version.getVersion())

        self.machineSize = util3d.Vector3(
            profile.getPreferenceFloat("machine_width"),
            profile.getPreferenceFloat("machine_depth"),
            profile.getPreferenceFloat("machine_height"),
        )
        self.filename = None
        self.svg = None

        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.SetIcon(icon.getMainIcon())

        self.toolbar = toolbarUtil.Toolbar(self.panel)

        toolbarUtil.NormalButton(self.toolbar, self.OnOpenSVG, "open.png", "Open SVG")
        self.toolbar.AddSeparator()
        group = []
        toolbarUtil.RadioButton(
            self.toolbar, group, "object-3d-on.png", "object-3d-off.png", "3D view", callback=self.On3DClick
        )
        toolbarUtil.RadioButton(
            self.toolbar, group, "object-top-on.png", "object-top-off.png", "Topdown view", callback=self.OnTopClick
        ).SetValue(True)
        self.toolbar.AddSeparator()
        toolbarUtil.NormalButton(self.toolbar, self.OnQuit, "exit.png", "Close project planner")

        self.toolbar.Realize()

        sizer = wx.GridBagSizer(2, 2)
        self.panel.SetSizer(sizer)
        self.preview = PreviewGLCanvas(self.panel, self)

        sizer.Add(self.toolbar, (0, 0), span=(1, 1), flag=wx.EXPAND | wx.LEFT | wx.RIGHT)
        sizer.Add(self.preview, (1, 0), span=(5, 1), flag=wx.EXPAND)

        sizer.AddGrowableCol(0)
        sizer.AddGrowableRow(1)

        self.SetSize((600, 400))
def getDefaultFirmware():
	if profile.getPreference('machine_type') == 'ultimaker':
		if profile.getPreferenceFloat('extruder_amount') > 1:
			return None
		if profile.getPreference('has_heated_bed') == 'True':
			return None
		if sys.platform.startswith('linux'):
			return resources.getPathForFirmware("ultimaker_115200.hex")
		else:
			return resources.getPathForFirmware("ultimaker_250000.hex")
	return None
Esempio n. 12
0
	def __init__(self, mainWindow, parent, filelist):
		wx.Panel.__init__(self, parent, -1)
		self.mainWindow = mainWindow
		self.filelist = filelist
		self.abort = False
		
		box = wx.StaticBox(self, -1, filelist[0])
		self.sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)

		mainSizer = wx.BoxSizer(wx.VERTICAL) 
		mainSizer.Add(self.sizer, 0, flag=wx.EXPAND)

		self.statusText = wx.StaticText(self, -1, "Starting...")
		self.progressGauge = wx.Gauge(self, -1)
		self.progressGauge.SetRange(10000 * len(filelist))
		self.abortButton = wx.Button(self, -1, "X", style=wx.BU_EXACTFIT)
		self.sizer.Add(self.statusText, 2, flag=wx.ALIGN_CENTER )
		self.sizer.Add(self.progressGauge, 2)
		self.sizer.Add(self.abortButton, 0)

		self.Bind(wx.EVT_BUTTON, self.OnAbort, self.abortButton)

		self.SetSizer(mainSizer)
		self.prevStep = 'start'
		self.totalDoneFactor = 0.0
		self.startTime = time.time()
		if profile.getPreference('save_profile') == 'True':
			profile.saveGlobalProfile(self.filelist[0][: self.filelist[0].rfind('.')] + "_profile.ini")
		cmdList = []
		for filename in self.filelist:
			idx = self.filelist.index(filename)
			#print filename, idx
			if idx > 0:
				profile.setTempOverride('fan_enabled', 'False')
				profile.setTempOverride('skirt_line_count', '0')
				profile.setTempOverride('machine_center_x', profile.getProfileSettingFloat('machine_center_x') - profile.getPreferenceFloat('extruder_offset_x%d' % (idx)))
				profile.setTempOverride('machine_center_y', profile.getProfileSettingFloat('machine_center_y') - profile.getPreferenceFloat('extruder_offset_y%d' % (idx)))
				profile.setTempOverride('alternative_center', self.filelist[0])
			if len(self.filelist) > 1:
				profile.setTempOverride('add_start_end_gcode', 'False')
				profile.setTempOverride('gcode_extension', 'multi_extrude_tmp')
			cmdList.append(sliceRun.getSliceCommand(filename))
		profile.resetTempOverride()
		self.thread = WorkerThread(self, filelist, cmdList)
Esempio n. 13
0
	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.SetIcon(icon.getMainIcon())
		
		self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles, '.stl'))
		
		self.list = []
		self.selection = None
		self.printMode = 0

		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)
		toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick).SetValue(True)
		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 slice a specific object.')
		self.toolbar2.AddSeparator()
		toolbarUtil.NormalButton(self.toolbar2, self.OnAutoPlace, 'autoplace.png', 'Automaticly organize the objects on the platform.')
		toolbarUtil.NormalButton(self.toolbar2, self.OnSlice, 'slice.png', 'Slice to project into a gcode file.')
		self.toolbar2.Realize()

		self.toolbar3 = toolbarUtil.Toolbar(self.panel)
		self.mirrorX = toolbarUtil.ToggleButton(self.toolbar3, 'flip_x', 'object-mirror-x-on.png', 'object-mirror-x-off.png', 'Mirror X', callback=self.OnMirrorChange)
		self.mirrorY = toolbarUtil.ToggleButton(self.toolbar3, 'flip_y', 'object-mirror-y-on.png', 'object-mirror-y-off.png', 'Mirror Y', callback=self.OnMirrorChange)
		self.mirrorZ = toolbarUtil.ToggleButton(self.toolbar3, 'flip_z', 'object-mirror-z-on.png', 'object-mirror-z-off.png', 'Mirror Z', callback=self.OnMirrorChange)
		self.toolbar3.AddSeparator()

		# Swap
		self.swapXZ = toolbarUtil.ToggleButton(self.toolbar3, 'swap_xz', 'object-swap-xz-on.png', 'object-swap-xz-off.png', 'Swap XZ', callback=self.OnMirrorChange)
		self.swapYZ = toolbarUtil.ToggleButton(self.toolbar3, 'swap_yz', 'object-swap-yz-on.png', 'object-swap-yz-off.png', 'Swap YZ', callback=self.OnMirrorChange)
		self.toolbar3.Realize()
		
		sizer = wx.GridBagSizer(2,2)
		self.panel.SetSizer(sizer)
		self.preview = 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, "Slice")
		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.preview, (1,0), span=(5,1), flag=wx.EXPAND)
		sizer.Add(self.listbox, (1,1), span=(1,2), flag=wx.EXPAND)
		sizer.Add(self.toolbar3, (2,1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
		sizer.Add(self.addButton, (3,1), span=(1,1))
		sizer.Add(self.remButton, (3,2), span=(1,1))
		sizer.Add(self.sliceButton, (4,1), span=(1,1))
		sizer.Add(self.autoPlaceButton, (4,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)
		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.scaleCtrl = wx.TextCtrl(panel, -1, '')
		self.rotateCtrl = wx.SpinCtrl(panel, -1, '', size=(21*4,21), style=wx.SP_ARROW_KEYS)
		self.rotateCtrl.SetRange(0, 360)

		sizer.Add(wx.StaticText(panel, -1, 'Scale'), (0,0), flag=wx.ALIGN_CENTER_VERTICAL)
		sizer.Add(self.scaleCtrl, (0,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
		sizer.Add(wx.StaticText(panel, -1, 'Rotate'), (1,0), flag=wx.ALIGN_CENTER_VERTICAL)
		sizer.Add(self.rotateCtrl, (1,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)

		if int(profile.getPreference('extruder_amount')) > 1:
			self.extruderCtrl = wx.ComboBox(panel, -1, '1', choices=map(str, range(1, int(profile.getPreference('extruder_amount'))+1)), style=wx.CB_DROPDOWN|wx.CB_READONLY)
			sizer.Add(wx.StaticText(panel, -1, 'Extruder'), (2,0), flag=wx.ALIGN_CENTER_VERTICAL)
			sizer.Add(self.extruderCtrl, (2,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
			self.extruderCtrl.Bind(wx.EVT_COMBOBOX, self.OnExtruderChange)

		self.scaleCtrl.Bind(wx.EVT_TEXT, self.OnScaleChange)
		self.rotateCtrl.Bind(wx.EVT_SPINCTRL, self.OnRotateChange)

		self.SetSize((800,600))
Esempio n. 14
0
def getProfileInformation():
	return {
		'carve': {
			'Add_Layer_Template_to_SVG': DEFSET,
			'Edge_Width_mm': calculateEdgeWidth,
			'Extra_Decimal_Places_float': DEFSET,
			'Import_Coarseness_ratio': DEFSET,
			'Layer_Height_mm': storedSettingFloat("layer_height"),
			'Layers_From_index': calcLayerSkip,
			'Layers_To_index': DEFSET,
			'Correct_Mesh': DEFSET,
			'Unproven_Mesh': DEFSET,
			'SVG_Viewer': DEFSET,
			'FlipX': storedSetting("flip_x"),
			'FlipY': storedSetting("flip_y"),
			'FlipZ': storedSetting("flip_z"),
			'SwapXZ': storedSetting("swap_xz"),
			'SwapYZ': storedSetting("swap_yz"),
			'Scale': storedSettingFloat("model_scale"),
			'Rotate': storedSettingFloat("model_rotate_base"),
			'CenterX': storedSettingFloat("machine_center_x"),
			'CenterY': storedSettingFloat("machine_center_y"),
			'AlternativeCenterFile': storedSetting("alternative_center"),
		},'scale': {
			'Activate_Scale': "False",
			'XY_Plane_Scale_ratio': DEFSET,
			'Z_Axis_Scale_ratio': DEFSET,
			'SVG_Viewer': DEFSET,
		},'bottom': {
			'Activate_Bottom': DEFSET,
			'Additional_Height_over_Layer_Thickness_ratio': DEFSET,
			'Altitude_mm': calcExtraBottomThickness,
			'SVG_Viewer': DEFSET,
		},'preface': {
			'Meta': DEFSET,
			'Set_Positioning_to_Absolute': "False",
			'Set_Units_to_Millimeters': "False",
			'Start_at_Home': DEFSET,
			'Turn_Extruder_Off_at_Shut_Down': DEFSET,
			'Turn_Extruder_Off_at_Start_Up': DEFSET,
		},'widen': {
			'Activate_Widen': DEFSET,
			'Widen_Width_over_Edge_Width_ratio': DEFSET,
		},'inset': {
			'Add_Custom_Code_for_Temperature_Reading': "False",
			'Infill_in_Direction_of_Bridge': ifSettingAboveZero('fill_density'),
			'Infill_Width': storedSettingFloat("nozzle_size"),
			'Loop_Order_Choice': DEFSET,
			'Overlap_Removal_Width_over_Perimeter_Width_ratio': DEFSET,
			'Turn_Extruder_Heater_Off_at_Shut_Down': "False",
			'Volume_Fraction_ratio': DEFSET,
		},'fill': {
			'Activate_Fill': "True",
			'Solid_Surface_Top': storedSetting("solid_top"),
			'Override_First_Layer_Sequence': storedSetting("force_first_layer_sequence"),
			'Diaphragm_Period_layers': DEFSET,
			'Diaphragm_Thickness_layers': DEFSET,
			'Extra_Shells_on_Alternating_Solid_Layer_layers': calculateShells,
			'Extra_Shells_on_Base_layers': calculateShellsBase,
			'Extra_Shells_on_Sparse_Layer_layers': calculateShells,
			'Grid_Circle_Separation_over_Perimeter_Width_ratio': DEFSET,
			'Grid_Extra_Overlap_ratio': DEFSET,
			'Grid_Junction_Separation_Band_Height_layers': DEFSET,
			'Grid_Junction_Separation_over_Octogon_Radius_At_End_ratio': DEFSET,
			'Grid_Junction_Separation_over_Octogon_Radius_At_Middle_ratio': DEFSET,
			'Infill_Begin_Rotation_degrees': DEFSET,
			'Infill_Begin_Rotation_Repeat_layers': DEFSET,
			'Infill_Odd_Layer_Extra_Rotation_degrees': DEFSET,
			'Grid_Circular': ifSettingIs('infill_type', 'Grid Circular'),
			'Grid_Hexagonal': ifSettingIs('infill_type', 'Grid Hexagonal'),
			'Grid_Rectangular': ifSettingIs('infill_type', 'Grid Rectangular'),
			'Line': ifSettingIs('infill_type', 'Line'),
			'Infill_Perimeter_Overlap_ratio': storedPercentSetting('fill_overlap'),
			'Infill_Solidity_ratio': storedPercentSetting('fill_density'),
			'Infill_Width': storedSettingFloat("nozzle_size"),
			'Sharpest_Angle_degrees': DEFSET,
			'Solid_Surface_Thickness_layers': calculateSolidLayerCount,
			'Start_From_Choice': DEFSET,
			'Surrounding_Angle_degrees': DEFSET,
			'Thread_Sequence_Choice': storedSetting('sequence'),
		},'multiply': {
			'Activate_Multiply': "False",
			'Center_X_mm': storedSettingFloat("machine_center_x"),
			'Center_Y_mm': storedSettingFloat("machine_center_y"),
			'Number_of_Columns_integer': storedSetting('model_multiply_x'),
			'Number_of_Rows_integer': storedSetting('model_multiply_y'),
			'Reverse_Sequence_every_Odd_Layer': DEFSET,
			'Separation_over_Perimeter_Width_ratio': calculateMultiplyDistance,
		},'speed': {
			'Activate_Speed': "True",
			'Add_Flow_Rate': "True",
			'Bridge_Feed_Rate_Multiplier_ratio': storedPercentSetting('bridge_speed'),
			'Bridge_Flow_Rate_Multiplier_ratio': storedPercentSetting('bridge_speed'),
			'Duty_Cyle_at_Beginning_portion': DEFSET,
			'Duty_Cyle_at_Ending_portion': DEFSET,
			'Feed_Rate_mm/s': storedSettingFloat("print_speed"),
			'Flow_Rate_Setting_float': storedSettingFloat("print_speed"),
			'Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio': firstLayerSpeedRatio,
			'Object_First_Layer_Feed_Rate_Perimeter_Multiplier_ratio': firstLayerSpeedRatio,
			'Object_First_Layer_Feed_Rate_Travel_Multiplier_ratio': firstLayerSpeedRatio,
			'Object_First_Layer_Flow_Rate_Infill_Multiplier_ratio': firstLayerSpeedRatio,
			'Object_First_Layer_Flow_Rate_Perimeter_Multiplier_ratio': firstLayerSpeedRatio,
			'Object_First_Layers_Amount_Of_Layers_For_Speed_Change': DEFSET,
			'Orbital_Feed_Rate_over_Operating_Feed_Rate_ratio': DEFSET,
			'Maximum_Z_Feed_Rate_mm/s': DEFSET,
			'Perimeter_Feed_Rate_Multiplier_ratio': DEFSET,
			'Perimeter_Flow_Rate_Multiplier_ratio': DEFSET,
			'Travel_Feed_Rate_mm/s': storedSettingFloat("travel_speed"),
			'Bottom_layer_flow_rate_ratio': calcBottomLayerFlowRateRatio,
		},'temperature': {
			'Activate_Temperature': DEFSET,#ifSettingAboveZero('print_temperature'),
			'Cooling_Rate_Celcius/second': DEFSET,
			'Heating_Rate_Celcius/second': DEFSET,
			'Base_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Interface_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Object_First_Layer_Infill_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Object_First_Layer_Perimeter_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Object_Next_Layers_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Support_Layers_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
			'Supported_Layers_Temperature_Celcius': DEFSET,#storedSettingFloat("print_temperature"),
		},'raft': {
			'Activate_Raft': "True",
			'Add_Raft,_Elevate_Nozzle,_Orbit': DEFSET,
			'Base_Feed_Rate_Multiplier_ratio': DEFSET,
			'Base_Flow_Rate_Multiplier_ratio': storedPercentSetting('raft_base_material_amount'),
			'Base_Infill_Density_ratio': DEFSET,
			'Base_Layer_Thickness_over_Layer_Thickness': DEFSET,
			'Base_Layers_integer': raftLayerCount,
			'Base_Nozzle_Lift_over_Base_Layer_Thickness_ratio': DEFSET,
			'Initial_Circling': DEFSET,
			'Infill_Overhang_over_Extrusion_Width_ratio': DEFSET,
			'Interface_Feed_Rate_Multiplier_ratio': DEFSET,
			'Interface_Flow_Rate_Multiplier_ratio': storedPercentSetting('raft_interface_material_amount'),
			'Interface_Infill_Density_ratio': DEFSET,
			'Interface_Layer_Thickness_over_Layer_Thickness': DEFSET,
			'Interface_Layers_integer': raftLayerCount,
			'Interface_Nozzle_Lift_over_Interface_Layer_Thickness_ratio': DEFSET,
			'Name_of_Support_End_File': DEFSET,
			'Name_of_Support_Start_File': DEFSET,
			'Operating_Nozzle_Lift_over_Layer_Thickness_ratio': DEFSET,
			'Raft_Additional_Margin_over_Length_%': DEFSET,
			'Raft_Margin_mm': storedSettingFloat('raft_margin'),
			'Support_Cross_Hatch': 'False',
			'Support_Flow_Rate_over_Operating_Flow_Rate_ratio': storedPercentSetting('support_rate'),
			'Support_Gap_over_Perimeter_Extrusion_Width_ratio': calcSupportDistanceRatio,
			'Support_Material_Choice_': storedSetting('support'),
			'Support_Minimum_Angle_degrees': DEFSET,
			'Support_Margin_mm': '3.0',
			'Support_Offset_X_mm': lambda setting: -profile.getPreferenceFloat('extruder_offset_x1') if profile.getProfileSetting('support_dual_extrusion') == 'True' and int(profile.getPreference('extruder_amount')) > 1 else '0',
			'Support_Offset_Y_mm': lambda setting: -profile.getPreferenceFloat('extruder_offset_y1') if profile.getProfileSetting('support_dual_extrusion') == 'True' and int(profile.getPreference('extruder_amount')) > 1 else '0',
		},'skirt': {
			'Skirt_line_count': storedSetting("skirt_line_count"),
			'Convex': "True",
			'Gap_Width_mm': storedSetting("skirt_gap"),
			'Layers_To_index': "1",
		},'joris': {
			'Activate_Joris': storedSetting("joris"),
			'Layers_From_index': calculateSolidLayerCount,
		},'chamber': {
			'Activate_Chamber': "False",
			'Bed_Temperature_Celcius': DEFSET,
			'Bed_Temperature_Begin_Change_Height_mm': DEFSET,
			'Bed_Temperature_End_Change_Height_mm': DEFSET,
			'Bed_Temperature_End_Celcius': DEFSET,
			'Chamber_Temperature_Celcius': DEFSET,
			'Holding_Force_bar': DEFSET,
		},'tower': {
			'Activate_Tower': "False",
			'Extruder_Possible_Collision_Cone_Angle_degrees': DEFSET,
			'Maximum_Tower_Height_layers': DEFSET,
			'Tower_Start_Layer_integer': DEFSET,
		},'jitter': {
			'Activate_Jitter': "False",
			'Jitter_Over_Perimeter_Width_ratio': DEFSET,
		},'clip': {
			'Activate_Clip': "False",
			'Clip_Over_Perimeter_Width_ratio': DEFSET,
			'Maximum_Connection_Distance_Over_Perimeter_Width_ratio': DEFSET,
		},'smooth': {
			'Activate_Smooth': "False",
			'Layers_From_index': DEFSET,
			'Maximum_Shortening_over_Width_float': DEFSET,
		},'stretch': {
			'Activate_Stretch': "False",
			'Cross_Limit_Distance_Over_Perimeter_Width_ratio': DEFSET,
			'Loop_Stretch_Over_Perimeter_Width_ratio': DEFSET,
			'Path_Stretch_Over_Perimeter_Width_ratio': DEFSET,
			'Perimeter_Inside_Stretch_Over_Perimeter_Width_ratio': DEFSET,
			'Perimeter_Outside_Stretch_Over_Perimeter_Width_ratio': DEFSET,
			'Stretch_From_Distance_Over_Perimeter_Width_ratio': DEFSET,
		},'skin': {
			'Activate_Skin': storedSetting("enable_skin"),
			'Horizontal_Infill_Divisions_integer': "1",
			'Horizontal_Perimeter_Divisions_integer': "1",
			'Vertical_Divisions_integer': "2",
			'Hop_When_Extruding_Infill': "False",
			'Layers_From_index': "1",
		},'comb': {
			'Activate_Comb': "True",
			'Running_Jump_Space_mm': DEFSET,
		},'cool': {
			'Activate_Cool': "True",
			'Bridge_Cool_Celcius': DEFSET,
			'Cool_Type': DEFSET,
			'Maximum_Cool_Celcius': DEFSET,
			'Minimum_Layer_Time_seconds': storedSettingFloat("cool_min_layer_time"),
			'Minimum_Orbital_Radius_millimeters': DEFSET,
			'Name_of_Cool_End_File': DEFSET,
			'Name_of_Cool_Start_File': DEFSET,
			'Orbital_Outset_millimeters': DEFSET,
			'Turn_Fan_On_at_Beginning': storedSetting("fan_enabled"),
			'Turn_Fan_Off_at_Ending': storedSetting("fan_enabled"),
			'Minimum_feed_rate_mm/s': storedSettingFloat("cool_min_feedrate"),
			'Fan_on_at_layer': storedSettingInt('fan_layer'),
			'Fan_speed_min_%': storedSettingInt('fan_speed'),
			'Fan_speed_max_%': storedSettingInt('fan_speed_max'),
		},'hop': {
			'Activate_Hop': "False",
			'Hop_Over_Layer_Thickness_ratio': DEFSET,
			'Minimum_Hop_Angle_degrees': DEFSET,
		},'wipe': {
			'Activate_Wipe': "False",
			'Arrival_X_mm': DEFSET,
			'Arrival_Y_mm': DEFSET,
			'Arrival_Z_mm': DEFSET,
			'Departure_X_mm': DEFSET,
			'Departure_Y_mm': DEFSET,
			'Departure_Z_mm': DEFSET,
			'Wipe_X_mm': DEFSET,
			'Wipe_Y_mm': DEFSET,
			'Wipe_Z_mm': DEFSET,
			'Wipe_Period_layers': DEFSET,
		},'oozebane': {
			'Activate_Oozebane': "False",
			'After_Startup_Distance_millimeters': DEFSET,
			'Early_Shutdown_Distance_millimeters': DEFSET,
			'Early_Startup_Distance_Constant_millimeters': DEFSET,
			'Early_Startup_Maximum_Distance_millimeters': DEFSET,
			'First_Early_Startup_Distance_millimeters': DEFSET,
			'Minimum_Distance_for_Early_Startup_millimeters': DEFSET,
			'Minimum_Distance_for_Early_Shutdown_millimeters': DEFSET,
			'Slowdown_Startup_Steps_positive_integer': DEFSET,
		},'dwindle': {
			'Activate_Dwindle': "False",
			'End_Rate_Multiplier_ratio': '0.5',
			'Pent_Up_Volume_cubic_millimeters': "0.4",
			'Slowdown_Steps_positive_integer': '5',
			'Slowdown_Volume_cubic_millimeters': "5.0",
		},'splodge': {
			'Activate_Splodge': "False",
			'Initial_Lift_over_Extra_Thickness_ratio': DEFSET,
			'Initial_Splodge_Feed_Rate_mm/s': DEFSET,
			'Operating_Splodge_Feed_Rate_mm/s': DEFSET,
			'Operating_Splodge_Quantity_Length_millimeters': DEFSET,
			'Initial_Splodge_Quantity_Length_millimeters': DEFSET,
			'Operating_Lift_over_Extra_Thickness_ratio': DEFSET,
		},'home': {
			'Activate_Home': "False",
			'Name_of_Home_File': DEFSET,
		},'lash': {
			'Activate_Lash': "False",
			'X_Backlash_mm': DEFSET,
			'Y_Backlash_mm': DEFSET,
		},'fillet': {
			'Activate_Fillet': "False",
			'Arc_Point': DEFSET,
			'Arc_Radius': DEFSET,
			'Arc_Segment': DEFSET,
			'Bevel': DEFSET,
			'Corner_Feed_Rate_Multiplier_ratio': DEFSET,
			'Fillet_Radius_over_Perimeter_Width_ratio': DEFSET,
			'Reversal_Slowdown_Distance_over_Perimeter_Width_ratio': DEFSET,
			'Use_Intermediate_Feed_Rate_in_Corners': DEFSET,
		},'limit': {
			'Activate_Limit': "False",
			'Maximum_Initial_Feed_Rate_mm/s': DEFSET,
		},'unpause': {
			'Activate_Unpause': "False",
			'Delay_milliseconds': DEFSET,
			'Maximum_Speed_ratio': DEFSET,
		},'dimension': {
			'Activate_Dimension': "True",
			'Absolute_Extrusion_Distance': "True",
			'Relative_Extrusion_Distance': "False",
			'Extruder_Retraction_Speed_mm/s': storedSettingFloat('retraction_speed'),
			'Filament_Diameter_mm': storedSettingFloat("filament_diameter"),
			'Filament_Packing_Density_ratio': storedSettingFloat("filament_density"),
			'Maximum_E_Value_before_Reset_float': DEFSET,
			'Minimum_Travel_for_Retraction_millimeters': storedSettingFloat("retraction_min_travel"),
			'Retract_Within_Island': storedSettingInvertBoolean("retract_on_jumps_only"),
			'Retraction_Distance_millimeters': lambda setting: profile.getProfileSettingFloat('retraction_amount') if profile.getProfileSetting('retraction_enable') == 'True' else 0,
			'Restart_Extra_Distance_millimeters': storedSettingFloat('retraction_extra'),
		},'alteration': {
			'Activate_Alteration': storedSetting('add_start_end_gcode'),
			'Name_of_End_File': "end.gcode",
			'Name_of_Start_File': "start.gcode",
			'Remove_Redundant_Mcode': "True",
			'Replace_Variable_with_Setting': DEFSET,
		},'export': {
			'Activate_Export': "True",
			'Add_Descriptive_Extension': DEFSET,
			'Add_Export_Suffix': DEFSET,
			'Add_Profile_Extension': DEFSET,
			'Add_Timestamp_Extension': DEFSET,
			'Also_Send_Output_To': DEFSET,
			'Analyze_Gcode': DEFSET,
			'Comment_Choice': DEFSET,
			'Do_Not_Change_Output': DEFSET,
			'binary_16_byte': DEFSET,
			'gcode_step': DEFSET,
			'gcode_time_segment': DEFSET,
			'gcode_small': DEFSET,
			'File_Extension': storedSetting('gcode_extension'),
			'Name_of_Replace_File': DEFSET,
			'Save_Penultimate_Gcode': "False",
		}
	}
Esempio n. 15
0
def storedPreferenceFloat(name):
	return lambda setting: profile.getPreferenceFloat(name)
Esempio n. 16
0
	def __init__(self, parent):
		super(previewPanel, self).__init__(parent,-1)
		
		self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW))
		self.SetMinSize((440,320))
		
		self.objectList = []
		self.errorList = []
		self.gcode = None
		self.objectsMinV = None
		self.objectsMaxV = None
		self.loadThread = None
		self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height'))
		self.machineCenter = util3d.Vector3(float(profile.getProfileSetting('machine_center_x')), float(profile.getProfileSetting('machine_center_y')), 0)

		self.glCanvas = PreviewGLCanvas(self)
		#Create the popup window
		self.warningPopup = wx.PopupWindow(self, flags=wx.BORDER_SIMPLE)
		self.warningPopup.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_INFOBK))
		self.warningPopup.text = wx.StaticText(self.warningPopup, -1, 'Reset scale, rotation and mirror?')
		self.warningPopup.yesButton = wx.Button(self.warningPopup, -1, 'yes', style=wx.BU_EXACTFIT)
		self.warningPopup.noButton = wx.Button(self.warningPopup, -1, 'no', style=wx.BU_EXACTFIT)
		self.warningPopup.sizer = wx.BoxSizer(wx.HORIZONTAL)
		self.warningPopup.SetSizer(self.warningPopup.sizer)
		self.warningPopup.sizer.Add(self.warningPopup.text, 1, flag=wx.ALL|wx.ALIGN_CENTER_VERTICAL, border=1)
		self.warningPopup.sizer.Add(self.warningPopup.yesButton, 0, flag=wx.EXPAND|wx.ALL, border=1)
		self.warningPopup.sizer.Add(self.warningPopup.noButton, 0, flag=wx.EXPAND|wx.ALL, border=1)
		self.warningPopup.Fit()
		self.warningPopup.Layout()
		self.warningPopup.timer = wx.Timer(self)
		self.Bind(wx.EVT_TIMER, self.OnHideWarning, self.warningPopup.timer)
		
		self.Bind(wx.EVT_BUTTON, self.OnResetAll, self.warningPopup.yesButton)
		self.Bind(wx.EVT_BUTTON, self.OnHideWarning, self.warningPopup.noButton)
		parent.Bind(wx.EVT_MOVE, self.OnMove)
		parent.Bind(wx.EVT_SIZE, self.OnMove)
		
		self.toolbar = toolbarUtil.Toolbar(self)

		group = []
		toolbarUtil.RadioButton(self.toolbar, group, 'object-3d-on.png', 'object-3d-off.png', '3D view', callback=self.On3DClick)
		toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick)
		self.toolbar.AddSeparator()

		self.showBorderButton = toolbarUtil.ToggleButton(self.toolbar, '', 'view-border-on.png', 'view-border-off.png', 'Show model borders', callback=self.OnViewChange)
		self.toolbar.AddSeparator()

		group = []
		self.normalViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-normal-on.png', 'view-normal-off.png', 'Normal model view', callback=self.OnViewChange)
		self.transparentViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-transparent-on.png', 'view-transparent-off.png', 'Transparent model view', callback=self.OnViewChange)
		self.xrayViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-xray-on.png', 'view-xray-off.png', 'X-Ray view', callback=self.OnViewChange)
		self.gcodeViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-gcode-on.png', 'view-gcode-off.png', 'GCode view', callback=self.OnViewChange)
		self.mixedViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-mixed-on.png', 'view-mixed-off.png', 'Mixed model/GCode view', callback=self.OnViewChange)
		self.toolbar.AddSeparator()

		self.layerSpin = wx.SpinCtrl(self.toolbar, -1, '', size=(21*4,21), style=wx.SP_ARROW_KEYS)
		self.toolbar.AddControl(self.layerSpin)
		self.Bind(wx.EVT_SPINCTRL, self.OnLayerNrChange, self.layerSpin)

		self.toolbar2 = toolbarUtil.Toolbar(self)

		# Mirror
		self.mirrorX = toolbarUtil.ToggleButton(self.toolbar2, 'flip_x', 'object-mirror-x-on.png', 'object-mirror-x-off.png', 'Mirror X', callback=self.updateModelTransform)
		self.mirrorY = toolbarUtil.ToggleButton(self.toolbar2, 'flip_y', 'object-mirror-y-on.png', 'object-mirror-y-off.png', 'Mirror Y', callback=self.updateModelTransform)
		self.mirrorZ = toolbarUtil.ToggleButton(self.toolbar2, 'flip_z', 'object-mirror-z-on.png', 'object-mirror-z-off.png', 'Mirror Z', callback=self.updateModelTransform)
		self.toolbar2.AddSeparator()

		# Swap
		self.swapXZ = toolbarUtil.ToggleButton(self.toolbar2, 'swap_xz', 'object-swap-xz-on.png', 'object-swap-xz-off.png', 'Swap XZ', callback=self.updateModelTransform)
		self.swapYZ = toolbarUtil.ToggleButton(self.toolbar2, 'swap_yz', 'object-swap-yz-on.png', 'object-swap-yz-off.png', 'Swap YZ', callback=self.updateModelTransform)
		self.toolbar2.AddSeparator()

		# Scale
		self.scaleReset = toolbarUtil.NormalButton(self.toolbar2, self.OnScaleReset, 'object-scale.png', 'Reset model scale')
		self.scale = wx.TextCtrl(self.toolbar2, -1, profile.getProfileSetting('model_scale'), size=(21*2,21))
		self.toolbar2.AddControl(self.scale)
		self.scale.Bind(wx.EVT_TEXT, self.OnScale)
		self.scaleMax = toolbarUtil.NormalButton(self.toolbar2, self.OnScaleMax, 'object-max-size.png', 'Scale object to fit machine size')

		self.toolbar2.AddSeparator()

		# Multiply
		#self.mulXadd = toolbarUtil.NormalButton(self.toolbar2, self.OnMulXAddClick, 'object-mul-x-add.png', 'Increase number of models on X axis')
		#self.mulXsub = toolbarUtil.NormalButton(self.toolbar2, self.OnMulXSubClick, 'object-mul-x-sub.png', 'Decrease number of models on X axis')
		#self.mulYadd = toolbarUtil.NormalButton(self.toolbar2, self.OnMulYAddClick, 'object-mul-y-add.png', 'Increase number of models on Y axis')
		#self.mulYsub = toolbarUtil.NormalButton(self.toolbar2, self.OnMulYSubClick, 'object-mul-y-sub.png', 'Decrease number of models on Y axis')
		#self.toolbar2.AddSeparator()

		# Rotate
		self.rotateReset = toolbarUtil.NormalButton(self.toolbar2, self.OnRotateReset, 'object-rotate.png', 'Reset model rotation')
		self.rotate = wx.SpinCtrl(self.toolbar2, -1, profile.getProfileSetting('model_rotate_base'), size=(21*3,21), style=wx.SP_WRAP|wx.SP_ARROW_KEYS)
		self.rotate.SetRange(0, 360)
		self.rotate.Bind(wx.EVT_TEXT, self.OnRotate)
		self.toolbar2.AddControl(self.rotate)

		self.toolbar2.Realize()
		self.OnViewChange()
		
		sizer = wx.BoxSizer(wx.VERTICAL)
		sizer.Add(self.toolbar, 0, flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT, border=1)
		sizer.Add(self.glCanvas, 1, flag=wx.EXPAND)
		sizer.Add(self.toolbar2, 0, flag=wx.EXPAND|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=1)
		self.SetSizer(sizer)
Esempio n. 17
0
	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.SetIcon(icon.getMainIcon())
		
		self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles, meshLoader.supportedExtensions()))
		
		self.list = []
		self.selection = None
		self.printMode = 0
		self.alwaysAutoPlace = 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()

		self.toolbar3 = toolbarUtil.Toolbar(self.panel)
		self.mirrorX = toolbarUtil.ToggleButton(self.toolbar3, 'flip_x', 'object-mirror-x-on.png', 'object-mirror-x-off.png', 'Mirror X', callback=self.OnMirrorChange)
		self.mirrorY = toolbarUtil.ToggleButton(self.toolbar3, 'flip_y', 'object-mirror-y-on.png', 'object-mirror-y-off.png', 'Mirror Y', callback=self.OnMirrorChange)
		self.mirrorZ = toolbarUtil.ToggleButton(self.toolbar3, 'flip_z', 'object-mirror-z-on.png', 'object-mirror-z-off.png', 'Mirror Z', callback=self.OnMirrorChange)
		self.toolbar3.AddSeparator()

		# Swap
		self.swapXZ = toolbarUtil.ToggleButton(self.toolbar3, 'swap_xz', 'object-swap-xz-on.png', 'object-swap-xz-off.png', 'Swap XZ', callback=self.OnMirrorChange)
		self.swapYZ = toolbarUtil.ToggleButton(self.toolbar3, 'swap_yz', 'object-swap-yz-on.png', 'object-swap-yz-off.png', 'Swap YZ', callback=self.OnMirrorChange)
		self.toolbar3.Realize()
		
		sizer = wx.GridBagSizer(2,2)
		self.panel.SetSizer(sizer)
		self.preview = 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.preview, (1,0), span=(5,1), flag=wx.EXPAND)
		sizer.Add(self.listbox, (1,1), span=(1,2), flag=wx.EXPAND)
		sizer.Add(self.toolbar3, (2,1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
		sizer.Add(self.addButton, (3,1), span=(1,1))
		sizer.Add(self.remButton, (3,2), span=(1,1))
		sizer.Add(self.sliceButton, (4,1), span=(1,1))
		if not self.alwaysAutoPlace:
			sizer.Add(self.autoPlaceButton, (4,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.scaleCtrl = wx.TextCtrl(panel, -1, '')
		self.rotateCtrl = wx.SpinCtrl(panel, -1, '', size=(21*4,21), style=wx.SP_ARROW_KEYS)
		self.rotateCtrl.SetRange(0, 360)

		sizer.Add(wx.StaticText(panel, -1, 'Scale'), (0,0), flag=wx.ALIGN_CENTER_VERTICAL)
		sizer.Add(self.scaleCtrl, (0,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
		sizer.Add(wx.StaticText(panel, -1, 'Rotate'), (1,0), flag=wx.ALIGN_CENTER_VERTICAL)
		sizer.Add(self.rotateCtrl, (1,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)

		if int(profile.getPreference('extruder_amount')) > 1:
			self.extruderCtrl = wx.ComboBox(panel, -1, '1', choices=map(str, range(1, int(profile.getPreference('extruder_amount'))+1)), style=wx.CB_DROPDOWN|wx.CB_READONLY)
			sizer.Add(wx.StaticText(panel, -1, 'Extruder'), (2,0), flag=wx.ALIGN_CENTER_VERTICAL)
			sizer.Add(self.extruderCtrl, (2,1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
			self.extruderCtrl.Bind(wx.EVT_COMBOBOX, self.OnExtruderChange)

		self.scaleCtrl.Bind(wx.EVT_TEXT, self.OnScaleChange)
		self.rotateCtrl.Bind(wx.EVT_SPINCTRL, self.OnRotateChange)

		self.SetSize((800,600))
Esempio n. 18
0
def getSliceCommand(filename):
	if profile.getPreference('slicer').startswith('Slic3r') and getSlic3rExe() != False:
		slic3rExe = getSlic3rExe()
		if slic3rExe == False:
			return False
		cmd = [slic3rExe,
			'--output-filename-format', '[input_filename_base].gcode',
			'--nozzle-diameter', str(profile.calculateEdgeWidth()),
			'--print-center', '%s,%s' % (profile.getPreferenceFloat('machine_width') / 2, profile.getPreferenceFloat('machine_depth') / 2),
			'--z-offset', '0',
			'--gcode-flavor', 'reprap',
			'--gcode-comments',
			'--filament-diameter', profile.getProfileSetting('filament_diameter'),
			'--extrusion-multiplier', str(1.0 / float(profile.getProfileSetting('filament_density'))),
			'--temperature', profile.getProfileSetting('print_temperature'),
			'--travel-speed', profile.getProfileSetting('travel_speed'),
			'--perimeter-speed', profile.getProfileSetting('print_speed'),
			'--small-perimeter-speed', profile.getProfileSetting('print_speed'),
			'--infill-speed', profile.getProfileSetting('print_speed'),
			'--solid-infill-speed', profile.getProfileSetting('print_speed'),
			'--bridge-speed', profile.getProfileSetting('print_speed'),
			'--bottom-layer-speed-ratio', str(float(profile.getProfileSetting('bottom_layer_speed')) / float(profile.getProfileSetting('print_speed'))),
			'--layer-height', profile.getProfileSetting('layer_height'),
			'--first-layer-height-ratio', '1.0',
			'--infill-every-layers', '1',
			'--perimeters', str(profile.calculateLineCount()),
			'--solid-layers', str(profile.calculateSolidLayerCount()),
			'--fill-density', str(float(profile.getProfileSetting('fill_density'))/100),
			'--fill-angle', '45',
			'--fill-pattern', 'rectilinear', #rectilinear line concentric hilbertcurve archimedeanchords octagramspiral
			'--solid-fill-pattern', 'rectilinear',
			'--start-gcode', profile.getAlterationFilePath('start.gcode'),
			'--end-gcode', profile.getAlterationFilePath('end.gcode'),
			'--retract-length', profile.getProfileSetting('retraction_amount'),
			'--retract-speed', str(int(float(profile.getProfileSetting('retraction_speed')))),
			'--retract-restart-extra', profile.getProfileSetting('retraction_extra'),
			'--retract-before-travel', profile.getProfileSetting('retraction_min_travel'),
			'--retract-lift', '0',
			'--slowdown-below-layer-time', profile.getProfileSetting('cool_min_layer_time'),
			'--min-print-speed', profile.getProfileSetting('cool_min_feedrate'),
			'--skirts', profile.getProfileSetting('skirt_line_count'),
			'--skirt-distance', str(int(float(profile.getProfileSetting('skirt_gap')))),
			'--skirt-height', '1',
			'--scale', profile.getProfileSetting('model_scale'),
			'--rotate', profile.getProfileSetting('model_rotate_base'),
			'--duplicate-x', profile.getProfileSetting('model_multiply_x'),
			'--duplicate-y', profile.getProfileSetting('model_multiply_y'),
			'--duplicate-distance', '10']
		if profile.getProfileSetting('support') != 'None':
			cmd.extend(['--support-material'])
		cmd.extend([filename])
		return cmd
	else:
		pypyExe = getPyPyExe()
		if pypyExe == False:
			pypyExe = sys.executable
		
		#In case we have a frozen exe, then argv[0] points to the executable, but we want to give pypy a real script file.
		#if hasattr(sys, 'frozen'):
		#	mainScriptFile = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../..", "cura_sf.zip"))
		#else:
		#	mainScriptFile = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", os.path.split(sys.argv[0])[1]))
		cmd = [pypyExe, '-m', 'cura', '-p', profile.getGlobalProfileString(), '-s']
		if platform.system() == "Windows":
			try:
				cmd.append(str(filename))
			except UnicodeEncodeError:
				cmd.append("#UTF8#" + filename.encode("utf-8"))
		else:
			cmd.append(filename)
		return cmd
Esempio n. 19
0
    def __init__(self, parent):
        super(previewPanel, self).__init__(parent, -1)

        self.SetBackgroundColour(
            wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW))
        self.SetMinSize((440, 320))

        self.objectList = []
        self.errorList = []
        self.gcode = None
        self.objectsMinV = None
        self.objectsMaxV = None
        self.loadThread = None
        self.machineSize = util3d.Vector3(
            profile.getPreferenceFloat('machine_width'),
            profile.getPreferenceFloat('machine_depth'),
            profile.getPreferenceFloat('machine_height'))
        self.machineCenter = util3d.Vector3(
            float(profile.getProfileSetting('machine_center_x')),
            float(profile.getProfileSetting('machine_center_y')), 0)

        self.glCanvas = PreviewGLCanvas(self)
        #Create the popup window
        self.warningPopup = wx.PopupWindow(self, flags=wx.BORDER_SIMPLE)
        self.warningPopup.SetBackgroundColour(
            wx.SystemSettings.GetColour(wx.SYS_COLOUR_INFOBK))
        self.warningPopup.text = wx.StaticText(
            self.warningPopup, -1, 'Reset scale, rotation and mirror?')
        self.warningPopup.yesButton = wx.Button(self.warningPopup,
                                                -1,
                                                'yes',
                                                style=wx.BU_EXACTFIT)
        self.warningPopup.noButton = wx.Button(self.warningPopup,
                                               -1,
                                               'no',
                                               style=wx.BU_EXACTFIT)
        self.warningPopup.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.warningPopup.SetSizer(self.warningPopup.sizer)
        self.warningPopup.sizer.Add(self.warningPopup.text,
                                    1,
                                    flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
                                    border=1)
        self.warningPopup.sizer.Add(self.warningPopup.yesButton,
                                    0,
                                    flag=wx.EXPAND | wx.ALL,
                                    border=1)
        self.warningPopup.sizer.Add(self.warningPopup.noButton,
                                    0,
                                    flag=wx.EXPAND | wx.ALL,
                                    border=1)
        self.warningPopup.Fit()
        self.warningPopup.Layout()
        self.warningPopup.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnHideWarning, self.warningPopup.timer)

        self.Bind(wx.EVT_BUTTON, self.OnResetAll, self.warningPopup.yesButton)
        self.Bind(wx.EVT_BUTTON, self.OnHideWarning,
                  self.warningPopup.noButton)
        parent.Bind(wx.EVT_MOVE, self.OnMove)
        parent.Bind(wx.EVT_SIZE, self.OnMove)

        self.toolbar = toolbarUtil.Toolbar(self)

        group = []
        toolbarUtil.RadioButton(self.toolbar,
                                group,
                                'object-3d-on.png',
                                'object-3d-off.png',
                                '3D view',
                                callback=self.On3DClick)
        toolbarUtil.RadioButton(self.toolbar,
                                group,
                                'object-top-on.png',
                                'object-top-off.png',
                                'Topdown view',
                                callback=self.OnTopClick)
        self.toolbar.AddSeparator()

        self.showBorderButton = toolbarUtil.ToggleButton(
            self.toolbar,
            '',
            'view-border-on.png',
            'view-border-off.png',
            'Show model borders',
            callback=self.OnViewChange)
        self.toolbar.AddSeparator()

        group = []
        self.normalViewButton = toolbarUtil.RadioButton(
            self.toolbar,
            group,
            'view-normal-on.png',
            'view-normal-off.png',
            'Normal model view',
            callback=self.OnViewChange)
        self.transparentViewButton = toolbarUtil.RadioButton(
            self.toolbar,
            group,
            'view-transparent-on.png',
            'view-transparent-off.png',
            'Transparent model view',
            callback=self.OnViewChange)
        self.xrayViewButton = toolbarUtil.RadioButton(
            self.toolbar,
            group,
            'view-xray-on.png',
            'view-xray-off.png',
            'X-Ray view',
            callback=self.OnViewChange)
        self.gcodeViewButton = toolbarUtil.RadioButton(
            self.toolbar,
            group,
            'view-gcode-on.png',
            'view-gcode-off.png',
            'GCode view',
            callback=self.OnViewChange)
        self.mixedViewButton = toolbarUtil.RadioButton(
            self.toolbar,
            group,
            'view-mixed-on.png',
            'view-mixed-off.png',
            'Mixed model/GCode view',
            callback=self.OnViewChange)
        self.toolbar.AddSeparator()

        self.layerSpin = wx.SpinCtrl(self.toolbar,
                                     -1,
                                     '',
                                     size=(21 * 4, 21),
                                     style=wx.SP_ARROW_KEYS)
        self.toolbar.AddControl(self.layerSpin)
        self.Bind(wx.EVT_SPINCTRL, self.OnLayerNrChange, self.layerSpin)

        self.toolbar2 = toolbarUtil.Toolbar(self)

        # Mirror
        self.mirrorX = toolbarUtil.ToggleButton(
            self.toolbar2,
            'flip_x',
            'object-mirror-x-on.png',
            'object-mirror-x-off.png',
            'Mirror X',
            callback=self.updateModelTransform)
        self.mirrorY = toolbarUtil.ToggleButton(
            self.toolbar2,
            'flip_y',
            'object-mirror-y-on.png',
            'object-mirror-y-off.png',
            'Mirror Y',
            callback=self.updateModelTransform)
        self.mirrorZ = toolbarUtil.ToggleButton(
            self.toolbar2,
            'flip_z',
            'object-mirror-z-on.png',
            'object-mirror-z-off.png',
            'Mirror Z',
            callback=self.updateModelTransform)
        self.toolbar2.AddSeparator()

        # Swap
        self.swapXZ = toolbarUtil.ToggleButton(
            self.toolbar2,
            'swap_xz',
            'object-swap-xz-on.png',
            'object-swap-xz-off.png',
            'Swap XZ',
            callback=self.updateModelTransform)
        self.swapYZ = toolbarUtil.ToggleButton(
            self.toolbar2,
            'swap_yz',
            'object-swap-yz-on.png',
            'object-swap-yz-off.png',
            'Swap YZ',
            callback=self.updateModelTransform)
        self.toolbar2.AddSeparator()

        # Scale
        self.scaleReset = toolbarUtil.NormalButton(self.toolbar2,
                                                   self.OnScaleReset,
                                                   'object-scale.png',
                                                   'Reset model scale')
        self.scale = wx.TextCtrl(self.toolbar2,
                                 -1,
                                 profile.getProfileSetting('model_scale'),
                                 size=(21 * 2, 21))
        self.toolbar2.AddControl(self.scale)
        self.scale.Bind(wx.EVT_TEXT, self.OnScale)
        self.scaleMax = toolbarUtil.NormalButton(
            self.toolbar2, self.OnScaleMax, 'object-max-size.png',
            'Scale object to fit machine size')

        self.toolbar2.AddSeparator()

        # Multiply
        #self.mulXadd = toolbarUtil.NormalButton(self.toolbar2, self.OnMulXAddClick, 'object-mul-x-add.png', 'Increase number of models on X axis')
        #self.mulXsub = toolbarUtil.NormalButton(self.toolbar2, self.OnMulXSubClick, 'object-mul-x-sub.png', 'Decrease number of models on X axis')
        #self.mulYadd = toolbarUtil.NormalButton(self.toolbar2, self.OnMulYAddClick, 'object-mul-y-add.png', 'Increase number of models on Y axis')
        #self.mulYsub = toolbarUtil.NormalButton(self.toolbar2, self.OnMulYSubClick, 'object-mul-y-sub.png', 'Decrease number of models on Y axis')
        #self.toolbar2.AddSeparator()

        # Rotate
        self.rotateReset = toolbarUtil.NormalButton(self.toolbar2,
                                                    self.OnRotateReset,
                                                    'object-rotate.png',
                                                    'Reset model rotation')
        self.rotate = wx.SpinCtrl(
            self.toolbar2,
            -1,
            profile.getProfileSetting('model_rotate_base'),
            size=(21 * 3, 21),
            style=wx.SP_WRAP | wx.SP_ARROW_KEYS)
        self.rotate.SetRange(0, 360)
        self.rotate.Bind(wx.EVT_TEXT, self.OnRotate)
        self.toolbar2.AddControl(self.rotate)

        self.toolbar2.Realize()
        self.OnViewChange()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.toolbar,
                  0,
                  flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT,
                  border=1)
        sizer.Add(self.glCanvas, 1, flag=wx.EXPAND)
        sizer.Add(self.toolbar2,
                  0,
                  flag=wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT,
                  border=1)
        self.SetSizer(sizer)
Esempio n. 20
0
def getProfileInformation():
    return {
        "carve": {
            "Add_Layer_Template_to_SVG": DEFSET,
            "Edge_Width_mm": calculateEdgeWidth,
            "Extra_Decimal_Places_float": DEFSET,
            "Import_Coarseness_ratio": DEFSET,
            "Layer_Height_mm": storedSettingFloat("layer_height"),
            "Layers_From_index": calcLayerSkip,
            "Layers_To_index": DEFSET,
            "Correct_Mesh": DEFSET,
            "Unproven_Mesh": DEFSET,
            "SVG_Viewer": DEFSET,
            "FlipX": storedSetting("flip_x"),
            "FlipY": storedSetting("flip_y"),
            "FlipZ": storedSetting("flip_z"),
            "SwapXZ": storedSetting("swap_xz"),
            "SwapYZ": storedSetting("swap_yz"),
            "Scale": storedSettingFloat("model_scale"),
            "Rotate": storedSettingFloat("model_rotate_base"),
            "CenterX": storedSettingFloat("machine_center_x"),
            "CenterY": storedSettingFloat("machine_center_y"),
            "AlternativeCenterFile": storedSetting("alternative_center"),
        },
        "scale": {
            "Activate_Scale": "False",
            "XY_Plane_Scale_ratio": DEFSET,
            "Z_Axis_Scale_ratio": DEFSET,
            "SVG_Viewer": DEFSET,
        },
        "bottom": {
            "Activate_Bottom": DEFSET,
            "Additional_Height_over_Layer_Thickness_ratio": DEFSET,
            "Altitude_mm": calcExtraBottomThickness,
            "SVG_Viewer": DEFSET,
        },
        "preface": {
            "Meta": DEFSET,
            "Set_Positioning_to_Absolute": "False",
            "Set_Units_to_Millimeters": "False",
            "Start_at_Home": DEFSET,
            "Turn_Extruder_Off_at_Shut_Down": DEFSET,
            "Turn_Extruder_Off_at_Start_Up": DEFSET,
        },
        "widen": {"Activate_Widen": DEFSET, "Widen_Width_over_Edge_Width_ratio": DEFSET},
        "inset": {
            "Add_Custom_Code_for_Temperature_Reading": "False",
            "Infill_in_Direction_of_Bridge": ifSettingAboveZero("fill_density"),
            "Infill_Width": storedSettingFloat("nozzle_size"),
            "Loop_Order_Choice": DEFSET,
            "Overlap_Removal_Width_over_Perimeter_Width_ratio": DEFSET,
            "Turn_Extruder_Heater_Off_at_Shut_Down": "False",
            "Volume_Fraction_ratio": DEFSET,
        },
        "fill": {
            "Activate_Fill": "True",
            "Solid_Surface_Top": storedSetting("solid_top"),
            "Override_First_Layer_Sequence": storedSetting("force_first_layer_sequence"),
            "Diaphragm_Period_layers": DEFSET,
            "Diaphragm_Thickness_layers": DEFSET,
            "Extra_Shells_on_Alternating_Solid_Layer_layers": calculateShells,
            "Extra_Shells_on_Base_layers": calculateShellsBase,
            "Extra_Shells_on_Sparse_Layer_layers": calculateShells,
            "Grid_Circle_Separation_over_Perimeter_Width_ratio": DEFSET,
            "Grid_Extra_Overlap_ratio": DEFSET,
            "Grid_Junction_Separation_Band_Height_layers": DEFSET,
            "Grid_Junction_Separation_over_Octogon_Radius_At_End_ratio": DEFSET,
            "Grid_Junction_Separation_over_Octogon_Radius_At_Middle_ratio": DEFSET,
            "Infill_Begin_Rotation_degrees": DEFSET,
            "Infill_Begin_Rotation_Repeat_layers": DEFSET,
            "Infill_Odd_Layer_Extra_Rotation_degrees": DEFSET,
            "Grid_Circular": ifSettingIs("infill_type", "Grid Circular"),
            "Grid_Hexagonal": ifSettingIs("infill_type", "Grid Hexagonal"),
            "Grid_Rectangular": ifSettingIs("infill_type", "Grid Rectangular"),
            "Line": ifSettingIs("infill_type", "Line"),
            "Infill_Perimeter_Overlap_ratio": storedPercentSetting("fill_overlap"),
            "Infill_Solidity_ratio": storedPercentSetting("fill_density"),
            "Infill_Width": storedSettingFloat("nozzle_size"),
            "Sharpest_Angle_degrees": DEFSET,
            "Solid_Surface_Thickness_layers": calculateSolidLayerCount,
            "Start_From_Choice": DEFSET,
            "Surrounding_Angle_degrees": DEFSET,
            "Thread_Sequence_Choice": storedSetting("sequence"),
        },
        "multiply": {
            "Activate_Multiply": "False",
            "Center_X_mm": storedSettingFloat("machine_center_x"),
            "Center_Y_mm": storedSettingFloat("machine_center_y"),
            "Number_of_Columns_integer": storedSetting("model_multiply_x"),
            "Number_of_Rows_integer": storedSetting("model_multiply_y"),
            "Reverse_Sequence_every_Odd_Layer": DEFSET,
            "Separation_over_Perimeter_Width_ratio": calculateMultiplyDistance,
        },
        "speed": {
            "Activate_Speed": "True",
            "Add_Flow_Rate": "True",
            "Bridge_Feed_Rate_Multiplier_ratio": storedPercentSetting("bridge_speed"),
            "Bridge_Flow_Rate_Multiplier_ratio": storedPercentSetting("bridge_speed"),
            "Duty_Cyle_at_Beginning_portion": DEFSET,
            "Duty_Cyle_at_Ending_portion": DEFSET,
            "Feed_Rate_mm/s": storedSettingFloat("print_speed"),
            "Flow_Rate_Setting_float": storedSettingFloat("print_speed"),
            "Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio": firstLayerSpeedRatio,
            "Object_First_Layer_Feed_Rate_Perimeter_Multiplier_ratio": firstLayerSpeedRatio,
            "Object_First_Layer_Feed_Rate_Travel_Multiplier_ratio": firstLayerSpeedRatio,
            "Object_First_Layer_Flow_Rate_Infill_Multiplier_ratio": firstLayerSpeedRatio,
            "Object_First_Layer_Flow_Rate_Perimeter_Multiplier_ratio": firstLayerSpeedRatio,
            "Object_First_Layers_Amount_Of_Layers_For_Speed_Change": DEFSET,
            "Orbital_Feed_Rate_over_Operating_Feed_Rate_ratio": DEFSET,
            "Maximum_Z_Feed_Rate_mm/s": DEFSET,
            "Perimeter_Feed_Rate_Multiplier_ratio": DEFSET,
            "Perimeter_Flow_Rate_Multiplier_ratio": DEFSET,
            "Travel_Feed_Rate_mm/s": storedSettingFloat("travel_speed"),
            "Bottom_layer_flow_rate_ratio": calcBottomLayerFlowRateRatio,
        },
        "temperature": {
            "Activate_Temperature": DEFSET,  # ifSettingAboveZero('print_temperature'),
            "Cooling_Rate_Celcius/second": DEFSET,
            "Heating_Rate_Celcius/second": DEFSET,
            "Base_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Interface_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Object_First_Layer_Infill_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Object_First_Layer_Perimeter_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Object_Next_Layers_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Support_Layers_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
            "Supported_Layers_Temperature_Celcius": DEFSET,  # storedSettingFloat("print_temperature"),
        },
        "raft": {
            "Activate_Raft": "True",
            "Add_Raft,_Elevate_Nozzle,_Orbit": DEFSET,
            "Base_Feed_Rate_Multiplier_ratio": DEFSET,
            "Base_Flow_Rate_Multiplier_ratio": storedPercentSetting("raft_base_material_amount"),
            "Base_Infill_Density_ratio": DEFSET,
            "Base_Layer_Thickness_over_Layer_Thickness": DEFSET,
            "Base_Layers_integer": raftLayerCount,
            "Base_Nozzle_Lift_over_Base_Layer_Thickness_ratio": DEFSET,
            "Initial_Circling": DEFSET,
            "Infill_Overhang_over_Extrusion_Width_ratio": DEFSET,
            "Interface_Feed_Rate_Multiplier_ratio": DEFSET,
            "Interface_Flow_Rate_Multiplier_ratio": storedPercentSetting("raft_interface_material_amount"),
            "Interface_Infill_Density_ratio": DEFSET,
            "Interface_Layer_Thickness_over_Layer_Thickness": DEFSET,
            "Interface_Layers_integer": raftLayerCount,
            "Interface_Nozzle_Lift_over_Interface_Layer_Thickness_ratio": DEFSET,
            "Name_of_Support_End_File": DEFSET,
            "Name_of_Support_Start_File": DEFSET,
            "Operating_Nozzle_Lift_over_Layer_Thickness_ratio": DEFSET,
            "Raft_Additional_Margin_over_Length_%": DEFSET,
            "Raft_Margin_mm": storedSettingFloat("raft_margin"),
            "Support_Cross_Hatch": "False",
            "Support_Flow_Rate_over_Operating_Flow_Rate_ratio": storedPercentSetting("support_rate"),
            "Support_Gap_over_Perimeter_Extrusion_Width_ratio": calcSupportDistanceRatio,
            "Support_Material_Choice_": storedSetting("support"),
            "Support_Minimum_Angle_degrees": DEFSET,
            "Support_Margin_mm": "3.0",
            "Support_Offset_X_mm": lambda setting: -profile.getPreferenceFloat("extruder_offset_x1")
            if profile.getProfileSetting("support_dual_extrusion") == "True"
            and int(profile.getPreference("extruder_amount")) > 1
            else "0",
            "Support_Offset_Y_mm": lambda setting: -profile.getPreferenceFloat("extruder_offset_y1")
            if profile.getProfileSetting("support_dual_extrusion") == "True"
            and int(profile.getPreference("extruder_amount")) > 1
            else "0",
        },
        "skirt": {
            "Skirt_line_count": storedSetting("skirt_line_count"),
            "Convex": "True",
            "Gap_Width_mm": storedSetting("skirt_gap"),
            "Layers_To_index": "1",
        },
        "joris": {"Activate_Joris": storedSetting("joris"), "Layers_From_index": calculateSolidLayerCount},
        "chamber": {
            "Activate_Chamber": "False",
            "Bed_Temperature_Celcius": DEFSET,
            "Bed_Temperature_Begin_Change_Height_mm": DEFSET,
            "Bed_Temperature_End_Change_Height_mm": DEFSET,
            "Bed_Temperature_End_Celcius": DEFSET,
            "Chamber_Temperature_Celcius": DEFSET,
            "Holding_Force_bar": DEFSET,
        },
        "tower": {
            "Activate_Tower": "False",
            "Extruder_Possible_Collision_Cone_Angle_degrees": DEFSET,
            "Maximum_Tower_Height_layers": DEFSET,
            "Tower_Start_Layer_integer": DEFSET,
        },
        "jitter": {"Activate_Jitter": "False", "Jitter_Over_Perimeter_Width_ratio": DEFSET},
        "clip": {
            "Activate_Clip": "False",
            "Clip_Over_Perimeter_Width_ratio": DEFSET,
            "Maximum_Connection_Distance_Over_Perimeter_Width_ratio": DEFSET,
        },
        "smooth": {
            "Activate_Smooth": "False",
            "Layers_From_index": DEFSET,
            "Maximum_Shortening_over_Width_float": DEFSET,
        },
        "stretch": {
            "Activate_Stretch": "False",
            "Cross_Limit_Distance_Over_Perimeter_Width_ratio": DEFSET,
            "Loop_Stretch_Over_Perimeter_Width_ratio": DEFSET,
            "Path_Stretch_Over_Perimeter_Width_ratio": DEFSET,
            "Perimeter_Inside_Stretch_Over_Perimeter_Width_ratio": DEFSET,
            "Perimeter_Outside_Stretch_Over_Perimeter_Width_ratio": DEFSET,
            "Stretch_From_Distance_Over_Perimeter_Width_ratio": DEFSET,
        },
        "skin": {
            "Activate_Skin": storedSetting("enable_skin"),
            "Horizontal_Infill_Divisions_integer": "1",
            "Horizontal_Perimeter_Divisions_integer": "1",
            "Vertical_Divisions_integer": "2",
            "Hop_When_Extruding_Infill": "False",
            "Layers_From_index": "1",
        },
        "comb": {"Activate_Comb": "True", "Running_Jump_Space_mm": DEFSET},
        "cool": {
            "Activate_Cool": "True",
            "Bridge_Cool_Celcius": DEFSET,
            "Cool_Type": DEFSET,
            "Maximum_Cool_Celcius": DEFSET,
            "Minimum_Layer_Time_seconds": storedSettingFloat("cool_min_layer_time"),
            "Minimum_Orbital_Radius_millimeters": DEFSET,
            "Name_of_Cool_End_File": DEFSET,
            "Name_of_Cool_Start_File": DEFSET,
            "Orbital_Outset_millimeters": DEFSET,
            "Turn_Fan_On_at_Beginning": storedSetting("fan_enabled"),
            "Turn_Fan_Off_at_Ending": storedSetting("fan_enabled"),
            "Minimum_feed_rate_mm/s": storedSettingFloat("cool_min_feedrate"),
            "Fan_on_at_layer": storedSettingInt("fan_layer"),
            "Fan_speed_min_%": storedSettingInt("fan_speed"),
            "Fan_speed_max_%": storedSettingInt("fan_speed_max"),
        },
        "hop": {"Activate_Hop": "False", "Hop_Over_Layer_Thickness_ratio": DEFSET, "Minimum_Hop_Angle_degrees": DEFSET},
        "wipe": {
            "Activate_Wipe": "False",
            "Arrival_X_mm": DEFSET,
            "Arrival_Y_mm": DEFSET,
            "Arrival_Z_mm": DEFSET,
            "Departure_X_mm": DEFSET,
            "Departure_Y_mm": DEFSET,
            "Departure_Z_mm": DEFSET,
            "Wipe_X_mm": DEFSET,
            "Wipe_Y_mm": DEFSET,
            "Wipe_Z_mm": DEFSET,
            "Wipe_Period_layers": DEFSET,
        },
        "oozebane": {
            "Activate_Oozebane": "False",
            "After_Startup_Distance_millimeters": DEFSET,
            "Early_Shutdown_Distance_millimeters": DEFSET,
            "Early_Startup_Distance_Constant_millimeters": DEFSET,
            "Early_Startup_Maximum_Distance_millimeters": DEFSET,
            "First_Early_Startup_Distance_millimeters": DEFSET,
            "Minimum_Distance_for_Early_Startup_millimeters": DEFSET,
            "Minimum_Distance_for_Early_Shutdown_millimeters": DEFSET,
            "Slowdown_Startup_Steps_positive_integer": DEFSET,
        },
        "dwindle": {
            "Activate_Dwindle": "False",
            "End_Rate_Multiplier_ratio": "0.5",
            "Pent_Up_Volume_cubic_millimeters": "0.4",
            "Slowdown_Steps_positive_integer": "5",
            "Slowdown_Volume_cubic_millimeters": "5.0",
        },
        "splodge": {
            "Activate_Splodge": "False",
            "Initial_Lift_over_Extra_Thickness_ratio": DEFSET,
            "Initial_Splodge_Feed_Rate_mm/s": DEFSET,
            "Operating_Splodge_Feed_Rate_mm/s": DEFSET,
            "Operating_Splodge_Quantity_Length_millimeters": DEFSET,
            "Initial_Splodge_Quantity_Length_millimeters": DEFSET,
            "Operating_Lift_over_Extra_Thickness_ratio": DEFSET,
        },
        "home": {"Activate_Home": "False", "Name_of_Home_File": DEFSET},
        "lash": {"Activate_Lash": "False", "X_Backlash_mm": DEFSET, "Y_Backlash_mm": DEFSET},
        "fillet": {
            "Activate_Fillet": "False",
            "Arc_Point": DEFSET,
            "Arc_Radius": DEFSET,
            "Arc_Segment": DEFSET,
            "Bevel": DEFSET,
            "Corner_Feed_Rate_Multiplier_ratio": DEFSET,
            "Fillet_Radius_over_Perimeter_Width_ratio": DEFSET,
            "Reversal_Slowdown_Distance_over_Perimeter_Width_ratio": DEFSET,
            "Use_Intermediate_Feed_Rate_in_Corners": DEFSET,
        },
        "limit": {"Activate_Limit": "False", "Maximum_Initial_Feed_Rate_mm/s": DEFSET},
        "unpause": {"Activate_Unpause": "False", "Delay_milliseconds": DEFSET, "Maximum_Speed_ratio": DEFSET},
        "dimension": {
            "Activate_Dimension": "True",
            "Absolute_Extrusion_Distance": "True",
            "Relative_Extrusion_Distance": "False",
            "Extruder_Retraction_Speed_mm/s": storedSettingFloat("retraction_speed"),
            "Filament_Diameter_mm": storedSettingFloat("filament_diameter"),
            "Filament_Packing_Density_ratio": storedSettingFloat("filament_density"),
            "Maximum_E_Value_before_Reset_float": DEFSET,
            "Minimum_Travel_for_Retraction_millimeters": storedSettingFloat("retraction_min_travel"),
            "Retract_Within_Island": storedSettingInvertBoolean("retract_on_jumps_only"),
            "Retraction_Distance_millimeters": storedSettingFloat("retraction_amount"),
            "Restart_Extra_Distance_millimeters": storedSettingFloat("retraction_extra"),
        },
        "alteration": {
            "Activate_Alteration": storedSetting("add_start_end_gcode"),
            "Name_of_End_File": "end.gcode",
            "Name_of_Start_File": "start.gcode",
            "Remove_Redundant_Mcode": "True",
            "Replace_Variable_with_Setting": DEFSET,
        },
        "export": {
            "Activate_Export": "True",
            "Add_Descriptive_Extension": DEFSET,
            "Add_Export_Suffix": DEFSET,
            "Add_Profile_Extension": DEFSET,
            "Add_Timestamp_Extension": DEFSET,
            "Also_Send_Output_To": DEFSET,
            "Analyze_Gcode": DEFSET,
            "Comment_Choice": DEFSET,
            "Do_Not_Change_Output": DEFSET,
            "binary_16_byte": DEFSET,
            "gcode_step": DEFSET,
            "gcode_time_segment": DEFSET,
            "gcode_small": DEFSET,
            "File_Extension": storedSetting("gcode_extension"),
            "Name_of_Replace_File": DEFSET,
            "Save_Penultimate_Gcode": "False",
        },
    }