supermerill / SuperSlicer

G-code generator for 3D printers (Prusa, Voron, Creality, etc.)
4.13k stars 520 forks source link

Cannot set Z speed independently #1154

Closed martinbudden closed 3 years ago

martinbudden commented 3 years ago

This is the same bug as https://github.com/prusa3d/PrusaSlicer/issues/2945 for which I have submitted a PR in PrusaSlicer , but not had a reply.

Describe the bug The z travel speed is the same as the xy travel speed, so when the xy travel speed is high, you get z-banding or even z-axis skipping.

I have a fix for this and so this bug report is just to see if you are interested in the fix - if so I will submit the PR. I'm also happy to submit it for review without any expectation that it will be accepted.

For reference, the PrusaSlicer PR is here https://github.com/prusa3d/PrusaSlicer/pull/6369

supermerill commented 3 years ago

Do you think it has any consequences on a print profile? Isn't it more useful on the printer machine limits tab?

balkin commented 3 years ago

@supermerill Hi! I'm not the TS but we just had a discussion about this issue and I'm willing to let you know what I've found. Here's a fragment of code generated by slic3r++, actually prusa does exactly the same:

;LAYER_CHANGE
;Z:0.2
;HEIGHT:0.2
; custom gcode: before_layer_gcode
;LAYER:0
M117 INDICATOR-Layer0
; custom gcode end: before_layer_gcode

G1 Z0.200000 F7200.000 ; move to next layer (0)

(see the last line)

Perhaps G1 Z0.200000 F7200.000 is really not very beautiful. Although I'm perfectly fine with the superslicer's gcode, my printer's firmware ignores velocities greater than upper limit of my printer. Maybe instead of using travel_speed for Z velocity you could use machine_max_feedrate_z?

supermerill commented 3 years ago

Maybe instead of using travel_speed for Z velocity you could use machine_max_feedrate_z?

Maybe, or i can create a machine_z_travel_speed next to it. I'll have to see if it's useful to create an other one. I have some 3D-path that may want to use a slow machine_max_feedrate_z, and travel that want to use a fast machine_z_travel_speed

balkin commented 3 years ago

I'm using klipper (and it ignores 120mm/s on z movements), but probably some firmwares may not ignore it.

