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

Commit

Permalink
Settings, refactor, validate
Browse files Browse the repository at this point in the history
- Explicit settings label.
- Refactor for code sharing between render, prerender and image families.
- Validate typos on settings knob names.
  • Loading branch information
tokejepsen committed Jan 29, 2024
1 parent 27eee75 commit c5c4ef1
Show file tree
Hide file tree
Showing 9 changed files with 135 additions and 55 deletions.
4 changes: 3 additions & 1 deletion openpype/hosts/nuke/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
get_node_data,
set_node_data,
update_node_data,
create_write_node
create_write_node,
link_knobs
)
from .utils import (
colorspace_exists_on_node,
Expand Down Expand Up @@ -95,6 +96,7 @@
"set_node_data",
"update_node_data",
"create_write_node",
"link_knobs",

"colorspace_exists_on_node",
"get_colorspace_list",
Expand Down
24 changes: 24 additions & 0 deletions openpype/hosts/nuke/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
)
11 changes: 10 additions & 1 deletion openpype/hosts/nuke/api/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
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,
Expand Down Expand Up @@ -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)
5 changes: 5 additions & 0 deletions openpype/hosts/nuke/plugins/create/create_write_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
EnumDef
)
from openpype.hosts.nuke import api as napi
from openpype.hosts.nuke.api.plugin import exposed_write_knobs


class CreateWriteImage(napi.NukeWriteCreator):
Expand Down Expand Up @@ -132,6 +133,10 @@ def create(self, subset_name, instance_data, pre_create_data):
instance.data_to_store()
)

exposed_write_knobs(
self.project_settings, self.__class__.__name__, instance_node
)

return instance

except Exception as er:
Expand Down
5 changes: 5 additions & 0 deletions openpype/hosts/nuke/plugins/create/create_write_prerender.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
BoolDef
)
from openpype.hosts.nuke import api as napi
from openpype.hosts.nuke.api.plugin import exposed_write_knobs


class CreateWritePrerender(napi.NukeWriteCreator):
Expand Down Expand Up @@ -119,6 +120,10 @@ def create(self, subset_name, instance_data, pre_create_data):
instance.data_to_store()
)

exposed_write_knobs(
self.project_settings, self.__class__.__name__, instance_node
)

return instance

except Exception as er:
Expand Down
13 changes: 4 additions & 9 deletions openpype/hosts/nuke/plugins/create/create_write_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
BoolDef
)
from openpype.hosts.nuke import api as napi
from openpype.hosts.nuke.api.plugin import exposed_write_knobs


class CreateWriteRender(napi.NukeWriteCreator):
Expand Down Expand Up @@ -113,15 +114,9 @@ def create(self, subset_name, instance_data, pre_create_data):
instance.data_to_store()
)

settings = self.project_settings["nuke"]["create"]
exposed_knobs = settings["CreateWriteRender"]["exposed_knobs"]
write_node = nuke.allNodes(group=instance_node, filter="Write")[0]
for knob in exposed_knobs:
link = nuke.Link_Knob("")
link.makeLink(write_node.name(), knob)
link.setName(knob)
link.setFlag(0x1000)
instance_node.addKnob(link)
exposed_write_knobs(
self.project_settings, self.__class__.__name__, instance_node
)

return instance

Expand Down
77 changes: 77 additions & 0 deletions openpype/hosts/nuke/plugins/publish/validate_exposed_knobs.py
Original file line number Diff line number Diff line change
@@ -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)
)
39 changes: 1 addition & 38 deletions openpype/hosts/nuke/plugins/publish/validate_write_nodes.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from collections import defaultdict

import nuke

import pyblish.api
from openpype.pipeline.publish import get_errored_instances_from_context
from openpype.hosts.nuke.api.lib import (
Expand All @@ -12,8 +10,7 @@

from openpype.pipeline.publish import (
PublishXmlValidationError,
OptionalPyblishPluginMixin,
PublishValidationError
OptionalPyblishPluginMixin
)


Expand Down Expand Up @@ -42,19 +39,6 @@ def process(self, context, plugin):

set_node_knobs_from_settings(write_node, correct_data["knobs"])

nuke_settings = instance.context.data["project_settings"]["nuke"]
create_settings = nuke_settings["create"]["CreateWriteRender"]
exposed_knobs = create_settings["exposed_knobs"]
for knob in exposed_knobs:
if knob in write_group_node.knobs():
continue

link = nuke.Link_Knob("")
link.makeLink(write_node.name(), knob)
link.setName(knob)
link.setFlag(0x1000)
write_group_node.addKnob(link)

self.log.debug("Node attributes were fixed")


Expand Down Expand Up @@ -150,27 +134,6 @@ def process(self, instance):
if check:
self._make_error(check)

nuke_settings = instance.context.data["project_settings"]["nuke"]
create_settings = nuke_settings["create"]["CreateWriteRender"]
exposed_knobs = create_settings["exposed_knobs"]
unexposed_knobs = []
for knob in exposed_knobs:
if knob not in write_group_node.knobs():
unexposed_knobs.append(knob)

"""
link = nuke.Link_Knob("")
link.makeLink(write_node.name(), knob)
link.setName(knob)
link.setFlag(0x1000)
write_group_node.addKnob(link)
"""

if unexposed_knobs:
raise PublishValidationError(
"Missing exposed knobs: {}".format(unexposed_knobs)
)

def _make_error(self, check):
# sourcery skip: merge-assign-and-aug-assign, move-assign-in-block
dbg_msg = "Write node's knobs values are not correct!\n"
Expand Down
12 changes: 6 additions & 6 deletions server_addon/nuke/server/settings/create_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ class CreateWriteRenderModel(BaseSettingsModel):
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
exposed_knobs: list[str] = Field(
title="Exposed Knobs",
exposed_knobs: list[str] = SettingsField(
title="Write Node Exposed Knobs",
default_factory=list
)
prenodes: list[PrenodeModel] = SettingsField(
Expand Down Expand Up @@ -84,8 +84,8 @@ class CreateWritePrerenderModel(BaseSettingsModel):
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
exposed_knobs: list[str] = Field(
title="Exposed Knobs",
exposed_knobs: list[str] = SettingsField(
title="Write Node Exposed Knobs",
default_factory=list
)
prenodes: list[PrenodeModel] = SettingsField(
Expand Down Expand Up @@ -113,8 +113,8 @@ class CreateWriteImageModel(BaseSettingsModel):
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
exposed_knobs: list[str] = Field(
title="Exposed Knobs",
exposed_knobs: list[str] = SettingsField(
title="Write Node Exposed Knobs",
default_factory=list
)
prenodes: list[PrenodeModel] = SettingsField(
Expand Down

0 comments on commit c5c4ef1

Please sign in to comment.