40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
"""Shared helpers for Dynamic Link Manager."""
|
|
|
|
import bpy
|
|
|
|
|
|
def descendants(armature):
|
|
"""Return a set of objects whose parent chain leads to the given armature."""
|
|
out = set()
|
|
for ob in bpy.data.objects:
|
|
p = ob.parent
|
|
while p:
|
|
if p == armature:
|
|
out.add(ob)
|
|
break
|
|
p = p.parent
|
|
return out
|
|
|
|
|
|
def collection_containing_armature(armature):
|
|
"""
|
|
Return a collection that contains the armature (for linked character context).
|
|
Prefers a collection whose name matches the character base (e.g. "Steve" for Steve_Rigify).
|
|
"""
|
|
if not armature or armature.name not in bpy.data.objects:
|
|
return None
|
|
colls = getattr(armature, "users_collection", []) or []
|
|
if not colls:
|
|
return None
|
|
name = armature.name
|
|
base = name.replace("_Rigify", "").replace(".001", "").rstrip("0123456789.")
|
|
for c in colls:
|
|
if c.name == base or base in c.name or c.name in name:
|
|
return c
|
|
return colls[0]
|