Skip to content

nic1972/SmartWiper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Smart-Wiper - Experimental G-Code Post-Processor for PrusaSlicer & OrcaSlicer to Optimize Wipe/Purge Towers and Reduce Waste in Multi-Color & Multi-Material 3D Printing

⚠️ Experimental Project – Open for Community Contributions


Current version: 0.1 (alpha)


📑 Jump to language section:

English English | Deutsch Deutsch | Italiano Italiano


English (GB)

Flag England

1️⃣ 🧠 What is SmartWiper?

SmartWiper is a Python post-processing script for G-code files, specifically developed for multi-material printing with tools like the Prusa MMU3. It has been tested with G-code files from PrusaSlicer, but should also work with other slicers.

The script specifically addresses common weaknesses of conventional wipe towers: print interruptions, nozzle collisions, unstable towers, delamination, and material build-up. The towers are created entirely from scratch outside of the slicer. SmartWiper generates independent, optimized wipe towers, improving stability, enhancing print quality, and effectively preventing nozzle damage. The project was developed with the support of ChatGPT and is aimed at the maker community: Both beginners and experienced users can contribute, improve the tool, or adapt it to their printers and workflows.


2️⃣ 🧑‍💻 Main Features and Requirements

SmartWiper offers:

  • 🖥️ An intuitive graphical user interface (GUI)

  • 🎛️ Parameter control
    All important parameters – position, width, speed, extrusion factor, Z-hops, wipe paths, options, and much more can be adjusted.

  • 🖼️ An integrated 2D live preview
    Displays the wipe towers in X/Y and X/Z view for better control and placement.

  • 🪄 Automatic analysis
    Automatically detects layer heights, tool changes, and tower heights – no manual post-processing required.

Only a few requirements:

  • 🖥️ No installation required
    The script is standalone – it only requires Python 3. No additional libraries or modules are necessary.

3️⃣ 🔧 How does SmartWiper work? (Technical concept)

It adds its own wipe towers to the existing G-code afterwards, specifically avoiding common problems with material changes in multi-material printing.

Conventional wipe towers consist of a single block in which all materials alternate layer by layer. This often leads to:

❌ Delamination between different materials

❌ Warping – corners curling upwards ("elephant foot")

❌ Filament residues and blobs that can collide with the nozzle

SmartWiper takes a completely different approach – with surprisingly simple yet effective measures:

  • 🧱 A separate wipe tower for each material
    No more mixed layers – each tower consists exclusively of a single material or color. This improves layer adhesion and prevents delamination.

  • 🌀 Optional spiral build
    Instead of classic rectangular blocks, towers can be created in a spiral shape to reduce thermal stresses and the typical corner lifting ("elephant foot").

  • 🕳️ Central material channel – always present in optional spiral towers
    Excess material and strings are "flushed" down through the opening in the middle instead of sticking to the nozzle.

This architecture improves adhesion, reduces critical stresses, and ensures a more stable, reliable, and low-maintenance printing process, especially for taller towers – without the classic wipe tower problems.


4️⃣ ⚖️ Comparison: Single- / Multi-material

With my Prusa MK4S set, I achieve very good print results 99% of the time – as long as I only use a single material or a single color.
Normally, I start a print job, wait for the first layer to be fully extruded, and can then leave the printer unattended.

It’s a completely different story with multi-material printing:
The printer pauses at almost every tool change due to nozzle collisions. I have to intervene manually each time, removing strings and material residues with small side cutters and tweezers.
A job that would normally take 6 hours can take over 8 hours with mandatory manual intervention – assuming you’re always right there and react immediately each time the printer pauses.


5️⃣ 💬 Personal experiences with conventional wipe towers

In multi-material printing with tools like Prusa’s MMU3, the same problems occur repeatedly:

  • Delamination
  • Elephant foot
  • Blobs, strings, and filament residues colliding with the nozzle
  • Result: Crash detection → Print interrupted or destroyed

SmartWiper was developed specifically to permanently avoid these problems.


6️⃣ 🧱 Comparison: Conventional vs. SmartWiper towers

Example: Left: without towers. Right: the PrusaSlicer preview (based on the G-code).
However, when actually printed, the previously mentioned issues often occur.:
Example Prusa wipe tower preview

In contrast, here are some examples of how the towers actually look when printed based on that PrusaSlicer-generated G-code – showing the typical issues such as delamination, stringing, and unstable structures:
Example Prusa wipe tower print

You can see strings and blobs that make the towers unstable. The printer aborted the print several times due to detected collisions. After multiple stops, I had to cancel the print – filament, time, and electricity costs were wasted.

This problem is not unique to me. Comparable images can also be found online:
Example online wipe tower print

📷 This photo shows a print of the model
"Halloween Cat Full (MMU3-Version)" by Fireball.XE
License: CC BY-NC-SA 4.0

Even for completed print jobs, it is visible that conventional towers are often unstable – especially with many tool changes. The print height in this example was low. What would have happened with a taller print?

How SmartWiper calculates the wipe towers is shown below:
Example SmartWiper wipe tower preview

🧱 This image was created using the model
"Creature - Trash for your 3D printer" by lecaramel
License: CC BY-NC 4.0

You can immediately see the new strategy from the SmartWiper script, with rectangular towers on the left and spiral-option enabled on the right (which also has a hole in the middle):

  • One separate tower per material
  • Optional: Spiral build with central hole for material drainage

7️⃣ ⚙️ Slicer settings

For proper functionality in the slicer, first disable wipe tower and binary G-code.
Slicer settings

SmartWiper automatically inserts a wipe only when a tool change occurs.
This results in different tower heights – depending on how often each material is changed. This saves filament.

⚠️ But beware:
If a filament is used for the first time in later layers, the first layer of its wipe tower will only then, for the first time, be extruded "on the bed".

This could increase the risk that the first layer does not adhere to the print bed, and all subsequent extrusions on top will be in mid-air – leading to a faulty print.

🧠 Solution (temporary):
For materials missing in the first layer, create small, flat squares in the slicer (e.g., 10 × 10 × H mm, where H corresponds to the first-layer height – usually 0.2 mm).
This forces the script to insert a wipe operation for these filaments already in the first layer.

That way, all materials or colors are already present in the first layer, and if they adhere to the bed, all layers above will adhere as well. It would be a shame if a filament were only used towards the end, and the tower failed to adhere at that point.

