mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
Merged in feature/PYPE-580-yeti-connect-mesh-when-loading (pull request #346)
connect shapes to loaded Yeti Rig Approved-by: Milan Kolar <milan@orbi.tools>
This commit is contained in:
commit
12d8c520e2
2 changed files with 61 additions and 3 deletions
|
|
@ -1,9 +1,17 @@
|
||||||
import pype.maya.plugin
|
|
||||||
import os
|
import os
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
from pypeapp import config
|
from pypeapp import config
|
||||||
|
import pype.maya.plugin
|
||||||
|
from pype.maya import lib
|
||||||
|
|
||||||
|
|
||||||
class YetiRigLoader(pype.maya.plugin.ReferenceLoader):
|
class YetiRigLoader(pype.maya.plugin.ReferenceLoader):
|
||||||
|
"""
|
||||||
|
This loader will load Yeti rig. You can select something in scene and if it
|
||||||
|
has same ID as mesh published with rig, their shapes will be linked
|
||||||
|
together.
|
||||||
|
"""
|
||||||
|
|
||||||
families = ["yetiRig"]
|
families = ["yetiRig"]
|
||||||
representations = ["ma"]
|
representations = ["ma"]
|
||||||
|
|
@ -18,6 +26,32 @@ class YetiRigLoader(pype.maya.plugin.ReferenceLoader):
|
||||||
import maya.cmds as cmds
|
import maya.cmds as cmds
|
||||||
from avalon import maya
|
from avalon import maya
|
||||||
|
|
||||||
|
# get roots of selected hierarchies
|
||||||
|
selected_roots = []
|
||||||
|
for sel in cmds.ls(sl=True, long=True):
|
||||||
|
selected_roots.append(sel.split("|")[1])
|
||||||
|
|
||||||
|
# get all objects under those roots
|
||||||
|
selected_hierarchy = []
|
||||||
|
for root in selected_roots:
|
||||||
|
selected_hierarchy.append(cmds.listRelatives(
|
||||||
|
root,
|
||||||
|
allDescendents=True) or [])
|
||||||
|
|
||||||
|
# flatten the list and filter only shapes
|
||||||
|
shapes_flat = []
|
||||||
|
for root in selected_hierarchy:
|
||||||
|
shapes = cmds.ls(root, long=True, type="mesh") or []
|
||||||
|
for shape in shapes:
|
||||||
|
shapes_flat.append(shape)
|
||||||
|
|
||||||
|
# create dictionary of cbId and shape nodes
|
||||||
|
scene_lookup = defaultdict(list)
|
||||||
|
for node in shapes_flat:
|
||||||
|
cb_id = lib.get_id(node)
|
||||||
|
scene_lookup[cb_id] = node
|
||||||
|
|
||||||
|
# load rig
|
||||||
with maya.maintained_selection():
|
with maya.maintained_selection():
|
||||||
nodes = cmds.file(self.fname,
|
nodes = cmds.file(self.fname,
|
||||||
namespace=namespace,
|
namespace=namespace,
|
||||||
|
|
@ -26,6 +60,20 @@ class YetiRigLoader(pype.maya.plugin.ReferenceLoader):
|
||||||
groupReference=True,
|
groupReference=True,
|
||||||
groupName="{}:{}".format(namespace, name))
|
groupName="{}:{}".format(namespace, name))
|
||||||
|
|
||||||
|
# for every shape node we've just loaded find matching shape by its
|
||||||
|
# cbId in selection. If found outMesh of scene shape will connect to
|
||||||
|
# inMesh of loaded shape.
|
||||||
|
for destination_node in nodes:
|
||||||
|
source_node = scene_lookup[lib.get_id(destination_node)]
|
||||||
|
if source_node:
|
||||||
|
self.log.info("found: {}".format(source_node))
|
||||||
|
self.log.info(
|
||||||
|
"creating connection to {}".format(destination_node))
|
||||||
|
|
||||||
|
cmds.connectAttr("{}.outMesh".format(source_node),
|
||||||
|
"{}.inMesh".format(destination_node),
|
||||||
|
force=True)
|
||||||
|
|
||||||
groupName = "{}:{}".format(namespace, name)
|
groupName = "{}:{}".format(namespace, name)
|
||||||
|
|
||||||
presets = config.get_presets(project=os.environ['AVALON_PROJECT'])
|
presets = config.get_presets(project=os.environ['AVALON_PROJECT'])
|
||||||
|
|
@ -38,6 +86,4 @@ class YetiRigLoader(pype.maya.plugin.ReferenceLoader):
|
||||||
c[0], c[1], c[2])
|
c[0], c[1], c[2])
|
||||||
self[:] = nodes
|
self[:] = nodes
|
||||||
|
|
||||||
self.log.info("Yeti Rig Connection Manager will be available soon")
|
|
||||||
|
|
||||||
return nodes
|
return nodes
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,18 @@ class ExtractYetiRig(pype.api.Extractor):
|
||||||
with open(settings_path, "w") as fp:
|
with open(settings_path, "w") as fp:
|
||||||
json.dump(settings, fp, ensure_ascii=False)
|
json.dump(settings, fp, ensure_ascii=False)
|
||||||
|
|
||||||
|
# add textures to transfers
|
||||||
|
if 'transfers' not in instance.data:
|
||||||
|
instance.data['transfers'] = []
|
||||||
|
|
||||||
|
for resource in instance.data.get('resources', []):
|
||||||
|
for file in resource['files']:
|
||||||
|
src = file
|
||||||
|
dst = os.path.join(image_search_path, os.path.basename(file))
|
||||||
|
instance.data['transfers'].append([src, dst])
|
||||||
|
|
||||||
|
self.log.info("adding transfer {} -> {}". format(src, dst))
|
||||||
|
|
||||||
# Ensure the imageSearchPath is being remapped to the publish folder
|
# Ensure the imageSearchPath is being remapped to the publish folder
|
||||||
attr_value = {"%s.imageSearchPath" % n: str(image_search_path) for
|
attr_value = {"%s.imageSearchPath" % n: str(image_search_path) for
|
||||||
n in yeti_nodes}
|
n in yeti_nodes}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue