fix(back-end): file error handling
This commit is contained in:
@@ -50,14 +50,18 @@ public class SlicerService {
|
|||||||
if (machineOverrides != null) machineOverrides.forEach(machineProfile::put);
|
if (machineOverrides != null) machineOverrides.forEach(machineProfile::put);
|
||||||
if (processOverrides != null) processOverrides.forEach(processProfile::put);
|
if (processOverrides != null) processOverrides.forEach(processProfile::put);
|
||||||
|
|
||||||
// Mantengo questa rimozione perché risolveva un errore specifico di triangolazione nei log
|
// Pulizia profonda per evitare errori di inizializzazione grafica/piatto
|
||||||
machineProfile.remove("bed_exclude_area");
|
machineProfile.remove("bed_exclude_area");
|
||||||
|
machineProfile.remove("head_wrap_detect_zone");
|
||||||
|
machineProfile.remove("bed_custom_model");
|
||||||
|
machineProfile.remove("bed_custom_texture");
|
||||||
|
|
||||||
Path baseTempPath = Paths.get("/app/temp");
|
Path baseTempPath = Paths.get("/app/temp");
|
||||||
if (!Files.exists(baseTempPath)) Files.createDirectories(baseTempPath);
|
if (!Files.exists(baseTempPath)) Files.createDirectories(baseTempPath);
|
||||||
Path tempDir = Files.createTempDirectory(baseTempPath, "job_");
|
Path tempDir = Files.createTempDirectory(baseTempPath, "job_");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Usiamo un nome file senza spazi per massima compatibilità CLI
|
||||||
File localStl = tempDir.resolve("input.stl").toFile();
|
File localStl = tempDir.resolve("input.stl").toFile();
|
||||||
Files.copy(inputStl.toPath(), localStl.toPath());
|
Files.copy(inputStl.toPath(), localStl.toPath());
|
||||||
|
|
||||||
@@ -71,23 +75,35 @@ public class SlicerService {
|
|||||||
|
|
||||||
List<String> command = new ArrayList<>();
|
List<String> command = new ArrayList<>();
|
||||||
command.add(slicerPath);
|
command.add(slicerPath);
|
||||||
command.add("--slice");
|
|
||||||
command.add("1");
|
// Parametri di caricamento
|
||||||
command.add("--outputdir");
|
|
||||||
command.add(tempDir.toAbsolutePath().toString());
|
|
||||||
command.add("--load-settings");
|
command.add("--load-settings");
|
||||||
command.add(mFile.getAbsolutePath());
|
command.add(mFile.getAbsolutePath());
|
||||||
command.add("--load-settings");
|
command.add("--load-settings");
|
||||||
command.add(pFile.getAbsolutePath());
|
command.add(pFile.getAbsolutePath());
|
||||||
command.add("--load-filaments");
|
command.add("--load-filaments");
|
||||||
command.add(fFile.getAbsolutePath());
|
command.add(fFile.getAbsolutePath());
|
||||||
|
|
||||||
|
// Output
|
||||||
|
command.add("--outputdir");
|
||||||
|
command.add(tempDir.toAbsolutePath().toString());
|
||||||
|
|
||||||
|
// Slicing & Auto-center (fondamentale per evitare "Nothing to be sliced")
|
||||||
|
command.add("--arrange");
|
||||||
|
command.add("1");
|
||||||
|
command.add("--ensure-on-bed");
|
||||||
|
|
||||||
|
command.add("--slice");
|
||||||
|
command.add("0"); // 0 solitamente significa "tutti i piatti con oggetti"
|
||||||
|
|
||||||
|
// File da processare (sempre per ultimo)
|
||||||
command.add(localStl.getAbsolutePath());
|
command.add(localStl.getAbsolutePath());
|
||||||
|
|
||||||
logger.info("Executing Slicer: " + String.join(" ", command));
|
logger.info("Executing Slicer: " + String.join(" ", command));
|
||||||
|
|
||||||
runSlicerCommand(command, tempDir);
|
runSlicerCommand(command, tempDir);
|
||||||
|
|
||||||
// Find any .gcode file
|
// Cerca il file G-code prodotto (input.gcode o simili)
|
||||||
try (Stream<Path> s = Files.list(tempDir)) {
|
try (Stream<Path> s = Files.list(tempDir)) {
|
||||||
Optional<Path> found = s.filter(p -> p.toString().endsWith(".gcode")).findFirst();
|
Optional<Path> found = s.filter(p -> p.toString().endsWith(".gcode")).findFirst();
|
||||||
if (found.isPresent()) return gCodeParser.parse(found.get().toFile());
|
if (found.isPresent()) return gCodeParser.parse(found.get().toFile());
|
||||||
@@ -103,8 +119,11 @@ public class SlicerService {
|
|||||||
protected void runSlicerCommand(List<String> command, Path tempDir) throws IOException, InterruptedException {
|
protected void runSlicerCommand(List<String> command, Path tempDir) throws IOException, InterruptedException {
|
||||||
ProcessBuilder pb = new ProcessBuilder(command);
|
ProcessBuilder pb = new ProcessBuilder(command);
|
||||||
pb.directory(tempDir.toFile());
|
pb.directory(tempDir.toFile());
|
||||||
pb.environment().put("HOME", "/tmp");
|
|
||||||
pb.environment().put("QT_QPA_PLATFORM", "offscreen");
|
// Variabili d'ambiente minimali ma necessarie
|
||||||
|
Map<String, String> env = pb.environment();
|
||||||
|
env.put("HOME", "/tmp");
|
||||||
|
env.put("QT_QPA_PLATFORM", "offscreen");
|
||||||
|
|
||||||
Process process = pb.start();
|
Process process = pb.start();
|
||||||
if (!process.waitFor(5, TimeUnit.MINUTES)) {
|
if (!process.waitFor(5, TimeUnit.MINUTES)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user