Rule of thumb: For each filament not used in layer 1, create a small (10 mm x 10 mm), shallow (0.2 mm) start square in the slicer. Materials or colors already used in the first layer do not need these squares!

🔜 In a future script version, there will be an option to wipe all materials already in the first layer.
In the GUI, this function is already planned and visible as a radio button, but it has not been implemented yet – therefore, it is currently greyed out.


8️⃣ 🔍 Functionality and compatibility

📂 The input G-code file is selected.

  • The original G-code file is never overwritten.
  • The script always creates a new output file with the suffix _wipe.

Example: my_print.gcode becomes my_print_wipe.gcode.

🔍 The file is scanned in the first phase. PrusaSlicer G-code usually consists of three sections:

  1. Head:
    – Metadata and image (kept unchanged by the script).
  2. Main:
    – Print instructions (wipe commands are added here).
  3. Tail:
    – Material colors and types, temperatures, settings, bed size, etc. (kept unchanged by the script).
  • SmartWiper automatically detects these sections by scanning the G-code once.

  • Important information for later is extracted from the tail section.

  • If certain information is missing, default values are used.

  • These are centrally defined in the script and can be easily adjusted.

  • Search patterns can be easily adjusted directly in the script by experienced users for better compatibility with other slicers.

  • Likewise, default values, which can easily be modified directly in the script by experienced users, can further ensure compatibility with other slicers or printers.

  • The default values and settings modified in the script can be adjusted once and will then remain the same for all future executions.

🖥️ During this first phase, information is displayed in the terminal.
It’s possible, but not recommended, to disable this in the script with little effort.

Example of the terminal output and explanation below:
Example SmartWiper terminal output

🔣 Then the graphical user interface (GUI) opens:
At this point, all important information from the initial scan phase (or from the default parameters) has been collected; only the editable settings are displayed in the GUI. Here you can:

  • Edit parameters
  • Enable/disable options
  • Change tower shape, positions, and dimensions
  • Use a 2D preview (front and top view)

💡 Important:

  • When changes are made that require verification, the Process button is disabled, and the Check button blinks (visual feedback).
  • Clicking the Check button validates the values and re-enables the Process button – afterwards, the Check button stops blinking.
  • Invalid values (e.g., "a" or "**-**60" or "1000000" for speed) are automatically replaced with the last valid value.
  • If necessary, you can reset all modified settings using the Restore button.

Overview of the GUI:
SmartWiper GUI

📝 When you press the Process button, the GUI closes, the script continues running independently, and inserts commands into the main section of the G-code.


9️⃣ 🚫 Limitations

  • The wipe time calculated by the script is still inaccurate and is only displayed in the GUI – it is not added to the print time on the printer display.

Therefore, the elapsed and remaining print time shown is incorrect! More accurate timing and correct display output are planned for future versions.

  • On the printer display and in the G-code head, only the object without towers is shown after script execution – as is also the case in PrusaSlicer.

How wipe towers look and where they are positioned is shown at script runtime and can be modified. They are also correctly displayed in the slicer’s G-code viewer.

  • Tower positions are freely selectable, but there is no automatic collision check – just like in PrusaSlicer.

Therefore, it’s always recommended to check the file in a G-code viewer before sending it to the printer!

  • The script only works with non-binary G-code – as mentioned above, binary G-code must be disabled in the slicer.

🔜 This may change in a future script version.


1️⃣0️⃣ ⏳ Status

The program runs and processes G-code correctly. The processed G-code can be viewed without errors in G-code viewers, and the wipe commands inserted by the script are syntactically valid. The file can be sent to the printer and the print starts without issues.

⚠️ However, there is currently a problem with the extrusion amount: At the start of wipe movements, the printer performs empty (non-extruding) movements, which results in the towers being printed smaller than shown in the preview. Presumably, the E-values (extrusion) are not yet correct or need better calibration.


1️⃣1️⃣ 🧩 Contributions welcome

SmartWiper is still under development.
Testing, ideas, pull requests, and community feedback are very welcome!


1️⃣2️⃣ 🧪 Future features (outlook)

🔄 Wipe all materials in the first layer (planned)

More accurate time estimates with output to the printer’s display (planned)


1️⃣3️⃣ 👤 About the author

I’m a hobby programmer with some experience in C and PowerShell – but none in Python. Nevertheless, with the help of ChatGPT, I developed a working main framework in Python – using only a text editor, without a special development environment. I deliberately chose Python because it is more accessible for many in the 3D printing community.

The project is certainly not perfect – but it is open.
Constructive help is welcome, destructive criticism will be ignored.

Author: Nicola Italiano

Contact:

🔗 LinkedIn Profile
🔗 XING Profile


1️⃣4️⃣ 🙏 Acknowledgements

Created with the help of ChatGPT and tested on a Prusa MK4S kit with MMU3.
Project: SmartWiper – G-code post-processor for multi-material printing.
Current version: 0.1 (alpha version)


1️⃣5️⃣ 🧪 In development: MaterialRemap (new project)

In addition to SmartWiper, I’m currently working on another open-source script for the 3D printing community: MaterialRemap.

In multi-material printing, it often happens that models are shared online (STL or 3MF) that are not split into separate parts but are directly painted.

Example: A user has painted the shoes of a model black – on their setup, this color (black) is loaded on tool #3. When I open the same model, I see yellow shoes because yellow filament is loaded on tool #3 in my setup – and black is on tool #4. ➡️ Currently, I would have to manually reassign my material slots, which is sometimes undesirable and time-consuming.

MaterialRemap aims to solve this problem: The script will adjust the material assignments directly in the file so that, for example, "black" is assigned to tool #4 – automatically and without loss.

📌 This script will also be completely open and free – like all my projects. I develop such tools in my free time, especially for the 3D printing and maker community.

💛 If you like my work and would like to support me – for example, with a coffee ☕ as a small motivation – I appreciate any contribution:

EURO & Dollar From all countries except Switzerland:

👉 Support me on Ko-fi

CHF Only from Switzerland, donations must be in CHF.:

👉 choose amount freely choose amount freely or ☕ Buy me a coffee (3 CHF) ☕ Buy me a coffee (3 CHF)

This project is non-commercial. Donations are purely voluntary and serve only to support motivation and further development.
I respect all licensing rights and will remove demonstrative content upon request by the original authors of the models used.


1️⃣6️⃣ 🪪 License

