Move bpy_hydra.export_mtlx() exception handling to C code #28

Merged
Bogdan Nagirniak merged 9 commits from BLEN-392_pyerr_catch into hydra-render 2023-05-03 21:15:52 +02:00
2 changed files with 29 additions and 17 deletions

View File

@ -38,7 +38,6 @@ __all__ = (
import os import os
import platform import platform
import traceback
from pathlib import Path from pathlib import Path
import bpy import bpy
@ -107,21 +106,14 @@ def export_mtlx(material):
""" Exports material to .mtlx file. It is called from Blender source code. """ """ Exports material to .mtlx file. It is called from Blender source code. """
try: try:
import materialx.utils as mx_utils import materialx.utils as mx_utils
doc = mx_utils.export(material, None)
if not doc:
return ""
mtlx_file = mx_utils.get_temp_file(".mtlx", f"mat_{material.as_pointer():016x}")
mx_utils.export_to_file(doc, mtlx_file, export_deps=True, copy_deps=False)
return str(mtlx_file)
except ImportError: except ImportError:
print("ERROR: no MaterialX addon available") print("ERROR: no MaterialX addon available")
return ""
except: doc = mx_utils.export(material, None)
# This is a placeholder, this code will be moved to C part later if not doc:
# This code shouldn't raise any exception due to breaking refcounts on RenderEngine return ""
traceback.print_exc()
return "" mtlx_file = mx_utils.get_temp_file(".mtlx", f"mat_{material.as_pointer():016x}")
mx_utils.export_to_file(doc, mtlx_file, export_deps=True, copy_deps=False)
return str(mtlx_file)

View File

@ -68,8 +68,28 @@ void MaterialData::init()
Py_DECREF(result); Py_DECREF(result);
} }
else { else {
CLOG_ERROR(LOG_RENDER_HYDRA_SCENE, "Export error for %s", id->name); /* Clearing and logging exception data */
PyErr_Print(); PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
PyErr_NormalizeException(&type, &value, &traceback);
std::string err_str = ((PyTypeObject *)type)->tp_name;
if (value) {
PyObject *pstr = PyObject_Str(value);
err_str += ": ";
err_str += PyUnicode_AsUTF8(pstr);
Py_DECREF(pstr);
}
CLOG_ERROR(LOG_RENDER_HYDRA_SCENE,
"Export error for %s (%s): %s",
prim_id.GetText(),
id->name,
err_str.c_str());
if (traceback) {
PyTraceBack_Print(traceback, PySys_GetObject("stderr"));
}
Py_XDECREF(traceback);
Py_XDECREF(value);
Py_DECREF(type);
} }
Py_DECREF(module); Py_DECREF(module);