Deutsch
Login

Makros

Relevant für

MMU family
MINI family
MK3 family
OLD PRODUCTS
SLA family
+
5 Kommentare
Artikel ist auch in folgenden Sprachen verfügbar
English
Čeština
Polski
Deutsch
Français
Español
Italiano
日本語

Makros ermöglichen die Erstellung von Bedingungen und die Auswertung von mathematischen Gleichungen in den benutzerdefinierten G-Code-Feldern.

Die PrusaSlicer-Makrosprache ist nicht kompatibel mit Slic3r-Bedingungsausdrücken.

Konstrukte

Bedingte Auswertung

{if }[][{else}]{endif}

Ausdruckauswertung

{}

Syntax der Legacy-Platzhalter

[Variable] oder [Variable_index]

In beiden Konstrukten kann auf die PrusaSlicer-Konfigurationsvariablen über deren Namen zugegriffen werden

layer_z

und auf Elemente von Vektorvariablen kann mit Hilfe von eckigen Klammern zugegriffen werden

temperature[0]

bezieht sich auf die Temperatur des ersten Extruders.

Mehrdimensionale Vektoren können derzeit nur als einfache Vektorvariable angesprochen werden, die einen String-Wert ergibt (z.B. wenn die extruder_variable[1] den String-Wert [n,0] ergibt -- kann in g-code ausgegeben werden, kann aber nicht in arithmetischen Operationen verwendet werden).

Strings werden durch doppelte Anführungszeichen "string" und reguläre Ausdrücke durch Schrägstriche /regex/ Strings werden nicht rekursiv geparst, d.h. geschweifte und eckige Klammern innerhalb von Strings werden in der Ausgabe erscheinen. Dies ermöglicht Konstrukte wie {"[Text in eckigen Klammern]"}

Operatoren

Die folgenden Operatoren sind erlaubt:

  1. Vergleich <, >, ==, !=, <>, <=, >=
    • Beispiel: {if layer_height == 0.2};Tu etwas{endif}
  2. Boolesche Logik and, or, notor, equivalently, &&, ||, ! 
    • Beispiel {if layer_height > 0.1 and first_layer_temperature[0] > 220};Tu etwas{endif}
  3. Arithmetik +, -, , /
    • Beispiel: M104 S{first_layer_temperature[0] * 2/3} (Beachten Sie, dass first_layer_temperature ein Vektor ist)
  4. Ternärer Operator (?:) Dieser muss in Klammern eingeschlossen werden, um zu funktionieren.
    • Beispiel: M104 S{(first_layer_temperature[0]>220 ? 230 : 200)}Dieser Ausdruck setzt die Extrudertemperatur entweder auf 230 oder 200, je nachdem, ob die erste Schicht über 220° sein muss.
  5. Regulärer Ausdruck, der (=~ (passend), !~ (nicht passend))
  6. Regelmäßige Ausdrücke werden in Schrägstriche / eingeschlossen
    • Beispiel: {if printer_notes=~/.PRINTER_VENDOR_PRUSA3D./};Drucker ist Prusa{endif}

Funktionen

Minimum min(a,b)

Maximum max(a,b)

Casting auf Ganzzahl int(a)

Runden / Auffüllen mit Nullen: wie oben, nur links mit Nullen gefüllt zdigits(a, num_digits, num_decimals=0)

Variablen (Platzhalter)

Sie können Variablen innerhalb von eigen Skripten und in der Vorlage für den Namen der Ausgabedatei verwenden.

Sehen Sie sich die Liste aller PrusaSlicer Platzhalter an, gruppiert nach ihrem Anwendungsbereich.

Skalare Variablen

Diese Werte sind skalar und können direkt referenziert werden.

  • printer_notes (String)
  • layer_z (nur verfügbar im Schichtwechsel GCode)
  • layer_num (nur verfügbar im Schichtwechsel GCode)
  • toolchange_z (verfügbar im benutzerdefinierten Werkzeugwechsel GCode seit Version 2.4.0)

Einige Variablen werden durch komplexe Formeln definiert. Zum Beispiel die perimeter_extrusion_width wenn auf Null gesetzt, nimmt den Wert von extrusion_width wenn ungleich Null, sonst die Standard perimeter_extrusion_width wird berechnet für die aktuelle layer_height. Diese Ersetzungen werden nur für die Ausdrücke der neuen Syntax (eingeschlossen in geschweiften Klammern {}) vorgenommen, während die Ausdrücke, die mit der alten Platzhalter-Syntax (eingeschlossen in eckigen Klammern []) geschrieben wurden, wortwörtlich interpretiert werden.

