Prusa Slicerのマクロ言語仕様をソースからまとめたVojtěch Bubník氏の文書"Slic3r Prusa Edition Macro Language"を翻訳しました。
文中で使用されているSlic3r PEという名称は、現在のPrusa Slicerのことです。Prusa SlicerはSlic3rを元に作られたソフトで、2019年5月30日の2.0.0版のリリースを機に改名するまではSlic3r Prusa Edition (略称PE) という名称でした。
Slic3r PEマクロ言語の簡易ドキュメント
注: この言語はSlic3r PEでのみ利用可能であり、Slic3rの条件式とは互換性がない。
注2: これはSlic3r PEマクロ言語の公式ドキュメントではない。ソースからトライアンドエラーにより導出したものだ。正確ではないかもしれない。
利用できる構成要素
Slic3r PEのカスタムGコードセクションでは以下のタイプのマクロ構成要素が許される。
条件評価: {if <条件_1>}<条件_1_のGCode>[{elsif <条件_2>}<条件_2_のGCode>][{else}<GCode_else>]{endif}
式評価: {<式>}
従来からのプレースホルダ構文:
[変数] または [変数_インデックス]
これらの構成要素の内側からは、設定変数に名前でアクセスできるし(たとえばlayer_z
)、またベクター変数には角カッコを使ってアクセスできる(たとえばtemperature[0]
で最初のエクストルーダの温度を参照する)。
現状では多次元ベクター変数には文字列の値となる単純ベクター変数としてのみアクセスできる(たとえばプレースホルダextruder_offset
が値0x0,nx0を持つときは、文字列値[n,0]を持つextruder_variable[1]
としてしかアクセスできない---すなわち、G-code内にポストすることは可能なものの、算術演算の中で使うことはできない)。
利用できる演算子
以下の演算子が許されている:
- 比較演算子(
<, >, ==, !=, <>, <=, >=
)。例:{if layer_height == 0.2};Do 何か{endif}
- ブール論理演算子(
and, or, not,
およびこれと同等の&&, ||, !
)。例:{if layer_height > 0.1 and first_layer_temperature[0] > 220};Do なにか{endif}
- 算術演算子(
+, -, *, /, %
)。例:M104 S{first_layer_temperature[0]*2/3}
(注 first_layer_temperatureはベクター) - 三項演算子(<条件>? <条件がtrueのとき>:<条件がfalseのとき>)。これは丸カッコ内に入れなければ動作しないようである。例:
M104 S{(first_layer_temperature[0]>220 ? 230 : 200)}
。この式は220℃を超えるファーストレイヤー温度が必要かどうかにより、エクストルーダ温度を230℃または200℃にセットする。 - 正規表現マッチング(=~ (マッチ), !~ (マッチしない))。正規表現はスラッシュ
/
で囲む。例:{if printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/};Printer is Prusa{endif}
利用できる関数
min(a, b)
、max(a, b)
int(a)
カスタムスクリプトや出力ファイル名テンプレートで使える便利な変数
Slic3rのプレースホルダとして利用できる変数はすべて利用できる(プレースホルダのリストを参照)
これらの変数はコマンドラインや(prusa-slicerをFFFプリンタなら--help-fff
、SLAプリンタなら---help-sla
を付けて実行)、各設定画面のフィールドのツールチップとしても表示される。
出力ファイル名テンプレートは以下の変数をサポートしている:
- プリント、フィラメント、SLAプリント、SLAマテリアル、プリンターの各設定のすべての変数
- FFF用のプリント統計: "print_time", "normal_print_time", "silent_print_time", "used_filament", "extruded_volume", "total_cost", "total_weight", "total_wipe_tower_cost", "total_wipe_tower_filament"
- SLA用のプリント統計: "print_time", "total_cost", "total_weight", "objects_used_material", "support_used_material"
スカラー変数
以下の値はスカラーであり直接参照できる。
複雑な式で定義されている変数もある。たとえば、perimeter_extrusion_width
は、ゼロのままになっていればextrusion_width
のゼロではない値を取るが、これがゼロであればデフォルト値がlayer_height
から算出される。これらの置換は新構文の式(中カッコ{}
で囲まれたもの)にのみ行われ、従来のプレースホルダ構文(角カッコ[]
で囲まれたもの)は逐語的に解釈される。
ベクター(配列変数)
以下の変数は配列であり、(添字での)アクセスが必要である。
- temperature
- first_layer_temperature
- bed_temperature (これがベクターであることに注意。意味のある値はひとつしかないのだが: bed_temperature[0])
- first_layer_bed_temperature (同上!)
多次元ベクター
以下の変数は単純ベクターとしてのみアクセス可能で、また算術式には使用できない。
- extruder_offset
- bed_shape
例
ノズル温度を連続的に低下させる
「レイヤー変更前」のカスタムGコードの使い道のひとつに、ホットエンド温度をゆっくり下げるというものがある。第一の方法としてif/elsif/else式が使用できる:
{if layer_z < 10}M104 S265 {elsif layer_z <17}M104 S260 {elsif layer_z < 24}M104 S255 {elsif layer_z < 31}M104 S250 {elsif layer_z < 38}M104 S245 {elsif layer_z < 45}M104 S240 {endif}
同様の結果は、もっと短いif/else/endif式と線形補間を組み合わせても得られる:
M104 S{if layer_z < 10}265{elsif layer_z > 45}240{else}265+(240-265)*(layer_z-10.0)/(45-10){endif}
三項演算子を使ってもよい:
M104 S{(layer_z < 10) ? 265 : (layer_z > 45) ? 240 : 265+(240-265)*(layer_z-10.0)/(45-10)}
低出力のヒートベッドをプリント前に素早く加熱する
ヒートベッドが弱くて設定温度に達するまで時間がかかるなら、「スタートGコード」でベッド温度を目標マイナス5℃まで加熱し、それからホットエンドの加熱を始め、ベッドの加熱はそのまま続けるようにすることで、待ち時間を少しだけ縮めることができる:
M190 S{first_layer_bed_temperature[0] - 5} ; ベッド温度が目標 - 5℃になるまで待つ M140 S[first_layer_bed_temperature] ; 従来からの [<変数>] 構文でベッド加熱を続ける M109 S[first_layer_temperature] ; ノズルが設定温度になるのを待つ