v1
This commit is contained in:
72
src/main/CameraParser.js
Normal file
72
src/main/CameraParser.js
Normal 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;
|
||||
Reference in New Issue
Block a user