-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Conditional Gcode Syntax Spec
Contents on this page are proposed and may not be implemented.
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
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}
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 with the {} removed..
- 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 with the enclosing {}
removed.
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