Macros 允许您在自定义 G 代码字段中创建条件等式和数学方程。
PrusaSlicer 宏语言与 Slic3r 条件表达式不兼容。
构造
条件等式
{if <condition_1>}{GCode_condition_1}[][{else}{GCode_else>]{endif}
表达式
{<expression>}
传统的变量
[variable]
或
[variable_index]
在任何构造内,可以通过它们的名称访问 PrusaSlicer 配置变量
layer_z
并且可以通过使用方括号访问矢量变量的元素
temperature[0]
指的是第一挤出机的温度。
目前只能将多维向量作为简单的矢量变量访问,从而产生字符串值(例如,如果 extruder_variable[1] 产生 [n,0] 字符串值–可以发布在 g 代码中但不能用于算术运算)。
字符串由双引号标识
“string”
正则表达式由斜杠标识
/regex/
字符串不会递归解析,即字符串内的花括号和方括号将出现在输出中。这允许这样的结构存在
{“[text in square brackets]”}
运算符
允许以下运算符:
比较
<, >, ==, !=, <>, <=, >=
例如:
{if layer_height == 0.2};Do something{endif}
布尔逻辑
和,或,非
或等效地,
&&, ||, !
例如
{if layer_height > 0.1 and first_layer_temperature[0] > 220};Do something{endif}
算术
+, -, , /
例如:
M104 S{first_layer_temperature[0] * 2/3}(注意,first_layer_temperature 是一个矢量)
三元运算符
(<condition>? <cond_true>:<cond_false>)
这需要用括号括起来才能工作。
例如:
M104 S{(first_layer_temperature[0]>220 ? 230 : 200)}
此表达式将挤出机温度设置为 230 或 200,具体取决于第一层是否需要超过 220°。
正则表达式匹配
(=(匹配),!(不匹配))
正则表达式用斜杠括起来 /
例如:
{if printer_notes=~/.PRINTER_VENDOR_PRUSA3D./};Printer is Prusa{endif}
函数
最小
min(a,b)
最大
max(a,b)
转换为整数
int(a)
四舍五入到整数
round(a)
四舍五入/填充空格:将小数部分四舍五入到 num_decimals 位数(如果需要,添加尾随零),然后使用空格填充,以使数字的总位数为 num_digits(包括小数点,如果存在)。最后一个参数可以省略,默认为零。
digits(a, num_digits, num_decimals=0)
四舍五入/用零填充:与上面相同,只是左侧用零填充
zdigits(a, num_digits, num_decimals=0)
检查配置选项是否激活
is_nil(config_option_name)
变量(占位符)
您可以在自定义脚本和输出文件名模板中使用变量。
查看所有 PrusaSlicer 占位符的列表,根据它们的范围进行分组。
标量变量
这些值是标量,可以直接引用。
printer_notes(字符串)
layer_z(仅在图层更改 G 代码中可用)
layer_num(仅在图层更改 G 代码中可用)
toolchange_z(自版本 2.4.0 起在自定义换刀 G 代码中可用)
有些变量由复杂的公式定义。例如,perimeter_extrusion_width 如果保持为零,则取 extrusion_width 的值(如果非零),否则为当前 layer_height 计算默认的 perimeter_extrusion_width。仅对新语法表达式(用花括号{}括起来的表达式)执行这些替换,而使用旧的占位符语法(用方括号[]括起来的表达式)编写的表达式将被逐字解释。
矢量(数组变量)
这些变量是数组,需要像这样访问(例如,temperature[0])。
temperature
first_layer_temperature
bed_temperature(请注意,这是一个矢量,即使只有一个值是有意义的:bed_temperature[0])
first_layer_bed_temperature(同上!)
多维向量
这些变量只能作为简单矢量访问,不能用于算术表达式。
extruder_offset
bed_shape
示例
温度塔
您可以使用“图层更改前”自定义 G 代码逐渐降低热端温度。首先,可以使用 if/elseif/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)))}
在打印之前使用弱床加热器更快地加热
如果您的床需要很长时间才能达到温