Source code: MIT License (see LICENSE in the repo root).
Content (documentation, images, videos, subtitle .srt files): Creative Commons Attribution – NonCommercial 4.0 International (CC BY-NC 4.0).
You may use, modify, and redistribute the content for non-commercial purposes only. For commercial use, please contact the author.

🔗 View full license online (CC BY-NC 4.0)
🔗 View full license locally

Unless otherwise noted in individual files/folders. Third-party assets: see NOTICE (if present).


📄 English manual (PDF)

YouTube Watch the video in English

👉 Please note:

  • The teaser is available in English.
  • The full explainer video is currently only in German, but it includes English subtitles.
  • The fully English version will be released soon!


Deutsch (DE)

Flagge Deutschland

1️⃣ 🧠 Was ist SmartWiper?

SmartWiper ist ein Python Post-Processing-Skript für G-Code-Dateien, das speziell für den Multi-Material-Druck mit Tools wie der Prusa MMU3 entwickelt wurde. Getestet wurde es mit G-Code-Dateien aus PrusaSlicer. Es sollte aber auch mit anderen Slicern funktionieren.

Das Skript behebt gezielt typische Schwächen herkömmlicher Wipe-Türme: Druckabbrüche, Düsenkollisionen, instabile Türme, Delaminierung und Materialansammlungen. Die Struktur der Türme wird vollständig außerhalb des Slicers von Grund auf neu erstellt. SmartWiper generiert eigenständige, optimierte Wipe-Türme, wodurch die Stabilität verbessert, die Druckqualität erhöht und Düsenschäden effektiv verhindert werden. Das Projekt wurde mit Unterstützung von ChatGPT entwickelt und richtet sich an die Maker-Community: Sowohl Neueinsteiger als auch erfahrene Nutzer können sich beteiligen, das Tool verbessern oder an ihre Drucker und Workflows anpassen.


2️⃣ 🧑‍💻 Hauptfunktionen und Voraussetzungen

SmartWiper bietet:

  • 🖥️ Eine intuitive grafische Benutzeroberfläche (GUI).

  • 🎛️ Parametersteuerung
    Alle wichtigen Parameter – Position, Breite, Geschwindigkeit, Extrusionsfaktor, Z-Hops, Wipe-Pfade, Optionen und vieles mehr einstellbar.

  • 🖼️ Eine integrierte 2D-Live-Vorschau
    Zeigt die Wipe-Türme
    in X/Y- und X/Z-Ansicht für besseren Kontrolle und Platzierung.

  • 🪄 Automatische Analyse
    Erkennt Layerhöhen, Toolchanges und Turmhöhen automatisch – keine manuelle Nachbearbeitung nötig.

Nur wenige Voraussetzungen nötig:

  • 🖥️ Keine Installation nötig
    Das Skript ist eigenständig – es wird nur Python 3 benötigt. Keine weiteren Bibliotheken oder Module notwendig.

3️⃣ 🔧 Wie funktioniert SmartWiper? (Technisches Konzept)

Es fügt dem bestehenden G-Code nachträglich eigene Wipe-Türme hinzu. So werden typische Probleme beim Materialwechsel im Multi-Material-Druck gezielt vermieden.

Herkömmliche Wipe-Türme bestehen aus einem einzigen Block, in dem alle Materialien Schicht für Schicht abwechseln. Das führt häufig zu:

❌ Delaminierung zwischen unterschiedlichen Materialien

❌ Verzug – Ecken wölben sich nach oben ("Elefantenfuß")

❌ Filamentreste und Blobs, die mit der Düse kollidieren können

SmartWiper geht einen völlig anderen Weg – mit überraschend einfachen, aber wirkungsvollen Maßnahmen:

  • 🧱 Ein separater Wipe-Turm pro Material
    Keine gemischten Schichten mehr – jeder Turm besteht ausschließlich aus einem einzigen Material bzw. Farbe. Dadurch wird Schichthaftung verbessert und Delaminierung verhindert.

  • 🌀 Optionaler Spiralaufbau
    Anstelle der klassischen rechteckigen Blöcke können die Türme spiralförmig erzeugt werden um thermische Spannungen und das typische Hochziehen der Ecken ("Elefantenfüße") zu reduzieren.

  • 🕳️ Zentrale Materialrinne – bei optionalen Spiraltürmen immer vorhanden
    Überschüssiges Material und Fäden werden durch die Öffnung in der Mitte nach unten "gespült" – statt an der Düse zu haften.

Diese Architektur verbessert die Haftung, reduziert kritische Spannungen und sorgt für einen stabileren, zuverlässigeren und wartungsarmen Druckprozess, besonders bei höheren Türmen - ganz ohne klassische Wipe-Turm-Probleme.


4️⃣ ⚖️ Vergleich: Einzel-/Multimaterial

Mit meinem Prusa MK4S-Set erziele ich zu 99 % sehr gute Druckergebnisse – solange ich nur ein einziges Material bzw. nur eine einzelne Farbe verwende.
Normalerweise starte ich einen Druckjob, warte dass die erste Schicht fertig extrudiert wird und kann anschließend den Drucker unbeaufsichtigt verlassen.

Ganz anders sieht es bei Multi-Material-Druck aus:
Der Drucker pausiert bei fast jedem Toolchange wegen Düsenkollisionen. Ich muss jedes Mal manuell eingreifen, indem ich mit einer kleinen Seitenschere und Pinzette, Fäden und Materialreste entferne.
Ein Job, der normalerweise 6 Stunden dauern müsste, braucht mit manueller Eingriffspflicht über 8 Stunden, falls man immer vor dem Drucker steht und aktiv bei jedem Pausieren sofort manuell eingreift.


5️⃣ 💬 Persönliche Erfahrungen mit klassischen Wipe-Türmen

Beim Multi-Material-Druck mit Tools wie der MMU3 von Prusa zeigen sich immer wieder dieselben Probleme:

  • Delaminierung
  • Elefantenfüße
  • Klümpchen, Fäden und Filamentreste kollidieren mit der Düse
  • Folge: Crash-Detektion → Druck unterbrochen oder zerstört

SmartWiper wurde genau entwickelt, um diese Probleme nachhaltig zu vermeiden.


6️⃣ 🧱 Vergleich: Klassische- vs. SmartWiper-Türme

Beispiel: Links ohne Türme, rechts die Vorschau von PrusaSlicer (basierend auf dem G-Code). Beim realen Druck treten dabei jedoch häufig die zuvor genannten Probleme auf.:
Beispiel Prusa Wipe-Turm Vorschau

