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()
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()
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()))
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
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 __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)
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()))
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')
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
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)
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))
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", } }
def storedPreferenceFloat(name): return lambda setting: profile.getPreferenceFloat(name)
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)
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))
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
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)
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", }, }