Copy/Mirror mode in OrcaSlicer

Asking for assistance with IDEX copy/mirror mode when using Orcaslicer

  1. When not using smfix (v1.12) as post processor I get an error on the display that the gcode exceeds the bounds to support this mode. From what I found online I have the assumption that it has to do with the machine start g-code and the pre-extrude going off the build plate towards the nozzle.
  2. When using smfix I get the error on the display that the gcode is a multi extrude project and thus you can’t select copy/mirror mode.

The start code also clearly shows that Dylan does have something (search for IDEXDupl) to get things to work but I haven’t found how to enable it.

Does anybody know what I have to do to get things working?

The machine start g-code:

; Model: Snapmaker J1 ({nozzle_diameter[0]}/{nozzle_diameter[1]})
; Update: 20241211
; Maintained by https://github.com/macdylan/3dp-configs
; Printer : [printer_preset]
; Profile : [print_preset]
; Plate   : [plate_name]
; --- initial_extruder: [initial_extruder]
; --- has_wipe_tower: [has_wipe_tower]
; --- total_toolchanges: [total_toolchanges]
; --- T0: {is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - 1, 0))]}
; --- T1: {is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - 0, 0))]}

T[initial_extruder]

{if plate_name =~/.*IDEXDupl.*/ || plate_name =~/.*IDEXCopy.*/ }
  M605 S2 X162 R0 ;IDEX Duplication

{elsif plate_name =~/.*IDEXMirr.*/}
  M605 S3 ;IDEX Mirror

{elsif plate_name =~/.*IDEXBack.*/}
  M605 S4 ;IDEX Backup
{endif}

M140 S{first_layer_bed_temperature[initial_extruder]}

{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]}
; preheat 0
M104 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]} 
  {endif}

{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]}
; preheat 1
M104 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]} 
  {endif}

G28
G0 Z0.2 F240.0

{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]}
  T{(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))}
  G0 X{if 0 == 0}80{else}240{endif} Y0 F6840.0
  {endif}
{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]}
  T{(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))}
  G0 X{if 1 == 0}80{else}240{endif} Y0 F6840.0
  {endif}

M190 R{first_layer_bed_temperature[initial_extruder]}

M83

{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))] and (initial_extruder % 2) != 0}
; flush nozzle 0
T{(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))}
M104 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]} 

G0 X{( 0 % 2 == 0 ? 137.0 : 187.0 )} F6840.0
M109 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]} C3 W1
G1 E6 F200
G92 E0
G1 X{( 0 % 2 == 0 ? -15 : 344 )} E8.5437 F3000.0
G92 E0

G1 E-{retract_length_toolchange[0]} F200
G92 E0
G0 Y20 F6840.0
M104 S{temperature_vitrification[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]}
  {endif}

{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))] and (initial_extruder % 2) != 1}
; flush nozzle 1
T{(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))}
M104 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]} 

G0 X{( 1 % 2 == 0 ? 137.0 : 187.0 )} F3000.0
G0 Z0.2 F240.0
M109 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]} C3 W1
G1 E8 F200
G92 E0
G1 X{( 1 % 2 == 0 ? -15 : 344 )} E8.5437 F3000.0
G92 E0

G1 E-{retract_length_toolchange[1]} F200
G92 E0
G0 Y20 F6840.0
M104 S{temperature_vitrification[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]}
  {endif}

; flush initial nozzle
T[initial_extruder]
M104 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + initial_extruder, 63) : max(initial_extruder - (1-initial_extruder), 0))]}

G0 X{( initial_extruder % 2 == 0 ? 137.0 : 187.0 )} F3000.0
G0 Z0.2 F240.0
M109 S{nozzle_temperature_initial_layer[(initial_extruder % 2 == 0 ? min(initial_extruder + initial_extruder, 63) : max(initial_extruder - (1-initial_extruder), 0))]} C3 W1
G1 E8 F200
G92 E0
G1 X{( initial_extruder % 2 == 0 ? -15 : 344 )} E8.5437 F3000.0
G92 E0

G1 E-{retraction_length[initial_extruder]} F200
G92 E0
G0 Y20 F6840.0

; ready [plate_name]

Your print plate only needs to be used by half for duplication mode.
In the start gcode Skript it seems you need to name your plate something with IDEXDupl. or the other words in it.

Maybe @nweolu could answer?

Set up a new machine and configure the extruder count to one. This allows you to select and use the Copy and Mirror modes on the machine.

I just had another go at it an it appears that you don’t even need to created another machine. Just removing the second filament is sufficient. It works and thus solves the problem however not having to remove the second filament (obviously not use it) would be easier.

Obviously iXex: Parallel Printing Support for IDEX and IQEX Printers by cgarwood82 · Pull Request #13086 · OrcaSlicer/OrcaSlicer · GitHub would also do the trick. Does anybody know how to put it on the Snapmaker dev team radar?