Prusa Slicerのマクロ言語仕様

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内にポストすることは可能なものの、算術演算の中で使うことはできない)。

利用できる演算子

以下の演算子が許されている:

  1. 比較演算子<, >, ==, !=, <>, <=, >=)。例: {if layer_height == 0.2};Do 何か{endif}
  2. ブール論理演算子and, or, not,およびこれと同等の&&, ||, !)。例: {if layer_height > 0.1 and first_layer_temperature[0] > 220};Do なにか{endif}
  3. 算術演算子+, -, *, /, %)。例: M104 S{first_layer_temperature[0]*2/3} (注 first_layer_temperatureはベクター
  4. 三項演算子(<条件>? <条件がtrueのとき>:<条件がfalseのとき>)。これは丸カッコ内に入れなければ動作しないようである。例: M104 S{(first_layer_temperature[0]>220 ? 230 : 200)} 。この式は220℃を超えるファーストレイヤー温度が必要かどうかにより、エクストルーダ温度を230℃または200℃にセットする。
  5. 正規表現マッチング(=~ (マッチ), !~ (マッチしない))。正規表現はスラッシュ/で囲む。例: {if printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/};Printer is Prusa{endif}

利用できる関数

  1. min(a, b)max(a, b)
  2. int(a)

カスタムスクリプトや出力ファイル名テンプレートで使える便利な変数

Slic3rのプレースホルダとして利用できる変数はすべて利用できる(プレースホルダのリストを参照)

これらの変数はコマンドラインや(prusa-slicerをFFFプリンタなら--help-fffSLAプリンタなら---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"

スカラー変数

以下の値はスカラーであり直接参照できる。

  • printer_notes (文字列)
  • layer_z (レイヤー変更Gコードでのみ利用可)
  • layer_num (レイヤー変更Gコードでのみ利用可)

複雑な式で定義されている変数もある。たとえば、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]             ; ノズルが設定温度になるのを待つ