If that helps, here are my settings from the gcode file: ```` ; allow_empty_layers = 0 ; avoid_crossing_not_first_layer = 1 ; avoid_crossing_perimeters = 0 ; avoid_crossing_perimeters_max_detour = 0 ; bed_custom_model = C:\\Program Files\\Ultimaker Cura 4.6\\resources\\meshes\\ulti_steel_platform.stl ; bed_custom_texture = ; bed_shape = 0x0,200x0,200x200,0x200 ; bed_temperature = 105 ; before_layer_gcode = ;LAYER:[layer_num]\n ; between_objects_gcode = ; bottom_fill_pattern = monotonic ; bottom_solid_layers = 5 ; bottom_solid_min_thickness = 0 ; bridge_acceleration = 1000 ; bridge_angle = 0 ; bridge_fan_speed = 100 ; bridge_flow_ratio = 35% ; bridge_overlap = 100% ; bridge_speed = 25 ; bridge_speed_internal = 150% ; bridged_infill_margin = 200% ; brim_ears = 1 ; brim_ears_detection_length = 1 ; brim_ears_max_angle = 125 ; brim_ears_pattern = concentric ; brim_inside_holes = 0 ; brim_offset = 0 ; brim_width = 6 ; brim_width_interior = 0 ; chamber_temperature = 0 ; clip_multipart_objects = 0 ; color_change_gcode = M600 ; complete_objects = 0 ; complete_objects_one_skirt = 0 ; complete_objects_sort = object ; cooling = 1 ; cooling_tube_length = 5 ; cooling_tube_retraction = 91.5 ; curve_smoothing_angle_concave = 0 ; curve_smoothing_angle_convex = 0 ; curve_smoothing_cutoff_dist = 2 ; curve_smoothing_precision = 0 ; default_acceleration = 3000 ; default_filament_profile = "" ; default_print_profile = ; deretract_speed = 35 ; disable_fan_first_layers = 3 ; dont_support_bridges = 1 ; draft_shield = 0 ; duplicate_distance = 6 ; end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" ; end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F240{endif} ; Move print head up\nG1 X0 Y0 F5000;\nM84 X Y Z E ; disable motors ; enforce_full_fill_volume = 1 ; ensure_vertical_shell_thickness = 0 ; exact_last_layer_height = 0 ; external_infill_margin = 150% ; external_perimeter_cut_corners = 0% ; external_perimeter_extrusion_spacing = ; external_perimeter_extrusion_width = 0 ; external_perimeter_fan_speed = -1 ; external_perimeter_overlap = 100% ; external_perimeter_speed = 45 ; external_perimeters_first = 0 ; external_perimeters_hole = 1 ; external_perimeters_nothole = 1 ; external_perimeters_vase = 0 ; extra_loading_move = -2 ; extra_perimeters = 1 ; extra_perimeters_odd_layers = 0 ; extra_perimeters_overhangs = 0 ; extruder_clearance_height = 50 ; extruder_clearance_radius = 60 ; extruder_colour = #FF0000 ; extruder_fan_offset = 0% ; extruder_offset = 0x0 ; extruder_temperature_offset = 0 ; extrusion_axis = E ; extrusion_multiplier = 1 ; extrusion_spacing = ; extrusion_width = 110% ; fan_always_on = 0 ; fan_below_layer_time = 30 ; fan_kickstart = 0 ; fan_percentage = 0 ; fan_speedup_overhangs = 1 ; fan_speedup_time = -0.5 ; feature_gcode = ; filament_colour = #FF00FF ; filament_cooling_final_speed = 3.4 ; filament_cooling_initial_speed = 2.2 ; filament_cooling_moves = 4 ; filament_cooling_zone_pause = 0 ; filament_cost = 0 ; filament_density = 0 ; filament_diameter = 1.75 ; filament_dip_extraction_speed = 70 ; filament_dip_insertion_speed = 33 ; filament_enable_toolchange_part_fan = 0 ; filament_enable_toolchange_temp = 0 ; filament_load_time = 0 ; filament_loading_speed = 28 ; filament_loading_speed_start = 3 ; filament_max_speed = 0 ; filament_max_volumetric_speed = 0 ; filament_max_wipe_tower_speed = 0 ; filament_melt_zone_pause = 0 ; filament_minimal_purge_on_wipe_tower = 15 ; filament_notes = "" ; filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" ; filament_settings_id = "ABS Winbo" ; filament_shrink = 100.25% ; filament_skinnydip_distance = 31 ; filament_soluble = 0 ; filament_spool_weight = 0 ; filament_toolchange_delay = 0 ; filament_toolchange_part_fan_speed = 50 ; filament_toolchange_temp = 200 ; filament_type = ABS ; filament_unload_time = 0 ; filament_unloading_speed = 90 ; filament_unloading_speed_start = 100 ; filament_use_fast_skinnydip = 0 ; filament_use_skinnydip = 0 ; filament_vendor = (Unknown) ; filament_wipe_advanced_pigment = 0.5 ; fill_angle = 45 ; fill_angle_increment = 0 ; fill_density = 25% ; fill_pattern = honeycomb ; fill_smooth_distribution = 10% ; fill_smooth_width = 50% ; fill_top_flow_ratio = 100% ; first_layer_acceleration = 1500 ; first_layer_bed_temperature = 105 ; first_layer_extrusion_spacing = ; first_layer_extrusion_width = 150% ; first_layer_flow_ratio = 100% ; first_layer_height = 0.2 ; first_layer_infill_speed = 30 ; first_layer_size_compensation = 0 ; first_layer_speed = 20 ; first_layer_temperature = 245 ; full_fan_speed_layer = 0 ; gap_fill = 1 ; gap_fill_min_area = 100% ; gap_fill_overlap = 100% ; gap_fill_speed = 30 ; gcode_comments = 1 ; gcode_flavor = klipper ; gcode_label_objects = 1 ; gcode_precision_e = 5 ; gcode_precision_xyz = 3 ; high_current_on_filament_swap = 0 ; hole_size_compensation = 0 ; hole_size_threshold = 100 ; hole_to_polyhole = 0 ; hole_to_polyhole_threshold = 0.01 ; host_type = octoprint ; infill_acceleration = 3000 ; infill_anchor = 0 ; infill_anchor_max = 0 ; infill_connection = connected ; infill_connection_bottom = connected ; infill_connection_solid = connected ; infill_connection_top = connected ; infill_dense = 0 ; infill_dense_algo = autosmall ; infill_every_layers = 1 ; infill_extruder = 1 ; infill_extrusion_spacing = ; infill_extrusion_width = 0 ; infill_first = 0 ; infill_only_where_needed = 0 ; infill_overlap = 35% ; infill_speed = 75 ; interface_shells = 0 ; ironing = 0 ; ironing_angle = -1 ; ironing_flowrate = 15% ; ironing_spacing = 0.1 ; ironing_speed = 15 ; ironing_type = top ; layer_gcode = ; layer_height = 0.1 ; machine_limits_usage = time_estimate_only ; machine_max_acceleration_e = 10000,5000 ; machine_max_acceleration_extruding = 3000,1250 ; machine_max_acceleration_retracting = 3000,1250 ; machine_max_acceleration_travel = 1500,1250 ; machine_max_acceleration_x = 3000,1000 ; machine_max_acceleration_y = 3000,1000 ; machine_max_acceleration_z = 100,200 ; machine_max_feedrate_e = 120,120 ; machine_max_feedrate_x = 300,200 ; machine_max_feedrate_y = 300,200 ; machine_max_feedrate_z = 2,12 ; machine_max_jerk_e = 5,2.5 ; machine_max_jerk_x = 10,10 ; machine_max_jerk_y = 10,10 ; machine_max_jerk_z = 0.3,0.4 ; machine_min_extruding_rate = 0,0 ; machine_min_travel_rate = 0,0 ; max_fan_speed = 40 ; max_layer_height = 0.35 ; max_print_height = 270 ; max_print_speed = 120 ; max_speed_reduction = 90% ; max_volumetric_speed = 0 ; milling_after_z = 200% ; milling_extra_size = 150% ; milling_post_process = 0 ; milling_speed = 30 ; milling_toolchange_end_gcode = ; milling_toolchange_start_gcode = ; min_fan_speed = 25 ; min_layer_height = 0.08 ; min_length = 0.035 ; min_print_speed = 10 ; min_skirt_length = 0 ; min_width_top_surface = 200% ; model_precision = 0.0001 ; no_perimeter_unsupported_algo = none ; notes = ; nozzle_diameter = 0.6 ; only_one_perimeter_top = 1 ; only_one_perimeter_top_other_algo = 0 ; only_retract_when_crossing_perimeters = 1 ; ooze_prevention = 0 ; output_filename_format = UlTiSS_{print_time}_{filament_type[0]}_[input_filename_base]_n{nozzle_diameter[0]}_l{layer_height}.gcode ; over_bridge_flow_ratio = 100% ; overhangs_reverse = 0 ; overhangs_reverse_threshold = 250% ; overhangs_speed = 100% ; overhangs_width = 75% ; overhangs_width_speed = 50% ; parking_pos_retraction = 92 ; pause_print_gcode = M601 ; perimeter_acceleration = 3000 ; perimeter_bonding = 0% ; perimeter_extruder = 1 ; perimeter_extrusion_spacing = ; perimeter_extrusion_width = 0 ; perimeter_loop = 0 ; perimeter_loop_seam = rear ; perimeter_overlap = 100% ; perimeter_speed = 45 ; perimeters = 3 ; physical_printer_settings_id = UlTiSteel ; post_process = ; print_extrusion_multiplier = 100% ; print_retract_length = -1 ; print_retract_lift = -1 ; print_settings_id = 0.1 x 3 perimeters ; print_temperature = 0 ; printer_model = ; printer_notes = ; printer_settings_id = Nozzle 0.6 - BaRoN ; printer_technology = FFF ; printer_variant = ; printer_vendor = ; raft_layers = 0 ; remaining_times = 0 ; resolution = 0 ; retract_before_travel = 0.5 ; retract_before_wipe = 70% ; retract_layer_change = 0 ; retract_length = 4 ; retract_length_toolchange = 10 ; retract_lift = 0 ; retract_lift_above = 0 ; retract_lift_below = 0 ; retract_lift_first_layer = 0 ; retract_lift_top = "All surfaces" ; retract_restart_extra = 0 ; retract_restart_extra_toolchange = 0 ; retract_speed = 35 ; seam_angle_cost = 100% ; seam_position = aligned ; seam_travel_cost = 100% ; silent_mode = 0 ; single_extruder_multi_material = 0 ; single_extruder_multi_material_priming = 1 ; skirt_distance = 3 ; skirt_extrusion_width = 0 ; skirt_height = 1 ; skirts = 0 ; slice_closing_radius = 0.049 ; slowdown_below_layer_time = 10 ; small_perimeter_max_length = 20 ; small_perimeter_min_length = 6 ; small_perimeter_speed = 30 ; solid_fill_pattern = rectilineargapfill ; solid_infill_below_area = 70 ; solid_infill_every_layers = 0 ; solid_infill_extruder = 1 ; solid_infill_extrusion_spacing = ; solid_infill_extrusion_width = 0 ; solid_infill_speed = 50 ; spiral_vase = 0 ; standby_temperature_delta = -5 ; start_filament_gcode = "; Filament gcode\nSET_PRESSURE_ADVANCE ADVANCE=0.4\n" ; start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y2 F3000\nG1 Z0.25 F240\nG92 E0.0\nG1 Y50 E10 F500.0 ; intro line\nG1 X2.3 F5000\nG1 Y2 E10 F500.0 ; intro line\nG92 E0.0 ; start_gcode_manual = 0 ; support_material = 1 ; support_material_angle = 0 ; support_material_auto = 1 ; support_material_buildplate_only = 1 ; support_material_contact_distance_bottom = 0.2 ; support_material_contact_distance_top = 0.2 ; support_material_contact_distance_type = filament ; support_material_enforce_layers = 2 ; support_material_extruder = 1 ; support_material_extrusion_width = 0 ; support_material_interface_contact_loops = 0 ; support_material_interface_extruder = 1 ; support_material_interface_layers = 5 ; support_material_interface_pattern = concentric ; support_material_interface_spacing = 0.1 ; support_material_interface_speed = 50% ; support_material_pattern = rectilinear ; support_material_solid_first_layer = 1 ; support_material_spacing = 1 ; support_material_speed = 45 ; support_material_synchronize_layers = 0 ; support_material_threshold = 45 ; support_material_with_sheath = 1 ; support_material_xy_spacing = 0.9 ; temperature = 245 ; template_custom_gcode = ; thin_perimeters = 1 ; thin_perimeters_all = 0 ; thin_walls = 1 ; thin_walls_merge = 1 ; thin_walls_min_width = 33% ; thin_walls_overlap = 50% ; thin_walls_speed = 30 ; threads = 12 ; thumbnails = 32x32,220x124 ; thumbnails_color = #018aff ; thumbnails_custom_color = 0 ; thumbnails_with_bed = 1 ; time_estimation_compensation = 100% ; tool_name = "" ; toolchange_gcode = ; top_fan_speed = -1 ; top_fill_pattern = monotonic ; top_infill_extrusion_spacing = ; top_infill_extrusion_width = 0 ; top_solid_infill_speed = 30 ; top_solid_layers = 5 ; top_solid_min_thickness = 0 ; travel_speed = 120 ; use_firmware_retraction = 0 ; use_relative_e_distances = 0 ; use_volumetric_e = 0 ; variable_layer_height = 1 ; wipe = 1 ; wipe_advanced = 0 ; wipe_advanced_algo = linear ; wipe_advanced_multiplier = 60 ; wipe_advanced_nozzle_melted_volume = 120 ; wipe_extra_perimeter = 0 ; wipe_into_infill = 0 ; wipe_into_objects = 0 ; wipe_tower = 0 ; wipe_tower_bridging = 10 ; wipe_tower_brim = 150% ; wipe_tower_no_sparse_layers = 0 ; wipe_tower_rotation_angle = 0 ; wipe_tower_width = 60 ; wipe_tower_x = 180 ; wipe_tower_y = 140 ; wiping_volumes_extruders = 70,70 ; wiping_volumes_matrix = 0 ; xy_inner_size_compensation = 0 ; xy_size_compensation = 0 ; z_offset = 0 ; z_step = 0.005 ; BEGIN DISPLAYLAYERPROGRESS SETTINGS ; DisplayLayerProgress_layerIndicatorProcessed = true ; END DISPLAYLAYERPROGRESS SETTINGS ``` And actually the second layer is exactly the same: ```;LAYER_CHANGE ;Z:0.3 ;HEIGHT:0.1 ; custom gcode: before_layer_gcode ;LAYER:1 M117 INDICATOR-Layer1 ; custom gcode end: before_layer_gcode @Objectstop robocar - Helly.stl id:0 copy 0 M204 S3000 ; adjust acceleration G1 Z0.300000 F7200.000 ; move to next layer (1) ````
martinbudden commented 3 years ago

Sorry the delay in replying.

Maybe instead of using travel_speed for Z velocity you could use machine_max_feedrate_z?

That was my initial idea, however, from the (limited) discussion on the PrusaSlicer fork, there seemed a reluctance to use machine_max_feedrate_z for this purpose.

Also, machine_max_feedrate_z is not directly accessible by GCodeWriter, so it would certainly be a more complicated PR to do it this way.

My feeling is that an additional option of travel_speed_z is more likely to get accepted as a PR for the PrusaSlicer.

Note that Marlin (unlike Klipper, it seems) definitely does not honour the value of machine_max_feedrate_z, so the z feedrate does need to be limited by the slicer.

supermerill commented 3 years ago

I'm ok for a pr to add travel_speed_z

martinbudden commented 3 years ago

OK, I'll get my PR from PrucaSlicer moved over here.

martinbudden commented 3 years ago

Shouldn't this be closed now?