Bisher wurden nur STLs vor dem Slicen zentriert; unpositionierte 3MFs verursachten dadurch fast alle "outside of print volume"-Fehler, auch wenn das Objekt locker aufs Bett gepasst hätte. --center beim prusa-slicer-Aufruf zentriert jetzt beide Dateitypen einheitlich. Zusätzlich: Objekte, die auch zentriert nicht ins Druckvolumen passen, wandern einmalig nach models/ignored/ statt bei jedem Lauf erneut zu scheitern. Objekte, die laut G-Code (;TYPE:Support-Marker) Supportmaterial brauchen, wandern nach models/manual/ zur manuellen Neuausrichtung statt mit Stützstrukturen automatisch hochgeladen zu werden. Nicht mehr genutzte Materialprofile entfernt. |
||
|---|---|---|
| material | ||
| printer | ||
| .gitignore | ||
| nexus-ender.code-workspace | ||
| README.md | ||
| slice.sh | ||
nexus-ender / slice.sh
Automatisiertes Slicen von STL/3MF-Modellen mit PrusaSlicer, inkl. optionalem Nextcloud-Sync (WebDAV) für Modelle und fertige GCodes.
Voraussetzungen
- Linux (Arch, Debian/Ubuntu o. ä. — getestet auf Arch)
- Bash ≥ 4 (für
mapfile, assoziative Arrays) - PrusaSlicer (CLI muss als
prusa-slicerimPATHverfügbar sein) - curl
- Python 3 inkl. pip
- Python-Pakete:
numpy,numpy-stl
Installation der Abhängigkeiten
Arch Linux:
sudo pacman -S bash curl python python-pip prusa-slicer
pip install --user numpy numpy-stl
Debian/Ubuntu:
sudo apt update
sudo apt install bash curl python3 python3-pip
pip3 install --user numpy numpy-stl
PrusaSlicer gibt es für Debian/Ubuntu nicht offiziell als Paket — am einfachsten
das AppImage von der PrusaSlicer-Releases-Seite
herunterladen, ausführbar machen und als prusa-slicer ins PATH legen, z. B.:
chmod +x PrusaSlicer-*.AppImage
sudo mv PrusaSlicer-*.AppImage /usr/local/bin/prusa-slicer
Prüfen, ob alles gefunden wird:
prusa-slicer --help > /dev/null && echo "PrusaSlicer OK"
python3 -c "import stl, numpy; print('Python-Pakete OK')"
Download
git clone <repo-url> nexus-ender
cd nexus-ender
chmod +x slice.sh
Verzeichnisstruktur
nexus-ender/
├── slice.sh
├── .env # optional, siehe unten
├── material/ # Material-Profile (*.ini, aus PrusaSlicer exportiert)
├── printer/ # Drucker-Profil (*.ini), wird mit Material-Profil gemergt
├── models/ # STL/3MF-Dateien (auch in Unterordnern)
│ └── manual/ # wird ignoriert — für Modelle, die NICHT automatisch gesliced werden sollen
├── output/ # generierte GCodes (nach Material/Pfad sortiert)
└── logs/ # detaillierte Logs je Lauf, automatisch angelegt
Mindestens ein *.ini in material/ muss vorhanden sein, sonst bricht das
Script ab. Ein Drucker-Profil in printer/ ist optional — fehlt es, wird
nur das Material-Profil verwendet.
Konfiguration (optional): Nextcloud-Sync
Nur nötig, wenn STLs automatisch von Nextcloud geholt und GCodes dorthin
hochgeladen werden sollen. .env im Projektordner anlegen:
NEXTCLOUD_URL="https://deine-nextcloud.example.com"
NEXTCLOUD_BASE="/remote.php/dav/files/<benutzername>/dein-ordner"
NEXTCLOUD_USER="dein-benutzername"
NEXTCLOUD_PASS="dein-app-passwort"
Fehlt die .env, sind die Zugangsdaten unvollständig, oder ist Nextcloud
nicht erreichbar, gibt das Script nur eine Warnung aus und slict trotzdem
ganz normal lokal weiter — nur der Sync-Teil wird übersprungen.
Nutzung
./slice.sh
Das Script läuft in 5 Schritten:
- Neue STLs von Nextcloud herunterladen (falls konfiguriert)
- Lokale STL/3MF-Dateien in
models/einlesen - Material-Profile prüfen (per Hash erkennen, ob sich seit dem letzten Lauf etwas geändert hat)
- Slicen (nur wo nötig) und GCode hochladen (falls Nextcloud verfügbar)
- Erfolgreich gesyncte STLs wieder von Nextcloud löschen
Im Terminal erscheint pro Material eine kompakte Fortschrittszeile:
PETG_GST3D [ 7/12] sliced:5 skipped:2 failed:0
Alles Detaillierte (einzelne Dateien, PrusaSlicer-Ausgabe, Warnungen) landet
in logs/slice_<timestamp>.log — dort nachsehen, falls etwas fehlschlägt.
Hinweise
- Modelle in
models/manual/werden weder synchronisiert noch automatisch gesliced. - Wird ein Modell größer als die Druckbett-Fläche (220×220 mm) erkannt, skaliert das Script es automatisch passend herunter (nur bei STL, nicht bei 3MF).
- Ändert sich ein Material-Profil, werden beim nächsten Lauf alle zugehörigen GCodes neu generiert; unveränderte Profile slicen nur fehlende GCodes.