Hier hingegen einige Beispiele, wie die Türme im realen Druck tatsächlich aussehen, die auf diesem von PrusaSlicer berechneten G-Code basieren – mit den typischen Problemen wie Delaminierung, Fäden und instabilen Strukturen:
Beispiel Prusa Wipe-Turm Druck

Man erkennt Fäden und Klumpen, die die Türme instabil machen. Der Drucker hat den Druckvorgang mehrmals wegen erkannter Kollisionen abgebrochen. Nach mehreren Stopps musste ich den Druck abbrechen – Filament, Zeit und Stromkosten waren umsonst.

Das Problem betrifft nicht nur mich. Auch online sieht man vergleichbare Bilder:
Beispiel online Wipe-Turm Druck

📷 Dieses Foto zeigt einen Druck des Modells
"Halloween Cat Full (MMU3-Version)" von Fireball.XE
Lizenz: CC BY-NC-SA 4.0

Selbst bei abgeschlossenen Druck-Jobs bleibt sichtbar, dass herkömmliche Türme oft instabil sind – besonders bei vielen Toolchanges. Der Druck war auch nicht hoch. Was wäre passiert bei einem höheren Druck?

Wie SmartWiper hingegen die Wipe Türme einkalkuliert wird da drunter gezeigt:
Beispiel SmartWiper Wipe-Turm Vorschau

🧱 Dieses Bild wurde mit dem Modell erstellt
"Creature - Trash for your 3D printer" von lecaramel
Lizenz: CC BY-NC 4.0

Man erkennt sofort die neue Strategie vom Skript SmartWiper, links mit rechteckigen Türme, rechts mit aktivierter Spiral-Option (das auch ein Loch in der Mitte besitzt):

  • Ein separater Turm pro Material
  • Optional: Spiralförmiger Aufbau mit zentralem Loch für Materialabfluss

7️⃣ ⚙️ Slicer-Einstellungen

Für eine korrekte Funktion im Slicer zunächst Wipe-Turm und binären G-Code deaktivieren.
Slicer settings

SmartWiper fügt automatisch einen Wipe nur dann ein, wenn ein Toolchange erfolgt.
Das führt zu unterschiedlichen Turmhöhen – je nachdem, wie oft jedes Material gewechselt wird. Dadurch wird Filament gespart.

⚠️ Aber Achtung:
Wenn ein Filament zum ersten Mal erst in späteren Schichten verwendet wird, könnte die erste Schicht seines Wipe-Turmes erst dann zum ersten Mal "auf dem Bett" extrudiert werden.

Das könnte das Risiko erhöhen, dass die erste Schicht auf dem Druckbett nicht haftet und somit alle darauffolgenden Extrusionen obendrauf ins Leere extrudieren und der Druck wird fehlerhaft.

🧠 Lösung (vorübergehend):
Für Materialien, die in der ersten Schicht fehlen, im Slicer kleine, flache Quadrate anlegen (z. B. 10 × 10 × H mm, wobei H der Schichthöhe der ersten Schicht entspricht – in der Regel 0,2 mm).

So wird das Skript gezwungen, auch für diese Filamente bereits in der ersten Schicht einen Wipe-Vorgang einzufügen.

So sind alle verwendeten Materialien bzw. Farben in der ersten Schicht schon vorhanden und wenn diese auf dem Bett haften, werden alle Schichten drüber auch korrekt haften. Es wäre schade, falls ein Filament erst gegen Ende benutzt wird und genau dann der Turm nicht mit dem Bett haftet.

Faustregel: Für jedes verwendete Filament, das nicht in Schicht 1 zum Einsatz kommt, sollte ein kleines (10 mm x 10 mm), tiefes (0.2 mm) Startquadrat im Slicer erzeugt werden. Alle Materialien bzw. Farben die bereits in der ersten Schicht verwendet werden, brauchen diese Quadrate nicht!

🔜 In einer späteren Skript-Version wird es die Option geben, alle Materialien bereits bei der ersten Schicht zu wipen.
In der GUI ist diese Funktion bereits als Radiobutton vorgesehen und sichtbar, jedoch noch nicht programmiert – daher aktuell ausgegraut.


8️⃣ 🔍 Funktionsweise und Kompatibilität

📂 Input G-Code Datei wird ausgewählt.

  • Die ursprüngliche G-Code-Datei wird niemals überschrieben.
  • Das Skript erzeugt immer eine neue Output-Datei mit dem Suffix _wipe.

Beispiel: aus mein_druck.gcode wird es mein_druck_wipe.gcode.

🔍 Die Datei wird in erster Phase durchsucht. PrusaSlicer-G-Code besteht in der Regel aus drei Bereichen:

  1. Head:
    – Metadaten und Bild (unverändert vom Skript übernommen).
  2. Main:
    – Druckanweisungen (hier werden Wipe-Befehle ergänzt).
  3. Tail:
    – Material-Farben und -Typ, Temperaturen, Einstellunhen, Bettgröße usw. (unverändert vom Skriptübernommen).
  • SmartWiper erkennt diese Bereiche automatisch, indem der G-Code einmal nur durchsucht wird.

  • Aus dem Tail-Bereich werden wichtige Informationen für später extrahiert.

  • Wenn bestimmte Informationen fehlen, werden Standardwerte verwendet.

  • Diese sind zentral im Skript definiert und lassen sich leicht anpassen.

  • Suchmuster können eventuell von erfahrenen Users direkt im Skript leicht angepasst werden, um bessere Kompatibilität zu anderen Slicer zu ermöglichen.

  • Durch Standardwerte, wieder von erfahrenen Users direkt im Skript leicht modifizierbar, kann man nochmals Kompatibilität zu anderen Slicer oder Drucker gewährleisten.

  • Die im Skript angepassten Standardwerte und Einstellungen können einmalig geändert werden und bleiben dann bei allen zukünftigen Ausführungen erhalten.

🖥️ Während dieser ersten Phase werden Informationen im Terminal angezeigt.
Es ist auch möglich aber nicht empfohlen, diese im Skript mit geringem Aufwand zu deaktivieren.

Eine Vorschau der Ausgaben im Terminal und Erklärung da unten:
Beispiel SmartWiper Terminal

