65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
"""
|
|
compat.py
|
|
---------
|
|
One-shot compatibility patches applied at add-on load time:
|
|
|
|
1. Enables 'add_curve_extra_objects' (provides Torus Knot Plus operator).
|
|
2. Monkey-patches add_curve_torus_knots.align_matrix so it does not crash
|
|
when Blender is running in headless mode (no space_data on context).
|
|
|
|
Usage::
|
|
|
|
from .compat import apply_compat_patches
|
|
apply_compat_patches() # call once from register() / __main__
|
|
"""
|
|
import sys
|
|
|
|
|
|
def apply_compat_patches() -> None:
|
|
"""Apply all compatibility patches. Safe to call more than once."""
|
|
_enable_extra_curves()
|
|
_patch_align_matrix()
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Patch 1 — enable the built-in curve extras add-on
|
|
# ---------------------------------------------------------------------------
|
|
|
|
def _enable_extra_curves() -> None:
|
|
try:
|
|
import addon_utils
|
|
addon_utils.enable("add_curve_extra_objects", default_set=True)
|
|
except Exception:
|
|
pass # module name may differ across Blender versions — silently skip
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Patch 2 — safe align_matrix for headless (CLI) mode
|
|
# ---------------------------------------------------------------------------
|
|
|
|
def _patch_align_matrix() -> None:
|
|
"""Monkey-patch the buggy align_matrix that crashes without space_data."""
|
|
for mod_name, mod in sys.modules.items():
|
|
if "add_curve_torus_knots" not in mod_name:
|
|
continue
|
|
if not hasattr(mod, "align_matrix"):
|
|
continue
|
|
if hasattr(mod, "_original_align_matrix"):
|
|
continue # already patched
|
|
|
|
mod._original_align_matrix = mod.align_matrix
|
|
|
|
def safe_align_matrix(self, context, _orig=mod._original_align_matrix):
|
|
if not getattr(context, "space_data", None):
|
|
import mathutils
|
|
user_loc = mathutils.Matrix.Translation(self.location)
|
|
user_rot = self.rotation.to_matrix().to_4x4()
|
|
if self.absolute_location:
|
|
loc = mathutils.Matrix.Translation(mathutils.Vector((0, 0, 0)))
|
|
else:
|
|
loc = mathutils.Matrix.Translation(context.scene.cursor.location)
|
|
return user_loc @ loc @ mathutils.Matrix() @ user_rot
|
|
return _orig(self, context)
|
|
|
|
mod.align_matrix = safe_align_matrix
|