mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
Merge pull request #6137 from tokejepsen/enhancement/OP-7592_expose_write_knobs
Nuke: Expose write knobs - OP-7592
This commit is contained in:
commit
c81e139612
10 changed files with 146 additions and 7 deletions
|
|
@ -43,7 +43,8 @@ from .lib import (
|
|||
get_node_data,
|
||||
set_node_data,
|
||||
update_node_data,
|
||||
create_write_node
|
||||
create_write_node,
|
||||
link_knobs
|
||||
)
|
||||
from .utils import (
|
||||
colorspace_exists_on_node,
|
||||
|
|
@ -95,6 +96,7 @@ __all__ = (
|
|||
"set_node_data",
|
||||
"update_node_data",
|
||||
"create_write_node",
|
||||
"link_knobs",
|
||||
|
||||
"colorspace_exists_on_node",
|
||||
"get_colorspace_list",
|
||||
|
|
|
|||
|
|
@ -3499,3 +3499,27 @@ def create_camera_node_by_version():
|
|||
return nuke.createNode("Camera4")
|
||||
else:
|
||||
return nuke.createNode("Camera2")
|
||||
|
||||
|
||||
def link_knobs(knobs, node, group_node):
|
||||
"""Link knobs from inside `group_node`"""
|
||||
|
||||
missing_knobs = []
|
||||
for knob in knobs:
|
||||
if knob in group_node.knobs():
|
||||
continue
|
||||
|
||||
if knob not in node.knobs().keys():
|
||||
missing_knobs.append(knob)
|
||||
|
||||
link = nuke.Link_Knob("")
|
||||
link.makeLink(node.name(), knob)
|
||||
link.setName(knob)
|
||||
link.setFlag(0x1000)
|
||||
group_node.addKnob(link)
|
||||
|
||||
if missing_knobs:
|
||||
raise ValueError(
|
||||
"Write node exposed knobs missing:\n\n{}\n\nPlease review"
|
||||
" project settings.".format("\n".join(missing_knobs))
|
||||
)
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@ from .lib import (
|
|||
get_view_process_node,
|
||||
get_viewer_config_from_string,
|
||||
deprecated,
|
||||
get_filenames_without_hash
|
||||
get_filenames_without_hash,
|
||||
link_knobs
|
||||
)
|
||||
from .pipeline import (
|
||||
list_instances,
|
||||
|
|
@ -1344,3 +1345,11 @@ def _remove_old_knobs(node):
|
|||
node.removeKnob(knob)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
def exposed_write_knobs(settings, plugin_name, instance_node):
|
||||
exposed_knobs = settings["nuke"]["create"][plugin_name]["exposed_knobs"]
|
||||
if exposed_knobs:
|
||||
instance_node.addKnob(nuke.Text_Knob('', 'Write Knobs'))
|
||||
write_node = nuke.allNodes(group=instance_node, filter="Write")[0]
|
||||
link_knobs(exposed_knobs, write_node, instance_node)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ from openpype.lib import (
|
|||
EnumDef
|
||||
)
|
||||
from openpype.hosts.nuke import api as napi
|
||||
from openpype.hosts.nuke.api.plugin import exposed_write_knobs
|
||||
|
||||
|
||||
class CreateWriteImage(napi.NukeWriteCreator):
|
||||
|
|
@ -132,6 +133,10 @@ class CreateWriteImage(napi.NukeWriteCreator):
|
|||
instance.data_to_store()
|
||||
)
|
||||
|
||||
exposed_write_knobs(
|
||||
self.project_settings, self.__class__.__name__, instance_node
|
||||
)
|
||||
|
||||
return instance
|
||||
|
||||
except Exception as er:
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ from openpype.lib import (
|
|||
BoolDef
|
||||
)
|
||||
from openpype.hosts.nuke import api as napi
|
||||
from openpype.hosts.nuke.api.plugin import exposed_write_knobs
|
||||
|
||||
|
||||
class CreateWritePrerender(napi.NukeWriteCreator):
|
||||
|
|
@ -119,6 +120,10 @@ class CreateWritePrerender(napi.NukeWriteCreator):
|
|||
instance.data_to_store()
|
||||
)
|
||||
|
||||
exposed_write_knobs(
|
||||
self.project_settings, self.__class__.__name__, instance_node
|
||||
)
|
||||
|
||||
return instance
|
||||
|
||||
except Exception as er:
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ from openpype.lib import (
|
|||
BoolDef
|
||||
)
|
||||
from openpype.hosts.nuke import api as napi
|
||||
from openpype.hosts.nuke.api.plugin import exposed_write_knobs
|
||||
|
||||
|
||||
class CreateWriteRender(napi.NukeWriteCreator):
|
||||
|
|
@ -113,6 +114,10 @@ class CreateWriteRender(napi.NukeWriteCreator):
|
|||
instance.data_to_store()
|
||||
)
|
||||
|
||||
exposed_write_knobs(
|
||||
self.project_settings, self.__class__.__name__, instance_node
|
||||
)
|
||||
|
||||
return instance
|
||||
|
||||
except Exception as er:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
import pyblish.api
|
||||
|
||||
from openpype.pipeline.publish import get_errored_instances_from_context
|
||||
from openpype.hosts.nuke.api.lib import link_knobs
|
||||
from openpype.pipeline.publish import (
|
||||
OptionalPyblishPluginMixin,
|
||||
PublishValidationError
|
||||
)
|
||||
|
||||
|
||||
class RepairExposedKnobs(pyblish.api.Action):
|
||||
label = "Repair"
|
||||
on = "failed"
|
||||
icon = "wrench"
|
||||
|
||||
def process(self, context, plugin):
|
||||
instances = get_errored_instances_from_context(context)
|
||||
|
||||
for instance in instances:
|
||||
child_nodes = (
|
||||
instance.data.get("transientData", {}).get("childNodes")
|
||||
or instance
|
||||
)
|
||||
|
||||
write_group_node = instance.data["transientData"]["node"]
|
||||
# get write node from inside of group
|
||||
write_node = None
|
||||
for x in child_nodes:
|
||||
if x.Class() == "Write":
|
||||
write_node = x
|
||||
|
||||
plugin_name = plugin.families_mapping[instance.data["family"]]
|
||||
nuke_settings = instance.context.data["project_settings"]["nuke"]
|
||||
create_settings = nuke_settings["create"][plugin_name]
|
||||
exposed_knobs = create_settings["exposed_knobs"]
|
||||
link_knobs(exposed_knobs, write_node, write_group_node)
|
||||
|
||||
|
||||
class ValidateExposedKnobs(
|
||||
OptionalPyblishPluginMixin,
|
||||
pyblish.api.InstancePlugin
|
||||
):
|
||||
""" Validate write node exposed knobs.
|
||||
|
||||
Compare exposed linked knobs to settings.
|
||||
"""
|
||||
|
||||
order = pyblish.api.ValidatorOrder
|
||||
optional = True
|
||||
families = ["render", "prerender", "image"]
|
||||
label = "Validate Exposed Knobs"
|
||||
actions = [RepairExposedKnobs]
|
||||
hosts = ["nuke"]
|
||||
families_mapping = {
|
||||
"render": "CreateWriteRender",
|
||||
"prerender": "CreateWritePrerender",
|
||||
"image": "CreateWriteImage"
|
||||
}
|
||||
|
||||
def process(self, instance):
|
||||
if not self.is_active(instance.data):
|
||||
return
|
||||
|
||||
plugin = self.families_mapping[instance.data["family"]]
|
||||
group_node = instance.data["transientData"]["node"]
|
||||
nuke_settings = instance.context.data["project_settings"]["nuke"]
|
||||
create_settings = nuke_settings["create"][plugin]
|
||||
exposed_knobs = create_settings["exposed_knobs"]
|
||||
unexposed_knobs = []
|
||||
for knob in exposed_knobs:
|
||||
if knob not in group_node.knobs():
|
||||
unexposed_knobs.append(knob)
|
||||
|
||||
if unexposed_knobs:
|
||||
raise PublishValidationError(
|
||||
"Missing exposed knobs: {}".format(unexposed_knobs)
|
||||
)
|
||||
|
|
@ -10,7 +10,7 @@ from openpype.hosts.nuke.api.lib import (
|
|||
|
||||
from openpype.pipeline.publish import (
|
||||
PublishXmlValidationError,
|
||||
OptionalPyblishPluginMixin,
|
||||
OptionalPyblishPluginMixin
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,10 @@ class CreateWriteRenderModel(BaseSettingsModel):
|
|||
enum_resolver=instance_attributes_enum,
|
||||
title="Instance attributes"
|
||||
)
|
||||
|
||||
exposed_knobs: list[str] = SettingsField(
|
||||
title="Write Node Exposed Knobs",
|
||||
default_factory=list
|
||||
)
|
||||
prenodes: list[PrenodeModel] = SettingsField(
|
||||
default_factory=list,
|
||||
title="Preceding nodes",
|
||||
|
|
@ -81,7 +84,10 @@ class CreateWritePrerenderModel(BaseSettingsModel):
|
|||
enum_resolver=instance_attributes_enum,
|
||||
title="Instance attributes"
|
||||
)
|
||||
|
||||
exposed_knobs: list[str] = SettingsField(
|
||||
title="Write Node Exposed Knobs",
|
||||
default_factory=list
|
||||
)
|
||||
prenodes: list[PrenodeModel] = SettingsField(
|
||||
default_factory=list,
|
||||
title="Preceding nodes",
|
||||
|
|
@ -107,7 +113,10 @@ class CreateWriteImageModel(BaseSettingsModel):
|
|||
enum_resolver=instance_attributes_enum,
|
||||
title="Instance attributes"
|
||||
)
|
||||
|
||||
exposed_knobs: list[str] = SettingsField(
|
||||
title="Write Node Exposed Knobs",
|
||||
default_factory=list
|
||||
)
|
||||
prenodes: list[PrenodeModel] = SettingsField(
|
||||
default_factory=list,
|
||||
title="Preceding nodes",
|
||||
|
|
@ -146,6 +155,7 @@ DEFAULT_CREATE_SETTINGS = {
|
|||
"reviewable",
|
||||
"farm_rendering"
|
||||
],
|
||||
"exposed_knobs": [],
|
||||
"prenodes": [
|
||||
{
|
||||
"name": "Reformat01",
|
||||
|
|
@ -179,6 +189,7 @@ DEFAULT_CREATE_SETTINGS = {
|
|||
"farm_rendering",
|
||||
"use_range_limit"
|
||||
],
|
||||
"exposed_knobs": [],
|
||||
"prenodes": []
|
||||
},
|
||||
"CreateWriteImage": {
|
||||
|
|
@ -191,6 +202,7 @@ DEFAULT_CREATE_SETTINGS = {
|
|||
"instance_attributes": [
|
||||
"use_range_limit"
|
||||
],
|
||||
"exposed_knobs": [],
|
||||
"prenodes": [
|
||||
{
|
||||
"name": "FrameHold01",
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.8"
|
||||
__version__ = "0.1.9"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue