32 lines
1.2 KiB
Python
32 lines
1.2 KiB
Python
from __future__ import annotations
|
|
from typing import Any
|
|
|
|
from .formatter import format_node_failure_message
|
|
|
|
|
|
class NodeErrorReportingProxy:
|
|
"""Wraps Blender operator to ensure any operator.report({'ERROR'}, ...) calls
|
|
always report which node failed and the names of its inputs."""
|
|
|
|
def __init__(self, operator: Any, node: Any):
|
|
self._operator = operator
|
|
self._node = node
|
|
|
|
def report(self, type_set: set[str], message: str) -> None:
|
|
if self._operator and hasattr(self._operator, "report"):
|
|
if "ERROR" in type_set:
|
|
formatted_msg = format_node_failure_message(self._node, message)
|
|
print(f"[NodeSlicer ERROR] {formatted_msg}")
|
|
self._operator.report(type_set, formatted_msg)
|
|
else:
|
|
self._operator.report(type_set, message)
|
|
|
|
def __getattr__(self, name: str) -> Any:
|
|
return getattr(self._operator, name)
|
|
|
|
|
|
def wrap_operator_for_node(operator: Any, node: Any) -> NodeErrorReportingProxy | Any:
|
|
"""Wraps an operator with NodeErrorReportingProxy if operator is not None."""
|
|
if operator is None:
|
|
return None
|
|
return NodeErrorReportingProxy(operator, node)
|