Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #4228 from pypeclub/bugfix/blender-layout_family_v…
Browse files Browse the repository at this point in the history
…ersioning

Blender: Fix Layout Family Versioning
  • Loading branch information
LiborBatek authored Dec 15, 2022
2 parents 8465e96 + c07bcb2 commit 738350b
Showing 1 changed file with 63 additions and 20 deletions.
83 changes: 63 additions & 20 deletions openpype/hosts/blender/plugins/load/load_layout_blend.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,14 @@ def _remove(self, asset_group):
bpy.data.objects.remove(obj)

def _remove_asset_and_library(self, asset_group):
if not asset_group.get(AVALON_PROPERTY):
return

libpath = asset_group.get(AVALON_PROPERTY).get('libpath')

if not libpath:
return

# Check how many assets use the same library
count = 0
for obj in bpy.data.collections.get(AVALON_CONTAINERS).all_objects:
Expand All @@ -63,10 +69,12 @@ def _remove_asset_and_library(self, asset_group):
# If it is the last object to use that library, remove it
if count == 1:
library = bpy.data.libraries.get(bpy.path.basename(libpath))
bpy.data.libraries.remove(library)
if library:
bpy.data.libraries.remove(library)

def _process(
self, libpath, asset_group, group_name, asset, representation, actions
self, libpath, asset_group, group_name, asset, representation,
actions, anim_instances
):
with bpy.data.libraries.load(
libpath, link=True, relative=False
Expand Down Expand Up @@ -140,12 +148,12 @@ def _process(
elif local_obj.type == 'ARMATURE':
plugin.prepare_data(local_obj.data)

if action is not None:
if action:
if local_obj.animation_data is None:
local_obj.animation_data_create()
local_obj.animation_data.action = action
elif (local_obj.animation_data and
local_obj.animation_data.action is not None):
local_obj.animation_data.action):
plugin.prepare_data(
local_obj.animation_data.action)

Expand All @@ -157,19 +165,26 @@ def _process(
t.id = local_obj

elif local_obj.type == 'EMPTY':
creator_plugin = get_legacy_creator_by_name("CreateAnimation")
if not creator_plugin:
raise ValueError("Creator plugin \"CreateAnimation\" was "
"not found.")

legacy_create(
creator_plugin,
name=local_obj.name.split(':')[-1] + "_animation",
asset=asset,
options={"useSelection": False,
"asset_group": local_obj},
data={"dependencies": representation}
)
if (not anim_instances or
(anim_instances and
local_obj.name not in anim_instances.keys())):
avalon = local_obj.get(AVALON_PROPERTY)
if avalon and avalon.get('family') == 'rig':
creator_plugin = get_legacy_creator_by_name(
"CreateAnimation")
if not creator_plugin:
raise ValueError(
"Creator plugin \"CreateAnimation\" was "
"not found.")

legacy_create(
creator_plugin,
name=local_obj.name.split(':')[-1] + "_animation",
asset=asset,
options={"useSelection": False,
"asset_group": local_obj},
data={"dependencies": representation}
)

if not local_obj.get(AVALON_PROPERTY):
local_obj[AVALON_PROPERTY] = dict()
Expand Down Expand Up @@ -272,7 +287,8 @@ def process_asset(
avalon_container.objects.link(asset_group)

objects = self._process(
libpath, asset_group, group_name, asset, representation, None)
libpath, asset_group, group_name, asset, representation,
None, None)

for child in asset_group.children:
if child.get(AVALON_PROPERTY):
Expand Down Expand Up @@ -352,10 +368,20 @@ def update(self, container: Dict, representation: Dict):
return

actions = {}
anim_instances = {}

for obj in asset_group.children:
obj_meta = obj.get(AVALON_PROPERTY)
if obj_meta.get('family') == 'rig':
# Get animation instance
collections = list(obj.users_collection)
for c in collections:
avalon = c.get(AVALON_PROPERTY)
if avalon and avalon.get('family') == 'animation':
anim_instances[obj.name] = c.name
break

# Get armature's action
rig = None
for child in obj.children:
if child.type == 'ARMATURE':
Expand Down Expand Up @@ -384,9 +410,26 @@ def update(self, container: Dict, representation: Dict):
# If it is the last object to use that library, remove it
if count == 1:
library = bpy.data.libraries.get(bpy.path.basename(group_libpath))
bpy.data.libraries.remove(library)
if library:
bpy.data.libraries.remove(library)

asset = container.get("asset_name").split("_")[0]

self._process(
str(libpath), asset_group, object_name, asset,
str(representation.get("_id")), actions, anim_instances
)

self._process(str(libpath), asset_group, object_name, actions)
# Link the new objects to the animation collection
for inst in anim_instances.keys():
try:
obj = bpy.data.objects[inst]
bpy.data.collections[anim_instances[inst]].objects.link(obj)
except KeyError:
self.log.info(f"Object {inst} does not exist anymore.")
coll = bpy.data.collections.get(anim_instances[inst])
if (coll):
bpy.data.collections.remove(coll)

avalon_container = bpy.data.collections.get(AVALON_CONTAINERS)
for child in asset_group.children:
Expand Down

0 comments on commit 738350b

Please sign in to comment.