This commit is contained in:
sorlinv
2026-02-20 19:27:27 +01:00
commit b556cce88c
23 changed files with 8182 additions and 0 deletions

72
src/main/CameraParser.js Normal file
View File

@@ -0,0 +1,72 @@
const { spawn } = require("child_process");
const PathResolver = require("./PathResolver.js");
const STR_CAMERA_MARKER = "CAMERAS_JSON:";
const STR_PYTHON_EXPR = [
"import bpy, json, sys;",
"cams=[o.name for o in bpy.data.objects if o.type=='CAMERA'];",
"sys.stdout.write('CAMERAS_JSON:' + json.dumps(cams) + '\\n');",
"sys.stdout.flush()",
].join("");
const CameraParser = {
list_cameras: (str_blend_path) => {
return new Promise((resolve, reject) => {
let str_stdout = "";
let str_stderr = "";
let obj_process = spawn(PathResolver.get_blender_path(), [
"-b", str_blend_path,
"--python-expr", STR_PYTHON_EXPR,
]);
obj_process.stdout.on("data", (obj_data) => {
str_stdout += obj_data.toString();
});
obj_process.stderr.on("data", (obj_data) => {
str_stderr += obj_data.toString();
});
obj_process.on("close", (nb_code) => {
if (nb_code !== 0) {
reject(new Error("Blender a quitte avec le code " + nb_code + " : " + str_stderr));
return;
}
let list_cameras = CameraParser._parse_camera_output(str_stdout);
if (list_cameras === null) {
console.error("[CameraParser] Stdout Blender:\n" + str_stdout.substring(str_stdout.length - 2000));
reject(new Error("Impossible de parser les cameras. Verifiez que le fichier .blend contient des cameras."));
return;
}
resolve(list_cameras);
});
obj_process.on("error", (obj_err) => {
reject(new Error("Impossible de lancer Blender. Verifiez qu'il est installe et accessible dans le PATH. " + obj_err.message));
});
});
},
_parse_camera_output: (str_stdout) => {
let list_lines = str_stdout.split("\n");
for (let str_line of list_lines) {
let nb_index = str_line.indexOf(STR_CAMERA_MARKER);
if (nb_index !== -1) {
let str_json = str_line.substring(nb_index + STR_CAMERA_MARKER.length).trim();
try {
return JSON.parse(str_json);
} catch (obj_err) {
console.error("[CameraParser] JSON parse error:", obj_err.message, "raw:", str_json);
return null;
}
}
}
return null;
},
};
module.exports = CameraParser;