🔣 Anschließend öffnet sich die grafische Oberfläche (GUI):
Nun sind alle wichtige Informationen aus der ersten Scan-Phase extrahiert (oder aus den Default-Parametern übernommen); in der GUI werden ausschließlich die editierbaren Einstellungen angezeigt. Hier kann man:

  • Parameter bearbeiten
  • Optionen ein-/ausschalten
  • Turmform, Positionen und Maßen ändern
  • Eine 2D-Vorschau (Front- und Top-View) nutzen

💡 Wichtig:

  • Wenn Änderungen vorgenommen werden, die eine Überprüfung erfordern, wird der Process-Button deaktiviert, Check-Button blinkt (visuelles Feedback).
  • Ein Klick auf Check-Button prüft die Werte und gibt den Process-Button wieder frei, danach blinkt der Check-Button nicht mehr.
  • Ungültige Werte (z. B. "a" oder "**-**60" oder "1000000" bei Geschwindigkeit) werden automatisch mit dem letzten gültigen Wert korrigiert.
  • Bei Bedarf kann man alle abgeänderten Einstellungen mit Restore-Button zurücksetzen.

Eine Übersicht der GUI:
SmartWiper GUI

📝 Beim drücken auf Process-Button verschwindet die GUI, das Skript läuft weiter eigenständig und fügt Anweisungen im Main-Bereich des G-Codes hinzu.


9️⃣ 🚫 Einschränkungen

  • Die vom Skript berechnete Wipe-Zeit ist noch ungenau und wird nur in der GUI angezeigt aber nicht zur Druckzeit im Drucker-Display addiert.

Daher stimmt die angezeigte abgelaufene und restliche Druck-Zeit nicht! Sowohl eine genauere Zeitangabe als auch die korrekte Anzeige auf dem Display sind für zukünftige Versionen geplant.

  • Auf dem Drucker-Display und im G-Code-(Head) wird nach der Skriptausführung nur das Objekt ohne Türme angezeigt. Das ist auch in PrusaSlicer so.

Wie Wipe-Türme aussehen und wo sie positioniert werden, wird zur Laufzeit des Skriptes angezeigt und kann eventuell modifiziert werden. Auch im G-code-Viewer werden die Wipe-Türme korrekt angezeigt.

  • Die Tower-Positionen sind frei wählbar, aber es gibt keine automatische Kollisionsprüfung. – wie auch nicht in PrusaSlicer.

Daher immer zu empfehlen, vor dem Senden auf dem Drucker, Datei in G-Code-Viewer überprüfen!

  • Das Skript funktioniert nur mit nicht-binären G-Codes – wie oben erwähnt, im Slicer muss binärer G-Code deaktiviert werden.

🔜 In einer späteren Skript-Version könnte sich das ändern.


1️⃣0️⃣ ⏳ Status

Das Programm läuft und verarbeitet G-Code korrekt. Der bearbeitete G-Code lässt sich fehlerfrei in G-Code-Viewern anzeigen, und die vom Skript eingefügten Wipe-Befehle sind syntaktisch gültig. Die Datei kann zum Drucker gesendet werden und der Druck startet problemlos.

⚠️ Allerdings gibt es aktuell ein Problem mit der Extrusionsmenge: Zu Beginn der Wipe-Bewegungen führt der Drucker leere (nicht extrudierende) Bewegungen aus, wodurch die Türme kleiner gedruckt werden als in der Vorschau dargestellt. Vermutlich sind die E-Werte (Extrusion) noch nicht korrekt oder müssen besser kalibriert werden.


1️⃣1️⃣ 🧩 Beiträge erwünscht

SmartWiper befindet sich noch in Entwicklung.
Tests, Ideen, Pull Requests und Feedback aus der Community sind herzlich willkommen!


1️⃣2️⃣ 🧪 Zukünftige Funktionen (Ausblick)

🔄 Wipe alle Materialien bei der ersten Schicht (geplant)

Korrektere Zeitangaben mit Output auf Drucker-Display (geplant)


1️⃣3️⃣ 👤 Über den Autor

Ich bin Hobby-Programmierer mit etwas Erfahrung in C und PowerShell – aber keine in Python. Trotzdem habe ich mit Hilfe von ChatGPT ein funktionierendes Hauptgerüst in Python entwickelt – nur mit Texteditor, ohne spezielle Entwicklungsumgebung. Ich habe mich bewusst für Python entschieden, weil es für viele in der 3D-Druck-Community leichter zugänglich ist.

Das Projekt ist sicher nicht perfekt – aber es ist offen.
Konstruktive Hilfe ist willkommen, destruktive Kritik wird ignoriert.

Autor: Nicola Italiano

Contact:

🔗 LinkedIn Profile
🔗 XING Profile


1️⃣4️⃣ 🙏 Danksagung

Erstellt mit Hilfe von ChatGPT und getestet auf einem Prusa MK4S-Kit mit MMU3.
Projekt: SmartWiper – G-Code-Postprozessor für den Mehrmaterialdruck.
Aktuelle Version: 0.1 (Alpha-Version)


1️⃣5️⃣ 🧪 In Entwicklung: MaterialRemap (neues Projekt)

Neben SmartWiper arbeite ich aktuell an einem weiteren Open-Source-Skript für die 3D-Druck-Community: MaterialRemap.

Im Multi-Material-Druck kommt es häufig vor, dass Modelle online geteilt werden (STL oder 3MF), die nicht in getrennte Teile zerlegt, sondern direkt bemalt wurden.

Ein Beispiel: Ein User hat bei einem Modell die Schuhe schwarz bemalt – Bei ihm ist diese Farbe (schwarz) auf Tool Nr. 3 geladen. Wenn ich dasselbe Modell öffne, sehe ich gelbe Schuhe, weil bei mir gelbes Filament auf Tool Nr.3 geladen ist – und schwarz liegt bei mir auf Tool Nr. 4. ➡️ Aktuell müsste ich meine Materialplätze manuell umstellen, was manchmal unerwünscht sein kann und zeitaufwendig ist.

MaterialRemap soll dieses Problem lösen: Das Skript wird die Materialzuweisungen direkt in der Datei anpassen, sodass beispielsweise "Schwarz" auf Tool 4 gelegt wird – automatisch und verlustfrei.

📌 Auch dieses Skript wird vollständig offen und kostenlos sein – wie alle meine Projekte. Ich entwickle solche Tools in meiner Freizeit, speziell für die 3D-Druck- und Maker-Community.

💛 Wenn dir meine Arbeit gefällt und du mich unterstützen möchtest – z. B. mit einem Kaffee ☕ als kleine Motivation – freue ich mich über jeden Beitrag:

