diff --git a/resources/profiles/Custom.json b/resources/profiles/Custom.json index e81049df69..de265beb0d 100644 --- a/resources/profiles/Custom.json +++ b/resources/profiles/Custom.json @@ -16,6 +16,10 @@ "name": "Generic RRF Printer", "sub_path": "machine/MyRRF.json" }, + { + "name": "Generic Repetier Printer", + "sub_path": "machine/MyRepetier.json" + }, { "name": "Generic ToolChanger Printer", "sub_path": "machine/MyToolChanger.json" @@ -38,6 +42,11 @@ "name": "fdm_process_rrf_common", "sub_path": "process/fdm_process_rrf_common.json" }, + { + "name": "fdm_process_repetier_common", + "sub_path": "process/fdm_process_repetier_common.json" + }, + { "name": "0.08mm Extra Fine @MyKlipper", "sub_path": "process/0.08mm Extra Fine @MyKlipper.json" @@ -130,6 +139,10 @@ "name": "0.28mm Extra Draft @MyRRF", "sub_path": "process/0.28mm Extra Draft @MyRRF.json" }, + { + "name": "0.20mm Standard @MyRepetier", + "sub_path": "process/0.20mm Standard @MyRepetier.json" + }, { "name": "0.08mm Extra Fine @MyToolChanger", "sub_path": "process/0.08mm Extra Fine @MyToolChanger.json" @@ -230,6 +243,10 @@ "name": "fdm_rrf_common", "sub_path": "machine/fdm_rrf_common.json" }, + { + "name": "fdm_repetier_common", + "sub_path": "machine/fdm_repetier_common.json" + }, { "name": "MyKlipper 0.2 nozzle", "sub_path": "machine/MyKlipper 0.2 nozzle.json" @@ -254,6 +271,10 @@ "name": "MyRRF 0.4 nozzle", "sub_path": "machine/MyRRF 0.4 nozzle.json" }, + { + "name": "MyRepetier 0.4 nozzle", + "sub_path": "machine/MyRepetier 0.4 nozzle.json" + }, { "name": "MyToolChanger 0.2 nozzle", "sub_path": "machine/MyToolChanger 0.2 nozzle.json" diff --git a/resources/profiles/Custom/Generic Repetier Printer_cover.png b/resources/profiles/Custom/Generic Repetier Printer_cover.png new file mode 100644 index 0000000000..0cd571dce7 Binary files /dev/null and b/resources/profiles/Custom/Generic Repetier Printer_cover.png differ diff --git a/resources/profiles/Custom/machine/MyRepetier 0.4 nozzle.json b/resources/profiles/Custom/machine/MyRepetier 0.4 nozzle.json new file mode 100644 index 0000000000..c75ed0fd71 --- /dev/null +++ b/resources/profiles/Custom/machine/MyRepetier 0.4 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "machine", + "name": "MyRepetier 0.4 nozzle", + "inherits": "fdm_repetier_common", + "from": "system", + "setting_id": "GM001", + "instantiation": "true", + "printer_model": "Generic Repetier Printer", + "nozzle_diameter": [ + "0.4" + ], + "printer_variant": "0.4", + "printable_area": [ + "0x0", + "250x0", + "250x250", + "0x250" + ], + "printable_height": "250" +} \ No newline at end of file diff --git a/resources/profiles/Custom/machine/MyRepetier.json b/resources/profiles/Custom/machine/MyRepetier.json new file mode 100644 index 0000000000..7b5a291c72 --- /dev/null +++ b/resources/profiles/Custom/machine/MyRepetier.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Generic Repetier Printer", + "model_id": "my_repetier_01", + "nozzle_diameter": "0.4", + "machine_tech": "FFF", + "family": "MyPrinter", + "bed_model": "", + "bed_texture": "orcaslicer_bed_texture.svg", + "hotend_model": "", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} \ No newline at end of file diff --git a/resources/profiles/Custom/machine/fdm_repetier_common.json b/resources/profiles/Custom/machine/fdm_repetier_common.json new file mode 100644 index 0000000000..1171559086 --- /dev/null +++ b/resources/profiles/Custom/machine/fdm_repetier_common.json @@ -0,0 +1,143 @@ +{ + "type": "machine", + "name": "fdm_repetier_common", + "inherits": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "gcode_flavor": "repetier", + "disable_m73": "1", + "emit_machine_limits_to_gcode": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "20000", + "20000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "200" + ], + "machine_max_speed_e": [ + "25", + "25" + ], + "machine_max_speed_x": [ + "500", + "200" + ], + "machine_max_speed_y": [ + "500", + "200" + ], + "machine_max_speed_z": [ + "12", + "12" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "0.2", + "0.4" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.08" + ], + "printable_height": "250", + "extruder_clearance_radius": "65", + "extruder_clearance_height_to_rod": "36", + "extruder_clearance_height_to_lid": "140", + "printer_settings_id": "", + "printer_technology": "FFF", + "printer_variant": "0.4", + "retraction_minimum_travel": [ + "1" + ], + "retract_before_wipe": [ + "70%" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_length": [ + "0.8" + ], + "retract_length_toolchange": [ + "2" + ], + "z_hop": [ + "0.4" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retraction_speed": [ + "30" + ], + "deretraction_speed": [ + "30" + ], + "z_hop_types": "Normal Lift", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "change_filament_gcode": "", + "wipe": [ + "1" + ], + "default_filament_profile": [ + "Generic PLA @System" + ], + "default_print_profile": "0.20mm Standard @MyRepetier", + "bed_exclude_area": [ + "0x0" + ], + "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nG28\nG92 E0\n", + "machine_end_gcode": "M104 S0\nM140 S0\nG92 E0\nM84\n", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n", + "machine_pause_gcode": "G91\nG1 Z10 F900\nG90\nG1 X0 Y0 F6000\n", + "scan_first_layer": "0", + "nozzle_type": "undefine", + "auxiliary_fan": "0" +} \ No newline at end of file diff --git a/resources/profiles/Custom/process/0.20mm Standard @MyRepetier.json b/resources/profiles/Custom/process/0.20mm Standard @MyRepetier.json new file mode 100644 index 0000000000..bdffd3b647 --- /dev/null +++ b/resources/profiles/Custom/process/0.20mm Standard @MyRepetier.json @@ -0,0 +1,11 @@ +{ + "type": "process", + "name": "0.20mm Standard @MyRepetier", + "inherits": "fdm_process_repetier_common", + "from": "system", + "setting_id": "GP004", + "instantiation": "true", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "top_shell_layers": "4" +} \ No newline at end of file diff --git a/resources/profiles/Custom/process/fdm_process_repetier_common.json b/resources/profiles/Custom/process/fdm_process_repetier_common.json new file mode 100644 index 0000000000..3a9bc23306 --- /dev/null +++ b/resources/profiles/Custom/process/fdm_process_repetier_common.json @@ -0,0 +1,108 @@ +{ + "type": "process", + "name": "fdm_process_repetier_common", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "adaptive_layer_height": "0", + "reduce_crossing_wall": "0", + "max_travel_detour_distance": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "bridge_flow": "0.95", + "bridge_speed": "50", + "brim_width": "5", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "print_sequence": "by layer", + "default_acceleration": "1000", + "top_surface_acceleration": "1000", + "travel_acceleration": "1000", + "inner_wall_acceleration": "1000", + "outer_wall_acceleration": "1000", + "bridge_no_support": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0", + "outer_wall_line_width": "0.4", + "wall_infill_order": "inner wall/outer wall/infill", + "line_width": "0.4", + "infill_direction": "45", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "crosshatch", + "initial_layer_acceleration": "500", + "initial_layer_line_width": "0.5", + "initial_layer_print_height": "0.2", + "infill_combination": "0", + "sparse_infill_line_width": "0.45", + "infill_wall_overlap": "25%", + "interface_shells": "0", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "layer_height": "0.2", + "reduce_infill_retraction": "1", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "detect_overhang_wall": "1", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "inner_wall_line_width": "0.45", + "wall_loops": "3", + "print_settings_id": "", + "raft_layers": "0", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "skirt_loops": "0", + "minimum_sparse_infill_area": "15", + "internal_solid_infill_line_width": "0.4", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "enable_support": "0", + "resolution": "0.012", + "support_type": "normal(auto)", + "support_style": "default", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.2", + "support_filament": "0", + "support_line_width": "0.4", + "support_interface_loop_pattern": "0", + "support_interface_filament": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "2", + "support_interface_spacing": "0.5", + "support_interface_speed": "40", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2.5", + "support_speed": "60", + "support_threshold_angle": "30", + "support_object_xy_distance": "0.35", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "0", + "detect_thin_wall": "0", + "top_surface_pattern": "monotonicline", + "top_surface_line_width": "0.4", + "top_shell_layers": "3", + "top_shell_thickness": "0.8", + "initial_layer_speed": "45", + "initial_layer_infill_speed": "60", + "outer_wall_speed": "60", + "inner_wall_speed": "80", + "internal_solid_infill_speed": "80", + "top_surface_speed": "50", + "gap_infill_speed": "80", + "sparse_infill_speed": "80", + "travel_speed": "150", + "enable_prime_tower": "1", + "wipe_tower_no_sparse_layers": "0", + "prime_tower_width": "60", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "enable_arc_fitting": "0", + "compatible_printers": [ + "MyRepetier 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index a5e1c6abf1..2d18a9d5b1 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -267,6 +267,21 @@ std::string GCodeWriter::set_jerk_xy(double jerk) jerk = m_max_jerk_y; gcode << "SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=" << jerk; + + } else if (FLAVOR_IS(gcfRepetier)) { + // Repetier uses M207 for temporary Jerk and combines X/Y into a single 'X' parameter. + double jerk_xy = jerk; + + // Clamp against the X machine limit + if (m_max_jerk_x > 0 && jerk_xy > m_max_jerk_x) + jerk_xy = m_max_jerk_x; + + // Clamp against the Y machine limit as well to be safe + if (m_max_jerk_y > 0 && jerk_xy > m_max_jerk_y) + jerk_xy = m_max_jerk_y; + + // Output the lowest safe limit using ONLY the X parameter + gcode << "M207 X" << jerk_xy; } else { double jerk_x = jerk; double jerk_y = jerk; @@ -278,7 +293,7 @@ std::string GCodeWriter::set_jerk_xy(double jerk) gcode << "M205 X" << jerk_x << " Y" << jerk_y; } - + //the is_bbl check should be in the else statement above so that it doesn't inadverently added Z & E to klipper if (m_is_bbl_printers) gcode << std::setprecision(2) << " Z" << m_max_jerk_z << " E" << m_max_jerk_e; @@ -365,6 +380,10 @@ std::string GCodeWriter::set_pressure_advance(double pa) const gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << std::setprecision(4) << pa << "; Override pressure advance value\n"; else if(FLAVOR_IS(gcfRepRapFirmware)) gcode << ("M572 D0 S") << std::setprecision(4) << pa << "; Override pressure advance value\n"; + else if (FLAVOR_IS(gcfRepetier)) + // Repetier M233: X is quadratic (K), Y is linear (L). + // Applying the value to both parameters simultaneously. + gcode << "M233 X" << std::setprecision(4) << pa << " Y" << std::setprecision(4) << pa << " ; Override pressure advance value\n"; else gcode << "M900 K" <enum_values.push_back("marlin"); def->enum_values.push_back("klipper"); def->enum_values.push_back("reprapfirmware"); - //def->enum_values.push_back("repetier"); + def->enum_values.push_back("repetier"); + def->enum_values.push_back("marlin2"); + //def->enum_values.push_back("reprap"); //def->enum_values.push_back("teacup"); //def->enum_values.push_back("makerware"); - def->enum_values.push_back("marlin2"); //def->enum_values.push_back("sailfish"); //def->enum_values.push_back("mach3"); //def->enum_values.push_back("machinekit"); @@ -3718,11 +3719,11 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back("Marlin(legacy)"); def->enum_labels.push_back(L("Klipper")); def->enum_labels.push_back("RepRapFirmware"); + def->enum_labels.push_back("Repetier"); + def->enum_labels.push_back("Marlin 2"); //def->enum_labels.push_back("RepRap/Sprinter"); - //def->enum_labels.push_back("Repetier"); //def->enum_labels.push_back("Teacup"); //def->enum_labels.push_back("MakerWare (MakerBot)"); - def->enum_labels.push_back("Marlin 2"); //def->enum_labels.push_back("Sailfish (MakerBot)"); //def->enum_labels.push_back("Mach3/LinuxCNC"); //def->enum_labels.push_back("Machinekit"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6d6377cc30..2b62000c1a 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -31,8 +31,19 @@ namespace Slic3r { enum GCodeFlavor : unsigned char { - gcfMarlinLegacy, gcfKlipper, gcfRepRapFirmware, gcfMarlinFirmware, gcfRepRapSprinter, gcfRepetier, gcfTeacup, gcfMakerWare, gcfSailfish, gcfMach3, gcfMachinekit, - gcfSmoothie, gcfNoExtrusion + gcfMarlinLegacy, + gcfKlipper, + gcfRepRapFirmware, + gcfRepetier, + gcfMarlinFirmware, + gcfRepRapSprinter, + gcfTeacup, + gcfMakerWare, + gcfSailfish, + gcfMach3, + gcfMachinekit, + gcfSmoothie, + gcfNoExtrusion }; diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index e9767fd866..be2f7278ee 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -1253,9 +1253,19 @@ PageFirmware::PageFirmware(ConfigWizard *parent) void PageFirmware::apply_custom_config(DynamicPrintConfig &config) { auto sel = gcode_picker->GetSelection(); - if (sel >= 0 && (size_t)sel < gcode_opt.enum_labels.size()) { - auto *opt = new ConfigOptionEnum(static_cast(sel)); - config.set_key_value("gcode_flavor", opt); + + // Safety check: ensure selection index is within bounds + if (sel >= 0 && (size_t) sel < gcode_opt.enum_values.size()) { + std::string selected_flavor_str = gcode_opt.enum_values[sel]; + // Ensure the default value exists to prevent null pointer crashes + if (gcode_opt.default_value) { + //Clone the fully initialized option (preserves the dictionary map) + ConfigOption* opt = gcode_opt.default_value->clone(); + // Deserialize the string safely + opt->deserialize(selected_flavor_str); + // Save it to the printer configuration + config.set_key_value("gcode_flavor", opt); + } } } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 206a83eab5..ae428b4970 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4851,7 +4851,7 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) { size_t n_before_extruders = 2; // Count of pages before Extruder pages auto flavor = m_config->option>("gcode_flavor")->value; - bool is_marlin_flavor = (flavor == gcfMarlinLegacy || flavor == gcfMarlinFirmware || flavor == gcfKlipper || flavor == gcfRepRapFirmware); + bool is_marlin_flavor = (flavor == gcfMarlinLegacy || flavor == gcfMarlinFirmware || flavor == gcfKlipper || flavor == gcfRepRapFirmware || flavor == gcfRepetier); /* ! Freeze/Thaw in this function is needed to avoid call OnPaint() for erased pages * and be cause of application crash, when try to change Preset in moment,