-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Conditional Gcode Syntax Spec
These features are planned for all custom G-Code fields.
The Slic3r Manual contains everything that has been implemented: http://manual.slic3r.org/advanced/conditional-gcode
PRUSA3D FORK USES A DIFFERENT SYNTAX
Related Feature Request/Issue: https://github.com/alexrj/Slic3r/issues/3390
All Slic3r variables referenced must be known by PlaceholderParser (eg [])
Conditional expressions has the following syntax:
{if _expression_} gcode line
expression may take one of the following forms:
- VARIABLE OPERATOR CONSTANT
- CONSTANT OPERATOR VARIABLE
- {subexpression} OPERATOR {subexpression}
- OPERATOR subexpression
subexpression has the same forms as expression.
If _subexpression_s exist, they are evaluated before any other operators.
Available operators:
-
&&
orand
- logical AND -
||
oror
- logical OR -
!
ornot
- logical NOT (inversion) -
^
orxor
- XOR (exclusive-OR) -
==
orequals
- equality comparison. -
!=
- inequality comparison. To use words, use a subexpression. -
<
- less than (valid for numbers only) -
<=
- less than or equal to (valid for numbers only) -
>
- greater than (valid for numbers only) -
>=
- greater than or equal to (valid for numbers only)
Available keywords:
- 'false'
- 'true'
To apply a single condition to multiple lines, repeat it once for each line.
{if [layer_num] == 10}M104 S210
{if [layer_num] == 10}M600
- If a conditional expression evaluates to false, all the characters until the end of the line are removed.
- If a conditional expression fails to parse, it's left in place.
- Expressions may be chained for an implicit AND.
{if [layer_num] == 10}{if [temperature_1] != 210}M104 S210
- Numerical value of 0 is equivalent to logical
false
. Any nonzero value is considered to be logicaltrue
.-
{if { 1 - 1 } }
would result in 0 and thusfalse
.
-
Outside of an expression {
and }
may be escaped with a single \
.
Any expression enclosed in two curly brackets, but not starting with {if
is evaluated as an arithmetic expression: {foo - bar}
.
If evaluation fails, the expression is silently left untouched.
If any float variables are used, return value will have decimals. If string variables are mixed with numeric variables, they are parsed as floats if they have a dot, or integers otherwise.
Additional available operators:
-
+
- Addition -
-
- Subtraction -
/
- Division -
*
- Multiplication
Value expressions can be used in conditional expressions by nesting them: {if {foo - bar} > 10}
.
Should we also support modulo division and/or power syntax? I can see a couple use cases for modulo, but not for power - @lordofhyphens