EURO & Dollar Überall auf der Welt außer Schweiz:

👉 Support me on Ko-fi

CHF Nur aus der Schweiz, bitte in CHF spenden.:

👉 Betrag frei wählbar Betrag frei wählbar oder Spende einen Kaffee (3 CHF)  Spende einen Kaffee (3 CHF)

Dieses Projekt ist nicht-kommerziell. Spenden sind rein freiwillig und dienen nur zur Motivation und Weiterentwicklung.
Ich respektiere alle Lizenzrechte und entferne auf Wunsch Inhalte, die zu Demonstrationszwecken genutzte Modelle der Original-Autoren betreffen.


1️⃣6️⃣🪪 Lizenz

Quellcode: MIT-Lizenz (siehe LICENSE im Repo-Root).
Inhalte (Dokumentation, Bilder, Videos, Untertitel-.srt-Dateien): Creative Commons Namensnennung – Nicht-kommerziell 4.0 International (CC BY-NC 4.0).
Sie dürfen die Inhalte nur für nicht-kommerzielle Zwecke verwenden, ändern und weiterverbreiten.
Für kommerzielle Nutzung kontaktieren Sie bitte den Autor.

🔗 Vollständige Lizenz online anzeigen (CC BY-NC 4.0)
🔗 Vollständige Lizenz lokal anzeigen

Sofern in einzelnen Dateien/Ordnern nicht anders angegeben. Drittinhalte: siehe NOTICE (falls vorhanden).


📄 Deutsches Handbuch (PDF)

YouTube Video auf Deutsch anschauen

Italiano (IT)

Bandiera Italia

1️⃣ 🧠 Che cos’è SmartWiper?

SmartWiper è uno script Python di post-elaborazione per file G-Code, sviluppato appositamente per la stampa multi-materiale con strumenti come la Prusa MMU3. È stato testato con file G-Code provenienti da PrusaSlicer, ma dovrebbe funzionare anche con altri slicer.

Lo script risolve in modo mirato le tipiche debolezze delle torri di pulizia convenzionali: interruzioni di stampa, collisioni dell’ugello, torri instabili, delaminazione e accumuli di materiale. La struttura delle torri viene creata interamente al di fuori dello slicer. SmartWiper genera torri di pulizia indipendenti e ottimizzate, migliorando così la stabilità, aumentando la qualità di stampa e prevenendo efficacemente i danni all’ugello. Il progetto è stato sviluppato con il supporto di ChatGPT e si rivolge alla community dei maker: Sia i principianti che gli utenti esperti possono contribuire, migliorare lo strumento o adattarlo alle proprie stampanti e flussi di lavoro.


2️⃣ 🧑‍💻 Funzioni principali e requisiti

SmartWiper offre:

  • 🖥️ Un’interfaccia grafica utente (GUI) intuitiva.

  • 🎛️ Controllo dei parametri
    Tutti i parametri importanti – posizione, larghezza, velocità, fattore di estrusione, Z-hop, percorsi di pulizia, opzioni e molto altro – sono configurabili.

  • 🖼️ Un’anteprima 2D live integrata
    Mostra le torri di pulizia in vista X/Y e X/Z per un migliore controllo e posizionamento.

  • 🪄 Analisi automatica
    Rileva automaticamente altezze layer, cambi utensile e altezze torri – nessuna modifica manuale necessaria.

Pochi requisiti necessari:

  • 🖥️ Nessuna installazione richiesta
    Lo script è autonomo – è necessario solo Python 3. Nessuna libreria o modulo aggiuntivo richiesto.

3️⃣ 🔧 Come funziona SmartWiper? (Concetto tecnico)

Aggiunge torri di pulizia personalizzate al G-Code esistente. In questo modo evita in maniera mirata i problemi tipici del cambio materiale nella stampa multi-materiale.

Torri di pulizia convenzionali sono costituite da un unico blocco in cui tutti i materiali si alternano strato dopo strato. Questo porta spesso a:

❌ Delaminazione tra materiali diversi

❌ Deformazioni – gli angoli si sollevano verso l’alto (“piede di elefante”)

❌ Residui di filamento e grumi che possono collidere con l’ugello

SmartWiper adotta un approccio completamente diverso – con misure sorprendentemente semplici ma efficaci:

  • 🧱 Una torre di pulizia separata per ogni materiale
    Nessuno strato misto – ogni torre è composta esclusivamente da un unico materiale o colore. Ciò migliora l’adesione tra strati e previene la delaminazione.

  • 🌀 Costruzione a spirale, opzionale
    Invece dei classici blocchi rettangolari, le torri possono essere generate a spirale per ridurre le tensioni termiche e il sollevamento degli angoli (“piede di elefante”).

  • 🕳️ Canale centrale per il materiale – sempre presente con torri a spirale
    Il materiale in eccesso e i fili vengono convogliati verso il basso attraverso l’apertura centrale, evitando che aderiscano all’ugello.

Questa architettura migliora l’adesione, riduce le tensioni critiche e garantisce un processo di stampa più stabile, affidabile e con meno manutenzione, soprattutto con torri più alte – senza i tipici problemi delle torri di pulizia classiche.


4️⃣ ⚖️ Confronto: singolo / multi-materiale

Con il mio set Prusa MK4S ottengo risultati di stampa molto buoni nel 99 % dei casi – a patto di usare un solo materiale o un solo colore.
Di solito avvio un lavoro di stampa, aspetto che il primo strato venga completato e poi posso lasciare la stampante incustodita.

La situazione cambia completamente con la stampa multi-materiale:
La stampante si ferma quasi a ogni cambio utensile a causa di collisioni dell’ugello. Ogni volta devo intervenire manualmente con forbicine e pinzette per rimuovere fili e residui di materiale.
Una stampa che normalmente richiederebbe 6 ore, con interventi manuali obbligatori può superare le 8 ore – sempre che si resti davanti alla stampante e si intervenga subito a ogni pausa.


5️⃣ 💬 Esperienze personali con torri di pulizia classiche

Nella stampa multi-materiale con strumenti come la MMU3 di Prusa, emergono sempre gli stessi problemi:

  • Delaminazione
  • Piedi di elefante
  • Grumi, fili e residui di filamento che collidono con l’ugello
  • Conseguenza: rilevamento collisione → stampa interrotta o danneggiata

SmartWiper è stato sviluppato proprio per eliminare in modo duraturo questi problemi.


