目录
文章翻译自官方说明文档 PrusaSlicer Macro Language
** PrusaSlicer 宏语言的最新文档可以在Prusa 知识库的相应条目.**
============================
2.6.0-alpha6 中的新功能(尚未包含在上述文档中)
自定义 G 码解释器在 PrusaSlicer 2.6.0-alpha6 中得到了显著扩展。
- 新支持自定义本地变量和全局变量
- 在定制的 G 码和 PrusaSlicer 之间交换打印机的状态(机器位置、z-hop、挤出机位置和收回)是新的可能。
- 为了可读性,可以将多个表达式放置在由分号分隔的单个 { } 块中。
- 新增助手函数
interpolate_table()
、one_of()
、size()
和empty()
。 - 添加了新的占位符,用于访问挤出的材料量
请注意,使用新的 G 代码解释器功能生产的 3MF 将无法通过报告自定义 G 代码错误与旧的 PrusaSlicer 进行切片。建议向此类 3MF 的接收方警告此类不兼容性。
自定义变量 # 4048 # 7196
局部和全局变量可以在自定义 G 代码块中新定义和使用。局部变量仅在定义它们的自定义 G 代码块结束之前有效,而全局变量可以由在定义它们的块之后处理的任何自定义 G 代码块引用。这些变量是用以下语法定义的:
(global|local) variable_name =(scalar_expression|vector_variable|array_expr|initializer_list)
哪里
array_expr := repeat(repeat_cnt, value)
initializer_list := (value, value, value, ...)
可以使用以下语法为用户定义的变量或特殊变量(有关特殊变量,请参见下一节)赋值:
variable_name =(scalar_expression|vector_variable|array_expr|initializer_list)
新创建的变量的类型由右侧初始化器的类型定义。向量变量的所有元素都属于同一类型,因此,如果在单个 initializer _ list 表达式中混合不同类型,这些元素将被转换为相同类型:当 ints 与 floats 混合时,ints 将被转换为 floats。如果初始化列表元素中的任何一个是字符串,则所有元素都会转换为字符串。
新声明的变量不得覆盖现有变量。重复的 (global|local)
变量定义被视为赋值,因此它既不能改变变量类型,也不能改变其作用域(局部与全局)。
与切片引擎交换打印机状态的特殊变量
新的每个自定义 G 代码块可以通过从一组新的特殊变量读取和写入来与切片引擎交换打印机的状态。目前有两组这样的变量可用:G 码位置和挤出机状态。
以下特殊变量可用于交换打印机位置和 z-hop 控件:
position
(read/write)-当前 G 码位置的 3 个元素向量(X,Y,Z) zhop
(read only)-初始值 z-hop
以下特殊变量可用于交换挤出机状态:
e_position
(read/write)-绝对 E 位置,仅适用于绝对挤出机寻址 e_retracted
(read/write)-当前收缩状态 e_restart_extra
(read/write)-当前计划的额外挤出机在去收缩后的启动例如,以下块可用于额外收缩:
{
local long_retract = 0.6;
local extra_retract = long_retract - e_retracted[current_tool];
if extra_retract > 0 then
"G1 E" + extra_retract + "
";
e_retracted[current_tool] = long_retract;
endif
}
类似地,以下块可用于额外的 Z-hop:
{
local long_zhop = 2;
local extra_zhop = long_zhop - zhop;
if extra_zhop > 0 then
local new_z = position[2] + extra_zhop;
"G1 Z" + new_z + "
";
position[2] = new_z;
endif
}
多个表达式可以写在由分号分隔的单个 { } 块内。
现有的自定义 G 代码宏处理器语法是为简单的宏处理任务而设计的。现在,随着自定义变量的引入,人们被邀请编写复杂的自定义 G 代码块。虽然复杂的自定义 G 代码可以使用旧的宏处理语法编写,但新引入的语法通常更易读。
使用旧的语法,每个表达式必须包含在 { } 中。新的多个表达式可以封闭在由分号分隔的一对大括号 { } 中。
类似地, {if condition}... {endif condition}... {else}... {endif}
表达式可以新写入一对 {} 中,并且可以嵌套 ifs,例如:
{if condition then
statement;
statement
elsif condition then
if condition then
statement
else
statement
endif
else
statement
endif}
如果需要,可以在一个表达式中将旧的语法与新的语法混合:
{if condition
}some text{
else
statement
endif}
分号只在多个语句之间需要,并且在 if 块的末尾(endif 之后)不需要分号。
与较早的 PrusaSlicer 相比,不活动的 if/else/endif 块只是被解析,但不再被计算,因此不活动的分支可能包含无效的代码,例如引用未定义的变量。
新的助手功能
引入了以下新功能: interpolate_table()
、 one_of()
、 size()
和 empty()
- inpolate _ table(x,(x0,y0),(x1,y1),(x2,y2),…)
在点 x 处插值分段线性函数 - one _ of(sample,pattern1,pattern2,…)
如果样本与其中一个模式匹配,则返回 true。如果模式包含在//中,或者如果表达式的前缀是 ~,则模式被视为正则表达式。例如/。a./或 ~“.a.”是匹配任何包含单个“a”字符的模式。 - size(vector _ variable)返回其元素的数量。
- 如果向量变量有零元素,则空(vector _ variable)返回 true。
用于访问挤出材料量的新占位符
以下占位符提供了特定挤出机在评估占位符时挤出的塑料的体积和重量: extruded_volume
, extruded_weight
以下占位符提供了在评估占位符时所有挤出机挤出的塑料的体积和重量: extruded_volume_total
, extruded_weight_total