@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}