Reviewed-on: #34
Print Calculator (OrcaSlicer Edition)
Un'applicazione Full Stack (Angular + Spring Boot) per calcolare preventivi di stampa 3D precisi utilizzando OrcaSlicer in modalità headless.
Funzionalità
- Slicing Reale: Usa il motore di OrcaSlicer per stimare tempo e materiale, garantendo la massima precisione.
- Preventivazione Database-Driven: Calcolo basato su politiche di prezzo configurabili nel database (costo materiale, ammortamento macchina a scaglioni, energia e markup).
- Visualizzazione 3D: Anteprima del file STL caricato tramite Three.js.
- Multi-Profilo: Supporto per diverse stampanti, materiali e profili di processo.
Stack Tecnologico
- Backend: Java 21, Spring Boot 3.4, PostgreSQL.
- Frontend: Angular 19, Angular Material, Three.js.
- Slicer: OrcaSlicer (invocato via CLI).
Prerequisiti
- Java 21 installato.
- Node.js 22 e npm installati.
- PostgreSQL attivo.
- OrcaSlicer installato sul sistema.
- FFmpeg installato sul sistema o presente nell'immagine Docker del backend.
Avvio Rapido
1. Database
Crea un database PostgreSQL chiamato printcalc. Lo schema viene gestito dal progetto tramite configurazione JPA/SQL del repository.
2. Backend
Configura il percorso di OrcaSlicer in backend/src/main/resources/application.properties o tramite la variabile d'ambiente SLICER_PATH. Per il media service pubblico puoi configurare anche:
MEDIA_STORAGE_ROOTper la rootstorage_mediausata dal backend (original/,public/,private/)MEDIA_PUBLIC_BASE_URLper gli URL assoluti restituiti dalle API admin, ad esempiohttps://example.com/mediaMEDIA_FFMPEG_PATHper il binarioffmpegMEDIA_UPLOAD_MAX_FILE_SIZE_BYTESper il limite per asset immagine
cd backend
./gradlew bootRun
3. Frontend
cd frontend
npm install
npm start
Accedi a http://localhost:4200.
Configurazione Prezzi
I prezzi non sono più gestiti tramite variabili d'ambiente fisse ma tramite tabelle nel database:
pricing_policy: Definisce markup, fee fissi e costi elettrici.pricing_policy_machine_hour_tier: Definisce i costi orari delle macchine in base alla durata della stampa.printer_machine: Anagrafica stampanti e consumi energetici.filament_material_type/filament_variant: Listino prezzi materiali.
Struttura del Progetto
/backend: API Spring Boot./frontend: Applicazione Angular./backend/profiles: Contiene i file di configurazione per OrcaSlicer./storage_media: Originali e varianti media pubbliche/private su filesystem.
Media pubblici
Il backend salva sempre l'originale in storage_media/original/ e precomputa le varianti pubbliche in storage_media/public/. La cartella storage_media/private/ è predisposta per asset non pubblici.
Nel deploy Docker il volume media atteso è /mnt/cache/appdata/print-calculator/${ENV}/storage_media:/app/storage_media.
Nginx non deve passare dal backend per i file pubblici. Configurazione attesa:
location /media/ {
alias /mnt/cache/appdata/print-calculator/${ENV}/storage_media/public/;
}
Usage key iniziali previste per frontend:
HOME_SECTION / shop-galleryHOME_SECTION / founders-galleryHOME_SECTION / capability-prototypingHOME_SECTION / capability-custom-partsHOME_SECTION / capability-small-seriesHOME_SECTION / capability-cadABOUT_MEMBER / joeABOUT_MEMBER / matteo- riservati per estensioni future:
SHOP_PRODUCT,SHOP_CATEGORY,SHOP_GALLERY
Operativamente:
- carica i file dal media admin endpoint del backend
- associa ogni asset con
POST /api/admin/media/usages - per
ABOUT_MEMBERimpostaisPrimary=truesulla foto principale del membro - home e about leggono da
GET /api/public/media/usages?usageType=...&usageKey=... - il frontend usa
<picture>e preferisce AVIF/WEBP con fallback JPEG, senza usare l'originale - nel back-office frontend la gestione operativa della home passa dalla pagina
admin/home-media
Troubleshooting
Percorso OrcaSlicer
Assicurati che slicer.path punti al binario corretto. Su macOS è solitamente /Applications/OrcaSlicer.app/Contents/MacOS/OrcaSlicer. Su Linux è il percorso all'AppImage (estratta o meno).
FFmpeg e media pubblici
Verifica che MEDIA_FFMPEG_PATH punti a un ffmpeg con supporto JPEG, WebP e AVIF. Se gli URL media restituiti dalle API admin non sono raggiungibili, controlla che MEDIA_PUBLIC_BASE_URL corrisponda al location /media/ esposto da Nginx e che il volume storage_media sia montato correttamente.
Database connection
Verifica le credenziali in application.properties. Se usi Docker, puoi passare DB_URL, DB_USERNAME e DB_PASSWORD come variabili d'ambiente.