mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 05:14:40 +01:00
102 lines
3 KiB
Python
102 lines
3 KiB
Python
import random
|
|
import string
|
|
|
|
import avalon.nuke
|
|
from avalon.nuke import lib as anlib
|
|
from avalon import api
|
|
|
|
from openpype.api import (
|
|
get_current_project_settings,
|
|
PypeCreatorMixin
|
|
)
|
|
from .lib import check_subsetname_exists
|
|
import nuke
|
|
|
|
|
|
class PypeCreator(PypeCreatorMixin, avalon.nuke.pipeline.Creator):
|
|
"""Pype Nuke Creator class wrapper
|
|
"""
|
|
def __init__(self, *args, **kwargs):
|
|
super(PypeCreator, self).__init__(*args, **kwargs)
|
|
self.presets = get_current_project_settings()["nuke"]["create"].get(
|
|
self.__class__.__name__, {}
|
|
)
|
|
if check_subsetname_exists(
|
|
nuke.allNodes(),
|
|
self.data["subset"]):
|
|
msg = ("The subset name `{0}` is already used on a node in"
|
|
"this workfile.".format(self.data["subset"]))
|
|
self.log.error(msg + '\n\nPlease use other subset name!')
|
|
raise NameError("`{0}: {1}".format(__name__, msg))
|
|
return
|
|
|
|
|
|
def get_review_presets_config():
|
|
settings = get_current_project_settings()
|
|
review_profiles = (
|
|
settings["global"]
|
|
["publish"]
|
|
["ExtractReview"]
|
|
["profiles"]
|
|
)
|
|
|
|
outputs = {}
|
|
for profile in review_profiles:
|
|
outputs.update(profile.get("outputs", {}))
|
|
|
|
return [str(name) for name, _prop in outputs.items()]
|
|
|
|
|
|
class NukeLoader(api.Loader):
|
|
container_id_knob = "containerId"
|
|
container_id = None
|
|
|
|
def reset_container_id(self):
|
|
self.container_id = ''.join(random.choice(
|
|
string.ascii_uppercase + string.digits) for _ in range(10))
|
|
|
|
def get_container_id(self, node):
|
|
id_knob = node.knobs().get(self.container_id_knob)
|
|
return id_knob.value() if id_knob else None
|
|
|
|
def get_members(self, source):
|
|
"""Return nodes that has same 'containerId' as `source`"""
|
|
source_id = self.get_container_id(source)
|
|
return [node for node in nuke.allNodes(recurseGroups=True)
|
|
if self.get_container_id(node) == source_id
|
|
and node is not source] if source_id else []
|
|
|
|
def set_as_member(self, node):
|
|
source_id = self.get_container_id(node)
|
|
|
|
if source_id:
|
|
node[self.container_id_knob].setValue(source_id)
|
|
else:
|
|
HIDEN_FLAG = 0x00040000
|
|
_knob = anlib.Knobby(
|
|
"String_Knob",
|
|
self.container_id,
|
|
flags=[
|
|
nuke.READ_ONLY,
|
|
HIDEN_FLAG
|
|
])
|
|
knob = _knob.create(self.container_id_knob)
|
|
node.addKnob(knob)
|
|
|
|
def clear_members(self, parent_node):
|
|
members = self.get_members(parent_node)
|
|
|
|
dependent_nodes = None
|
|
for node in members:
|
|
_depndc = [n for n in node.dependent() if n not in members]
|
|
if not _depndc:
|
|
continue
|
|
|
|
dependent_nodes = _depndc
|
|
break
|
|
|
|
for member in members:
|
|
self.log.info("removing node: `{}".format(member.name()))
|
|
nuke.delete(member)
|
|
|
|
return dependent_nodes
|