6️⃣ 🧱 Confronto: torri classiche vs. SmartWiper

Esempio: A sinistra senza torri, a destra l’anteprima di PrusaSlicer (basata sul G-code).
Tuttavia, durante la stampa reale si verificano spesso i problemi già menzionati.:
Esempio anteprima torre di pulizia Prusa

Qui invece alcuni esempi di come le torri appaiono realmente in stampa, basandosi sullo stesso G-Code generato da PrusaSlicer – con i tipici problemi di delaminazione, fili e strutture instabili:
Esempio stampa reale torre di pulizia Prusa

Si notano fili e grumi che rendono le torri instabili. La stampante ha interrotto il processo più volte per collisioni rilevate. Dopo vari stop ho dovuto annullare la stampa – filamento, tempo ed energia sprecati.

Il problema non riguarda solo me: anche online si trovano immagini simili:
Esempio stampa torre di pulizia dal web

📷 Questa foto mostra una stampa del modello
“Halloween Cat Full (MMU3-Version)” di Fireball.XE
Licenza: CC BY-NC-SA 4.0

Anche nei lavori conclusi è evidente che le torri tradizionali sono spesso instabili – specialmente con molti cambi utensile. E questa non era nemmeno una stampa alta. Cosa succederebbe con un’altezza maggiore?

Come invece SmartWiper calcola le torri di pulizia è mostrato qui sotto:
Esempio anteprima torre SmartWiper

🧱 Questa immagine è stata creata utilizzando il modello
"Creature - Trash for your 3D printer" di lecaramel
Licenza: CC BY-NC 4.0

Si nota subito la nuova strategia dello script SmartWiper: a sinistra torri rettangolari, a destra opzione spirale attivata (con foro centrale per il deflusso del materiale):

  • Una torre separata per ogni materiale
  • Opzionale: costruzione a spirale con foro centrale

7️⃣ ⚙️ Impostazioni nello slicer

Per un funzionamento corretto nello slicer, disattivare inizialmente torre di pulizia e G-Code binario.
Slicer settings

SmartWiper aggiunge automaticamente una torre di pulizia solo quando avviene un cambio utensile.
Questo porta a un’altezza diversa delle torri, in base alla frequenza di cambio di ogni materiale, con un conseguente risparmio di filamento.

⚠️ Attenzione:
Se un filamento viene usato per la prima volta solo in strati successivi, il primo strato della sua torre di pulizia verrà estruso "sul piano" solo allora, per la prima volta.

Questo può aumentare il rischio che il primo strato non aderisca al piano, causando estrusioni nel vuoto per tutti gli strati successivi e quindi un errore di stampa.

🧠 Soluzione (temporanea):
Per i materiali assenti nel primo strato, creare nello slicer piccoli quadrati piatti (es. 10 × 10 × H mm, dove H è l’altezza del primo strato – solitamente 0,2 mm).

In questo modo lo script sarà obbligato a inserire un’operazione di pulizia per questi filamenti già nel primo strato.

Così tutti i materiali o colori utilizzati saranno presenti già nel primo strato e, se questo aderisce bene, anche gli strati successivi aderiranno correttamente. Sarebbe un peccato se un filamento fosse usato solo verso la fine e proprio allora la torre non aderisse al piano.

Regola pratica: per ogni filamento che non viene usato nello strato 1, creare un piccolo (10 mm × 10 mm), basso (0,2 mm) quadrato di avvio nello slicer. I materiali o colori già presenti nel primo strato non necessitano di questi quadrati.

🔜 In una versione futura dello script ci sarà l’opzione per pulire tutti i materiali già al primo strato.
Nella GUI questa funzione è già prevista come pulsante di selezione, ma non ancora programmata – quindi attualmente disattivata.


8️⃣ 🔍 Funzionamento e compatibilità

📂 Si seleziona il file G-Code di input.

  • Il file G-Code originale non viene mai sovrascritto.
  • Lo script genera sempre un nuovo file di output con il suffisso _wipe.

Esempio: da stampa_mia.gcode diventa stampa_mia_wipe.gcode.

🔍 Il file viene inizialmente analizzato. Il G-Code di PrusaSlicer è solitamente composto da tre sezioni:

  1. Head:
    – Metadati e immagine (copiati senza modifiche dallo script).
  2. Main:
    – Istruzioni di stampa (qui vengono aggiunti i comandi di pulizia).
  3. Tail:
    – Materiali, colori, temperature, impostazioni, dimensioni piano, ecc. (copiati senza modifiche dallo script).
  • SmartWiper riconosce automaticamente queste sezioni leggendo una sola volta il G-Code.

  • Dalla sezione Tail vengono estratte informazioni importanti per l’elaborazione successiva.

  • Se mancano determinate informazioni, vengono usati valori predefiniti.

  • Questi sono definiti centralmente nello script e sono facilmente modificabili.

  • I pattern di ricerca possono essere modificati da utenti esperti direttamente nello script per migliorare la compatibilità con altri slicer.

  • Anche i valori predefiniti possono essere adattati da utenti esperti per garantire compatibilità con altri slicer o stampanti.

  • I valori predefiniti e le impostazioni modificati nello script possono essere adattati una sola volta e resteranno invariati in tutte le esecuzioni future.

🖥️ Durante questa prima fase, le informazioni vengono mostrate nel terminale.
È anche possibile, ma non consigliato, disattivare questa funzione nello script in modo semplice.

Un’anteprima dell’output del terminale con spiegazione è mostrata qui sotto:
Esempio terminale SmartWiper

🔣 Successivamente si apre l’interfaccia grafica (GUI):
A questo punto tutte le informazioni importanti della fase di scansione iniziale (o dai parametri predefiniti) sono state raccolte; nella GUI vengono visualizzate esclusivamente le impostazioni modificabili. Qui è possibile:

  • Modificare parametri
  • Attivare/disattivare opzioni
  • Cambiare forma, posizione e dimensioni delle torri
  • Usare un’anteprima 2D (vista frontale e dall’alto)

💡 Importante:

  • Quando vengono fatte modifiche che richiedono verifica, il pulsante Process viene disattivato, il pulsante Check lampeggia (feedback visivo).
  • Un clic su Check controlla i valori e riattiva il pulsante Process; il pulsante Check smette quindi di lampeggiare.
  • Valori non validi (es. "a" o "-60" o "1000000" come velocità) vengono sostituiti automaticamente con l’ultimo valore valido.
  • Se necessario, è possibile ripristinare tutte le impostazioni modificate con il pulsante Restore.

