diff --git a/doc/calibration/input-shaping-calib.md b/doc/calibration/input-shaping-calib.md index fd0dfcc0b1..b91ee7cb5e 100644 --- a/doc/calibration/input-shaping-calib.md +++ b/doc/calibration/input-shaping-calib.md @@ -2,130 +2,124 @@ During high-speed movements, vibrations can cause a phenomenon called "ringing," where periodic ripples appear on the print surface. Input Shaping provides an effective solution by counteracting these vibrations, improving print quality and reducing wear on components without needing to significantly lower print speeds. -- [Klipper](#klipper) - - [Resonance Compensation](#resonance-compensation) -- [Marlin](#marlin) - - [ZV Input Shaping](#zv-input-shaping) +> [!IMPORTANT] +> RepRap can only set one frequency for both X and Y axes so you will need to select a frequency that works well for both axes. + +- [Types](#types) + - [Default](#default) + - [Version Table](#version-table) +- [Calibration Steps](#calibration-steps) - [Fixed-Time Motion](#fixed-time-motion) - [Credits](#credits) -## Klipper +## Types -### Resonance Compensation +It is usually recommended to use MZV, EI (specially for Delta printers) or ZV as a simple and effective solution. +Not all Input Shaping types are available in all firmware and their performance may vary depending on the firmware implementation and the printer's mechanics. -The Klipper Resonance Compensation is a set of Input Shaping modes that can be used to reduce ringing and improve print quality. -Ussualy the recommended values modes are `MZV` or `EI` for Delta printers. +### Default -1. Pre-requisites: - 1. In OrcaSlicer, set: - 1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²). - 2. Speed high enough to trigger ringing (e.g., 100 mm/s). +When "Default" is selected, the firmware's default input shaper will be used. +Every firmware and even its version may have a different default type but usually are: -> [!NOTE] -> These settings depend on your printer's motion ability and the filament's max volumetric speed. If you can't reach speeds that cause ringing, try increasing the filament's max volumetric speed (avoid materials below 10 mm³/s). - 3. Jerk [Klipper Square Corner Velocity](https://www.klipper3d.org/Kinematics.html?h=square+corner+velocity#look-ahead) to 5 or a high value (e.g., 20). +- Klipper: MZV +- Marlin: ZV +- RepRap: + - Version >= 3.4: MZV + - Version < 3.4: DAA + - Version < 3.2: DAA (without damping option) - 2. In printer settigs: - 1. Set the Shaper Type to `MZV` or `EI`. - ```gcode - SET_INPUT_SHAPER SHAPER_TYPE=MZV - ``` - 2. Disable [Minimun Cruise Ratio](https://www.klipper3d.org/Kinematics.html#minimum-cruise-ratio) with: - ```gcode - SET_VELOCITY_LIMIT MINIMUM_CRUISE_RATIO=0 - ``` - 3. Use an opaque, high-gloss filament to make the ringing more visible. -2. Print the Input Shaping Frequency test with a range of frequencies. +### Version Table - ![IS_freq_menu](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_menu.png?raw=true) +| Type | Name | [Klipper](https://www.klipper3d.org/Resonance_Compensation.html#technical-details) | [RepRap](https://docs.duet3d.com/User_manual/Reference/Gcodes#m593-configure-input-shaping) | [Marlin 2](https://marlinfw.org/docs/features/ft_motion.html#more-complexity-zv-input-shaper) | Marlin Legacy | +|---|---|---|---|---|---| +| MZV | Modified Zero Vibration | >=0.9.0 | >=3.4 | - | - | +| ZV | Zero Vibration | >=0.9.0 | = 3.5 | >2.1.2 | - | +| ZVD | Zero Vibration Derivative | >=0.9.0 | >=3.4 | - | - | +| ZVDD | Zero Vibration Double Derivative | - | >=3.4 | - | - | +| ZVDDD | Zero Vibration Triple Derivative | - | >=3.4 | - | - | +| EI | Extra Insensitive | >=0.9.0 | - | - | - | +| 2HUMP_EI / EI2 | Two-Hump Extra Insensitive | >=0.9.0 | >=3.4 | - | - | +| 3HUMP_EI / EI3 | Three-Hump Extra Insensitive | >=0.9.0 | >=3.4 | - | - | +| [FT_MOTION](https://marlinfw.org/docs/features/ft_motion.html#fixed-time-motion-by-ulendo) | Fixed-Time Motion | - | - | >2.1.3 | - | +| DAA | Damped Anti-Resonance | - | < 3.4 | - | - | - 1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer. +## Calibration Steps - ![IS_damp_klipper_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_klipper_print_measure.jpg?raw=true) - ![IS_freq_klipper_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_klipper_slicer_measure.png?raw=true) - - 2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value. - -> [!WARNING] -> There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz. - -3. Print the Damping test setting your X and Y frequency to the value you found in the previous step. - - ![IS_damp_menu](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_menu.png?raw=true) - - 1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer. - - ![IS_damp_klipper_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_klipper_print_measure.jpg?raw=true) - ![IS_damp_klipper_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_klipper_slicer_measure.png?raw=true) +0. Pre-requisites: + 1. Use an opaque, high-gloss filament to make the ringing more visible. + 2. In OrcaSlicer, set: + 1. Acceleration high enough to trigger ringing (e.g., 20000 mm/s²). + 2. Speed high enough to trigger ringing (e.g., 200 mm/s). > [!IMPORTANT] -> Not all Resonance Compensation modes support damping. - -4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values. -5. Save the settings - 1. You need to go to the printer settings and set the X and Y frequency and damp to the value you found in the previous step. - -## Marlin - -### ZV Input Shaping - -ZV Input Shaping introduces an anti-vibration signal into the stepper motion for the X and Y axes. It works by splitting the step count into two halves: the first at half the frequency and the second as an "echo," delayed by half the ringing interval. This simple approach effectively reduces vibrations, improving print quality and allowing for higher speeds. - -1. Pre-requisites: - 1. In OrcaSlicer, set: - 1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²). - 2. Speed high enough to trigger ringing (e.g., 100 mm/s). - -> [!NOTE] -> These settings depend on your printer's motion ability and the filament's max volumetric speed. If you can't reach speeds that cause ringing, try increasing the filament's max volumetric speed (avoid materials below 10 mm³/s). - - 3. Jerk - 1. If using [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) use a high value (e.g., 20). - 2. If using [Junction Deviation](https://marlinfw.org/docs/features/junction_deviation.html) (new Marlin default mode) this test will use 0.25 (high enough to most printers). - 2. Use an opaque, high-gloss filament to make the ringing more visible. -2. Print the Input Shaping Frequency test with a range of frequencies. +> It's recommended to use the fastest [acceleration](speed_settings_acceleration), [speed](speed_settings_other_layers_speed) and [Jerk/Junction Deviation](speed_settings_jerk_xy) your printer can handle without losing steps. +> This test **will set the values to high values** limited by your printer's motion ability and the filament's max volumetric speed (avoid materials below 10 mm³/s). +1. Select the Test Model ´Ringing Tower´ (Recommended) or ´Fast Tower´ (Reduced version useful for printers with high ringing). +2. Select the [Input Shaper Type](#types) you want to test. Each firmware has different types available and each type has different performance. +3. Select a range of frequencies to test. The Default 15hz to 110hz range is usually a good start. +4. Select your damping. Usually, a value between 0.1 and 0.2 is a good start but you can change it to 0 and your printer will use the firmware default value (if available). ![IS_freq_menu](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_menu.png?raw=true) - - 1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer. - - ![IS_freq_marlin_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg?raw=true) - ![IS_freq_marlin_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_marlin_slicer_measure.png?raw=true) - + 1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer. + ![IS_freq_marlin_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg?raw=true) + - Marlin: + ![IS_freq_marlin_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_marlin_slicer_measure.png?raw=true) + - Klipper: + ![IS_freq_klipper_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_freq_klipper_slicer_measure.png?raw=true) 2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value. - -> [!WARNING] -> There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz. - -3. Print the Damping test setting your X and Y frequency to the value you found in the previous step. - +5. Print the Damping test setting your X and Y frequency to the value you found in the previous step. ![IS_damp_menu](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_menu.png?raw=true) + 1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer. + ![IS_damp_marlin_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true) + - Marlin: + ![IS_damp_marlin_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_slicer_measure.png?raw=true) + - Klipper: + ![IS_damp_klipper_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_klipper_slicer_measure.png?raw=true) - 1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer. - - ![IS_damp_marlin_print_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true) - ![IS_damp_marlin_slicer_measure](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_slicer_measure.png?raw=true) - -4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values. - 1. Reboot your printer. - 2. Use the following G-code to restore your printer settings: - ```gcode - M501 - ``` -5. Save the settings - 1. You need to go to the printer settings and set the X and Y frequency and damp to the value you found in the previous step. - 2. Use the following G-code to set the frequency: - ```gcode - M593 X F#Xfrequency D#XDamping - M593 Y F#Yfrequency D#YDamping - M500 - ``` - Example - ```gcode - M593 X F37.25 D0.16 - M593 Y F37.5 D0.06 - M500 - ``` +6. **Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.** +7. Save the settings + - Into your printer firmware settings save the values you found (Type, frequency/cies and damp) + - Save it into Orca's printer profile settings in Printer settings/ Machine G-code/ Machine start G-code using the following G-code: + - Klipper: + - Skeleton + ```gcode + SET_INPUT_SHAPER SHAPER_TYPE=TYPE SHAPER_FREQ_X=#Xfrequency DAMPING_RATIO_X=#XDamping SHAPER_FREQ_Y=#Yfrequency DAMPING_RATIO_Y=#YDamping + ``` + Example + ```gcode + SET_INPUT_SHAPER SHAPER_TYPE=MZV SHAPER_FREQ_X=37.25 DAMPING_RATIO_X=0.16 SHAPER_FREQ_Y=37.5 DAMPING_RATIO_Y=0.06 + ``` + - Marlin: + - Skeleton + ```gcode + M593 X F#Xfrequency D#XDamping + M593 Y F#Yfrequency D#YDamping + M500 + ``` + Example + ```gcode + M593 X F37.25 D0.16 + M593 Y F37.5 D0.06 + M500 + ``` + - RepRap: + - Skeleton for RepRap 3.3 and later + ```gcode + M593 P#Type F#frequency S#Damping + ``` + Example RepRap 3.4 and later + ```gcode + M593 P"ZVD" F37.25 S0.16 + ``` + - Skeleton for RepRap 3.2 and earlier + ```gcode + M593 F#frequency + ``` + Example Legacy (RepRap 3.2 and earlier) + ```gcode + M593 F37.25 + ``` ### Fixed-Time Motion diff --git a/doc/images/InputShaping/IS_damp_klipper_print_measure.jpg b/doc/images/InputShaping/IS_damp_klipper_print_measure.jpg deleted file mode 100644 index a4dc561ec7..0000000000 Binary files a/doc/images/InputShaping/IS_damp_klipper_print_measure.jpg and /dev/null differ diff --git a/doc/images/InputShaping/IS_damp_menu.png b/doc/images/InputShaping/IS_damp_menu.png index bb3674826d..70460f7aef 100644 Binary files a/doc/images/InputShaping/IS_damp_menu.png and b/doc/images/InputShaping/IS_damp_menu.png differ diff --git a/doc/images/InputShaping/IS_freq_klipper_print_measure.jpg b/doc/images/InputShaping/IS_freq_klipper_print_measure.jpg deleted file mode 100644 index 812236d590..0000000000 Binary files a/doc/images/InputShaping/IS_freq_klipper_print_measure.jpg and /dev/null differ diff --git a/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg b/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg index db7080cb3d..00c4a54098 100644 Binary files a/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg and b/doc/images/InputShaping/IS_freq_marlin_print_measure.jpg differ diff --git a/doc/images/InputShaping/IS_freq_menu.png b/doc/images/InputShaping/IS_freq_menu.png index e4764b50bf..3589e1d51a 100644 Binary files a/doc/images/InputShaping/IS_freq_menu.png and b/doc/images/InputShaping/IS_freq_menu.png differ diff --git a/doc/print_settings/quality/quality_settings_ironing.md b/doc/print_settings/quality/quality_settings_ironing.md index 5b34cfb31a..c764a9124c 100644 --- a/doc/print_settings/quality/quality_settings_ironing.md +++ b/doc/print_settings/quality/quality_settings_ironing.md @@ -33,7 +33,9 @@ The pattern that will be used when ironing. Usually, the best pattern is the one ## Flow The amount of material to extrude during ironing. -This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish. +This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish. + +A lower layer height may require higher flow due to less volumetric extrusion per distance. ## Line spacing @@ -48,10 +50,9 @@ The distance to keep from the edges, which can help prevent over-extrusion at th If this value is set to 0, the ironing toolpath will start directly at the perimeter edges without any inward offset. This means the [ironing pattern](#pattern) will extend all the way to the outer boundaries of the top surface being ironed. -## Angle +## Angle Offset -The angle ironing is done at. -A negative number disables this function and uses the [sparse infill direction](strength_settings_infill#direction). +The angle of ironing lines offset relative to the top surface solid infill direction. Commonly used ironing angle offsets are 0°, 45°, and 90° each producing a [different surface finish](https://github.com/SoftFever/OrcaSlicer/issues/10834#issuecomment-3322628589) which will depend on your printer nozzle. ## Speed diff --git a/resources/profiles/Anycubic/process/0.08mm HighDetail @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.08mm HighDetail @Anycubic Kobra 3 0.4 nozzle.json index 14e6d07c55..2231465b6a 100644 --- a/resources/profiles/Anycubic/process/0.08mm HighDetail @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.08mm HighDetail @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "200", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.10mm Detail @Anycubic Kobra 3 0.2 nozzle.json b/resources/profiles/Anycubic/process/0.10mm Detail @Anycubic Kobra 3 0.2 nozzle.json index 3c86bca3cb..429c756708 100644 --- a/resources/profiles/Anycubic/process/0.10mm Detail @Anycubic Kobra 3 0.2 nozzle.json +++ b/resources/profiles/Anycubic/process/0.10mm Detail @Anycubic Kobra 3 0.2 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.22", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "120", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.12mm Detail @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.12mm Detail @Anycubic Kobra 3 0.4 nozzle.json index 3114c07ea1..9171007fe2 100644 --- a/resources/profiles/Anycubic/process/0.12mm Detail @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.12mm Detail @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "200", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 2 Pro 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 2 Pro 0.4 nozzle.json index ac729ec122..72040f5d3e 100644 --- a/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 2 Pro 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 2 Pro 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "240", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 3 0.4 nozzle.json index 4b30de8de0..91cd4e155a 100644 --- a/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.16mm Optimal @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Max 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Max 0.4 nozzle.json index 4ae781ef7b..077a3af03e 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Max 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Max 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "130", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Neo 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Neo 0.4 nozzle.json index ba195fdb71..3ee0511436 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Neo 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Neo 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "100", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Plus 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Plus 0.4 nozzle.json index 7fd2f802fd..3531b421fc 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Plus 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Plus 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "130", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Pro 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Pro 0.4 nozzle.json index ca6c31851d..4a912876df 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Pro 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 2 Pro 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "130", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 3 0.4 nozzle.json index a41ebfda03..75df40bb96 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "130", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra S1 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra S1 0.4 nozzle.json index fe300766b9..681061a1ca 100644 --- a/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra S1 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra S1 0.4 nozzle.json @@ -90,7 +90,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.24mm Draft @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.24mm Draft @Anycubic Kobra 3 0.4 nozzle.json index 7a78799c68..ee2e848f26 100644 --- a/resources/profiles/Anycubic/process/0.24mm Draft @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.24mm Draft @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.45", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "200", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.28mm Draft @Anycubic Kobra 2 Pro 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.28mm Draft @Anycubic Kobra 2 Pro 0.4 nozzle.json index 29299c1e9c..f5cf2a58a5 100644 --- a/resources/profiles/Anycubic/process/0.28mm Draft @Anycubic Kobra 2 Pro 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.28mm Draft @Anycubic Kobra 2 Pro 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "120", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Anycubic/process/0.28mm SuperDraft @Anycubic Kobra 3 0.4 nozzle.json b/resources/profiles/Anycubic/process/0.28mm SuperDraft @Anycubic Kobra 3 0.4 nozzle.json index a3f88f28d9..79b1031696 100644 --- a/resources/profiles/Anycubic/process/0.28mm SuperDraft @Anycubic Kobra 3 0.4 nozzle.json +++ b/resources/profiles/Anycubic/process/0.28mm SuperDraft @Anycubic Kobra 3 0.4 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "180", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.30mm Standard @Anycubic Kobra 3 0.6 nozzle.json b/resources/profiles/Anycubic/process/0.30mm Standard @Anycubic Kobra 3 0.6 nozzle.json index f4384a42bb..85b6b0406d 100644 --- a/resources/profiles/Anycubic/process/0.30mm Standard @Anycubic Kobra 3 0.6 nozzle.json +++ b/resources/profiles/Anycubic/process/0.30mm Standard @Anycubic Kobra 3 0.6 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.62", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Anycubic/process/0.40mm Standard @Anycubic Kobra 3 0.8 nozzle.json b/resources/profiles/Anycubic/process/0.40mm Standard @Anycubic Kobra 3 0.8 nozzle.json index 3b76c7e3c9..242c46ab1b 100644 --- a/resources/profiles/Anycubic/process/0.40mm Standard @Anycubic Kobra 3 0.8 nozzle.json +++ b/resources/profiles/Anycubic/process/0.40mm Standard @Anycubic Kobra 3 0.8 nozzle.json @@ -91,7 +91,7 @@ "internal_solid_infill_line_width": "0.82", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.08mm Extra Fine @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.08mm Extra Fine @Artillery M1 Pro 0.4 nozzle.json index 0d34e48320..6782b66043 100644 --- a/resources/profiles/Artillery/process/0.08mm Extra Fine @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.08mm Extra Fine @Artillery M1 Pro 0.4 nozzle.json @@ -101,7 +101,7 @@ "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.2 nozzle.json b/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.2 nozzle.json index b08ec4a36a..2f78eb25c1 100644 --- a/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.2 nozzle.json +++ b/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.2 nozzle.json @@ -93,7 +93,7 @@ "internal_solid_infill_line_width": "0.22", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.4 nozzle.json index a7edc4d623..f83d5abd27 100644 --- a/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.08mm High Quality @Artillery M1 Pro 0.4 nozzle.json @@ -98,7 +98,7 @@ "internal_bridge_speed": "150%", "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.12mm Fine @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.12mm Fine @Artillery M1 Pro 0.4 nozzle.json index 4392f735cb..817bb4adfa 100644 --- a/resources/profiles/Artillery/process/0.12mm Fine @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.12mm Fine @Artillery M1 Pro 0.4 nozzle.json @@ -99,7 +99,7 @@ "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.12mm High Quality @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.12mm High Quality @Artillery M1 Pro 0.4 nozzle.json index d4e859d445..62dc77f66d 100644 --- a/resources/profiles/Artillery/process/0.12mm High Quality @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.12mm High Quality @Artillery M1 Pro 0.4 nozzle.json @@ -99,7 +99,7 @@ "internal_bridge_speed": "150%", "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.16mm High Quality @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.16mm High Quality @Artillery M1 Pro 0.4 nozzle.json index f4d59cc9fa..c5a47dce99 100644 --- a/resources/profiles/Artillery/process/0.16mm High Quality @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.16mm High Quality @Artillery M1 Pro 0.4 nozzle.json @@ -100,7 +100,7 @@ "internal_bridge_speed": "150%", "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.16mm Optimal @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.16mm Optimal @Artillery M1 Pro 0.4 nozzle.json index 20382f1ec6..79729dfa9a 100644 --- a/resources/profiles/Artillery/process/0.16mm Optimal @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.16mm Optimal @Artillery M1 Pro 0.4 nozzle.json @@ -102,7 +102,7 @@ "internal_bridge_speed": "150%", "internal_solid_infill_acceleration": "100%", "internal_solid_infill_pattern": "monotonic", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Standard @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Standard @Artillery M1 Pro 0.4 nozzle.json index d7fdadf076..e7464ceaac 100644 --- a/resources/profiles/Artillery/process/0.20mm Standard @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Standard @Artillery M1 Pro 0.4 nozzle.json @@ -103,7 +103,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Plus 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Plus 0.4 nozzle.json index 609e4e0449..095eca39f6 100644 --- a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Plus 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Plus 0.4 nozzle.json @@ -87,7 +87,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Pro 0.4 nozzle.json index 03596bb89b..4f2ba17308 100644 --- a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X3Pro 0.4 nozzle.json @@ -87,7 +87,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Plus 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Plus 0.4 nozzle.json index ffc4990277..6cd017a2a2 100644 --- a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Plus 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Plus 0.4 nozzle.json @@ -87,7 +87,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Pro 0.4 nozzle.json index 9d9f9fa94b..205850caa9 100644 --- a/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Standard @Artillery X4Pro 0.4 nozzle.json @@ -87,7 +87,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.20mm Strength @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.20mm Strength @Artillery M1 Pro 0.4 nozzle.json index 7e7511a827..3c82b8e353 100644 --- a/resources/profiles/Artillery/process/0.20mm Strength @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.20mm Strength @Artillery M1 Pro 0.4 nozzle.json @@ -98,7 +98,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.4 nozzle.json index cb39c30cfe..b0bbf7da19 100644 --- a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.4 nozzle.json @@ -96,7 +96,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.6 nozzle.json b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.6 nozzle.json index 76f2a27d95..e2e13de246 100644 --- a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.6 nozzle.json +++ b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.6 nozzle.json @@ -93,7 +93,7 @@ "internal_solid_infill_line_width": "0.62", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.8 nozzle.json b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.8 nozzle.json index 1f8c58c0c5..73faaa0416 100644 --- a/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.8 nozzle.json +++ b/resources/profiles/Artillery/process/0.24mm Draft @Artillery M1 Pro 0.8 nozzle.json @@ -93,7 +93,7 @@ "internal_solid_infill_line_width": "0.82", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "150", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Artillery/process/0.28mm Extra Draft @Artillery M1 Pro 0.4 nozzle.json b/resources/profiles/Artillery/process/0.28mm Extra Draft @Artillery M1 Pro 0.4 nozzle.json index 073bf7e5af..82d05cd7f9 100644 --- a/resources/profiles/Artillery/process/0.28mm Extra Draft @Artillery M1 Pro 0.4 nozzle.json +++ b/resources/profiles/Artillery/process/0.28mm Extra Draft @Artillery M1 Pro 0.4 nozzle.json @@ -99,7 +99,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "300", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/CoLiDo/process/fdm_process_colidodiy40_common.json b/resources/profiles/CoLiDo/process/fdm_process_colidodiy40_common.json index 42140b6af0..746335aaf5 100644 --- a/resources/profiles/CoLiDo/process/fdm_process_colidodiy40_common.json +++ b/resources/profiles/CoLiDo/process/fdm_process_colidodiy40_common.json @@ -87,7 +87,7 @@ "internal_solid_infill_line_width": "0.4", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/CoLiDo/process/fdm_process_colidox16_common.json b/resources/profiles/CoLiDo/process/fdm_process_colidox16_common.json index 4ee6991395..5966d9c818 100644 --- a/resources/profiles/CoLiDo/process/fdm_process_colidox16_common.json +++ b/resources/profiles/CoLiDo/process/fdm_process_colidox16_common.json @@ -94,7 +94,7 @@ "internal_solid_infill_line_width": "0.4", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "90", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json b/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json index f05c33ad01..65a123843d 100644 --- a/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json +++ b/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json @@ -76,7 +76,7 @@ "internal_solid_infill_line_width": "0", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "200", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.25", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender-5 Max 0.4mm nozzle.json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender-5 Max 0.4mm nozzle.json index 011735e4a5..c0beaa6fbd 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender-5 Max 0.4mm nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender-5 Max 0.4mm nozzle.json @@ -89,7 +89,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "500", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Creality/process/0.20mm Ultrafast @Creality Ender-5 Max 0.4mm nozzle.json b/resources/profiles/Creality/process/0.20mm Ultrafast @Creality Ender-5 Max 0.4mm nozzle.json index 36f5a44408..3a4c005dc6 100644 --- a/resources/profiles/Creality/process/0.20mm Ultrafast @Creality Ender-5 Max 0.4mm nozzle.json +++ b/resources/profiles/Creality/process/0.20mm Ultrafast @Creality Ender-5 Max 0.4mm nozzle.json @@ -89,7 +89,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "500", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json index 4478100260..5046b8b8f4 100644 --- a/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json @@ -104,7 +104,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_inset": "0", "ironing_pattern": "zig-zag", diff --git a/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json b/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json index 05e8ac0755..bdd93a714c 100644 --- a/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json +++ b/resources/profiles/Eryone/process/0.20mm Standard @Thinker X400.json @@ -80,7 +80,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/resources/profiles/Flashforge/process/0.20mm Standard @Flashforge G3U 0.4 Nozzle.json b/resources/profiles/Flashforge/process/0.20mm Standard @Flashforge G3U 0.4 Nozzle.json index e6412eaaf6..b9c8cc8c02 100644 --- a/resources/profiles/Flashforge/process/0.20mm Standard @Flashforge G3U 0.4 Nozzle.json +++ b/resources/profiles/Flashforge/process/0.20mm Standard @Flashforge G3U 0.4 Nozzle.json @@ -83,7 +83,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "15%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Ginger Additive/process/fdm_process_common.json b/resources/profiles/Ginger Additive/process/fdm_process_common.json index ec7d5e4646..f517188d37 100644 --- a/resources/profiles/Ginger Additive/process/fdm_process_common.json +++ b/resources/profiles/Ginger Additive/process/fdm_process_common.json @@ -84,7 +84,7 @@ "internal_solid_infill_line_width": "3", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "100", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.1", diff --git a/resources/profiles/Phrozen/process/0.20mm Standard @Phrozen Arco 0.4 nozzle.json b/resources/profiles/Phrozen/process/0.20mm Standard @Phrozen Arco 0.4 nozzle.json index ac76e85ada..c341766281 100644 --- a/resources/profiles/Phrozen/process/0.20mm Standard @Phrozen Arco 0.4 nozzle.json +++ b/resources/profiles/Phrozen/process/0.20mm Standard @Phrozen Arco 0.4 nozzle.json @@ -90,7 +90,7 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "monotonic", "internal_solid_infill_speed": "250", - "ironing_angle": "-1", + "ironing_angle": "0", "ironing_flow": "10%", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index c953e242b3..1be8e8997a 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -1462,43 +1462,31 @@ void Layer::make_ironing() double height; double speed; double angle; + bool is_using_template_angle; double inset; bool operator<(const IroningParams &rhs) const { - if (this->extruder < rhs.extruder) - return true; - if (this->extruder > rhs.extruder) - return false; - if (int(this->just_infill) < int(rhs.just_infill)) - return true; - if (int(this->just_infill) > int(rhs.just_infill)) - return false; - if (this->line_spacing < rhs.line_spacing) - return true; - if (this->line_spacing > rhs.line_spacing) - return false; - if (this->height < rhs.height) - return true; - if (this->height > rhs.height) - return false; - if (this->speed < rhs.speed) - return true; - if (this->speed > rhs.speed) - return false; - if (this->angle < rhs.angle) - return true; - if (this->angle > rhs.angle) - return false; - if (this->inset < rhs.inset) - return true; - if (this->inset > rhs.inset) - return false; + RETURN_COMPARE_NON_EQUAL(extruder); + RETURN_COMPARE_NON_EQUAL(just_infill); + RETURN_COMPARE_NON_EQUAL(line_spacing); + RETURN_COMPARE_NON_EQUAL(height); + RETURN_COMPARE_NON_EQUAL(speed); + RETURN_COMPARE_NON_EQUAL(angle); + RETURN_COMPARE_NON_EQUAL(is_using_template_angle); + RETURN_COMPARE_NON_EQUAL(inset); return false; } bool operator==(const IroningParams &rhs) const { - return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill && - this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed && this->angle == rhs.angle && this->pattern == rhs.pattern && this->inset == rhs.inset; + return this->extruder == rhs.extruder && + this->just_infill == rhs.just_infill && + this->line_spacing == rhs.line_spacing && + this->height == rhs.height && + this->speed == rhs.speed && + this->angle == rhs.angle && + this->is_using_template_angle == rhs.is_using_template_angle && + this->pattern == rhs.pattern && + this->inset == rhs.inset; } LayerRegion *layerm = nullptr; @@ -1545,7 +1533,8 @@ void Layer::make_ironing() ironing_params.inset = config.ironing_inset; ironing_params.height = default_layer_height * 0.01 * config.ironing_flow; ironing_params.speed = config.ironing_speed; - ironing_params.angle = (config.ironing_angle >= 0 ? config.ironing_angle : config.infill_direction) * M_PI / 180.; + ironing_params.angle = calculate_infill_rotation_angle(this->object(), this->id(), config.solid_infill_direction.value, config.solid_infill_rotate_template.value) + config.ironing_angle * M_PI / 180.; + ironing_params.is_using_template_angle = !config.solid_infill_rotate_template.value.empty(); ironing_params.pattern = config.ironing_pattern; ironing_params.layerm = layerm; by_extruder.emplace_back(ironing_params); @@ -1641,6 +1630,7 @@ void Layer::make_ironing() // Create the filler object. f->spacing = ironing_params.line_spacing; f->angle = float(ironing_params.angle); + f->is_using_template_angle = ironing_params.is_using_template_angle; f->link_max_length = (coord_t) scale_(3. * f->spacing); double extrusion_height = ironing_params.height * f->spacing / nozzle_dmr; float extrusion_width = Flow::rounded_rectangle_extrusion_width_from_spacing(float(nozzle_dmr), float(extrusion_height)); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6948cad3fc..e0dd3d71f5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4234,23 +4234,31 @@ LayerResult GCode::process_layer( } case CalibMode::Calib_Input_shaping_freq: { if (m_layer_index == 1){ - gcode += writer().set_input_shaping('A', print.calib_params().start, 0.f); + gcode += writer().set_input_shaping('A', print.calib_params().start, 0.f, print.calib_params().shaper_type); + if (m_writer.get_gcode_flavor() == gcfKlipper) { + // Disable minimum cruise ratio to ensure consistent motion for calibration + gcode += "SET_VELOCITY_LIMIT MINIMUM_CRUISE_RATIO=0\n"; + } } else { if (print.calib_params().freqStartX == print.calib_params().freqStartY && print.calib_params().freqEndX == print.calib_params().freqEndY) { - gcode += writer().set_input_shaping('A', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3)); + gcode += writer().set_input_shaping('A', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3), ""); } else { - gcode += writer().set_input_shaping('X', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3)); - gcode += writer().set_input_shaping('Y', 0.f, (print.calib_params().freqStartY) + ((print.calib_params().freqEndY)-(print.calib_params().freqStartY)) * (m_layer_index - 2) / (m_layer_count - 3)); + gcode += writer().set_input_shaping('X', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3), ""); + gcode += writer().set_input_shaping('Y', 0.f, (print.calib_params().freqStartY) + ((print.calib_params().freqEndY)-(print.calib_params().freqStartY)) * (m_layer_index - 2) / (m_layer_count - 3), ""); } } break; } case CalibMode::Calib_Input_shaping_damp: { if (m_layer_index == 1){ - gcode += writer().set_input_shaping('X', 0.f, print.calib_params().freqStartX); - gcode += writer().set_input_shaping('Y', 0.f, print.calib_params().freqStartY); + if (m_writer.get_gcode_flavor() == gcfKlipper) { + // Disable minimum cruise ratio to ensure consistent motion for calibration + gcode += "SET_VELOCITY_LIMIT MINIMUM_CRUISE_RATIO=0\n"; + } + gcode += writer().set_input_shaping('X', 0.f, print.calib_params().freqStartX, print.calib_params().shaper_type); + gcode += writer().set_input_shaping('Y', 0.f, print.calib_params().freqStartY, print.calib_params().shaper_type); } else { - gcode += writer().set_input_shaping('A', print.calib_params().start + ((print.calib_params().end)-(print.calib_params().start)) * (m_layer_index) / (m_layer_count), 0.f); + gcode += writer().set_input_shaping('A', print.calib_params().start + ((print.calib_params().end)-(print.calib_params().start)) * (m_layer_index) / (m_layer_count), 0.f, ""); } break; } diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 36639f3305..c53d3a0f9a 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -351,8 +351,10 @@ std::string GCodeWriter::set_pressure_advance(double pa) const return gcode.str(); } -std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) const +std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq, std::string type) const { + if (FLAVOR_IS(gcfMarlinLegacy)) + throw std::runtime_error("Input shaping is not supported by Marlin < 2.1.2.\nCheck your firmware version and update your G-code flavor to ´Marlin 2´"); if (freq < 0.0f || damp < 0.f || damp > 1.0f || (axis != 'X' && axis != 'Y' && axis != 'Z' && axis != 'A'))// A = all axis { throw std::runtime_error("Invalid input shaping parameters: freq=" + std::to_string(freq) + ", damp=" + std::to_string(damp)); @@ -360,14 +362,17 @@ std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) co std::ostringstream gcode; if (FLAVOR_IS(gcfKlipper)) { gcode << "SET_INPUT_SHAPER"; + if (!type.empty() && type != "Default") { + gcode << " SHAPER_TYPE=" << type; + } if (axis != 'A') { if (freq > 0.0f) { gcode << " SHAPER_FREQ_" << axis << "=" << std::fixed << std::setprecision(2) << freq; } if (damp > 0.0f){ - gcode << " DAMPING_RATIO_" << axis << "=" << damp; - } + gcode << " DAMPING_RATIO_" << axis << "=" << std::fixed << std::setprecision(3) << damp; + } } else { if (freq > 0.0f) { gcode << " SHAPER_FREQ_X=" << std::fixed << std::setprecision(2) << freq << " SHAPER_FREQ_Y=" << std::fixed << std::setprecision(2) << freq; @@ -376,7 +381,18 @@ std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) co gcode << " DAMPING_RATIO_X=" << std::fixed << std::setprecision(3) << damp << " DAMPING_RATIO_Y=" << std::fixed << std::setprecision(3) << damp; } } - } else { + } else if (FLAVOR_IS(gcfRepRapFirmware)) { + gcode << "M593"; + if (!type.empty() && type != "Default" && type != "DAA") { + gcode << " P\"" << type << "\""; + } + if (freq > 0.0f) { + gcode << " F" << std::fixed << std::setprecision(2) << freq; + } + if (damp > 0.0f){ + gcode << " S" << std::fixed << std::setprecision(3) << damp; + } + } else if (FLAVOR_IS(gcfMarlinFirmware)) { gcode << "M593"; if (axis != 'A') { @@ -390,6 +406,8 @@ std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) co { gcode << " D" << std::fixed << std::setprecision(3) << damp; } + } else { + throw std::runtime_error("Input shaping is only supported by Klipper, RepRapFirmware and Marlin 2"); } if (GCodeWriter::full_gcode_comment){ gcode << " ; Override input shaping"; diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 4fd93e3560..1fbe7623c0 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -58,7 +58,7 @@ public: std::string set_accel_and_jerk(unsigned int acceleration, double jerk); std::string set_junction_deviation(double junction_deviation); std::string set_pressure_advance(double pa) const; - std::string set_input_shaping(char axis, float damp, float freq) const; + std::string set_input_shaping(char axis, float damp, float freq, std::string type) const; std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; // return false if this extruder was already selected diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 36013f3ecf..1084617c8a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3780,14 +3780,14 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(20)); def = this->add("ironing_angle", coFloat); - def->label = L("Ironing angle"); + def->label = L("Ironing angle offset"); def->category = L("Quality"); - def->tooltip = L("The angle ironing is done at. A negative number disables this function and uses the default method."); + def->tooltip = L("The angle of ironing lines offset from the top surface."); def->sidetext = u8"°"; // degrees, don't need translation - def->min = -1; + def->min = 0; def->max = 359; def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(-1)); + def->set_default_value(new ConfigOptionFloat(0)); def = this->add("layer_change_gcode", coString); def->label = L("Layer change G-code"); @@ -7290,6 +7290,8 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va opt_key = "bottom_solid_infill_flow_ratio"; } else if (opt_key == "ironing_direction") { opt_key = "ironing_angle"; + } else if (opt_key == "ironing_angle" && boost::starts_with(value, "-")) { + value = "0"; } else if (opt_key == "counterbole_hole_bridging") { opt_key = "counterbore_hole_bridging"; } else if (opt_key == "draft_shield" && value == "limited") { diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index 1f60314a71..1d78b6fca3 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -39,6 +39,7 @@ struct Calib_Params bool print_numbers; double freqStartX, freqEndX, freqStartY, freqEndY; int test_model; + std::string shaper_type; std::vector accelerations; std::vector speeds; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 58b1d05fc2..0afedd1943 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12303,7 +12303,28 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params) auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; auto printer_config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; - printer_config->set_key_value("machine_max_junction_deviation", new ConfigOptionFloats {0.3}); + const auto gcode_flavor_option = printer_config->option>("gcode_flavor"); + float junction_deviation_value = 0.f; + if (gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfMarlinFirmware) { + const auto machine_junction_option = printer_config->option("machine_max_junction_deviation"); + const float current = (machine_junction_option && !machine_junction_option->values.empty()) + ? machine_junction_option->values.front() + : 0.f; + junction_deviation_value = std::max(current, 0.25f); + } + float machine_max_jerk_x = 0.f; + if (const auto option = printer_config->option("machine_max_jerk_x"); + option != nullptr && !option->values.empty()) { + machine_max_jerk_x = option->values.front(); + } + float machine_max_jerk_y = 0.f; + if (const auto option = printer_config->option("machine_max_jerk_y"); + option != nullptr && !option->values.empty()) { + machine_max_jerk_y = option->values.front(); + } + const float jerk_value = std::max((gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfKlipper) ? 5.f : 10.f, + std::min(machine_max_jerk_x, machine_max_jerk_y)); + printer_config->set_key_value("machine_max_junction_deviation", new ConfigOptionFloats {junction_deviation_value}); printer_config->set_key_value("resonance_avoidance", new ConfigOptionBool{false}); filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 }); filament_config->set_key_value("slow_down_min_speed", new ConfigOptionFloats { 0.0 }); @@ -12323,9 +12344,11 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params) print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(false)); print_config->set_key_value("bottom_surface_pattern", new ConfigOptionEnum(ipRectilinear)); print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200)); - print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000)); - print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000)); - print_config->set_key_value("default_junction_deviation", new ConfigOptionFloat(0.25)); + print_config->set_key_value("default_acceleration", new ConfigOptionFloat(20000)); + print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(20000)); + print_config->set_key_value("default_jerk", new ConfigOptionFloat(jerk_value)); + print_config->set_key_value("outer_wall_jerk", new ConfigOptionFloat(jerk_value)); + print_config->set_key_value("default_junction_deviation", new ConfigOptionFloat(junction_deviation_value)); model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum(btOuterOnly)); model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0)); model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0)); @@ -12351,7 +12374,28 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params) auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; auto printer_config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; - printer_config->set_key_value("machine_max_junction_deviation", new ConfigOptionFloats{0.3}); + const auto gcode_flavor_option = printer_config->option>("gcode_flavor"); + float junction_deviation_value = 0.f; + if (gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfMarlinFirmware) { + const auto machine_junction_option = printer_config->option("machine_max_junction_deviation"); + const float current = (machine_junction_option && !machine_junction_option->values.empty()) + ? machine_junction_option->values.front() + : 0.f; + junction_deviation_value = std::max(current, 0.25f); + } + float machine_max_jerk_x = 0.f; + if (const auto option = printer_config->option("machine_max_jerk_x"); + option != nullptr && !option->values.empty()) { + machine_max_jerk_x = option->values.front(); + } + float machine_max_jerk_y = 0.f; + if (const auto option = printer_config->option("machine_max_jerk_y"); + option != nullptr && !option->values.empty()) { + machine_max_jerk_y = option->values.front(); + } + const float jerk_value = std::max((gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfKlipper) ? 5.f : 10.f, + std::min(machine_max_jerk_x, machine_max_jerk_y)); + printer_config->set_key_value("machine_max_junction_deviation", new ConfigOptionFloats{junction_deviation_value}); printer_config->set_key_value("resonance_avoidance", new ConfigOptionBool{false}); filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 }); filament_config->set_key_value("slow_down_min_speed", new ConfigOptionFloats { 0.0 }); @@ -12371,9 +12415,11 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params) print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(false)); print_config->set_key_value("bottom_surface_pattern", new ConfigOptionEnum(ipRectilinear)); print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200)); - print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000)); - print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000)); - print_config->set_key_value("default_junction_deviation", new ConfigOptionFloat(0.25)); + print_config->set_key_value("default_acceleration", new ConfigOptionFloat(20000)); + print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(20000)); + print_config->set_key_value("default_jerk", new ConfigOptionFloat(jerk_value)); + print_config->set_key_value("outer_wall_jerk", new ConfigOptionFloat(jerk_value)); + print_config->set_key_value("default_junction_deviation", new ConfigOptionFloat(junction_deviation_value)); model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum(btOuterOnly)); model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0)); model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0)); @@ -12422,6 +12468,7 @@ void Plater::calib_junction_deviation(const Calib_Params& params) print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200)); print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000)); print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000)); + print_config->set_key_value("default_jerk", new ConfigOptionFloat(0)); print_config->set_key_value("default_junction_deviation", new ConfigOptionFloat(0.0)); model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum(btOuterOnly)); model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0)); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a4890ea1d3..e4c8e94542 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2333,7 +2333,7 @@ void TabPrint::build() optgroup->append_single_option_line("ironing_flow", "quality_settings_ironing#flow"); optgroup->append_single_option_line("ironing_spacing", "quality_settings_ironing#line-spacing"); optgroup->append_single_option_line("ironing_inset", "quality_settings_ironing#inset"); - optgroup->append_single_option_line("ironing_angle", "quality_settings_ironing#angle"); + optgroup->append_single_option_line("ironing_angle", "quality_settings_ironing#angle-offset"); optgroup = page->new_optgroup(L("Wall generator"), L"param_wall_generator"); optgroup->append_single_option_line("wall_generator", "quality_settings_wall_generator"); diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 448920a7bd..11873a2bd4 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -6,6 +6,8 @@ #include "MainFrame.hpp" #include "Widgets/DialogButtons.hpp" #include +#include +#include "libslic3r/PrintConfig.hpp" namespace Slic3r { namespace GUI { @@ -28,6 +30,39 @@ int GetTextMax(wxWindow* parent, const std::vector& labels) return text_size.x + parent->FromDIP(10); } +std::vector get_shaper_type_values() +{ + if (auto* preset_bundle = wxGetApp().preset_bundle) { + auto printer_config = &preset_bundle->printers.get_edited_preset().config; + if (auto* gcode_flavor_option = printer_config->option>("gcode_flavor")) { + switch (gcode_flavor_option->value) { + case GCodeFlavor::gcfKlipper: + return {"Default", "ZV", "MZV", "ZVD", "EI", "2HUMP_EI", "3HUMP_EI"}; + case GCodeFlavor::gcfRepRapFirmware: + return {"Default", "MZV", "ZVD", "ZVDD", "ZVDDD", "EI2", "EI3", "DAA"}; + case GCodeFlavor::gcfMarlinFirmware: + return {"ZV"}; + default: + break; + } + } + } + return {"Default"}; +} + +std::vector make_shaper_type_labels() +{ + auto values = get_shaper_type_values(); + if (values.empty()) + values.emplace_back(""); + + std::vector labels; + labels.reserve(values.size()); + for (const auto& label : values) + labels.emplace_back(wxString::FromUTF8(label.c_str())); + return labels; +} + } PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) @@ -763,6 +798,12 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin SetForegroundColour(wxColour("#363636")); SetFont(Label::Body_14); + const auto* preset_bundle = wxGetApp().preset_bundle; + const auto* gcode_flavor_option = (preset_bundle != nullptr) + ? preset_bundle->printers.get_edited_preset().config.option>("gcode_flavor") + : nullptr; + const bool reprap_firmware = gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfRepRapFirmware; + wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); @@ -774,8 +815,41 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin model_box->Add(m_rbModel, 0, wxALL | wxEXPAND, FromDIP(4)); v_sizer->Add(model_box, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); + // Input shaper type selection + auto labeled_box_type = new LabeledStaticBox(this, _L("Input shaper type")); + auto type_box = new wxStaticBoxSizer(labeled_box_type, wxVERTICAL); + auto type_labels = make_shaper_type_labels(); + m_rbType = new RadioGroup(this, type_labels, wxVERTICAL, 3); + type_box->Add(m_rbType, 0, wxALL | wxEXPAND, FromDIP(4)); + m_rbType->SetSelection(0); + + // Determine firmware-specific note + wxString firmware_note = "Please ensure the selected type is compatible with your firmware version."; + if (gcode_flavor_option) { + switch (gcode_flavor_option->value) { + case GCodeFlavor::gcfMarlinFirmware: + case GCodeFlavor::gcfMarlinLegacy: + firmware_note = "Marlin version => 2.1.2\nFixed-Time motion not yet implemented."; + break; + case GCodeFlavor::gcfKlipper: + firmware_note = "Klipper version => 0.9.0"; + break; + case GCodeFlavor::gcfRepRapFirmware: + firmware_note = "RepRap firmware version => 3.4.0\nCheck your firmware documentation for supported shaper types."; + break; + default: + break; + } + } + + auto type_note = new wxStaticText(this, wxID_ANY, firmware_note, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + type_note->SetForegroundColour(wxColour(128, 128, 128)); + type_box->Add(type_note, 0, wxALL, FromDIP(5)); + + v_sizer->Add(type_box, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); + // Settings - wxString x_axis_str = "X " + _L("Start / End") + ": "; + wxString x_axis_str = reprap_firmware ? _L("Frequency (Start / End): ") : "X " + _L("Start / End") + ": "; wxString y_axis_str = "Y " + _L("Start / End") + ": "; int text_max = GetTextMax(this, std::vector{x_axis_str, y_axis_str}); @@ -807,12 +881,24 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin m_tiFreqStartY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); m_tiFreqEndY = new TextInput(this, std::to_string(110), "Hz", "", wxDefaultPosition, ti_size); m_tiFreqEndY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - + y_freq_sizer->Add(start_y_text , 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); y_freq_sizer->Add(m_tiFreqStartY, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); y_freq_sizer->Add(m_tiFreqEndY , 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); settings_sizer->Add(y_freq_sizer, 0, wxLEFT, FromDIP(3)); + if (reprap_firmware) { + m_tiFreqStartY->GetTextCtrl()->SetValue(m_tiFreqStartX->GetTextCtrl()->GetValue()); + m_tiFreqEndY->GetTextCtrl()->SetValue(m_tiFreqEndX->GetTextCtrl()->GetValue()); + start_y_text->Hide(); + m_tiFreqStartY->Hide(); + m_tiFreqEndY->Hide(); + settings_sizer->Hide(y_freq_sizer); + start_x_text->SetLabel(_L("Frequency (Start / End): ")); + m_tiFreqStartX->GetTextCtrl()->SetToolTip(_L("RepRap firmware uses the same frequency range for both axes.")); + m_tiFreqEndX->GetTextCtrl()->SetToolTip(_L("RepRap firmware uses the same frequency range for both axes.")); + } + // Damping Factor wxString damping_factor_str = _L("Damp: "); auto damping_factor_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -826,8 +912,7 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin settings_sizer->AddSpacer(FromDIP(5)); - // Add a note explaining that 0 means use default value - auto note_text = new wxStaticText(this, wxID_ANY, _L("Recommended: Set Damp to 0.\nThis will use the printer's default or the last saved value."), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + auto note_text = new wxStaticText(this, wxID_ANY, _L("Recommended: Set Damp to 0.\nThis will use the printer's default or saved value."), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); note_text->SetForegroundColour(wxColour(128, 128, 128)); settings_sizer->Add(note_text, 0, wxALL, FromDIP(5)); @@ -855,15 +940,29 @@ void Input_Shaping_Freq_Test_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; read_double = m_tiFreqStartX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartX); read_double = read_double && m_tiFreqEndX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqEndX); - read_double = read_double && m_tiFreqStartY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); - read_double = read_double && m_tiFreqEndY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqEndY); + + const auto* preset_bundle = wxGetApp().preset_bundle; + const auto* gcode_flavor_option = (preset_bundle != nullptr) + ? preset_bundle->printers.get_edited_preset().config.option>("gcode_flavor") + : nullptr; + const bool reprap_firmware = gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfRepRapFirmware; + + if (!reprap_firmware) { + read_double = read_double && m_tiFreqStartY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); + read_double = read_double && m_tiFreqEndY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqEndY); + } else { + m_params.freqStartY = m_params.freqStartX; + m_params.freqEndY = m_params.freqEndX; + m_tiFreqStartY->GetTextCtrl()->SetValue(m_tiFreqStartX->GetTextCtrl()->GetValue()); + m_tiFreqEndY->GetTextCtrl()->SetValue(m_tiFreqEndX->GetTextCtrl()->GetValue()); + } read_double = read_double && m_tiDampingFactor->GetTextCtrl()->GetValue().ToDouble(&m_params.start); if (!read_double || m_params.freqStartX < 0 || m_params.freqEndX > 500 || - m_params.freqStartY < 0 || m_params.freqEndX > 500 || + (!reprap_firmware && (m_params.freqStartY < 0 || m_params.freqEndY > 500)) || m_params.freqStartX >= m_params.freqEndX || - m_params.freqStartY >= m_params.freqEndY) { + (!reprap_firmware && m_params.freqStartY >= m_params.freqEndY)) { MessageDialog msg_dlg(nullptr, _L("Please input valid values:\n(0 < FreqStart < FreqEnd < 500)"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; @@ -875,6 +974,16 @@ void Input_Shaping_Freq_Test_Dlg::on_start(wxCommandEvent& event) { return; } + auto shaper_values = get_shaper_type_values(); + int type_selection = m_rbType->GetSelection(); + if (shaper_values.empty()) { + m_params.shaper_type.clear(); + } else { + if (type_selection < 0 || type_selection >= static_cast(shaper_values.size())) + type_selection = 0; + m_params.shaper_type = shaper_values[static_cast(type_selection)]; + } + m_params.mode = CalibMode::Calib_Input_shaping_freq; // Set model type based on selection @@ -899,6 +1008,12 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin SetForegroundColour(wxColour("#363636")); SetFont(Label::Body_14); + const auto* preset_bundle = wxGetApp().preset_bundle; + const auto* gcode_flavor_option = (preset_bundle != nullptr) + ? preset_bundle->printers.get_edited_preset().config.option>("gcode_flavor") + : nullptr; + const bool reprap_firmware = gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfRepRapFirmware; + wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); @@ -910,8 +1025,41 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin model_box->Add(m_rbModel, 0, wxALL | wxEXPAND, FromDIP(4)); v_sizer->Add(model_box, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); + // Input shaper type selection + auto labeled_box_type = new LabeledStaticBox(this, _L("Input shaper type")); + auto type_box = new wxStaticBoxSizer(labeled_box_type, wxVERTICAL); + auto type_labels = make_shaper_type_labels(); + m_rbType = new RadioGroup(this, type_labels, wxVERTICAL, 3); + type_box->Add(m_rbType, 0, wxALL | wxEXPAND, FromDIP(4)); + m_rbType->SetSelection(0); + + // Determine firmware-specific note + wxString firmware_note = "Check firmware compatibility."; + if (gcode_flavor_option) { + switch (gcode_flavor_option->value) { + case GCodeFlavor::gcfMarlinFirmware: + case GCodeFlavor::gcfMarlinLegacy: + firmware_note = "Marlin version => 2.1.2\nFixed-Time motion not yet implemented."; + break; + case GCodeFlavor::gcfKlipper: + firmware_note = "Klipper version => 0.9.0"; + break; + case GCodeFlavor::gcfRepRapFirmware: + firmware_note = "RepRap firmware version => 3.4.0\nCheck your firmware documentation for supported shaper types."; + break; + default: + break; + } + } + + auto type_note = new wxStaticText(this, wxID_ANY, firmware_note, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + type_note->SetForegroundColour(wxColour(128, 128, 128)); + type_box->Add(type_note, 0, wxALL, FromDIP(5)); + + v_sizer->Add(type_box, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); + // Settings - wxString freq_str = _L("Frequency") + " X / Y: "; + wxString freq_str = reprap_firmware ? _L("Frequency: ") : _L("Frequency") + " X / Y: "; wxString damp_str = _L("Damp") + " " + _L("Start / End") + ": "; int text_max = GetTextMax(this, std::vector{freq_str, damp_str}); @@ -933,7 +1081,14 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin freq_sizer->Add(m_tiFreqX, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); freq_sizer->Add(m_tiFreqY, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); settings_sizer->Add(freq_sizer, 0, wxLEFT, FromDIP(3)); - + + if (reprap_firmware) { + m_tiFreqY->GetTextCtrl()->SetValue(m_tiFreqX->GetTextCtrl()->GetValue()); + m_tiFreqY->Hide(); + freq_text->SetLabel(freq_str); + m_tiFreqX->GetTextCtrl()->SetToolTip(_L("RepRap firmware uses the same frequency for both axes.")); + } + // Damping Factor Start and End auto damp_sizer = new wxBoxSizer(wxHORIZONTAL); auto damp_text = new wxStaticText(this, wxID_ANY, damp_str, wxDefaultPosition, st_size, wxALIGN_LEFT); @@ -976,13 +1131,24 @@ Input_Shaping_Damp_Test_Dlg::~Input_Shaping_Damp_Test_Dlg() { void Input_Shaping_Damp_Test_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; read_double = m_tiFreqX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartX); - read_double = read_double && m_tiFreqY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); + const auto* preset_bundle = wxGetApp().preset_bundle; + const auto* gcode_flavor_option = (preset_bundle != nullptr) + ? preset_bundle->printers.get_edited_preset().config.option>("gcode_flavor") + : nullptr; + const bool reprap_firmware = gcode_flavor_option && gcode_flavor_option->value == GCodeFlavor::gcfRepRapFirmware; + + if (!reprap_firmware) { + read_double = read_double && m_tiFreqY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); + } else { + m_params.freqStartY = m_params.freqStartX; + m_tiFreqY->GetTextCtrl()->SetValue(m_tiFreqX->GetTextCtrl()->GetValue()); + } read_double = read_double && m_tiDampingFactorStart->GetTextCtrl()->GetValue().ToDouble(&m_params.start); read_double = read_double && m_tiDampingFactorEnd->GetTextCtrl()->GetValue().ToDouble(&m_params.end); if (!read_double || m_params.freqStartX < 0 || m_params.freqStartX > 500 || - m_params.freqStartY < 0 || m_params.freqStartY > 500 ) { + (!reprap_firmware && (m_params.freqStartY < 0 || m_params.freqStartY > 500))) { MessageDialog msg_dlg(nullptr, _L("Please input valid values:\n(0 < Freq < 500)"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; @@ -995,6 +1161,16 @@ void Input_Shaping_Damp_Test_Dlg::on_start(wxCommandEvent& event) { return; } + auto shaper_values = get_shaper_type_values(); + int type_selection = m_rbType->GetSelection(); + if (shaper_values.empty()) { + m_params.shaper_type.clear(); + } else { + if (type_selection < 0 || type_selection >= static_cast(shaper_values.size())) + type_selection = 0; + m_params.shaper_type = shaper_values[static_cast(type_selection)]; + } + m_params.mode = CalibMode::Calib_Input_shaping_damp; // Set model type based on selection diff --git a/src/slic3r/GUI/calib_dlg.hpp b/src/slic3r/GUI/calib_dlg.hpp index fd21c59ca9..9f43b71107 100644 --- a/src/slic3r/GUI/calib_dlg.hpp +++ b/src/slic3r/GUI/calib_dlg.hpp @@ -134,6 +134,7 @@ protected: Calib_Params m_params; RadioGroup* m_rbModel; + RadioGroup* m_rbType; TextInput* m_tiFreqStartX; TextInput* m_tiFreqEndX; TextInput* m_tiFreqStartY; @@ -155,6 +156,7 @@ protected: Calib_Params m_params; RadioGroup* m_rbModel; + RadioGroup* m_rbType; TextInput* m_tiFreqX; TextInput* m_tiFreqY; TextInput* m_tiDampingFactorStart;