Vektor (Array-Variablen)

Diese Variablen sind Arrays und müssen als solche angesprochen werden (z.B. temperature[0]).

  • temperature
  • first_layer_temperature
  • bed_temperature (Beachten Sie, dass dies ein Vektor ist, auch wenn nur ein Wert sinnvoll ist: bed_temperature[0])
  • first_layer_bed_temperature (wie oben!)

Mehrdimensionaler Vektor

Diese Variablen können nur als einfache Vektoren angesprochen werden und können nicht in arithmetischen Ausdrücken verwendet werden.

  • extruder_offset
  • bed_shape

Beispiele

Temperaturturm

Sie können den benutzerdefinierten G-Code "Vor Schichtwechsel" verwenden, um die Temperaturen am Hot End langsam zu senken. Zunächst kann man den if/elseif/else-Ausdruck verwenden:

{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}

 Das gleiche Ergebnis kann durch einen kürzeren if/else/endif-Ausdruck zusammen mit einer linearen Interpolation erreicht werden:

M104 S{if layer_z < 10}265{elsif layer_z > 45}240{else}265+(240-265)(layer_z-10.0)/(45-10){endif}

Oder man kann den ternären Operator verwenden:

M104 S{(layer_z < 10) ? 265 : (layer_z > 45) ? 240 : 265+(240-265)(layer_z-10.0)/(45-10)}

Schnelleres Aufheizen mit schwachen Bettheizungen vor dem Druck

Wenn Sie ein Bett haben, das sehr lange braucht, um auf Temperatur zu kommen, können Sie ein wenig Wartezeit einsparen, indem Sie mit "Start G-Code" das Bett auf die Zieltemperatur minus 5 Grad aufheizen und dann mit dem Aufheizen des Hot End beginnen, während das Bett weiter auf den Zielwert aufheizt:

M190 S{first_layer_bed_temperature[0] - 5} ; Warten auf Betttemperatur - 5
M140 S[first_layer_bed_temperature] ; Bettheizung fortsetzen mit Legacy [] syntax
M109 S[first_layer_temperature] ; Warten auf Düsentemperatur

 

War dieser Artikel hilfreich?
Diese Aktion ist nur für registrierte Benutzer verfügbar. Bitte anmelden.
 

3 Kommentare

Einloggen  um einen Kommentar zu schreiben
Schorsch3000
Is there a way to replace strings? either replacing a simple substring or using some kind of regex replace?
 
My Usecase is:
I often have multiple files for the same project.
The way my workflow is setup, they always have the same preif in the filename.
The filename is something like "$projectname__$partname.stl"
i would like to have one folder per project, so i would like to replace __ with /
SPURLOS
Wie muss die if Abfrage für den Wert "filament_type" formuliert sein ? In dem Start gcode soll eine if abfrage sein, um z.B. bei verschiedenen Fillament Typen jeweils immer auf eine bestimmte Extruder Temp vorzuheizen. Danach Bett Level und dann erst die "richtige" Extruder Temperatur.
Wenn filamant_type = PLA dann Extruder Temp 190
Wenn filament_type = PETG dann Extruder Temp 210, usw....
Das hier funktioniert nicht....
{if filament_type = PLA}M104 S190{endif}
es kommt die Meldung
Parsing error at line 7: Referencing a vector variable when scalar is expected{if filament_type = PLA}M104 S190 ; Extruder auf 190 Grad bei PLA{endif}
 
Giuliano - Official Prusa CS
Hallo. Es ist möglich, Befehle zur Änderung der Temperatur einzufügen, wie in diesem Artikel dargestellt, aber es ist nicht an den Materialtyp gebunden, so dass die Angabe des Materials nicht wirklich notwendig ist.
Devilscave
Gibt es einen weg wie ich zwei Kommands hinter einen if Abfrage setzen kann?z.B: {if layer_z == 20}M220 S130, M106 S255{endif}das M106 wird in diesem Beispiel nicht beachtet, wie wird es beachtet?Benötige ich ein anderes Zeichen anstelle des "," ???
KB - Official Prusa Support
In diesem Fall sollte es möglich sein die Kommentare sequentiel zu schreiben. Also folgendermassen:
{if layer_z == 20}
M220 S130
M106 S255
{endif}