Una panoramica della GUI:
GUI SmartWiper

📝 Premendo Process, la GUI si chiude, lo script prosegue in autonomia e aggiunge le istruzioni nella sezione Main del G-Code.


9️⃣ 🚫 Limitazioni

  • Il tempo di pulizia calcolato dallo script è ancora impreciso e viene mostrato solo nella GUI, non viene aggiunto al tempo di stampa sul display della stampante.

Di conseguenza, il tempo trascorso e rimanente visualizzato non è corretto. Sia una stima più precisa sia la visualizzazione corretta sul display sono previste per versioni future.

  • Sul display della stampante e nell’Head del G-Code, dopo l’esecuzione dello script, viene mostrato solo l’oggetto senza torri. Questo avviene anche in PrusaSlicer.

L’aspetto e la posizione delle torri vengono mostrati in tempo reale dallo script e possono eventualmente essere modificati. Anche nel visualizzatore G-code le torri di pulizia vengono visualizzate correttamente.

  • Le posizioni delle torri sono liberamente selezionabili, ma non esiste un controllo automatico delle collisioni – come nemmeno in PrusaSlicer.

Si raccomanda quindi di controllare sempre il file in un visualizzatore G-Code prima di inviarlo alla stampante.

  • Lo script funziona solo con G-Code non binario – come detto sopra, nello slicer va disattivato il G-Code binario.

🔜 In una versione futura questa limitazione potrebbe essere rimossa.


1️⃣0️⃣ ⏳ Stato

Il programma funziona e processa correttamente il G-Code. Il G-Code modificato può essere visualizzato senza errori in un visualizzatore G-code e i comandi di pulizia aggiunti sono sintatticamente corretti. Il file può essere inviato alla stampante e la stampa avvia senza problemi.

⚠️ Attualmente c’è un problema con la quantità di estrusione All’inizio delle operazioni di pulizia, la stampante esegue movimenti a vuoto (senza estrusione), riducendo la dimensione effettiva delle torri rispetto all’anteprima. Probabilmente i valori E (estrusione) non sono ancora corretti o necessitano di calibrazione.


1️⃣1️⃣ 🧩 Contributi benvenuti

SmartWiper è ancora in sviluppo.
Test, idee, pull request e feedback dalla community sono benvenuti!


1️⃣2️⃣ 🧪 Funzioni future (anteprima)

🔄 Pulizia di tutti i materiali al primo strato (previsto)

Tempi più precisi con output sul display della stampante (previsto)


1️⃣3️⃣ 👤 Autore

Sono un programmatore hobbista con un po’ di esperienza in C e PowerShell – ma nessuna in Python. Nonostante ciò, con l’aiuto di ChatGPT ho sviluppato framework principale funzionante in Python – solo con un editor di testo, senza un ambiente di sviluppo dedicato. Ho scelto Python perché è più accessibile per molti nella community della stampa 3D.

Il progetto non è perfetto – ma è aperto.
Accetto volentieri aiuti e suggerimenti costruttivi, ma ignorerò le critiche distruttive.

Autore: Nicola Italiano

Contatti:

🔗 Profilo LinkedIn
🔗 Profilo XING


1️⃣4️⃣ 🙏 Ringraziamenti

Creato con l’aiuto di ChatGPT e testato su una Prusa MK4S Kit con MMU3.
Progetto: SmartWiper – Post-processore G-Code per stampa multi-materiale.
Versione attuale: 0.1 (versione Alpha)


1️⃣5️⃣ 🧪 In sviluppo: MaterialRemap (nuovo progetto)

Oltre a SmartWiper, sto lavorando a un altro script open-source per la community della stampa 3D: MaterialRemap.

Nella stampa multi-materiale capita spesso di scaricare modelli (STL o 3MF) non suddivisi in parti, ma già colorati.

Esempio: un utente, in un modello, ha colorato le scarpe di nero – sul suo setup il nero è sul tool n. 3. Quando apro lo stesso modello, vedo scarpe gialle perché nel mio setup il giallo è sul tool n. 3 e il nero sul tool n. 4. ➡️ Al momento dovrei cambiare manualmente la disposizione dei materiali, operazione talvolta indesiderata e dispendiosa in termini di tempo.

MaterialRemap risolverà questo problema: Lo script modificherà le assegnazioni dei materiali direttamente nel file, così che ad esempio il “nero” venga messo sul tool 4 – automaticamente e senza perdita di dati.

📌 Anche questo script sarà completamente aperto e gratuito – come tutti i miei progetti. Sviluppo questi strumenti nel mio tempo libero, specificamente per la community della stampa 3D e maker.

💛 Se apprezzi il mio lavoro e vuoi supportarmi – ad esempio con un caffè ☕ come piccola motivazione – sarò felice di ogni contributo:

EURO & Dollar Da tutto il mondo tranne la Svizzera:

👉 Support me on Ko-fi

CHF Solo dalla Svizzera, per favore in CHF.:

👉 importo flessibile importo flessibile oppure Offrimi un caffè (3 CHF)  Offrimi un caffè (3 CHF)

Questo progetto è non commerciale. Le donazioni sono completamente volontarie e servono solo a sostenere la motivazione e lo sviluppo futuro.
Rispetto tutti i diritti di licenza e rimuoverò i contenuti dimostrativi su richiesta degli autori originali dei modelli utilizzati.


1️⃣6️⃣ 🪪 Licenza

Codice sorgente: Licenza MIT (vedi LICENSE nella root del repository).
Contenuti (documentazione, immagini, video, file di sottotitoli .srt): Creative Commons Attribuzione – Non commerciale 4.0 Internazionale (CC BY-NC 4.0).
Puoi usare, modificare e ridistribuire i contenuti solo per scopi non commerciali.
Per usi commerciali, contatta l’autore.

🔗 Visualizza la licenza completa online (CC BY-NC 4.0)
🔗 Visualizza la licenza completa dal file locale

Salvo diversa indicazione in singoli file/cartelle. Contenuti di terze parti: vedi NOTICE (se presente).


📄 Manuale italiano (PDF)

YouTube Guarda il video in italiano

👉 Nota bene:

  • Il teaser è già disponibile in italiano.
  • Il video esplicativo completo al momento è solo in tedesco, ma con sottotitoli in italiano.
  • La versione interamente in italiano sarà pubblicata presto!