rename knot_animation folder
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user