diff --git a/xs/src/PrintConfig.cpp b/xs/src/PrintConfig.cpp index 76cc9ef49..711740897 100644 --- a/xs/src/PrintConfig.cpp +++ b/xs/src/PrintConfig.cpp @@ -2,6 +2,6 @@ namespace Slic3r { -t_optiondef_map PrintConfig::PrintConfigDef = PrintConfig::build_def(); +t_optiondef_map PrintConfigDef::def = PrintConfigDef::build_def(); } diff --git a/xs/src/PrintConfig.hpp b/xs/src/PrintConfig.hpp index 17af9b4ee..38eb09ba1 100644 --- a/xs/src/PrintConfig.hpp +++ b/xs/src/PrintConfig.hpp @@ -37,417 +37,10 @@ template<> inline t_config_enum_values ConfigOptionEnum::get_enum return keys_map; } -class PrintConfig : public StaticConfig +class PrintConfigDef { public: - static t_optiondef_map PrintConfigDef; - - ConfigOptionBool avoid_crossing_perimeters; - ConfigOptionPoint bed_size; - ConfigOptionInt bed_temperature; - ConfigOptionInt bottom_solid_layers; - ConfigOptionFloat bridge_acceleration; - ConfigOptionInt bridge_fan_speed; - ConfigOptionFloat bridge_flow_ratio; - ConfigOptionFloat bridge_speed; - ConfigOptionFloat brim_width; - ConfigOptionBool complete_objects; - ConfigOptionBool cooling; - ConfigOptionFloat default_acceleration; - ConfigOptionInt disable_fan_first_layers; - ConfigOptionInt duplicate; - ConfigOptionFloat duplicate_distance; - ConfigOptionPoint duplicate_grid; - ConfigOptionString end_gcode; - ConfigOptionFloatOrPercent external_perimeter_speed; - ConfigOptionBool external_perimeters_first; - ConfigOptionBool extra_perimeters; - ConfigOptionFloat extruder_clearance_height; - ConfigOptionFloat extruder_clearance_radius; - ConfigOptionPoints extruder_offset; - ConfigOptionString extrusion_axis; - ConfigOptionFloats extrusion_multiplier; - ConfigOptionFloatOrPercent extrusion_width; - ConfigOptionBool fan_always_on; - ConfigOptionInt fan_below_layer_time; - ConfigOptionFloats filament_diameter; - ConfigOptionInt fill_angle; - ConfigOptionFloat fill_density; - ConfigOptionEnum fill_pattern; - ConfigOptionFloat first_layer_acceleration; - ConfigOptionInt first_layer_bed_temperature; - ConfigOptionFloatOrPercent first_layer_extrusion_width; - ConfigOptionFloatOrPercent first_layer_height; - ConfigOptionFloatOrPercent first_layer_speed; - ConfigOptionInts first_layer_temperature; - ConfigOptionBool g0; - ConfigOptionFloat gap_fill_speed; - ConfigOptionBool gcode_arcs; - ConfigOptionBool gcode_comments; - ConfigOptionEnum gcode_flavor; - ConfigOptionFloat infill_acceleration; - ConfigOptionInt infill_every_layers; - ConfigOptionInt infill_extruder; - ConfigOptionFloatOrPercent infill_extrusion_width; - ConfigOptionBool infill_first; - ConfigOptionBool infill_only_where_needed; - ConfigOptionFloat infill_speed; - ConfigOptionString layer_gcode; - ConfigOptionFloat layer_height; - ConfigOptionInt max_fan_speed; - ConfigOptionInt min_fan_speed; - ConfigOptionInt min_print_speed; - ConfigOptionFloat min_skirt_length; - ConfigOptionString notes; - ConfigOptionFloats nozzle_diameter; - ConfigOptionBool only_retract_when_crossing_perimeters; - ConfigOptionBool ooze_prevention; - ConfigOptionString output_filename_format; - ConfigOptionBool overhangs; - ConfigOptionFloat perimeter_acceleration; - ConfigOptionInt perimeter_extruder; - ConfigOptionFloatOrPercent perimeter_extrusion_width; - ConfigOptionFloat perimeter_speed; - ConfigOptionInt perimeters; - ConfigOptionStrings post_process; - ConfigOptionPoint print_center; - ConfigOptionInt raft_layers; - ConfigOptionBool randomize_start; - ConfigOptionFloat resolution; - ConfigOptionFloats retract_before_travel; - ConfigOptionBools retract_layer_change; - ConfigOptionFloats retract_length; - ConfigOptionFloats retract_length_toolchange; - ConfigOptionFloats retract_lift; - ConfigOptionFloats retract_restart_extra; - ConfigOptionFloats retract_restart_extra_toolchange; - ConfigOptionInts retract_speed; - ConfigOptionInt rotate; - ConfigOptionFloat scale; - ConfigOptionFloat skirt_distance; - ConfigOptionInt skirt_height; - ConfigOptionInt skirts; - ConfigOptionInt slowdown_below_layer_time; - ConfigOptionFloatOrPercent small_perimeter_speed; - ConfigOptionEnum solid_fill_pattern; - ConfigOptionFloat solid_infill_below_area; - ConfigOptionInt solid_infill_every_layers; - ConfigOptionFloatOrPercent solid_infill_extrusion_width; - ConfigOptionFloatOrPercent solid_infill_speed; - ConfigOptionInt solid_layers; - ConfigOptionBool spiral_vase; - ConfigOptionInt standby_temperature_delta; - ConfigOptionString start_gcode; - ConfigOptionBool start_perimeters_at_concave_points; - ConfigOptionBool start_perimeters_at_non_overhang; - ConfigOptionBool support_material; - ConfigOptionInt support_material_angle; - ConfigOptionInt support_material_enforce_layers; - ConfigOptionInt support_material_extruder; - ConfigOptionFloatOrPercent support_material_extrusion_width; - ConfigOptionInt support_material_interface_extruder; - ConfigOptionInt support_material_interface_layers; - ConfigOptionFloat support_material_interface_spacing; - ConfigOptionEnum support_material_pattern; - ConfigOptionFloat support_material_spacing; - ConfigOptionFloat support_material_speed; - ConfigOptionInt support_material_threshold; - ConfigOptionInts temperature; - ConfigOptionBool thin_walls; - ConfigOptionInt threads; - ConfigOptionString toolchange_gcode; - ConfigOptionFloatOrPercent top_infill_extrusion_width; - ConfigOptionFloatOrPercent top_solid_infill_speed; - ConfigOptionInt top_solid_layers; - ConfigOptionFloat travel_speed; - ConfigOptionBool use_firmware_retraction; - ConfigOptionBool use_relative_e_distances; - ConfigOptionFloat vibration_limit; - ConfigOptionBools wipe; - ConfigOptionFloat z_offset; - - PrintConfig() { - this->def = &PrintConfig::PrintConfigDef; - - this->avoid_crossing_perimeters.value = false; - this->bed_size.point = Pointf(200,200); - this->bed_temperature.value = 0; - this->bottom_solid_layers.value = 3; - this->bridge_acceleration.value = 0; - this->bridge_fan_speed.value = 100; - this->bridge_flow_ratio.value = 1; - this->bridge_speed.value = 60; - this->brim_width.value = 0; - this->complete_objects.value = false; - this->cooling.value = true; - this->default_acceleration.value = 0; - this->disable_fan_first_layers.value = 1; - this->duplicate.value = 1; - this->duplicate_distance.value = 6; - this->duplicate_grid.point = Pointf(1,1); - this->end_gcode.value = "M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n"; - this->external_perimeter_speed.value = 70; - this->external_perimeter_speed.percent = true; - this->external_perimeters_first.value = false; - this->extra_perimeters.value = true; - this->extruder_clearance_height.value = 20; - this->extruder_clearance_radius.value = 20; - this->extruder_offset.points.resize(1); - this->extruder_offset.points[0] = Pointf(0,0); - this->extrusion_axis.value = "E"; - this->extrusion_multiplier.values.resize(1); - this->extrusion_multiplier.values[0] = 1; - this->extrusion_width.value = 0; - this->extrusion_width.percent = false; - this->fan_always_on.value = false; - this->fan_below_layer_time.value = 60; - this->filament_diameter.values.resize(1); - this->filament_diameter.values[0] = 3; - this->fill_angle.value = 45; - this->fill_density.value = 0.4; - this->fill_pattern.value = ipHoneycomb; - this->first_layer_acceleration.value = 0; - this->first_layer_bed_temperature.value = 0; - this->first_layer_extrusion_width.value = 200; - this->first_layer_extrusion_width.percent = true; - this->first_layer_height.value = 0.35; - this->first_layer_height.percent = false; - this->first_layer_speed.value = 30; - this->first_layer_speed.percent = true; - this->first_layer_temperature.values.resize(1); - this->first_layer_temperature.values[0] = 200; - this->g0.value = false; - this->gap_fill_speed.value = 20; - this->gcode_arcs.value = false; - this->gcode_comments.value = false; - this->gcode_flavor.value = gcfRepRap; - this->infill_acceleration.value = 0; - this->infill_every_layers.value = 1; - this->infill_extruder.value = 1; - this->infill_extrusion_width.value = 0; - this->infill_extrusion_width.percent = false; - this->infill_first.value = false; - this->infill_only_where_needed.value = false; - this->infill_speed.value = 60; - this->layer_gcode.value = ""; - this->layer_height.value = 0.4; - this->max_fan_speed.value = 100; - this->min_fan_speed.value = 35; - this->min_print_speed.value = 10; - this->min_skirt_length.value = 0; - this->notes.value = ""; - this->nozzle_diameter.values.resize(1); - this->nozzle_diameter.values[0] = 0.5; - this->only_retract_when_crossing_perimeters.value = true; - this->ooze_prevention.value = false; - this->output_filename_format.value = "[input_filename_base].gcode"; - this->overhangs.value = true; - this->perimeter_acceleration.value = 0; - this->perimeter_extruder.value = 1; - this->perimeter_extrusion_width.value = 0; - this->perimeter_extrusion_width.percent = false; - this->perimeter_speed.value = 30; - this->perimeters.value = 3; - this->print_center.point = Pointf(100,100); - this->raft_layers.value = 0; - this->randomize_start.value = false; - this->resolution.value = 0; - this->retract_before_travel.values.resize(1); - this->retract_before_travel.values[0] = 2; - this->retract_layer_change.values.resize(1); - this->retract_layer_change.values[0] = true; - this->retract_length.values.resize(1); - this->retract_length.values[0] = 1; - this->retract_length_toolchange.values.resize(1); - this->retract_length_toolchange.values[0] = 10; - this->retract_lift.values.resize(1); - this->retract_lift.values[0] = 0; - this->retract_restart_extra.values.resize(1); - this->retract_restart_extra.values[0] = 0; - this->retract_restart_extra_toolchange.values.resize(1); - this->retract_restart_extra_toolchange.values[0] = 0; - this->retract_speed.values.resize(1); - this->retract_speed.values[0] = 30; - this->rotate.value = 0; - this->scale.value = 1; - this->skirt_distance.value = 6; - this->skirt_height.value = 1; - this->skirts.value = 1; - this->slowdown_below_layer_time.value = 30; - this->small_perimeter_speed.value = 30; - this->small_perimeter_speed.percent = false; - this->solid_fill_pattern.value = ipRectilinear; - this->solid_infill_below_area.value = 70; - this->solid_infill_every_layers.value = 0; - this->solid_infill_extrusion_width.value = 0; - this->solid_infill_extrusion_width.percent = false; - this->solid_infill_speed.value = 60; - this->solid_infill_speed.percent = false; - this->spiral_vase.value = false; - this->standby_temperature_delta.value = -5; - this->start_gcode.value = "G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n"; - this->start_perimeters_at_concave_points.value = false; - this->start_perimeters_at_non_overhang.value = false; - this->support_material.value = false; - this->support_material_angle.value = 0; - this->support_material_enforce_layers.value = 0; - this->support_material_extruder.value = 1; - this->support_material_extrusion_width.value = 0; - this->support_material_extrusion_width.percent = false; - this->support_material_interface_extruder.value = 1; - this->support_material_interface_layers.value = 3; - this->support_material_interface_spacing.value = 0; - this->support_material_pattern.value = ipHoneycomb; - this->support_material_spacing.value = 2.5; - this->support_material_speed.value = 60; - this->support_material_threshold.value = 0; - this->temperature.values.resize(1); - this->temperature.values[0] = 200; - this->thin_walls.value = true; - this->threads.value = 2; - this->toolchange_gcode.value = ""; - this->top_infill_extrusion_width.value = 0; - this->top_infill_extrusion_width.percent = false; - this->top_solid_infill_speed.value = 50; - this->top_solid_infill_speed.percent = false; - this->top_solid_layers.value = 3; - this->travel_speed.value = 130; - this->use_firmware_retraction.value = false; - this->use_relative_e_distances.value = false; - this->vibration_limit.value = 0; - this->wipe.values.resize(1); - this->wipe.values[0] = false; - this->z_offset.value = 0; - }; - - ConfigOption* option(const t_config_option_key opt_key, bool create = false) { - if (opt_key == "avoid_crossing_perimeters") return &this->avoid_crossing_perimeters; - if (opt_key == "bed_size") return &this->bed_size; - if (opt_key == "bed_temperature") return &this->bed_temperature; - if (opt_key == "bottom_solid_layers") return &this->bottom_solid_layers; - if (opt_key == "bridge_acceleration") return &this->bridge_acceleration; - if (opt_key == "bridge_fan_speed") return &this->bridge_fan_speed; - if (opt_key == "bridge_flow_ratio") return &this->bridge_flow_ratio; - if (opt_key == "bridge_speed") return &this->bridge_speed; - if (opt_key == "brim_width") return &this->brim_width; - if (opt_key == "complete_objects") return &this->complete_objects; - if (opt_key == "cooling") return &this->cooling; - if (opt_key == "default_acceleration") return &this->default_acceleration; - if (opt_key == "disable_fan_first_layers") return &this->disable_fan_first_layers; - if (opt_key == "duplicate") return &this->duplicate; - if (opt_key == "duplicate_distance") return &this->duplicate_distance; - if (opt_key == "duplicate_grid") return &this->duplicate_grid; - if (opt_key == "end_gcode") return &this->end_gcode; - if (opt_key == "external_perimeter_speed") return &this->external_perimeter_speed; - if (opt_key == "external_perimeters_first") return &this->external_perimeters_first; - if (opt_key == "extra_perimeters") return &this->extra_perimeters; - if (opt_key == "extruder_clearance_height") return &this->extruder_clearance_height; - if (opt_key == "extruder_clearance_radius") return &this->extruder_clearance_radius; - if (opt_key == "extruder_offset") return &this->extruder_offset; - if (opt_key == "extrusion_axis") return &this->extrusion_axis; - if (opt_key == "extrusion_multiplier") return &this->extrusion_multiplier; - if (opt_key == "extrusion_width") return &this->extrusion_width; - if (opt_key == "fan_always_on") return &this->fan_always_on; - if (opt_key == "fan_below_layer_time") return &this->fan_below_layer_time; - if (opt_key == "filament_diameter") return &this->filament_diameter; - if (opt_key == "fill_angle") return &this->fill_angle; - if (opt_key == "fill_density") return &this->fill_density; - if (opt_key == "fill_pattern") return &this->fill_pattern; - if (opt_key == "first_layer_acceleration") return &this->first_layer_acceleration; - if (opt_key == "first_layer_bed_temperature") return &this->first_layer_bed_temperature; - if (opt_key == "first_layer_extrusion_width") return &this->first_layer_extrusion_width; - if (opt_key == "first_layer_height") return &this->first_layer_height; - if (opt_key == "first_layer_speed") return &this->first_layer_speed; - if (opt_key == "first_layer_temperature") return &this->first_layer_temperature; - if (opt_key == "g0") return &this->g0; - if (opt_key == "gap_fill_speed") return &this->gap_fill_speed; - if (opt_key == "gcode_arcs") return &this->gcode_arcs; - if (opt_key == "gcode_comments") return &this->gcode_comments; - if (opt_key == "gcode_flavor") return &this->gcode_flavor; - if (opt_key == "infill_acceleration") return &this->infill_acceleration; - if (opt_key == "infill_every_layers") return &this->infill_every_layers; - if (opt_key == "infill_extruder") return &this->infill_extruder; - if (opt_key == "infill_extrusion_width") return &this->infill_extrusion_width; - if (opt_key == "infill_first") return &this->infill_first; - if (opt_key == "infill_only_where_needed") return &this->infill_only_where_needed; - if (opt_key == "infill_speed") return &this->infill_speed; - if (opt_key == "layer_gcode") return &this->layer_gcode; - if (opt_key == "layer_height") return &this->layer_height; - if (opt_key == "max_fan_speed") return &this->max_fan_speed; - if (opt_key == "min_fan_speed") return &this->min_fan_speed; - if (opt_key == "min_print_speed") return &this->min_print_speed; - if (opt_key == "min_skirt_length") return &this->min_skirt_length; - if (opt_key == "notes") return &this->notes; - if (opt_key == "nozzle_diameter") return &this->nozzle_diameter; - if (opt_key == "only_retract_when_crossing_perimeters") return &this->only_retract_when_crossing_perimeters; - if (opt_key == "ooze_prevention") return &this->ooze_prevention; - if (opt_key == "output_filename_format") return &this->output_filename_format; - if (opt_key == "overhangs") return &this->overhangs; - if (opt_key == "perimeter_acceleration") return &this->perimeter_acceleration; - if (opt_key == "perimeter_extruder") return &this->perimeter_extruder; - if (opt_key == "perimeter_extrusion_width") return &this->perimeter_extrusion_width; - if (opt_key == "perimeter_speed") return &this->perimeter_speed; - if (opt_key == "perimeters") return &this->perimeters; - if (opt_key == "post_process") return &this->post_process; - if (opt_key == "print_center") return &this->print_center; - if (opt_key == "raft_layers") return &this->raft_layers; - if (opt_key == "randomize_start") return &this->randomize_start; - if (opt_key == "resolution") return &this->resolution; - if (opt_key == "retract_before_travel") return &this->retract_before_travel; - if (opt_key == "retract_layer_change") return &this->retract_layer_change; - if (opt_key == "retract_length") return &this->retract_length; - if (opt_key == "retract_length_toolchange") return &this->retract_length_toolchange; - if (opt_key == "retract_lift") return &this->retract_lift; - if (opt_key == "retract_restart_extra") return &this->retract_restart_extra; - if (opt_key == "retract_restart_extra_toolchange") return &this->retract_restart_extra_toolchange; - if (opt_key == "retract_speed") return &this->retract_speed; - if (opt_key == "rotate") return &this->rotate; - if (opt_key == "scale") return &this->scale; - if (opt_key == "skirt_distance") return &this->skirt_distance; - if (opt_key == "skirt_height") return &this->skirt_height; - if (opt_key == "skirts") return &this->skirts; - if (opt_key == "slowdown_below_layer_time") return &this->slowdown_below_layer_time; - if (opt_key == "small_perimeter_speed") return &this->small_perimeter_speed; - if (opt_key == "solid_fill_pattern") return &this->solid_fill_pattern; - if (opt_key == "solid_infill_below_area") return &this->solid_infill_below_area; - if (opt_key == "solid_infill_every_layers") return &this->solid_infill_every_layers; - if (opt_key == "solid_infill_extrusion_width") return &this->solid_infill_extrusion_width; - if (opt_key == "solid_infill_speed") return &this->solid_infill_speed; - if (opt_key == "solid_layers") return &this->solid_layers; - if (opt_key == "spiral_vase") return &this->spiral_vase; - if (opt_key == "standby_temperature_delta") return &this->standby_temperature_delta; - if (opt_key == "start_gcode") return &this->start_gcode; - if (opt_key == "start_perimeters_at_concave_points") return &this->start_perimeters_at_concave_points; - if (opt_key == "start_perimeters_at_non_overhang") return &this->start_perimeters_at_non_overhang; - if (opt_key == "support_material") return &this->support_material; - if (opt_key == "support_material_angle") return &this->support_material_angle; - if (opt_key == "support_material_enforce_layers") return &this->support_material_enforce_layers; - if (opt_key == "support_material_extruder") return &this->support_material_extruder; - if (opt_key == "support_material_extrusion_width") return &this->support_material_extrusion_width; - if (opt_key == "support_material_interface_extruder") return &this->support_material_interface_extruder; - if (opt_key == "support_material_interface_layers") return &this->support_material_interface_layers; - if (opt_key == "support_material_interface_spacing") return &this->support_material_interface_spacing; - if (opt_key == "support_material_pattern") return &this->support_material_pattern; - if (opt_key == "support_material_spacing") return &this->support_material_spacing; - if (opt_key == "support_material_speed") return &this->support_material_speed; - if (opt_key == "support_material_threshold") return &this->support_material_threshold; - if (opt_key == "temperature") return &this->temperature; - if (opt_key == "thin_walls") return &this->thin_walls; - if (opt_key == "threads") return &this->threads; - if (opt_key == "toolchange_gcode") return &this->toolchange_gcode; - if (opt_key == "top_infill_extrusion_width") return &this->top_infill_extrusion_width; - if (opt_key == "top_solid_infill_speed") return &this->top_solid_infill_speed; - if (opt_key == "top_solid_layers") return &this->top_solid_layers; - if (opt_key == "travel_speed") return &this->travel_speed; - if (opt_key == "use_firmware_retraction") return &this->use_firmware_retraction; - if (opt_key == "use_relative_e_distances") return &this->use_relative_e_distances; - if (opt_key == "vibration_limit") return &this->vibration_limit; - if (opt_key == "wipe") return &this->wipe; - if (opt_key == "z_offset") return &this->z_offset; - - if (create) throw "Attempt to create non-existing option in StaticConfig object"; - return NULL; - }; + static t_optiondef_map def; static t_optiondef_map build_def () { t_optiondef_map Options; @@ -1301,15 +894,459 @@ class PrintConfig : public StaticConfig }; }; +class PrintObjectConfig : public virtual StaticConfig +{ + public: + ConfigOptionFloatOrPercent extrusion_width; + ConfigOptionFloatOrPercent first_layer_height; + ConfigOptionFloat layer_height; + ConfigOptionInt raft_layers; + ConfigOptionBool support_material; + ConfigOptionInt support_material_angle; + ConfigOptionInt support_material_enforce_layers; + ConfigOptionInt support_material_extruder; + ConfigOptionFloatOrPercent support_material_extrusion_width; + ConfigOptionInt support_material_interface_extruder; + ConfigOptionInt support_material_interface_layers; + ConfigOptionFloat support_material_interface_spacing; + ConfigOptionEnum support_material_pattern; + ConfigOptionFloat support_material_spacing; + ConfigOptionFloat support_material_speed; + ConfigOptionInt support_material_threshold; + + PrintObjectConfig() { + this->def = &PrintConfigDef::def; + + this->extrusion_width.value = 0; + this->extrusion_width.percent = false; + this->first_layer_height.value = 0.35; + this->first_layer_height.percent = false; + this->layer_height.value = 0.4; + this->raft_layers.value = 0; + this->support_material.value = false; + this->support_material_angle.value = 0; + this->support_material_enforce_layers.value = 0; + this->support_material_extruder.value = 1; + this->support_material_extrusion_width.value = 0; + this->support_material_extrusion_width.percent = false; + this->support_material_interface_extruder.value = 1; + this->support_material_interface_layers.value = 3; + this->support_material_interface_spacing.value = 0; + this->support_material_pattern.value = ipHoneycomb; + this->support_material_spacing.value = 2.5; + this->support_material_speed.value = 60; + this->support_material_threshold.value = 0; + }; + + ConfigOption* option(const t_config_option_key opt_key, bool create = false) { + if (opt_key == "extrusion_width") return &this->extrusion_width; + if (opt_key == "first_layer_height") return &this->first_layer_height; + if (opt_key == "layer_height") return &this->layer_height; + if (opt_key == "raft_layers") return &this->raft_layers; + if (opt_key == "support_material") return &this->support_material; + if (opt_key == "support_material_angle") return &this->support_material_angle; + if (opt_key == "support_material_enforce_layers") return &this->support_material_enforce_layers; + if (opt_key == "support_material_extruder") return &this->support_material_extruder; + if (opt_key == "support_material_extrusion_width") return &this->support_material_extrusion_width; + if (opt_key == "support_material_interface_extruder") return &this->support_material_interface_extruder; + if (opt_key == "support_material_interface_layers") return &this->support_material_interface_layers; + if (opt_key == "support_material_interface_spacing") return &this->support_material_interface_spacing; + if (opt_key == "support_material_pattern") return &this->support_material_pattern; + if (opt_key == "support_material_spacing") return &this->support_material_spacing; + if (opt_key == "support_material_speed") return &this->support_material_speed; + if (opt_key == "support_material_threshold") return &this->support_material_threshold; + + if (create) throw "Attempt to create non-existing option in StaticConfig object"; + return NULL; + }; +}; + +class PrintRegionConfig : public virtual StaticConfig +{ + public: + ConfigOptionInt bottom_solid_layers; + ConfigOptionBool extra_perimeters; + ConfigOptionInt fill_angle; + ConfigOptionFloat fill_density; + ConfigOptionEnum fill_pattern; + ConfigOptionFloatOrPercent first_layer_extrusion_width; + ConfigOptionInt infill_extruder; + ConfigOptionFloatOrPercent infill_extrusion_width; + ConfigOptionInt infill_every_layers; + ConfigOptionBool infill_only_where_needed; + ConfigOptionInt perimeter_extruder; + ConfigOptionFloatOrPercent perimeter_extrusion_width; + ConfigOptionInt perimeters; + ConfigOptionEnum solid_fill_pattern; + ConfigOptionFloat solid_infill_below_area; + ConfigOptionFloatOrPercent solid_infill_extrusion_width; + ConfigOptionInt solid_infill_every_layers; + ConfigOptionInt solid_layers; + ConfigOptionBool thin_walls; + ConfigOptionFloatOrPercent top_infill_extrusion_width; + ConfigOptionInt top_solid_layers; + + PrintObjectConfig() { + this->def = &PrintConfigDef::def; + + this->bottom_solid_layers.value = 3; + this->extra_perimeters.value = true; + this->fill_angle.value = 45; + this->fill_density.value = 0.4; + this->fill_pattern.value = ipHoneycomb; + this->first_layer_extrusion_width.value = 200; + this->first_layer_extrusion_width.percent = true; + this->infill_extruder.value = 1; + this->infill_extrusion_width.value = 0; + this->infill_extrusion_width.percent = false; + this->infill_every_layers.value = 1; + this->infill_only_where_needed.value = false; + this->perimeter_extruder.value = 1; + this->perimeter_extrusion_width.value = 0; + this->perimeter_extrusion_width.percent = false; + this->perimeters.value = 3; + this->solid_fill_pattern.value = ipRectilinear; + this->solid_infill_below_area.value = 70; + this->solid_infill_extrusion_width.value = 0; + this->solid_infill_extrusion_width.percent = false; + this->solid_infill_every_layers.value = 0; + this->thin_walls.value = true; + this->top_infill_extrusion_width.value = 0; + this->top_infill_extrusion_width.percent = false; + this->top_solid_layers.value = 3; + }; + + ConfigOption* option(const t_config_option_key opt_key, bool create = false) { + if (opt_key == "bottom_solid_layers") return &this->bottom_solid_layers; + if (opt_key == "extra_perimeters") return &this->extra_perimeters; + if (opt_key == "fill_angle") return &this->fill_angle; + if (opt_key == "fill_density") return &this->fill_density; + if (opt_key == "fill_pattern") return &this->fill_pattern; + if (opt_key == "first_layer_extrusion_width") return &this->first_layer_extrusion_width; + if (opt_key == "infill_extruder") return &this->infill_extruder; + if (opt_key == "infill_extrusion_width") return &this->infill_extrusion_width; + if (opt_key == "infill_every_layers") return &this->infill_every_layers; + if (opt_key == "infill_only_where_needed") return &this->infill_only_where_needed; + if (opt_key == "perimeter_extruder") return &this->perimeter_extruder; + if (opt_key == "perimeter_extrusion_width") return &this->perimeter_extrusion_width; + if (opt_key == "perimeters") return &this->perimeters; + if (opt_key == "solid_fill_pattern") return &this->solid_fill_pattern; + if (opt_key == "solid_infill_below_area") return &this->solid_infill_below_area; + if (opt_key == "solid_infill_extrusion_width") return &this->solid_infill_extrusion_width; + if (opt_key == "solid_infill_every_layers") return &this->solid_infill_every_layers; + if (opt_key == "solid_layers") return &this->solid_layers; + if (opt_key == "thin_walls") return &this->thin_walls; + if (opt_key == "top_infill_extrusion_width") return &this->top_infill_extrusion_width; + if (opt_key == "top_solid_layers") return &this->top_solid_layers; + + if (create) throw "Attempt to create non-existing option in StaticConfig object"; + return NULL; + }; +}; + +class PrintConfig : public virtual StaticConfig +{ + public: + ConfigOptionBool avoid_crossing_perimeters; + ConfigOptionPoint bed_size; + ConfigOptionInt bed_temperature; + ConfigOptionFloat bridge_acceleration; + ConfigOptionInt bridge_fan_speed; + ConfigOptionFloat bridge_flow_ratio; + ConfigOptionFloat bridge_speed; + ConfigOptionFloat brim_width; + ConfigOptionBool complete_objects; + ConfigOptionBool cooling; + ConfigOptionFloat default_acceleration; + ConfigOptionInt disable_fan_first_layers; + ConfigOptionInt duplicate; + ConfigOptionFloat duplicate_distance; + ConfigOptionPoint duplicate_grid; + ConfigOptionString end_gcode; + ConfigOptionFloatOrPercent external_perimeter_speed; + ConfigOptionBool external_perimeters_first; + ConfigOptionFloat extruder_clearance_height; + ConfigOptionFloat extruder_clearance_radius; + ConfigOptionPoints extruder_offset; + ConfigOptionString extrusion_axis; + ConfigOptionFloats extrusion_multiplier; + ConfigOptionBool fan_always_on; + ConfigOptionInt fan_below_layer_time; + ConfigOptionFloats filament_diameter; + ConfigOptionFloat first_layer_acceleration; + ConfigOptionInt first_layer_bed_temperature; + ConfigOptionFloatOrPercent first_layer_speed; + ConfigOptionInts first_layer_temperature; + ConfigOptionBool g0; + ConfigOptionFloat gap_fill_speed; + ConfigOptionBool gcode_arcs; + ConfigOptionBool gcode_comments; + ConfigOptionEnum gcode_flavor; + ConfigOptionFloat infill_acceleration; + ConfigOptionBool infill_first; + ConfigOptionFloat infill_speed; + ConfigOptionString layer_gcode; + ConfigOptionInt max_fan_speed; + ConfigOptionInt min_fan_speed; + ConfigOptionInt min_print_speed; + ConfigOptionFloat min_skirt_length; + ConfigOptionString notes; + ConfigOptionFloats nozzle_diameter; + ConfigOptionBool only_retract_when_crossing_perimeters; + ConfigOptionBool ooze_prevention; + ConfigOptionString output_filename_format; + ConfigOptionBool overhangs; + ConfigOptionFloat perimeter_acceleration; + ConfigOptionFloat perimeter_speed; + ConfigOptionStrings post_process; + ConfigOptionPoint print_center; + ConfigOptionBool randomize_start; + ConfigOptionFloat resolution; + ConfigOptionFloats retract_before_travel; + ConfigOptionBools retract_layer_change; + ConfigOptionFloats retract_length; + ConfigOptionFloats retract_length_toolchange; + ConfigOptionFloats retract_lift; + ConfigOptionFloats retract_restart_extra; + ConfigOptionFloats retract_restart_extra_toolchange; + ConfigOptionInts retract_speed; + ConfigOptionInt rotate; + ConfigOptionFloat scale; + ConfigOptionFloat skirt_distance; + ConfigOptionInt skirt_height; + ConfigOptionInt skirts; + ConfigOptionInt slowdown_below_layer_time; + ConfigOptionFloatOrPercent small_perimeter_speed; + ConfigOptionFloatOrPercent solid_infill_speed; + ConfigOptionBool spiral_vase; + ConfigOptionInt standby_temperature_delta; + ConfigOptionString start_gcode; + ConfigOptionBool start_perimeters_at_concave_points; + ConfigOptionBool start_perimeters_at_non_overhang; + ConfigOptionInts temperature; + ConfigOptionInt threads; + ConfigOptionString toolchange_gcode; + ConfigOptionFloatOrPercent top_solid_infill_speed; + ConfigOptionFloat travel_speed; + ConfigOptionBool use_firmware_retraction; + ConfigOptionBool use_relative_e_distances; + ConfigOptionFloat vibration_limit; + ConfigOptionBools wipe; + ConfigOptionFloat z_offset; + + PrintConfig() { + this->def = &PrintConfig::PrintConfigDef; + + this->avoid_crossing_perimeters.value = false; + this->bed_size.point = Pointf(200,200); + this->bed_temperature.value = 0; + this->bridge_acceleration.value = 0; + this->bridge_fan_speed.value = 100; + this->bridge_flow_ratio.value = 1; + this->bridge_speed.value = 60; + this->brim_width.value = 0; + this->complete_objects.value = false; + this->cooling.value = true; + this->default_acceleration.value = 0; + this->disable_fan_first_layers.value = 1; + this->duplicate.value = 1; + this->duplicate_distance.value = 6; + this->duplicate_grid.point = Pointf(1,1); + this->end_gcode.value = "M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n"; + this->external_perimeter_speed.value = 70; + this->external_perimeter_speed.percent = true; + this->external_perimeters_first.value = false; + this->extruder_clearance_height.value = 20; + this->extruder_clearance_radius.value = 20; + this->extruder_offset.points.resize(1); + this->extruder_offset.points[0] = Pointf(0,0); + this->extrusion_axis.value = "E"; + this->extrusion_multiplier.values.resize(1); + this->extrusion_multiplier.values[0] = 1; + this->fan_always_on.value = false; + this->fan_below_layer_time.value = 60; + this->filament_diameter.values.resize(1); + this->filament_diameter.values[0] = 3; + this->first_layer_acceleration.value = 0; + this->first_layer_bed_temperature.value = 0; + this->first_layer_speed.value = 30; + this->first_layer_speed.percent = true; + this->first_layer_temperature.values.resize(1); + this->first_layer_temperature.values[0] = 200; + this->g0.value = false; + this->gap_fill_speed.value = 20; + this->gcode_arcs.value = false; + this->gcode_comments.value = false; + this->gcode_flavor.value = gcfRepRap; + this->infill_acceleration.value = 0; + this->infill_first.value = false; + this->infill_speed.value = 60; + this->layer_gcode.value = ""; + this->max_fan_speed.value = 100; + this->min_fan_speed.value = 35; + this->min_print_speed.value = 10; + this->min_skirt_length.value = 0; + this->notes.value = ""; + this->nozzle_diameter.values.resize(1); + this->nozzle_diameter.values[0] = 0.5; + this->only_retract_when_crossing_perimeters.value = true; + this->ooze_prevention.value = false; + this->output_filename_format.value = "[input_filename_base].gcode"; + this->overhangs.value = true; + this->perimeter_acceleration.value = 0; + this->perimeter_speed.value = 30; + this->print_center.point = Pointf(100,100); + this->randomize_start.value = false; + this->resolution.value = 0; + this->retract_before_travel.values.resize(1); + this->retract_before_travel.values[0] = 2; + this->retract_layer_change.values.resize(1); + this->retract_layer_change.values[0] = true; + this->retract_length.values.resize(1); + this->retract_length.values[0] = 1; + this->retract_length_toolchange.values.resize(1); + this->retract_length_toolchange.values[0] = 10; + this->retract_lift.values.resize(1); + this->retract_lift.values[0] = 0; + this->retract_restart_extra.values.resize(1); + this->retract_restart_extra.values[0] = 0; + this->retract_restart_extra_toolchange.values.resize(1); + this->retract_restart_extra_toolchange.values[0] = 0; + this->retract_speed.values.resize(1); + this->retract_speed.values[0] = 30; + this->rotate.value = 0; + this->scale.value = 1; + this->skirt_distance.value = 6; + this->skirt_height.value = 1; + this->skirts.value = 1; + this->slowdown_below_layer_time.value = 30; + this->small_perimeter_speed.value = 30; + this->small_perimeter_speed.percent = false; + this->solid_infill_speed.value = 60; + this->solid_infill_speed.percent = false; + this->spiral_vase.value = false; + this->standby_temperature_delta.value = -5; + this->start_gcode.value = "G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n"; + this->start_perimeters_at_concave_points.value = false; + this->start_perimeters_at_non_overhang.value = false; + this->temperature.values.resize(1); + this->temperature.values[0] = 200; + this->threads.value = 2; + this->toolchange_gcode.value = ""; + this->top_solid_infill_speed.value = 50; + this->top_solid_infill_speed.percent = false; + this->travel_speed.value = 130; + this->use_firmware_retraction.value = false; + this->use_relative_e_distances.value = false; + this->vibration_limit.value = 0; + this->wipe.values.resize(1); + this->wipe.values[0] = false; + this->z_offset.value = 0; + }; + + ConfigOption* option(const t_config_option_key opt_key, bool create = false) { + if (opt_key == "avoid_crossing_perimeters") return &this->avoid_crossing_perimeters; + if (opt_key == "bed_size") return &this->bed_size; + if (opt_key == "bed_temperature") return &this->bed_temperature; + if (opt_key == "bridge_acceleration") return &this->bridge_acceleration; + if (opt_key == "bridge_fan_speed") return &this->bridge_fan_speed; + if (opt_key == "bridge_flow_ratio") return &this->bridge_flow_ratio; + if (opt_key == "bridge_speed") return &this->bridge_speed; + if (opt_key == "brim_width") return &this->brim_width; + if (opt_key == "complete_objects") return &this->complete_objects; + if (opt_key == "cooling") return &this->cooling; + if (opt_key == "default_acceleration") return &this->default_acceleration; + if (opt_key == "disable_fan_first_layers") return &this->disable_fan_first_layers; + if (opt_key == "duplicate") return &this->duplicate; + if (opt_key == "duplicate_distance") return &this->duplicate_distance; + if (opt_key == "duplicate_grid") return &this->duplicate_grid; + if (opt_key == "end_gcode") return &this->end_gcode; + if (opt_key == "external_perimeter_speed") return &this->external_perimeter_speed; + if (opt_key == "external_perimeters_first") return &this->external_perimeters_first; + if (opt_key == "extruder_clearance_height") return &this->extruder_clearance_height; + if (opt_key == "extruder_clearance_radius") return &this->extruder_clearance_radius; + if (opt_key == "extruder_offset") return &this->extruder_offset; + if (opt_key == "extrusion_axis") return &this->extrusion_axis; + if (opt_key == "extrusion_multiplier") return &this->extrusion_multiplier; + if (opt_key == "fan_always_on") return &this->fan_always_on; + if (opt_key == "fan_below_layer_time") return &this->fan_below_layer_time; + if (opt_key == "filament_diameter") return &this->filament_diameter; + if (opt_key == "first_layer_acceleration") return &this->first_layer_acceleration; + if (opt_key == "first_layer_bed_temperature") return &this->first_layer_bed_temperature; + if (opt_key == "first_layer_speed") return &this->first_layer_speed; + if (opt_key == "first_layer_temperature") return &this->first_layer_temperature; + if (opt_key == "g0") return &this->g0; + if (opt_key == "gap_fill_speed") return &this->gap_fill_speed; + if (opt_key == "gcode_arcs") return &this->gcode_arcs; + if (opt_key == "gcode_comments") return &this->gcode_comments; + if (opt_key == "gcode_flavor") return &this->gcode_flavor; + if (opt_key == "infill_acceleration") return &this->infill_acceleration; + if (opt_key == "infill_first") return &this->infill_first; + if (opt_key == "infill_speed") return &this->infill_speed; + if (opt_key == "layer_gcode") return &this->layer_gcode; + if (opt_key == "max_fan_speed") return &this->max_fan_speed; + if (opt_key == "min_fan_speed") return &this->min_fan_speed; + if (opt_key == "min_print_speed") return &this->min_print_speed; + if (opt_key == "min_skirt_length") return &this->min_skirt_length; + if (opt_key == "notes") return &this->notes; + if (opt_key == "nozzle_diameter") return &this->nozzle_diameter; + if (opt_key == "only_retract_when_crossing_perimeters") return &this->only_retract_when_crossing_perimeters; + if (opt_key == "ooze_prevention") return &this->ooze_prevention; + if (opt_key == "output_filename_format") return &this->output_filename_format; + if (opt_key == "overhangs") return &this->overhangs; + if (opt_key == "perimeter_acceleration") return &this->perimeter_acceleration; + if (opt_key == "perimeter_speed") return &this->perimeter_speed; + if (opt_key == "post_process") return &this->post_process; + if (opt_key == "print_center") return &this->print_center; + if (opt_key == "randomize_start") return &this->randomize_start; + if (opt_key == "resolution") return &this->resolution; + if (opt_key == "retract_before_travel") return &this->retract_before_travel; + if (opt_key == "retract_layer_change") return &this->retract_layer_change; + if (opt_key == "retract_length") return &this->retract_length; + if (opt_key == "retract_length_toolchange") return &this->retract_length_toolchange; + if (opt_key == "retract_lift") return &this->retract_lift; + if (opt_key == "retract_restart_extra") return &this->retract_restart_extra; + if (opt_key == "retract_restart_extra_toolchange") return &this->retract_restart_extra_toolchange; + if (opt_key == "retract_speed") return &this->retract_speed; + if (opt_key == "rotate") return &this->rotate; + if (opt_key == "scale") return &this->scale; + if (opt_key == "skirt_distance") return &this->skirt_distance; + if (opt_key == "skirt_height") return &this->skirt_height; + if (opt_key == "skirts") return &this->skirts; + if (opt_key == "slowdown_below_layer_time") return &this->slowdown_below_layer_time; + if (opt_key == "small_perimeter_speed") return &this->small_perimeter_speed; + if (opt_key == "solid_infill_speed") return &this->solid_infill_speed; + if (opt_key == "spiral_vase") return &this->spiral_vase; + if (opt_key == "standby_temperature_delta") return &this->standby_temperature_delta; + if (opt_key == "start_gcode") return &this->start_gcode; + if (opt_key == "start_perimeters_at_concave_points") return &this->start_perimeters_at_concave_points; + if (opt_key == "start_perimeters_at_non_overhang") return &this->start_perimeters_at_non_overhang; + if (opt_key == "temperature") return &this->temperature; + if (opt_key == "threads") return &this->threads; + if (opt_key == "toolchange_gcode") return &this->toolchange_gcode; + if (opt_key == "top_solid_infill_speed") return &this->top_solid_infill_speed; + if (opt_key == "travel_speed") return &this->travel_speed; + if (opt_key == "use_firmware_retraction") return &this->use_firmware_retraction; + if (opt_key == "use_relative_e_distances") return &this->use_relative_e_distances; + if (opt_key == "vibration_limit") return &this->vibration_limit; + if (opt_key == "wipe") return &this->wipe; + if (opt_key == "z_offset") return &this->z_offset; + + if (create) throw "Attempt to create non-existing option in StaticConfig object"; + return NULL; + }; +}; + class DynamicPrintConfig : public DynamicConfig { public: DynamicPrintConfig() { - this->def = &PrintConfig::PrintConfigDef; + this->def = &PrintConfigDef::def; }; - }; +class FullPrintConfig : public PrintObjectConfig, public PrintRegionConfig, public PrintConfig {}; + } #endif