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:
Daid 2012-02-23 22:47:42 +01:00
parent a2bbadbc37
commit 86c8bc2288
4 changed files with 380 additions and 421 deletions

View File

@ -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

View File

@ -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):

View File

@ -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()

View File

@ -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