mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-06 08:36:07 +08:00
Fixed the OpenGL window (old implementation caused problems in windows)
Changed the way profiles are loaded/saved/used. This is more flexable, allows for calculations inside the actual settings to SF
This commit is contained in:
parent
a2bbadbc37
commit
86c8bc2288
@ -812,7 +812,7 @@ class TriangleMesh( group.Group ):
|
||||
self.zoneArrangement = ZoneArrangement(self.layerHeight, self.getTransformedVertexes())
|
||||
layerTop = self.cornerMaximum.z - halfHeight * 0.5
|
||||
z = self.cornerMinimum.z + halfHeight
|
||||
layerCount = int((layerTop - z) / self.layerHeight)
|
||||
layerCount = int((layerTop - z) / self.layerHeight) + 1
|
||||
while z < layerTop:
|
||||
getLoopLayerAppend(self.loopLayers, layerCount, z).loops = self.getLoopsFromMesh(self.zoneArrangement.getEmptyZ(z))
|
||||
z += self.layerHeight
|
||||
|
@ -9,299 +9,306 @@ import __init__
|
||||
|
||||
import ConfigParser
|
||||
import os, sys
|
||||
import types
|
||||
|
||||
from fabmetheus_utilities import archive
|
||||
|
||||
def defaultSetting(setting):
|
||||
return setting.value
|
||||
|
||||
def storedSetting(name):
|
||||
return lambda setting: getSetting(name, setting.value)
|
||||
|
||||
def getSkeinPyPyProfileInformation():
|
||||
return {
|
||||
'carve': {
|
||||
'Add_Layer_Template_to_SVG': 'ignore',
|
||||
'Edge_Width_mm': 'save',
|
||||
'Extra_Decimal_Places_float': 'ignore',
|
||||
'Import_Coarseness_ratio': 'ignore',
|
||||
'Layer_Height_mm': 'save',
|
||||
'Layers_From_index': 'ignore',
|
||||
'Layers_To_index': 'ignore',
|
||||
'Correct_Mesh': 'ignore',
|
||||
'Unproven_Mesh': 'ignore',
|
||||
'SVG_Viewer': 'ignore',
|
||||
'Add_Layer_Template_to_SVG': defaultSetting,
|
||||
'Edge_Width_mm': defaultSetting,
|
||||
'Extra_Decimal_Places_float': defaultSetting,
|
||||
'Import_Coarseness_ratio': defaultSetting,
|
||||
'Layer_Height_mm': storedSetting("layer_height"),
|
||||
'Layers_From_index': defaultSetting,
|
||||
'Layers_To_index': defaultSetting,
|
||||
'Correct_Mesh': defaultSetting,
|
||||
'Unproven_Mesh': defaultSetting,
|
||||
'SVG_Viewer': defaultSetting,
|
||||
},'scale': {
|
||||
'Activate_Scale': 'ignore',
|
||||
'XY_Plane_Scale_ratio': 'ignore',
|
||||
'Z_Axis_Scale_ratio': 'ignore',
|
||||
'SVG_Viewer': 'ignore',
|
||||
'Activate_Scale': defaultSetting,
|
||||
'XY_Plane_Scale_ratio': defaultSetting,
|
||||
'Z_Axis_Scale_ratio': defaultSetting,
|
||||
'SVG_Viewer': defaultSetting,
|
||||
},'bottom': {
|
||||
'Activate_Bottom': 'ignore',
|
||||
'Additional_Height_over_Layer_Thickness_ratio': 'ignore',
|
||||
'Altitude_mm': 'ignore',
|
||||
'SVG_Viewer': 'ignore',
|
||||
'Activate_Bottom': defaultSetting,
|
||||
'Additional_Height_over_Layer_Thickness_ratio': defaultSetting,
|
||||
'Altitude_mm': defaultSetting,
|
||||
'SVG_Viewer': defaultSetting,
|
||||
},'preface': {
|
||||
'Meta': 'ignore',
|
||||
'Set_Positioning_to_Absolute': 'ignore',
|
||||
'Set_Units_to_Millimeters': 'ignore',
|
||||
'Start_at_Home': 'ignore',
|
||||
'Turn_Extruder_Off_at_Shut_Down': 'ignore',
|
||||
'Turn_Extruder_Off_at_Start_Up': 'ignore',
|
||||
'Meta': defaultSetting,
|
||||
'Set_Positioning_to_Absolute': defaultSetting,
|
||||
'Set_Units_to_Millimeters': defaultSetting,
|
||||
'Start_at_Home': defaultSetting,
|
||||
'Turn_Extruder_Off_at_Shut_Down': defaultSetting,
|
||||
'Turn_Extruder_Off_at_Start_Up': defaultSetting,
|
||||
},'widen': {
|
||||
'Activate_Widen': 'save',
|
||||
'Activate_Widen': defaultSetting,
|
||||
},'inset': {
|
||||
'Add_Custom_Code_for_Temperature_Reading': 'ignore',
|
||||
'Infill_in_Direction_of_Bridge': 'ignore',
|
||||
'Infill_Width_over_Thickness_ratio': 'ignore',
|
||||
'Loop_Order_Choice': 'ignore',
|
||||
'Overlap_Removal_Width_over_Perimeter_Width_ratio': 'ignore',
|
||||
'Turn_Extruder_Heater_Off_at_Shut_Down': 'ignore',
|
||||
'Volume_Fraction_ratio': 'ignore',
|
||||
'Add_Custom_Code_for_Temperature_Reading': defaultSetting,
|
||||
'Infill_in_Direction_of_Bridge': defaultSetting,
|
||||
'Infill_Width_over_Thickness_ratio': defaultSetting,
|
||||
'Loop_Order_Choice': defaultSetting,
|
||||
'Overlap_Removal_Width_over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Turn_Extruder_Heater_Off_at_Shut_Down': defaultSetting,
|
||||
'Volume_Fraction_ratio': defaultSetting,
|
||||
},'fill': {
|
||||
'Activate_Fill': 'save',
|
||||
'Diaphragm_Period_layers': 'save',
|
||||
'Diaphragm_Thickness_layers': 'save',
|
||||
'Extra_Shells_on_Alternating_Solid_Layer_layers': 'save',
|
||||
'Extra_Shells_on_Base_layers': 'save',
|
||||
'Extra_Shells_on_Sparse_Layer_layers': 'save',
|
||||
'Grid_Circle_Separation_over_Perimeter_Width_ratio': 'ignore',
|
||||
'Grid_Extra_Overlap_ratio': 'ignore',
|
||||
'Grid_Junction_Separation_Band_Height_layers': 'ignore',
|
||||
'Grid_Junction_Separation_over_Octogon_Radius_At_End_ratio': 'ignore',
|
||||
'Grid_Junction_Separation_over_Octogon_Radius_At_Middle_ratio': 'ignore',
|
||||
'Infill_Begin_Rotation_degrees': 'ignore',
|
||||
'Infill_Begin_Rotation_Repeat_layers': 'ignore',
|
||||
'Infill_Odd_Layer_Extra_Rotation_degrees': 'ignore',
|
||||
'Grid_Circular': 'ignore',
|
||||
'Grid_Hexagonal': 'ignore',
|
||||
'Grid_Rectangular': 'ignore',
|
||||
'Line': 'ignore',
|
||||
'Infill_Perimeter_Overlap_ratio': 'save',
|
||||
'Infill_Solidity_ratio': 'save',
|
||||
'Infill_Width': 'use:carve:Edge_Width_mm',
|
||||
'Solid_Surface_Thickness_layers': 'save',
|
||||
'Start_From_Choice': 'ignore',
|
||||
'Surrounding_Angle_degrees': 'ignore',
|
||||
'Thread_Sequence_Choice': 'save',
|
||||
'Activate_Fill': defaultSetting,
|
||||
'Diaphragm_Period_layers': defaultSetting,
|
||||
'Diaphragm_Thickness_layers': defaultSetting,
|
||||
'Extra_Shells_on_Alternating_Solid_Layer_layers': defaultSetting,
|
||||
'Extra_Shells_on_Base_layers': defaultSetting,
|
||||
'Extra_Shells_on_Sparse_Layer_layers': defaultSetting,
|
||||
'Grid_Circle_Separation_over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Grid_Extra_Overlap_ratio': defaultSetting,
|
||||
'Grid_Junction_Separation_Band_Height_layers': defaultSetting,
|
||||
'Grid_Junction_Separation_over_Octogon_Radius_At_End_ratio': defaultSetting,
|
||||
'Grid_Junction_Separation_over_Octogon_Radius_At_Middle_ratio': defaultSetting,
|
||||
'Infill_Begin_Rotation_degrees': defaultSetting,
|
||||
'Infill_Begin_Rotation_Repeat_layers': defaultSetting,
|
||||
'Infill_Odd_Layer_Extra_Rotation_degrees': defaultSetting,
|
||||
'Grid_Circular': defaultSetting,
|
||||
'Grid_Hexagonal': defaultSetting,
|
||||
'Grid_Rectangular': defaultSetting,
|
||||
'Line': defaultSetting,
|
||||
'Infill_Perimeter_Overlap_ratio': defaultSetting,
|
||||
'Infill_Solidity_ratio': defaultSetting,
|
||||
'Infill_Width': defaultSetting,
|
||||
'Solid_Surface_Thickness_layers': defaultSetting,
|
||||
'Start_From_Choice': defaultSetting,
|
||||
'Surrounding_Angle_degrees': defaultSetting,
|
||||
'Thread_Sequence_Choice': defaultSetting,
|
||||
},'multiply': {
|
||||
'Activate_Multiply': 'ignore',
|
||||
'Center_X_mm': 'save',
|
||||
'Center_Y_mm': 'save',
|
||||
'Number_of_Columns_integer': 'save',
|
||||
'Number_of_Rows_integer': 'save',
|
||||
'Reverse_Sequence_every_Odd_Layer': 'ignore',
|
||||
'Separation_over_Perimeter_Width_ratio': 'save',
|
||||
'Activate_Multiply': "True",
|
||||
'Center_X_mm': storedSetting("centerX"),
|
||||
'Center_Y_mm': storedSetting("centerY"),
|
||||
'Number_of_Columns_integer': "1",
|
||||
'Number_of_Rows_integer': "1",
|
||||
'Reverse_Sequence_every_Odd_Layer': defaultSetting,
|
||||
'Separation_over_Perimeter_Width_ratio': defaultSetting,
|
||||
},'speed': {
|
||||
'Activate_Speed': 'ignore',
|
||||
'Add_Flow_Rate': 'ignore',
|
||||
'Bridge_Feed_Rate_Multiplier_ratio': 'ignore',
|
||||
'Bridge_Flow_Rate_Multiplier_ratio': 'ignore',
|
||||
'Duty_Cyle_at_Beginning_portion': 'ignore',
|
||||
'Duty_Cyle_at_Ending_portion': 'ignore',
|
||||
'Feed_Rate_mm/s': 'save',
|
||||
'Flow_Rate_Setting_float': 'use:speed:Feed_Rate_mm/s',
|
||||
'Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio': 'save',
|
||||
'Object_First_Layer_Feed_Rate_Perimeter_Multiplier_ratio': 'use:speed:Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio',
|
||||
'Object_First_Layer_Feed_Rate_Travel_Multiplier_ratio': 'use:speed:Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio',
|
||||
'Object_First_Layer_Flow_Rate_Infill_Multiplier_ratio': 'use:speed:Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio',
|
||||
'Object_First_Layer_Flow_Rate_Perimeter_Multiplier_ratio': 'use:speed:Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio',
|
||||
'Object_First_Layers_Amount_Of_Layers_For_Speed_Change': 'save',
|
||||
'Orbital_Feed_Rate_over_Operating_Feed_Rate_ratio': 'ignore',
|
||||
'Maximum_Z_Feed_Rate_mm/s': 'save',
|
||||
'Perimeter_Feed_Rate_Multiplier_ratio': 'ignore',
|
||||
'Perimeter_Flow_Rate_Multiplier_ratio': 'ignore',
|
||||
'Travel_Feed_Rate_mm/s': 'save',
|
||||
'Activate_Speed': "True",
|
||||
'Add_Flow_Rate': "True",
|
||||
'Bridge_Feed_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Bridge_Flow_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Duty_Cyle_at_Beginning_portion': defaultSetting,
|
||||
'Duty_Cyle_at_Ending_portion': defaultSetting,
|
||||
'Feed_Rate_mm/s': storedSetting("print_speed"),
|
||||
'Flow_Rate_Setting_float': storedSetting("print_speed"),
|
||||
'Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio': defaultSetting,
|
||||
'Object_First_Layer_Feed_Rate_Perimeter_Multiplier_ratio': defaultSetting,
|
||||
'Object_First_Layer_Feed_Rate_Travel_Multiplier_ratio': defaultSetting,
|
||||
'Object_First_Layer_Flow_Rate_Infill_Multiplier_ratio': defaultSetting,
|
||||
'Object_First_Layer_Flow_Rate_Perimeter_Multiplier_ratio': defaultSetting,
|
||||
'Object_First_Layers_Amount_Of_Layers_For_Speed_Change': defaultSetting,
|
||||
'Orbital_Feed_Rate_over_Operating_Feed_Rate_ratio': defaultSetting,
|
||||
'Maximum_Z_Feed_Rate_mm/s': defaultSetting,
|
||||
'Perimeter_Feed_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Perimeter_Flow_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Travel_Feed_Rate_mm/s': storedSetting("travel_speed"),
|
||||
},'temperature': {
|
||||
'Activate_Temperature': 'ignore',
|
||||
'Cooling_Rate_Celcius/second': 'ignore',
|
||||
'Heating_Rate_Celcius/second': 'ignore',
|
||||
'Base_Temperature_Celcius': 'ignore',
|
||||
'Interface_Temperature_Celcius': 'ignore',
|
||||
'Object_First_Layer_Infill_Temperature_Celcius': 'ignore',
|
||||
'Object_First_Layer_Perimeter_Temperature_Celcius': 'ignore',
|
||||
'Object_Next_Layers_Temperature_Celcius': 'ignore',
|
||||
'Support_Layers_Temperature_Celcius': 'ignore',
|
||||
'Supported_Layers_Temperature_Celcius': 'ignore',
|
||||
'Activate_Temperature': defaultSetting,
|
||||
'Cooling_Rate_Celcius/second': defaultSetting,
|
||||
'Heating_Rate_Celcius/second': defaultSetting,
|
||||
'Base_Temperature_Celcius': defaultSetting,
|
||||
'Interface_Temperature_Celcius': defaultSetting,
|
||||
'Object_First_Layer_Infill_Temperature_Celcius': defaultSetting,
|
||||
'Object_First_Layer_Perimeter_Temperature_Celcius': defaultSetting,
|
||||
'Object_Next_Layers_Temperature_Celcius': defaultSetting,
|
||||
'Support_Layers_Temperature_Celcius': defaultSetting,
|
||||
'Supported_Layers_Temperature_Celcius': defaultSetting,
|
||||
},'raft': {
|
||||
'Activate_Raft': 'ignore',
|
||||
'Add_Raft,_Elevate_Nozzle,_Orbit': 'ignore',
|
||||
'Base_Feed_Rate_Multiplier_ratio': 'ignore',
|
||||
'Base_Flow_Rate_Multiplier_ratio': 'ignore',
|
||||
'Base_Infill_Density_ratio': 'ignore',
|
||||
'Base_Layer_Thickness_over_Layer_Thickness': 'ignore',
|
||||
'Base_Layers_integer': 'ignore',
|
||||
'Base_Nozzle_Lift_over_Base_Layer_Thickness_ratio': 'ignore',
|
||||
'Initial_Circling': 'ignore',
|
||||
'Infill_Overhang_over_Extrusion_Width_ratio': 'ignore',
|
||||
'Interface_Feed_Rate_Multiplier_ratio': 'ignore',
|
||||
'Interface_Flow_Rate_Multiplier_ratio': 'ignore',
|
||||
'Interface_Infill_Density_ratio': 'ignore',
|
||||
'Interface_Layer_Thickness_over_Layer_Thickness': 'ignore',
|
||||
'Interface_Layers_integer': 'ignore',
|
||||
'Interface_Nozzle_Lift_over_Interface_Layer_Thickness_ratio': 'ignore',
|
||||
'Name_of_Support_End_File': 'ignore',
|
||||
'Name_of_Support_Start_File': 'ignore',
|
||||
'Operating_Nozzle_Lift_over_Layer_Thickness_ratio': 'ignore',
|
||||
'Raft_Additional_Margin_over_Length_%': 'ignore',
|
||||
'Raft_Margin_mm': 'ignore',
|
||||
'Support_Cross_Hatch': 'save',
|
||||
'Support_Flow_Rate_over_Operating_Flow_Rate_ratio': 'save',
|
||||
'Support_Gap_over_Perimeter_Extrusion_Width_ratio': 'save',
|
||||
'Support_Material_Choice_': 'save',
|
||||
'Support_Minimum_Angle_degrees': 'save',
|
||||
'Activate_Raft': defaultSetting,
|
||||
'Add_Raft,_Elevate_Nozzle,_Orbit': defaultSetting,
|
||||
'Base_Feed_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Base_Flow_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Base_Infill_Density_ratio': defaultSetting,
|
||||
'Base_Layer_Thickness_over_Layer_Thickness': defaultSetting,
|
||||
'Base_Layers_integer': defaultSetting,
|
||||
'Base_Nozzle_Lift_over_Base_Layer_Thickness_ratio': defaultSetting,
|
||||
'Initial_Circling': defaultSetting,
|
||||
'Infill_Overhang_over_Extrusion_Width_ratio': defaultSetting,
|
||||
'Interface_Feed_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Interface_Flow_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Interface_Infill_Density_ratio': defaultSetting,
|
||||
'Interface_Layer_Thickness_over_Layer_Thickness': defaultSetting,
|
||||
'Interface_Layers_integer': defaultSetting,
|
||||
'Interface_Nozzle_Lift_over_Interface_Layer_Thickness_ratio': defaultSetting,
|
||||
'Name_of_Support_End_File': defaultSetting,
|
||||
'Name_of_Support_Start_File': defaultSetting,
|
||||
'Operating_Nozzle_Lift_over_Layer_Thickness_ratio': defaultSetting,
|
||||
'Raft_Additional_Margin_over_Length_%': defaultSetting,
|
||||
'Raft_Margin_mm': defaultSetting,
|
||||
'Support_Cross_Hatch': defaultSetting,
|
||||
'Support_Flow_Rate_over_Operating_Flow_Rate_ratio': defaultSetting,
|
||||
'Support_Gap_over_Perimeter_Extrusion_Width_ratio': defaultSetting,
|
||||
'Support_Material_Choice_': defaultSetting,
|
||||
'Support_Minimum_Angle_degrees': defaultSetting,
|
||||
},'skirt': {
|
||||
'Skirt_line_count': 'save',
|
||||
'Convex': 'ignore',
|
||||
'Gap_Width_mm': 'save',
|
||||
'Layers_To_index': 'ignore',
|
||||
'Skirt_line_count': storedSetting("skirt_line_count"),
|
||||
'Convex': "True",
|
||||
'Gap_Width_mm': storedSetting("skirt_gap"),
|
||||
'Layers_To_index': "1",
|
||||
},'chamber': {
|
||||
'Activate_Chamber': 'ignore',
|
||||
'Bed_Temperature_Celcius': 'ignore',
|
||||
'Bed_Temperature_Begin_Change_Height_mm': 'ignore',
|
||||
'Bed_Temperature_End_Change_Height_mm': 'ignore',
|
||||
'Bed_Temperature_End_Celcius': 'ignore',
|
||||
'Chamber_Temperature_Celcius': 'ignore',
|
||||
'Holding_Force_bar': 'ignore',
|
||||
'Activate_Chamber': defaultSetting,
|
||||
'Bed_Temperature_Celcius': defaultSetting,
|
||||
'Bed_Temperature_Begin_Change_Height_mm': defaultSetting,
|
||||
'Bed_Temperature_End_Change_Height_mm': defaultSetting,
|
||||
'Bed_Temperature_End_Celcius': defaultSetting,
|
||||
'Chamber_Temperature_Celcius': defaultSetting,
|
||||
'Holding_Force_bar': defaultSetting,
|
||||
},'tower': {
|
||||
'Activate_Tower': 'ignore',
|
||||
'Extruder_Possible_Collision_Cone_Angle_degrees': 'ignore',
|
||||
'Maximum_Tower_Height_layers': 'ignore',
|
||||
'Tower_Start_Layer_integer': 'ignore',
|
||||
'Activate_Tower': defaultSetting,
|
||||
'Extruder_Possible_Collision_Cone_Angle_degrees': defaultSetting,
|
||||
'Maximum_Tower_Height_layers': defaultSetting,
|
||||
'Tower_Start_Layer_integer': defaultSetting,
|
||||
},'jitter': {
|
||||
'Activate_Jitter': 'ignore',
|
||||
'Jitter_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Activate_Jitter': defaultSetting,
|
||||
'Jitter_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
},'clip': {
|
||||
'Activate_Clip': 'ignore',
|
||||
'Clip_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Maximum_Connection_Distance_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Activate_Clip': defaultSetting,
|
||||
'Clip_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Maximum_Connection_Distance_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
},'smooth': {
|
||||
'Activate_Smooth': 'ignore',
|
||||
'Layers_From_index': 'ignore',
|
||||
'Maximum_Shortening_over_Width_float': 'ignore',
|
||||
'Activate_Smooth': defaultSetting,
|
||||
'Layers_From_index': defaultSetting,
|
||||
'Maximum_Shortening_over_Width_float': defaultSetting,
|
||||
},'stretch': {
|
||||
'Activate_Stretch': 'ignore',
|
||||
'Cross_Limit_Distance_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Loop_Stretch_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Path_Stretch_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Perimeter_Inside_Stretch_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Perimeter_Outside_Stretch_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Stretch_From_Distance_Over_Perimeter_Width_ratio': 'ignore',
|
||||
'Activate_Stretch': defaultSetting,
|
||||
'Cross_Limit_Distance_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Loop_Stretch_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Path_Stretch_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Perimeter_Inside_Stretch_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Perimeter_Outside_Stretch_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Stretch_From_Distance_Over_Perimeter_Width_ratio': defaultSetting,
|
||||
},'skin': {
|
||||
'Activate_Skin': 'ignore',
|
||||
'Horizontal_Infill_Divisions_integer': 'ignore',
|
||||
'Horizontal_Perimeter_Divisions_integer': 'ignore',
|
||||
'Vertical_Divisions_integer': 'ignore',
|
||||
'Hop_When_Extruding_Infill': 'ignore',
|
||||
'Layers_From_index': 'ignore',
|
||||
'Activate_Skin': defaultSetting,
|
||||
'Horizontal_Infill_Divisions_integer': defaultSetting,
|
||||
'Horizontal_Perimeter_Divisions_integer': defaultSetting,
|
||||
'Vertical_Divisions_integer': defaultSetting,
|
||||
'Hop_When_Extruding_Infill': defaultSetting,
|
||||
'Layers_From_index': defaultSetting,
|
||||
},'comb': {
|
||||
'Activate_Comb': 'ignore',
|
||||
'Running_Jump_Space_mm': 'ignore',
|
||||
'Activate_Comb': defaultSetting,
|
||||
'Running_Jump_Space_mm': defaultSetting,
|
||||
},'cool': {
|
||||
'Activate_Cool': 'save',
|
||||
'Bridge_Cool_Celcius': 'ignore',
|
||||
'Cool_Type': 'save',
|
||||
'Maximum_Cool_Celcius': 'ignore',
|
||||
'Minimum_Layer_Time_seconds': 'save',
|
||||
'Minimum_Orbital_Radius_millimeters': 'ignore',
|
||||
'Name_of_Cool_End_File': 'ignore',
|
||||
'Name_of_Cool_Start_File': 'ignore',
|
||||
'Orbital_Outset_millimeters': 'ignore',
|
||||
'Turn_Fan_On_at_Beginning': 'ignore',
|
||||
'Turn_Fan_Off_at_Ending': 'ignore',
|
||||
'Activate_Cool': defaultSetting,
|
||||
'Bridge_Cool_Celcius': defaultSetting,
|
||||
'Cool_Type': defaultSetting,
|
||||
'Maximum_Cool_Celcius': defaultSetting,
|
||||
'Minimum_Layer_Time_seconds': defaultSetting,
|
||||
'Minimum_Orbital_Radius_millimeters': defaultSetting,
|
||||
'Name_of_Cool_End_File': defaultSetting,
|
||||
'Name_of_Cool_Start_File': defaultSetting,
|
||||
'Orbital_Outset_millimeters': defaultSetting,
|
||||
'Turn_Fan_On_at_Beginning': defaultSetting,
|
||||
'Turn_Fan_Off_at_Ending': defaultSetting,
|
||||
},'hop': {
|
||||
'Activate_Hop': 'ignore',
|
||||
'Hop_Over_Layer_Thickness_ratio': 'ignore',
|
||||
'Minimum_Hop_Angle_degrees': 'ignore',
|
||||
'Activate_Hop': defaultSetting,
|
||||
'Hop_Over_Layer_Thickness_ratio': defaultSetting,
|
||||
'Minimum_Hop_Angle_degrees': defaultSetting,
|
||||
},'wipe': {
|
||||
'Activate_Wipe': 'ignore',
|
||||
'Arrival_X_mm': 'ignore',
|
||||
'Arrival_Y_mm': 'ignore',
|
||||
'Arrival_Z_mm': 'ignore',
|
||||
'Departure_X_mm': 'ignore',
|
||||
'Departure_Y_mm': 'ignore',
|
||||
'Departure_Z_mm': 'ignore',
|
||||
'Wipe_X_mm': 'ignore',
|
||||
'Wipe_Y_mm': 'ignore',
|
||||
'Wipe_Z_mm': 'ignore',
|
||||
'Wipe_Period_layers': 'ignore',
|
||||
'Activate_Wipe': defaultSetting,
|
||||
'Arrival_X_mm': defaultSetting,
|
||||
'Arrival_Y_mm': defaultSetting,
|
||||
'Arrival_Z_mm': defaultSetting,
|
||||
'Departure_X_mm': defaultSetting,
|
||||
'Departure_Y_mm': defaultSetting,
|
||||
'Departure_Z_mm': defaultSetting,
|
||||
'Wipe_X_mm': defaultSetting,
|
||||
'Wipe_Y_mm': defaultSetting,
|
||||
'Wipe_Z_mm': defaultSetting,
|
||||
'Wipe_Period_layers': defaultSetting,
|
||||
},'oozebane': {
|
||||
'Activate_Oozebane': 'ignore',
|
||||
'After_Startup_Distance_millimeters': 'ignore',
|
||||
'Early_Shutdown_Distance_millimeters': 'ignore',
|
||||
'Early_Startup_Distance_Constant_millimeters': 'ignore',
|
||||
'Early_Startup_Maximum_Distance_millimeters': 'ignore',
|
||||
'First_Early_Startup_Distance_millimeters': 'ignore',
|
||||
'Minimum_Distance_for_Early_Startup_millimeters': 'ignore',
|
||||
'Minimum_Distance_for_Early_Shutdown_millimeters': 'ignore',
|
||||
'Slowdown_Startup_Steps_positive_integer': 'ignore',
|
||||
'Activate_Oozebane': defaultSetting,
|
||||
'After_Startup_Distance_millimeters': defaultSetting,
|
||||
'Early_Shutdown_Distance_millimeters': defaultSetting,
|
||||
'Early_Startup_Distance_Constant_millimeters': defaultSetting,
|
||||
'Early_Startup_Maximum_Distance_millimeters': defaultSetting,
|
||||
'First_Early_Startup_Distance_millimeters': defaultSetting,
|
||||
'Minimum_Distance_for_Early_Startup_millimeters': defaultSetting,
|
||||
'Minimum_Distance_for_Early_Shutdown_millimeters': defaultSetting,
|
||||
'Slowdown_Startup_Steps_positive_integer': defaultSetting,
|
||||
},'dwindle': {
|
||||
'Activate_Dwindle': 'ignore',
|
||||
'End_Rate_Multiplier_ratio': 'ignore',
|
||||
'Pent_Up_Volume_cubic_millimeters': 'ignore',
|
||||
'Slowdown_Steps_positive_integer': 'ignore',
|
||||
'Slowdown_Volume_cubic_millimeters': 'ignore',
|
||||
'Activate_Dwindle': defaultSetting,
|
||||
'End_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Pent_Up_Volume_cubic_millimeters': defaultSetting,
|
||||
'Slowdown_Steps_positive_integer': defaultSetting,
|
||||
'Slowdown_Volume_cubic_millimeters': defaultSetting,
|
||||
},'splodge': {
|
||||
'Activate_Splodge': 'ignore',
|
||||
'Initial_Lift_over_Extra_Thickness_ratio': 'ignore',
|
||||
'Initial_Splodge_Feed_Rate_mm/s': 'ignore',
|
||||
'Operating_Splodge_Feed_Rate_mm/s': 'ignore',
|
||||
'Operating_Splodge_Quantity_Length_millimeters': 'ignore',
|
||||
'Initial_Splodge_Quantity_Length_millimeters': 'ignore',
|
||||
'Operating_Lift_over_Extra_Thickness_ratio': 'ignore',
|
||||
'Activate_Splodge': defaultSetting,
|
||||
'Initial_Lift_over_Extra_Thickness_ratio': defaultSetting,
|
||||
'Initial_Splodge_Feed_Rate_mm/s': defaultSetting,
|
||||
'Operating_Splodge_Feed_Rate_mm/s': defaultSetting,
|
||||
'Operating_Splodge_Quantity_Length_millimeters': defaultSetting,
|
||||
'Initial_Splodge_Quantity_Length_millimeters': defaultSetting,
|
||||
'Operating_Lift_over_Extra_Thickness_ratio': defaultSetting,
|
||||
},'home': {
|
||||
'Activate_Home': 'ignore',
|
||||
'Name_of_Home_File': 'ignore',
|
||||
'Activate_Home': defaultSetting,
|
||||
'Name_of_Home_File': defaultSetting,
|
||||
},'lash': {
|
||||
'Activate_Lash': 'ignore',
|
||||
'X_Backlash_mm': 'ignore',
|
||||
'Y_Backlash_mm': 'ignore',
|
||||
'Activate_Lash': defaultSetting,
|
||||
'X_Backlash_mm': defaultSetting,
|
||||
'Y_Backlash_mm': defaultSetting,
|
||||
},'fillet': {
|
||||
'Activate_Fillet': 'ignore',
|
||||
'Arc_Point': 'ignore',
|
||||
'Arc_Radius': 'ignore',
|
||||
'Arc_Segment': 'ignore',
|
||||
'Bevel': 'ignore',
|
||||
'Corner_Feed_Rate_Multiplier_ratio': 'ignore',
|
||||
'Fillet_Radius_over_Perimeter_Width_ratio': 'ignore',
|
||||
'Reversal_Slowdown_Distance_over_Perimeter_Width_ratio': 'ignore',
|
||||
'Use_Intermediate_Feed_Rate_in_Corners': 'ignore',
|
||||
'Activate_Fillet': defaultSetting,
|
||||
'Arc_Point': defaultSetting,
|
||||
'Arc_Radius': defaultSetting,
|
||||
'Arc_Segment': defaultSetting,
|
||||
'Bevel': defaultSetting,
|
||||
'Corner_Feed_Rate_Multiplier_ratio': defaultSetting,
|
||||
'Fillet_Radius_over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Reversal_Slowdown_Distance_over_Perimeter_Width_ratio': defaultSetting,
|
||||
'Use_Intermediate_Feed_Rate_in_Corners': defaultSetting,
|
||||
},'limit': {
|
||||
'Activate_Limit': 'ignore',
|
||||
'Maximum_Initial_Feed_Rate_mm/s': 'ignore',
|
||||
'Activate_Limit': defaultSetting,
|
||||
'Maximum_Initial_Feed_Rate_mm/s': defaultSetting,
|
||||
},'unpause': {
|
||||
'Activate_Unpause': 'ignore',
|
||||
'Delay_milliseconds': 'ignore',
|
||||
'Maximum_Speed_ratio': 'ignore',
|
||||
'Activate_Unpause': defaultSetting,
|
||||
'Delay_milliseconds': defaultSetting,
|
||||
'Maximum_Speed_ratio': defaultSetting,
|
||||
},'dimension': {
|
||||
'Activate_Dimension': 'ignore',
|
||||
'Absolute_Extrusion_Distance': 'ignore',
|
||||
'Relative_Extrusion_Distance': 'ignore',
|
||||
'Extruder_Retraction_Speed_mm/s': 'save',
|
||||
'Filament_Diameter_mm': 'save',
|
||||
'Filament_Packing_Density_ratio': 'save',
|
||||
'Maximum_E_Value_before_Reset_float': 'ignore',
|
||||
'Minimum_Travel_for_Retraction_millimeters': 'save',
|
||||
'Retract_Within_Island': 'save',
|
||||
'Retraction_Distance_millimeters': 'save',
|
||||
'Restart_Extra_Distance_millimeters': 'save',
|
||||
'Activate_Dimension': defaultSetting,
|
||||
'Absolute_Extrusion_Distance': defaultSetting,
|
||||
'Relative_Extrusion_Distance': defaultSetting,
|
||||
'Extruder_Retraction_Speed_mm/s': defaultSetting,
|
||||
'Filament_Diameter_mm': defaultSetting,
|
||||
'Filament_Packing_Density_ratio': defaultSetting,
|
||||
'Maximum_E_Value_before_Reset_float': defaultSetting,
|
||||
'Minimum_Travel_for_Retraction_millimeters': defaultSetting,
|
||||
'Retract_Within_Island': defaultSetting,
|
||||
'Retraction_Distance_millimeters': defaultSetting,
|
||||
'Restart_Extra_Distance_millimeters': defaultSetting,
|
||||
},'alteration': {
|
||||
'Activate_Alteration': 'ignore',
|
||||
'Name_of_End_File': 'ignore',
|
||||
'Name_of_Start_File': 'ignore',
|
||||
'Remove_Redundant_Mcode': 'ignore',
|
||||
'Replace_Variable_with_Setting': 'ignore',
|
||||
'Activate_Alteration': defaultSetting,
|
||||
'Name_of_End_File': defaultSetting,
|
||||
'Name_of_Start_File': defaultSetting,
|
||||
'Remove_Redundant_Mcode': defaultSetting,
|
||||
'Replace_Variable_with_Setting': defaultSetting,
|
||||
},'export': {
|
||||
'Activate_Export': 'ignore',
|
||||
'Add_Descriptive_Extension': 'ignore',
|
||||
'Add_Export_Suffix': 'ignore',
|
||||
'Add_Profile_Extension': 'ignore',
|
||||
'Add_Timestamp_Extension': 'ignore',
|
||||
'Also_Send_Output_To': 'ignore',
|
||||
'Analyze_Gcode': 'ignore',
|
||||
'Comment_Choice': 'ignore',
|
||||
'Do_Not_Change_Output': 'ignore',
|
||||
'binary_16_byte': 'ignore',
|
||||
'gcode_step': 'ignore',
|
||||
'gcode_time_segment': 'ignore',
|
||||
'gcode_small': 'ignore',
|
||||
'File_Extension': 'ignore',
|
||||
'Name_of_Replace_File': 'ignore',
|
||||
'Save_Penultimate_Gcode': 'ignore',
|
||||
'Activate_Export': defaultSetting,
|
||||
'Add_Descriptive_Extension': defaultSetting,
|
||||
'Add_Export_Suffix': defaultSetting,
|
||||
'Add_Profile_Extension': defaultSetting,
|
||||
'Add_Timestamp_Extension': defaultSetting,
|
||||
'Also_Send_Output_To': defaultSetting,
|
||||
'Analyze_Gcode': defaultSetting,
|
||||
'Comment_Choice': defaultSetting,
|
||||
'Do_Not_Change_Output': defaultSetting,
|
||||
'binary_16_byte': defaultSetting,
|
||||
'gcode_step': defaultSetting,
|
||||
'gcode_time_segment': defaultSetting,
|
||||
'gcode_small': defaultSetting,
|
||||
'File_Extension': defaultSetting,
|
||||
'Name_of_Replace_File': defaultSetting,
|
||||
'Save_Penultimate_Gcode': defaultSetting,
|
||||
}
|
||||
}
|
||||
|
||||
@ -314,6 +321,25 @@ def loadGlobalProfile(filename):
|
||||
def saveGlobalProfile(filename):
|
||||
globalProfileParser.write(open(filename, 'w'))
|
||||
|
||||
def getSetting(name, default = ""):
|
||||
#Check if we have a configuration file loaded, else load the default.
|
||||
if not globals().has_key('globalProfileParser'):
|
||||
loadGlobalProfile(getDefaultProfilePath())
|
||||
if not globalProfileParser.has_option("profile", name):
|
||||
if not globalProfileParser.has_section("profile"):
|
||||
globalProfileParser.add_section("profile")
|
||||
globalProfileParser.set("profile", name, str(default))
|
||||
return default
|
||||
return globalProfileParser.get("profile", name)
|
||||
|
||||
def putSetting(name, value):
|
||||
#Check if we have a configuration file loaded, else load the default.
|
||||
if not globals().has_key('globalProfileParser'):
|
||||
loadGlobalProfile(getDefaultProfilePath())
|
||||
if not globalProfileParser.has_section("profile"):
|
||||
globalProfileParser.add_section("profile")
|
||||
globalProfileParser.set("profile", name, str(value))
|
||||
|
||||
def getDefaultProfilePath():
|
||||
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../current_profile.ini"))
|
||||
|
||||
@ -323,10 +349,6 @@ def safeConfigName(name):
|
||||
def getReadRepository(repository):
|
||||
"Read the configuration for this 'repository'"
|
||||
|
||||
#Check if we have a configuration file loaded, else load the default.
|
||||
if not globals().has_key('globalProfileParser'):
|
||||
loadGlobalProfile(getDefaultProfilePath())
|
||||
|
||||
info = getSkeinPyPyProfileInformation()
|
||||
if not info.has_key(repository.name):
|
||||
print "Warning: Plugin: " + repository.name + " missing from SkeinPyPy info"
|
||||
@ -342,63 +364,19 @@ def getReadRepository(repository):
|
||||
if not info.has_key(name):
|
||||
print "Setting: " + repository.name + ":" + name + " missing from SkeinPyPy info"
|
||||
continue
|
||||
#ignore this setting, use the default, always
|
||||
if info[name] == 'ignore':
|
||||
continue
|
||||
#Load this setting from another value.
|
||||
if info[name][0:4] == "use:":
|
||||
i = info[name][4:].split(':')
|
||||
p.setValueToString(globalProfileParser.get(i[0], i[1]))
|
||||
continue
|
||||
|
||||
try:
|
||||
p.setValueToString(globalProfileParser.get(repository.name, name))
|
||||
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
|
||||
#Value not in configuration, add it.
|
||||
try:
|
||||
globalProfileParser.add_section(repository.name)
|
||||
except:
|
||||
pass
|
||||
globalProfileParser.set(repository.name, name, str(p.value))
|
||||
#saveGlobalProfile(getDefaultProfilePath())
|
||||
#print "============" + str(p) + "|" + p.name + "|" + str(p.value) + "|" + str(type(p.value))
|
||||
return repository
|
||||
if isinstance(info[name], types.FunctionType):
|
||||
p.setValueToString(str(info[name](p)))
|
||||
else:
|
||||
p.setValueToString(str(info[name]))
|
||||
|
||||
def storeRepository(repository):
|
||||
"Store the configuration for this 'repository'"
|
||||
#Check if we have a configuration file loaded, else load the default.
|
||||
if not globals().has_key('globalProfileParser'):
|
||||
loadGlobalProfile(getDefaultProfilePath())
|
||||
|
||||
info = getSkeinPyPyProfileInformation()
|
||||
if not info.has_key(repository.name):
|
||||
print "Warning: Plugin: " + repository.name + " missing from SkeinPyPy info"
|
||||
return repository
|
||||
info = info[repository.name]
|
||||
if not type(info) is dict:
|
||||
print "Ignoring plugin configuration: " + repository.name
|
||||
return repository
|
||||
|
||||
for p in repository.preferences:
|
||||
name = safeConfigName(p.name)
|
||||
if not info.has_key(name):
|
||||
print "Setting: " + repository.name + ":" + name + " missing from SkeinPyPy info"
|
||||
continue
|
||||
|
||||
if info[name] == "save":
|
||||
try:
|
||||
globalProfileParser.add_section(repository.name)
|
||||
except:
|
||||
pass
|
||||
globalProfileParser.set(repository.name, name, str(p.value))
|
||||
return repository
|
||||
|
||||
def printProgress(layerIndex, procedureName):
|
||||
print ("Progress[" + procedureName + ":" + str(layerIndex) + "]")
|
||||
print ("Progress[" + procedureName + ":" + str(layerIndex+1) + "]")
|
||||
sys.stdout.flush()
|
||||
|
||||
def printProgressByNumber(layerIndex, numberOfLayers, procedureName):
|
||||
print ("Progress[" + procedureName + ":" + str(layerIndex) + ":" + str(numberOfLayers) + "]")
|
||||
print ("Progress[" + procedureName + ":" + str(layerIndex+1) + ":" + str(numberOfLayers) + "]")
|
||||
sys.stdout.flush()
|
||||
|
||||
def getAlterationFileLines(fileName):
|
||||
|
@ -20,6 +20,9 @@ class mainWindow(wx.Frame):
|
||||
"Main user interface window"
|
||||
def __init__(self):
|
||||
super(mainWindow, self).__init__(None, title='SkeinPyPy')
|
||||
|
||||
wx.EVT_CLOSE(self, self.OnClose)
|
||||
|
||||
menubar = wx.MenuBar()
|
||||
fileMenu = wx.Menu()
|
||||
fitem = fileMenu.Append(-1, 'Open Profile...', 'Open Profile...')
|
||||
@ -38,21 +41,8 @@ class mainWindow(wx.Frame):
|
||||
self.filename = None
|
||||
self.progressPanelList = []
|
||||
self.controlList = []
|
||||
self.plugins = {}
|
||||
for m in skeinforge_profile.getCraftTypePluginModule().getCraftSequence():
|
||||
self.plugins[m] = archive.getModuleWithDirectoryPath(archive.getCraftPluginsDirectoryPath(), m).getNewRepository()
|
||||
settings.getReadRepository(self.plugins[m])
|
||||
|
||||
skeinPyPySettingInfo = settings.getSkeinPyPyProfileInformation()
|
||||
|
||||
for pluginName in self.plugins.keys():
|
||||
self.plugins[pluginName].preferencesDict = {}
|
||||
for pref in self.plugins[pluginName].preferences:
|
||||
if skeinPyPySettingInfo[pluginName][settings.safeConfigName(pref.name)] == 'save':
|
||||
self.plugins[pluginName].preferencesDict[settings.safeConfigName(pref.name)] = pref
|
||||
|
||||
p = self#wx.Panel(self)
|
||||
nb = wx.Notebook(p)
|
||||
nb = wx.Notebook(self)
|
||||
|
||||
configPanel = wx.Panel(nb);
|
||||
nb.AddPage(configPanel, "Print config")
|
||||
@ -68,21 +58,21 @@ class mainWindow(wx.Frame):
|
||||
sizer.Add(rightConfigPanel)
|
||||
|
||||
self.AddTitle(leftConfigPanel, "Accuracy")
|
||||
self.AddSetting(leftConfigPanel, "Layer height (mm)", self.plugins['carve'].preferencesDict['Layer_Height_mm'], 'Layer height in millimeters.\n0.2 is a good value for quick prints.\n0.1 gives high quality prints.')
|
||||
self.AddSetting(leftConfigPanel, "Layer height (mm)", 'layer_height', 'Layer height in millimeters.\n0.2 is a good value for quick prints.\n0.1 gives high quality prints.')
|
||||
self.AddTitle(leftConfigPanel, "Fill")
|
||||
self.AddSetting(leftConfigPanel, "Solid layers", self.plugins['fill'].preferencesDict['Solid_Surface_Thickness_layers'])
|
||||
self.AddSetting(leftConfigPanel, "Fill Density", self.plugins['fill'].preferencesDict['Infill_Solidity_ratio'])
|
||||
#self.AddSetting(leftConfigPanel, "Solid layers", self.plugins['fill'].preferencesDict['Solid_Surface_Thickness_layers'])
|
||||
#self.AddSetting(leftConfigPanel, "Fill Density", self.plugins['fill'].preferencesDict['Infill_Solidity_ratio'])
|
||||
self.AddTitle(leftConfigPanel, "Skirt")
|
||||
self.AddSetting(leftConfigPanel, "Line count", self.plugins['skirt'].preferencesDict['Skirt_line_count'])
|
||||
self.AddSetting(leftConfigPanel, "Start distance (mm)", self.plugins['skirt'].preferencesDict['Gap_Width_mm'])
|
||||
self.AddSetting(leftConfigPanel, "Line count", 'skirt_line_count')
|
||||
self.AddSetting(leftConfigPanel, "Start distance (mm)", 'skirt_gap')
|
||||
self.AddTitle(leftConfigPanel, "Cool")
|
||||
#self.AddSetting(configPanel, "Cool type", self.plugins['cool'].preferencesDict['Cool_Type'])
|
||||
self.AddSetting(leftConfigPanel, "Minimal layer time", self.plugins['cool'].preferencesDict['Minimum_Layer_Time_seconds'])
|
||||
#self.AddSetting(leftConfigPanel, "Minimal layer time", self.plugins['cool'].preferencesDict['Minimum_Layer_Time_seconds'])
|
||||
self.AddTitle(rightConfigPanel, "Retraction")
|
||||
self.AddSetting(rightConfigPanel, "Speed (mm/s)", self.plugins['dimension'].preferencesDict['Extruder_Retraction_Speed_mm/s'])
|
||||
self.AddSetting(rightConfigPanel, "Distance (mm)", self.plugins['dimension'].preferencesDict['Retraction_Distance_millimeters'])
|
||||
self.AddSetting(rightConfigPanel, "Extra length on start (mm)", self.plugins['dimension'].preferencesDict['Restart_Extra_Distance_millimeters'])
|
||||
self.AddSetting(rightConfigPanel, "Minimal travel (mm)", self.plugins['dimension'].preferencesDict['Minimum_Travel_for_Retraction_millimeters'])
|
||||
#self.AddSetting(rightConfigPanel, "Speed (mm/s)", self.plugins['dimension'].preferencesDict['Extruder_Retraction_Speed_mm/s'])
|
||||
#self.AddSetting(rightConfigPanel, "Distance (mm)", self.plugins['dimension'].preferencesDict['Retraction_Distance_millimeters'])
|
||||
#self.AddSetting(rightConfigPanel, "Extra length on start (mm)", self.plugins['dimension'].preferencesDict['Restart_Extra_Distance_millimeters'])
|
||||
#self.AddSetting(rightConfigPanel, "Minimal travel (mm)", self.plugins['dimension'].preferencesDict['Minimum_Travel_for_Retraction_millimeters'])
|
||||
|
||||
configPanel = wx.Panel(nb);
|
||||
nb.AddPage(configPanel, "Machine && Filament")
|
||||
@ -98,35 +88,35 @@ class mainWindow(wx.Frame):
|
||||
sizer.Add(rightConfigPanel)
|
||||
|
||||
self.AddTitle(leftConfigPanel, "Machine size")
|
||||
self.AddSetting(leftConfigPanel, "Width (mm)", settings.IntSpin().getFromValue(10, "machine_width", None, 1000, 205))
|
||||
self.AddSetting(leftConfigPanel, "Depth (mm)", settings.IntSpin().getFromValue(10, "machine_depth", None, 1000, 205))
|
||||
self.AddSetting(leftConfigPanel, "Height (mm)", settings.IntSpin().getFromValue(10, "machine_height", None, 1000, 200))
|
||||
#self.AddSetting(leftConfigPanel, "Width (mm)", settings.IntSpin().getFromValue(10, "machine_width", None, 1000, 205))
|
||||
#self.AddSetting(leftConfigPanel, "Depth (mm)", settings.IntSpin().getFromValue(10, "machine_depth", None, 1000, 205))
|
||||
#self.AddSetting(leftConfigPanel, "Height (mm)", settings.IntSpin().getFromValue(10, "machine_height", None, 1000, 200))
|
||||
|
||||
self.AddTitle(leftConfigPanel, "Machine nozzle")
|
||||
self.AddSetting(leftConfigPanel, "Nozzle size (mm)", self.plugins['carve'].preferencesDict['Edge_Width_mm'])
|
||||
#self.AddSetting(leftConfigPanel, "Nozzle size (mm)", self.plugins['carve'].preferencesDict['Edge_Width_mm'])
|
||||
|
||||
self.AddTitle(leftConfigPanel, "Speed")
|
||||
self.AddSetting(leftConfigPanel, "Print speed (mm/s)", self.plugins['speed'].preferencesDict['Feed_Rate_mm/s'])
|
||||
self.AddSetting(leftConfigPanel, "Travel speed (mm/s)", self.plugins['speed'].preferencesDict['Travel_Feed_Rate_mm/s'])
|
||||
self.AddSetting(leftConfigPanel, "Max Z speed (mm/z)", self.plugins['speed'].preferencesDict['Maximum_Z_Feed_Rate_mm/s'])
|
||||
self.AddSetting(leftConfigPanel, "Bottom Layer Speed Ratio", self.plugins['speed'].preferencesDict['Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio'])
|
||||
#self.AddSetting(leftConfigPanel, "Print speed (mm/s)", self.plugins['speed'].preferencesDict['Feed_Rate_mm/s'])
|
||||
#self.AddSetting(leftConfigPanel, "Travel speed (mm/s)", self.plugins['speed'].preferencesDict['Travel_Feed_Rate_mm/s'])
|
||||
#self.AddSetting(leftConfigPanel, "Max Z speed (mm/z)", self.plugins['speed'].preferencesDict['Maximum_Z_Feed_Rate_mm/s'])
|
||||
#self.AddSetting(leftConfigPanel, "Bottom Layer Speed Ratio", self.plugins['speed'].preferencesDict['Object_First_Layer_Feed_Rate_Infill_Multiplier_ratio'])
|
||||
|
||||
self.AddTitle(rightConfigPanel, "Filament")
|
||||
self.AddSetting(rightConfigPanel, "Diameter (mm)", self.plugins['dimension'].preferencesDict['Filament_Diameter_mm'])
|
||||
self.AddSetting(rightConfigPanel, "Packing Density", self.plugins['dimension'].preferencesDict['Filament_Packing_Density_ratio'])
|
||||
#self.AddSetting(rightConfigPanel, "Diameter (mm)", self.plugins['dimension'].preferencesDict['Filament_Diameter_mm'])
|
||||
#self.AddSetting(rightConfigPanel, "Packing Density", self.plugins['dimension'].preferencesDict['Filament_Packing_Density_ratio'])
|
||||
|
||||
nb.AddPage(alterationPanel.alterationPanel(nb), "Start/End-GCode")
|
||||
|
||||
#Preview window, load and slice buttons.
|
||||
self.preview3d = preview3d.previewPanel(p)
|
||||
self.preview3d = preview3d.previewPanel(self)
|
||||
|
||||
loadButton = wx.Button(p, -1, 'Load STL')
|
||||
sliceButton = wx.Button(p, -1, 'Slice to GCode')
|
||||
loadButton = wx.Button(self, -1, 'Load STL')
|
||||
sliceButton = wx.Button(self, -1, 'Slice to GCode')
|
||||
self.Bind(wx.EVT_BUTTON, self.OnLoadSTL, loadButton)
|
||||
self.Bind(wx.EVT_BUTTON, self.OnSlice, sliceButton)
|
||||
|
||||
sizer = wx.GridBagSizer()
|
||||
p.SetSizer(sizer)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Add(nb, (0,0), span=(1,1), flag=wx.EXPAND)
|
||||
sizer.Add(self.preview3d, (0,1), span=(1,3), flag=wx.EXPAND)
|
||||
sizer.AddGrowableCol(2)
|
||||
@ -134,7 +124,6 @@ class mainWindow(wx.Frame):
|
||||
sizer.Add(loadButton, (1,1))
|
||||
sizer.Add(sliceButton, (1,2))
|
||||
|
||||
self.panel = p
|
||||
self.sizer = sizer
|
||||
|
||||
self.Fit()
|
||||
@ -150,24 +139,14 @@ class mainWindow(wx.Frame):
|
||||
sizer.Add(wx.StaticLine(panel), (sizer.GetRows()+1,sizer.GetCols()), (1,3), flag=wx.EXPAND)
|
||||
sizer.SetRows(sizer.GetRows() + 2)
|
||||
|
||||
def AddSetting(self, panel, name, setting, help = 'Help: TODO'):
|
||||
def AddSetting(self, panel, name, settingName, help = 'Help: TODO'):
|
||||
"Add a setting to the configuration panel"
|
||||
sizer = panel.GetSizer()
|
||||
sizer.Add(wx.StaticText(panel, -1, name), (sizer.GetRows(),sizer.GetCols()), flag=wx.ALIGN_CENTER_VERTICAL)
|
||||
ctrl = None
|
||||
if setting.__class__ is settings.FloatSpin:
|
||||
ctrl = wx.TextCtrl(panel, -1, str(setting.value))
|
||||
if setting.__class__ is settings.IntSpin:
|
||||
ctrl = wx.TextCtrl(panel, -1, str(setting.value))
|
||||
if setting.__class__ is settings.BooleanSetting:
|
||||
ctrl = wx.CheckBox(panel, -1, '')
|
||||
ctrl.SetValue(setting.value)
|
||||
if ctrl == None:
|
||||
print "No WX control for: " + str(setting), str(setting.__class__)
|
||||
else:
|
||||
ctrl.setting = setting
|
||||
self.controlList.append(ctrl)
|
||||
sizer.Add(ctrl, (sizer.GetRows(),sizer.GetCols()+1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
|
||||
ctrl = wx.TextCtrl(panel, -1, settings.getSetting(settingName))
|
||||
ctrl.settingName = settingName
|
||||
self.controlList.append(ctrl)
|
||||
sizer.Add(ctrl, (sizer.GetRows(),sizer.GetCols()+1), flag=wx.ALIGN_BOTTOM|wx.EXPAND)
|
||||
helpButton = wx.Button(panel, -1, "?", style=wx.BU_EXACTFIT)
|
||||
sizer.Add(helpButton, (sizer.GetRows(),sizer.GetCols()+2))
|
||||
helpButton.SetToolTip(wx.ToolTip(help))
|
||||
@ -235,23 +214,19 @@ class mainWindow(wx.Frame):
|
||||
|
||||
def updateProfileToControls(self):
|
||||
"Update the configuration wx controls to show the new configuration settings"
|
||||
for pluginName in self.plugins.keys():
|
||||
settings.getReadRepository(self.plugins[pluginName])
|
||||
settings.saveGlobalProfile(settings.getDefaultProfilePath())
|
||||
for ctrl in self.controlList:
|
||||
if ctrl.setting.__class__ is settings.BooleanSetting:
|
||||
ctrl.SetValue(ctrl.setting.value)
|
||||
else:
|
||||
ctrl.SetValue(str(ctrl.setting.value))
|
||||
ctrl.SetValue(settings.getSetting(ctrl.settingName))
|
||||
|
||||
def updateProfileFromControls(self):
|
||||
"Update the configuration settings with values from the wx controls"
|
||||
for ctrl in self.controlList:
|
||||
ctrl.setting.setValueToString(ctrl.GetValue())
|
||||
for pluginName in self.plugins.keys():
|
||||
settings.storeRepository(self.plugins[pluginName])
|
||||
settings.putSetting(ctrl.settingName, ctrl.GetValue())
|
||||
settings.saveGlobalProfile(settings.getDefaultProfilePath())
|
||||
|
||||
def OnQuit(self, e):
|
||||
self.Close()
|
||||
|
||||
|
||||
def OnClose(self, e):
|
||||
self.updateProfileFromControls()
|
||||
self.Destroy()
|
||||
|
@ -1,10 +1,10 @@
|
||||
import wx
|
||||
import sys
|
||||
import math
|
||||
import threading
|
||||
import re
|
||||
|
||||
from wx.glcanvas import GLCanvas
|
||||
import wx
|
||||
try:
|
||||
from OpenGL.GLUT import *
|
||||
from OpenGL.GLU import *
|
||||
@ -24,19 +24,10 @@ class previewPanel(wx.Panel):
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW))
|
||||
self.SetMinSize((400,300))
|
||||
|
||||
self.glCanvas = GLCanvas(self, -1)
|
||||
wx.EVT_PAINT(self.glCanvas, self.OnPaint)
|
||||
wx.EVT_SIZE(self.glCanvas, self.OnSize)
|
||||
wx.EVT_ERASE_BACKGROUND(self.glCanvas, self.OnEraseBackground)
|
||||
wx.EVT_MOTION(self.glCanvas, self.OnMouseMotion)
|
||||
self.glCanvas = PreviewGLCanvas(self)
|
||||
self.init = 0
|
||||
self.triangleMesh = None
|
||||
self.modelDisplayList = None
|
||||
self.pathList = None
|
||||
self.yaw = 30
|
||||
self.pitch = 60
|
||||
self.zoom = 150
|
||||
self.renderTransparent = False
|
||||
self.machineSize = Vector3(210, 210, 200)
|
||||
self.machineCenter = Vector3(105, 105, 0)
|
||||
|
||||
@ -70,7 +61,7 @@ class previewPanel(wx.Panel):
|
||||
self.modelDirty = False
|
||||
self.triangleMesh = fabmetheus_interpret.getCarving(self.modelFilename)
|
||||
self.moveModel()
|
||||
self.Refresh()
|
||||
self.glCanvas.Refresh()
|
||||
|
||||
def getCodeInt(self, str, id):
|
||||
m = re.search(id + '([^\s]+)', str)
|
||||
@ -172,11 +163,11 @@ class previewPanel(wx.Panel):
|
||||
print "Unknown G code:" + str(G)
|
||||
self.pathList = pathList
|
||||
self.triangleMesh = None
|
||||
self.Refresh()
|
||||
self.glCanvas.Refresh()
|
||||
|
||||
def OnConfigClick(self, e):
|
||||
self.renderTransparent = not self.renderTransparent
|
||||
self.Refresh()
|
||||
self.glCanvas.renderTransparent = not self.glCanvas.renderTransparent
|
||||
self.glCanvas.Refresh()
|
||||
|
||||
def moveModel(self):
|
||||
if self.triangleMesh == None:
|
||||
@ -192,7 +183,21 @@ class previewPanel(wx.Panel):
|
||||
v.y += self.machineCenter.y
|
||||
self.triangleMesh.getMinimumZ()
|
||||
self.modelDirty = True
|
||||
|
||||
|
||||
class PreviewGLCanvas(GLCanvas):
|
||||
def __init__(self, parent):
|
||||
GLCanvas.__init__(self, parent)
|
||||
self.parent = parent
|
||||
wx.EVT_PAINT(self, self.OnPaint)
|
||||
wx.EVT_SIZE(self, self.OnSize)
|
||||
wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
|
||||
wx.EVT_MOTION(self, self.OnMouseMotion)
|
||||
self.yaw = 30
|
||||
self.pitch = 60
|
||||
self.zoom = 150
|
||||
self.renderTransparent = False
|
||||
self.modelDisplayList = None
|
||||
|
||||
def OnMouseMotion(self,e):
|
||||
if e.Dragging() and e.LeftIsDown():
|
||||
self.yaw += e.GetX() - self.oldX
|
||||
@ -221,53 +226,54 @@ class previewPanel(wx.Panel):
|
||||
dc.Clear()
|
||||
dc.DrawText("No PyOpenGL installation found.\nNo preview window available.", 10, 10)
|
||||
return
|
||||
self.glCanvas.SetCurrent()
|
||||
self.SetCurrent()
|
||||
self.InitGL()
|
||||
self.OnDraw()
|
||||
return
|
||||
|
||||
def OnDraw(self):
|
||||
machineSize = self.parent.machineSize
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
||||
|
||||
glTranslate(-self.machineCenter.x, -self.machineCenter.y, 0)
|
||||
glTranslate(-self.parent.machineCenter.x, -self.parent.machineCenter.y, 0)
|
||||
|
||||
glColor3f(1,1,1)
|
||||
glLineWidth(4)
|
||||
glDisable(GL_LIGHTING)
|
||||
glBegin(GL_LINE_LOOP)
|
||||
glVertex3f(0, 0, 0)
|
||||
glVertex3f(self.machineSize.x, 0, 0)
|
||||
glVertex3f(self.machineSize.x, self.machineSize.y, 0)
|
||||
glVertex3f(0, self.machineSize.y, 0)
|
||||
glVertex3f(machineSize.x, 0, 0)
|
||||
glVertex3f(machineSize.x, machineSize.y, 0)
|
||||
glVertex3f(0, machineSize.y, 0)
|
||||
glEnd()
|
||||
glLineWidth(2)
|
||||
glBegin(GL_LINES)
|
||||
for i in xrange(0, self.machineSize.x, 10):
|
||||
for i in xrange(0, machineSize.x, 10):
|
||||
glVertex3f(i, 0, 0)
|
||||
glVertex3f(i, self.machineSize.y, 0)
|
||||
for i in xrange(0, self.machineSize.y, 10):
|
||||
glVertex3f(i, machineSize.y, 0)
|
||||
for i in xrange(0, machineSize.y, 10):
|
||||
glVertex3f(0, i, 0)
|
||||
glVertex3f(self.machineSize.x, i, 0)
|
||||
glVertex3f(machineSize.x, i, 0)
|
||||
glEnd()
|
||||
glLineWidth(1)
|
||||
glBegin(GL_LINE_LOOP)
|
||||
glVertex3f(0, 0, self.machineSize.z)
|
||||
glVertex3f(self.machineSize.x, 0, self.machineSize.z)
|
||||
glVertex3f(self.machineSize.x, self.machineSize.y, self.machineSize.z)
|
||||
glVertex3f(0, self.machineSize.y, self.machineSize.z)
|
||||
glVertex3f(0, 0, machineSize.z)
|
||||
glVertex3f(machineSize.x, 0, machineSize.z)
|
||||
glVertex3f(machineSize.x, machineSize.y, machineSize.z)
|
||||
glVertex3f(0, machineSize.y, machineSize.z)
|
||||
glEnd()
|
||||
glBegin(GL_LINES)
|
||||
glVertex3f(0, 0, 0)
|
||||
glVertex3f(0, 0, self.machineSize.z)
|
||||
glVertex3f(self.machineSize.x, 0, 0)
|
||||
glVertex3f(self.machineSize.x, 0, self.machineSize.z)
|
||||
glVertex3f(self.machineSize.x, self.machineSize.y, 0)
|
||||
glVertex3f(self.machineSize.x, self.machineSize.y, self.machineSize.z)
|
||||
glVertex3f(0, self.machineSize.y, 0)
|
||||
glVertex3f(0, self.machineSize.y, self.machineSize.z)
|
||||
glVertex3f(0, 0, machineSize.z)
|
||||
glVertex3f(machineSize.x, 0, 0)
|
||||
glVertex3f(machineSize.x, 0, machineSize.z)
|
||||
glVertex3f(machineSize.x, machineSize.y, 0)
|
||||
glVertex3f(machineSize.x, machineSize.y, machineSize.z)
|
||||
glVertex3f(0, machineSize.y, 0)
|
||||
glVertex3f(0, machineSize.y, machineSize.z)
|
||||
glEnd()
|
||||
|
||||
if self.pathList != None:
|
||||
if self.parent.pathList != None:
|
||||
for path in self.pathList:
|
||||
if path['type'] == 'move':
|
||||
glColor3f(0,0,1)
|
||||
@ -280,17 +286,17 @@ class previewPanel(wx.Panel):
|
||||
glVertex3f(v.x, v.y, v.z)
|
||||
glEnd()
|
||||
|
||||
if self.triangleMesh != None:
|
||||
if self.parent.triangleMesh != None:
|
||||
if self.modelDisplayList == None:
|
||||
self.modelDisplayList = glGenLists(1);
|
||||
if self.modelDirty:
|
||||
self.modelDirty = False
|
||||
if self.parent.modelDirty:
|
||||
self.parent.modelDirty = False
|
||||
glNewList(self.modelDisplayList, GL_COMPILE)
|
||||
glBegin(GL_TRIANGLES)
|
||||
for face in self.triangleMesh.faces:
|
||||
v1 = self.triangleMesh.vertexes[face.vertexIndexes[0]]
|
||||
v2 = self.triangleMesh.vertexes[face.vertexIndexes[1]]
|
||||
v3 = self.triangleMesh.vertexes[face.vertexIndexes[2]]
|
||||
for face in self.parent.triangleMesh.faces:
|
||||
v1 = self.parent.triangleMesh.vertexes[face.vertexIndexes[0]]
|
||||
v2 = self.parent.triangleMesh.vertexes[face.vertexIndexes[1]]
|
||||
v3 = self.parent.triangleMesh.vertexes[face.vertexIndexes[2]]
|
||||
normal = (v2 - v1).cross(v3 - v1)
|
||||
normal.normalize()
|
||||
glNormal3f(normal.x, normal.y, normal.z)
|
||||
@ -317,14 +323,14 @@ class previewPanel(wx.Panel):
|
||||
glEnable(GL_LIGHTING)
|
||||
glCallList(self.modelDisplayList)
|
||||
|
||||
self.glCanvas.SwapBuffers()
|
||||
self.SwapBuffers()
|
||||
return
|
||||
|
||||
def InitGL(self):
|
||||
# set viewing projection
|
||||
glMatrixMode(GL_MODELVIEW)
|
||||
glLoadIdentity()
|
||||
size = self.glCanvas.GetSize()
|
||||
size = self.GetSize()
|
||||
glViewport(0,0, size.GetWidth(), size.GetHeight())
|
||||
|
||||
if self.renderTransparent:
|
||||
@ -352,6 +358,6 @@ class previewPanel(wx.Panel):
|
||||
glTranslate(0,0,-self.zoom)
|
||||
glRotate(-self.pitch, 1,0,0)
|
||||
glRotate(self.yaw, 0,0,1)
|
||||
if self.triangleMesh != None:
|
||||
glTranslate(0,0,-self.triangleMesh.getCarveCornerMaximum().z / 2)
|
||||
if self.parent.triangleMesh != None:
|
||||
glTranslate(0,0,-self.parent.triangleMesh.getCarveCornerMaximum().z / 2)
|
||||
return
|
||||
|
Loading…
x
Reference in New Issue
Block a user