PrusaSlicer profile for Sovol Zero!

@HandyDoodads I like what you’ve done with the Start G-code. I’ve also checked that Sovol hasn’t published any new profiles ( just ‘align profiles with Orca Slicer naming conventions’ on Aug 8 ).

I’ve made the following tweaks:

  • used global variables to clarify starting purge position, as you suggested
  • Load skew compensation
    • (various ways to find this, I use CaliLantern)
  • Generally removed hard-coded values when variables are available in SuperSlicer (WIP)
  • Beginning to add support for other nozzle diameters (WIP)
  • added @PicobelloBV Chamber Temperature Control via the exhaust_fan
    • this requires changes to printer.cfg
    • this should NOT associated with the new Chamber Heating Module
    • this block is commented out for easy copy/pasting
  • rewrote the priming/purge lines for clarity
    • Purpose of the 10 segments appears to be for good purge lines without pressure advance getting in the way
    • There’s three styles of purges depending on the conditionals
      • long 10 segment near the part E1
      • short 2 segment near the part, E lots
      • long 10 segment near the front edge.
    • All purge styles are tedious without jinja-2 or other loop implementation
      • Strongly considering abandoning purge codes in the starting g-code, opting either for a single loop skirt or a custom Klipper macro (common, but not part of Sovol)
  • Moved up M104/M140 commands as early as I could, and included the M109/M190 waits to save time per @sebastianha
    • originally it didn’t do much, but I moved up the initial dirty nozzle G28 homing so that it may actually save some time

I’ll be posting this whole profile to Printables as a remix of @TomsPrintGarden ‘s work.



; SuperSlicer Sovol Zero Start G-code
; Authored by @rpcyan, 2025-11-15
; based on @TomsPrintGarden's profile https://www.printables.com/model/1411860-sovol-zero-prusa-slicer-profile-experimental/files 
; contributions by @sebastianha, @HandyDoodads, and @PicobelloBV
; https://forum.sovol3d.com/t/prusaslicer-profile-for-sovol-zero/8746/10

; --- Baseline Heating ---
M140 S[first_layer_bed_temperature]                         ; Sets Bed          Heating (non-blocking)
M104 S130                                                   ; Sets Extruder Pre-Heating (non-blocking)
SKEW_PROFILE_LOAD = calilatern_skew_profile                 ; Klipper macro using Vector3D's CaliLatern for XY, XZ, and YZ skew compensations
{ if first_layer_bed_temperature[current_extruder] > 35 }   ; If bed is already warm, maintain current temp for initial homing
 M190 S[first_layer_bed_temperature[current_extruder]]      
{endif} 

; --- Exhaust Fan / Chamber Temperature Control ---
; Requires changes to printer.cfg
;{if chamber_temperature[0] == 0}
;  M141 S32 ; fallback to Zero's default chamber temp
;{else}
;  M141 S{chamber_temperature[0]}
;{endif}

; --- Home & Start Print ---
G28                                      ; Homes including any nozzle debris to enable nozzle cleaning
M190 S[first_layer_bed_temperature]      ; Waits for bed temp (blocking)
START_PRINT                              ; Klipper macro - expects nozzle cleaning @ 200C, cooldown to 130C, & eddy current mesh bed leveling
G28                                      ; Re-homes with clean nozzle
G92 E0                                   ; Reset extruder position
SET_GCODE_OFFSET Z_ADJUST=-0.00 MOVE=1   ; Nozzle height adjustment (if required)

; --- Segmented Prime Line close to part
; Avoids pressure buildup, works well with pressure advance & soft filaments
M104 S[first_layer_temperature] ; Sets Extruder (non-blo
cking)
G90                             ; absolute positioning to set starting position
M83                             ; Relative extruder
{                              
 local extr_width     = 1.05 * nozzle_diameter[0];
 local filament_area  = 3.14159 / 4 * filament_diameter[0] * filament_diameter[0];
 local extr_per_mm    = extr_width * 0.2 * .625 / filament_area;
 local print_width    = first_layer_print_max[0] - first_layer_print_min[0];
 local prime_pieces   = 10;
 local segment        = max( 5, print_width / ( prime_pieces * 2 ) );
 local prime_offset   =  5;        
 local bed_margin     =  1;
 local prime_length   = min( prime_pieces * segment,50);
 local prime_speed    = first_layer_speed * 60;
 local start_y = max( prime_offset + bed_margin, first_layer_print_min[1] ) - prime_offset;
}
M109 S[first_layer_temperature]                                                  ; wait for extruder temp
{ if first_layer_print_min[1] > print_bed_min[1] + prime_offset + bed_margin }   ; checks if there's room in the front of the part for the priming line 
 { if print_width >= 50 }                                                        ; checks if part is wide enough for a nominal priming line
  { local start_x = min( max( bed_margin, first_layer_print_min[0] + 0.25 * print_width ), print_bed_max[0] - prime_length - bed_margin ); }
  G0 X{ start_x } Y{ start_y } F{ travel_speed * 60 }   ; rapid motion to starting position
  G0 Z{ layer_height } F{ travel_speed_z * 60 }
  G91                                                       ; Relative positioning
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 1
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 2
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 3
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 4
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 5
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 6
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 7
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 8
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 9
  G1 X{ segment } E{ 1} F{ prime_speed }                 ; Segment 10
 {else} ; priming line has to be short
  { local start_x = first_layer_print_min[0]; }
  G0 X{ start_x } Y{ start_y } F{ travel_speed * 60}   ; rapid motion to starting position
  G0 Z{ layer_height } F{ travel_speed_z * 60 }
  G91                                                       ; Relative positioning
  M83
  G1 X{ print_width / 2 } E{ extr_per_mm * print_width / 2 * 5 } F{ prime_speed }
  G1 X{ print_width / 2 } E{ extr_per_mm * print_width / 2 * 5 } F{ prime_speed }
 {endif}
 G90                                                       ; Absolute positioning
 M83                                                       ; Relative extruder
 G1 E-0.2 F{ 10 * 60 }
 G0 Z1 F{ travel_speed_z * 60}
 ;--- Repeat for 2nd purging/priming line
 G0 X{ start_x } Y{ start_y + 1 } F{ travel_speed * 60}   ; 2nd line is same X, Y is 1mm closer to part
 G0 Z{ layer_height } F{ travel_speed_z * 60 }
 G91                                                           ; Relative positioning
 { if print_width >= 50 }
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 1
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 2
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 3
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 4
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 5
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 6
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 7
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 8
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 9
  G1 X{ segment } E1 F{ prime_speed }                 ; Segment 10
 {else}
  G1 X{ print_width / 2 } E{ extr_per_mm * print_width / 2 * 5 } F{ prime_speed }
  G1 X{ print_width / 2 } E{ extr_per_mm * print_width / 2 * 5 } F{ prime_speed }
 {endif}
 G90                                                       ; Absolute positioning
 M83                                                       ; Relative extruder
 G1 E-0.2 F{ 10 * 60 }
 G0 Z1 F{ travel_speed_z * 60}
{else}
 G0 X{ print_bed_max[0] / 3 } Y0 F{ travel_speed }
 G0 Z{ layer_height } F{ travel_speed_z * 60 }
 G91
 M83
 G1 X{ 50 } E{ extr_per_mm * print_bed_max[0] / 3 } F{ prime_speed }
 G90                                                       ; Absolute positioning
 M83                                                       ; Relative extruder
 G1 E-0.2 F{ 10 * 60 }
 G0 Z1 F{ travel_speed_z * 60}
{endif}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
3 Likes