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 #757 from quadproduction/release/3.16.9-quad-1.13.0
Browse files Browse the repository at this point in the history
Release 3.16.9-quad-1.13.0
  • Loading branch information
BenSouchet authored Jul 10, 2024
2 parents e45af84 + 5db0649 commit d652e34
Show file tree
Hide file tree
Showing 13 changed files with 192 additions and 15 deletions.
12 changes: 12 additions & 0 deletions openpype/hosts/aftereffects/api/extension/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,17 @@
});
</script>

<script type=text/javascript>
$(function() {
$("a#setcustomresolution-button").bind("click", function() {
RPC.call('AfterEffects.setcustomresolution_route').then(function (data) {
}, function (error) {
alert(error);
});
});
});
</script>

<script type=text/javascript>
$(function() {
$("a#setframes-button").bind("click", function() {
Expand Down Expand Up @@ -162,6 +173,7 @@
<div><a href=# id=sceneinventory-button><button class="hostFontSize">Manage...</button></a></div>
<div><a href=# id=separator0><button class="hostFontSize">&nbsp;</button></a></div>
<div><a href=# id=setresolution-button><button class="hostFontSize">Set Resolution</button></a></div>
<div><a href=# id=setcustomresolution-button><button class="hostFontSize">Set Custom Resolution</button></a></div>
<div><a href=# id=setframes-button><button class="hostFontSize">Set Frame Range</button></a></div>
<div><a href=# id=setall-button><button class="hostFontSize">Apply All Settings</button></a></div>
<div><a href=# id=separator1><button class="hostFontSize">&nbsp;</button></a></div>
Expand Down
17 changes: 16 additions & 1 deletion openpype/hosts/aftereffects/api/launch_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from openpype.tools.adobe_webserver.app import WebServerTool

from .ws_stub import get_stub
from .lib import set_settings
from .lib import set_settings, retrieve_custom_settings

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
Expand Down Expand Up @@ -328,6 +328,9 @@ async def sceneinventory_route(self):
async def setresolution_route(self):
self._settings_route(False, True)

async def setcustomresolution_route(self):
self._custom_settings_route(False, True, True)

async def setframes_route(self):
self._settings_route(True, False)

Expand Down Expand Up @@ -358,6 +361,18 @@ def _settings_route(self, frames, resolution):
# Required return statement.
return "nothing"

def _custom_settings_route(self, frames, resolution, use_custom_settings):
partial_method = functools.partial(set_settings,
frames,
resolution,
use_custom_settings=use_custom_settings)

ProcessLauncher.execute_in_main_thread(partial_method)

# Required return statement.
return "nothing"


def create_placeholder_route(self):
from openpype.hosts.aftereffects.api.workfile_template_builder import \
create_placeholder
Expand Down
53 changes: 51 additions & 2 deletions openpype/hosts/aftereffects/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import contextlib
import logging

from openpype.pipeline.context_tools import get_current_context
from openpype.pipeline.context_tools import get_current_context, get_project_settings
from openpype.client import get_asset_by_name
from openpype.pipeline import get_current_host_name
from .ws_stub import get_stub

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -120,7 +121,39 @@ def get_asset_settings(asset_doc):
}


def set_settings(frames, resolution, comp_ids=None, print_msg=True):
def get_custom_settings(project_name):
project_settings = get_project_settings(project_name)
custom_settings = project_settings.get('quad_custom_settings')
if not custom_settings:
log.warning("Can't access to quad custom settings. Custom settings will not be applied.")
return

return custom_settings


def get_workfile_overrides(custom_settings):
resolution_overrides = custom_settings.get("general", {}).get("working_resolution_overrides", None)
if not resolution_overrides:
log.warning("Can't retrieve resolution overrides for workfiles. Will not be applied.")
return

current_host_name = get_current_host_name()
overrides_group = _get_override_group(resolution_overrides, current_host_name)
if not overrides_group:
log.warning("Can't find overrides group that fit application. Abort.")

return overrides_group


def _get_override_group(resolution_overrides, current_host_name):
for resolution_overrides_set in resolution_overrides:
if current_host_name in resolution_overrides_set.get('hosts', []):
return resolution_overrides_set

return None


def set_settings(frames, resolution, comp_ids=None, print_msg=True, use_custom_settings=False):
"""Sets number of frames and resolution to selected comps.
Args:
Expand All @@ -144,7 +177,13 @@ def set_settings(frames, resolution, comp_ids=None, print_msg=True):
fps = settings["fps"]
msg += f"frame start:{frame_start}, duration:{frames_duration}, "\
f"fps:{fps}"

if resolution:
if use_custom_settings:
retrieve_custom_settings(
project_name=current_context["project_name"],
settings=settings
)
width = settings["resolutionWidth"]
height = settings["resolutionHeight"]
msg += f"width:{width} and height:{height}"
Expand All @@ -164,3 +203,13 @@ def set_settings(frames, resolution, comp_ids=None, print_msg=True):
fps, width, height)
if print_msg:
stub.print_msg(msg)

def retrieve_custom_settings(project_name, settings):
custom_settings = get_custom_settings(project_name)
workfile_overrides = get_workfile_overrides(custom_settings)

if workfile_overrides:
override_width = workfile_overrides.get('working_resolution_width')
if override_width: settings["resolutionWidth"] = override_width
override_height = workfile_overrides.get('working_resolution_height')
if override_height: settings["resolutionHeight"] = override_height
8 changes: 7 additions & 1 deletion openpype/hosts/aftereffects/plugins/create/create_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,13 @@ def create(self, subset_name_from_ui, data, pre_create_data):
self._add_instance_to_context(new_instance)

stub.rename_item(comp.id, subset_name)
set_settings(True, True, [comp.id], print_msg=False)
set_settings(
frames=True,
resolution=True,
comp_ids=[comp.id],
print_msg=False,
use_custom_settings=True
)

def get_pre_create_attr_defs(self):
output = [
Expand Down
8 changes: 4 additions & 4 deletions openpype/hosts/aftereffects/plugins/publish/collect_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ class AERenderInstance(RenderInstance):


class CollectAERender(publish.AbstractCollectRender):

order = pyblish.api.CollectorOrder + 0.405
label = "Collect After Effects Render Layers"
hosts = ["aftereffects"]
Expand All @@ -53,9 +52,9 @@ def get_instances(self, context):
version = context.data["version"]

project_entity = context.data["projectEntity"]
project_settings = get_project_settings(project_entity['name'])
project_settings = get_project_settings(project_entity["name"])
try:
format_conversion_table = project_settings['fix_custom_settings']['aftereffects']['publish']['CollectAERender']['format_conversion']
format_conversion_table = project_settings["quad_custom_settings"]["hosts"]["aftereffects"]["publish"]["CollectAERender"]["format_conversion"]
except KeyError:
self.log.warning("Can't retrieve format conversion table from after effects custom plugins.")
format_conversion_table = None
Expand Down Expand Up @@ -167,7 +166,8 @@ def _convert_format_label(self, retrieved_format, format_conversion_table):
return retrieved_format

return {
single_format['format'].lower(): single_format['converted_label'] for single_format in format_conversion_table
single_format['format'].lower(): single_format['converted_label'] for single_format in
format_conversion_table
}.get(retrieved_format.lower(), retrieved_format.lower())

def get_expected_files(self, render_instance):
Expand Down
4 changes: 2 additions & 2 deletions openpype/hosts/maya/api/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -524,9 +524,9 @@ def _update_renderlayer_instance(self, node, layer_name, subset):
# Rename the set to match the new layer name
set_layer_name = node.split(":")[-1]
new_set_name = node.replace(set_layer_name, layer_name)
cmds.rename(node, new_set_name)
renamed_node = cmds.rename(node, new_set_name)

return node
return renamed_node

def _create_layer_instance_node(self, layer):
# We only collect if a CreateRender instance exists
Expand Down
3 changes: 2 additions & 1 deletion openpype/hosts/maya/api/workfile_template_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,8 @@ def post_placeholder_process(self, placeholder, failed):
"""
node = placeholder.scene_identifier

cmds.sets(node, addElement=PLACEHOLDER_SET)
if cmds.objExists(PLACEHOLDER_SET):
cmds.sets(node, addElement=PLACEHOLDER_SET)
cmds.hide(node)
cmds.setAttr(node + ".hiddenInOutliner", True)
update_instances_frame_range()
Expand Down
76 changes: 76 additions & 0 deletions openpype/hosts/nuke/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -2543,6 +2543,8 @@ def reset_resolution(self):
"name": project_name
}

log.info(format_data)

if any(x_ for x_ in format_data.values() if x_ is None):
msg = ("Missing set shot attributes in DB."
"\nContact your supervisor!."
Expand Down Expand Up @@ -2604,6 +2606,80 @@ def set_context_settings(self):
self.set_colorspace()
del os.environ["OP_NUKE_SKIP_SAVE_EVENT"]

def set_custom_resolution(self):
custom_settings = self.get_custom_settings()
if not custom_settings:
log.warning("Can't access to quad custom settings. Custom settings will not be applied.")
return

self.set_workfile_overrides(
custom_settings=custom_settings
)

def get_custom_settings(self):
project_name = get_current_project_name()
project_settings = get_project_settings(project_name)

return project_settings.get('quad_custom_settings')

def set_workfile_overrides(self, custom_settings):
project_name = get_current_project_name()
resolution_overrides = custom_settings.get("general", {}).get("working_resolution_overrides", None)
if not resolution_overrides:
log.warning("Can't retrieve resolution overrides for workfiles. Will not be applied.")
return

host_name = get_current_host_name()
overrides_group = self._get_override_group(resolution_overrides, host_name)

if not overrides_group:
log.warning("Can't find overrides group that fit application. Abort.")

asset_data = self._asset_entity["data"]
format_data = {
"width": int(overrides_group.get('working_resolution_width')),
"height": int(overrides_group.get('working_resolution_height')),
"pixel_aspect": asset_data.get(
'pixelAspect',
asset_data.get('pixel_aspect', 1)),
"name": f"{project_name}_{host_name}"
}

if any(x_ for x_ in format_data.values() if x_ is None):
msg = ("Missing override from custom settings."
"\nContact your supervisor!."
"\n\nWidth: `{width}`"
"\nHeight: `{height}`"
"\nPixel Aspect: `{pixel_aspect}`").format(**format_data)
log.error(msg)
nuke.message(msg)

existing_format = None
for format in nuke.formats():
if format_data["name"] == format.name():
existing_format = format
break

if existing_format:
# Enforce existing format to be correct.
existing_format.setWidth(format_data["width"])
existing_format.setHeight(format_data["height"])
existing_format.setPixelAspect(format_data["pixel_aspect"])
else:
format_string = self.make_format_string(**format_data)
log.info("Creating new format: {}".format(format_string))
nuke.addFormat(format_string)

nuke.root()["format"].setValue(format_data["name"])
log.info(f"Format is set with values : {format_data}")

def _get_override_group(self, resolution_overrides, host_name):
for resolution_overrides_set in resolution_overrides:
if host_name in resolution_overrides_set.get('hosts', []):
return resolution_overrides_set

return None

def set_favorites(self):
from .utils import set_context_favorites

Expand Down
8 changes: 7 additions & 1 deletion openpype/hosts/nuke/api/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,11 +175,13 @@ def add_nuke_callbacks():

# set checker for last versions on loaded containers
nuke.addOnScriptLoad(check_inventory_versions)
nuke.addOnScriptSave(check_inventory_versions)

# set apply all workfile settings on script load and save
nuke.addOnScriptLoad(WorkfileSettings().set_context_settings)

# set apply all custom settings on script load and save
nuke.addOnScriptLoad(workfile_settings.set_custom_resolution)

# Emit events
nuke.addOnCreate(_on_scene_open, nodeClass="Root")
nuke.addOnScriptSave(_on_scene_save)
Expand Down Expand Up @@ -302,6 +304,10 @@ def _install_menu():
"Set Resolution",
lambda: WorkfileSettings().reset_resolution()
)
menu.addCommand(
"Set Custom Resolution",
lambda: WorkfileSettings().set_custom_resolution()
)
menu.addCommand(
"Set Frame Range",
lambda: WorkfileSettings().reset_frame_range_handles()
Expand Down
8 changes: 7 additions & 1 deletion openpype/hosts/tvpaint/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ def _calculate_in_range_frames(
# Calculate in range frames
in_range_frames = []
for frame_idx in exposure_frames:
# if the range_start is in between 2 exposure frame
if range_start > frame_idx:
output_idx_by_frame_idx[range_start] = frame_idx
if range_start <= frame_idx <= range_end:
output_idx_by_frame_idx[frame_idx] = frame_idx
in_range_frames.append(frame_idx)
Expand Down Expand Up @@ -257,7 +260,10 @@ def _cleanup_frame_references(output_idx_by_frame_idx):
real_reference_idx = reference_idx
_tmp_reference_idx = reference_idx
while True:
_temp = output_idx_by_frame_idx[_tmp_reference_idx]
_temp = output_idx_by_frame_idx.get(_tmp_reference_idx)
if not _temp:
# Key outside the range, skip
break
if _temp == _tmp_reference_idx:
real_reference_idx = _tmp_reference_idx
break
Expand Down
3 changes: 3 additions & 0 deletions openpype/pipeline/workfile/workfile_template_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -1609,6 +1609,9 @@ def populate_load_placeholder(self, placeholder, ignore_repre_ids=None):
self.log.info((
"There's no representation for this placeholder: {}"
).format(placeholder.scene_identifier))
self.post_placeholder_process(placeholder, failed=True)
if not placeholder.data.get("keep_placeholder", True):
self.delete_placeholder(placeholder)
return

repre_load_contexts = get_contexts_for_repre_docs(
Expand Down
5 changes: 4 additions & 1 deletion openpype/settings/entities/enum_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,9 @@ def _get_enum_values(self):

modules_system_settings = get_system_settings()["modules"]
deadline_enabled = modules_system_settings["deadline"]["enabled"]
if not deadline_enabled:
return [], set()

deadline_url = modules_system_settings["deadline"]["deadline_urls"].get("default", "") # noqa

try:
Expand Down Expand Up @@ -654,7 +657,7 @@ def _get_enum_values(self):
modules_system_settings = get_system_settings()["modules"]
deadline_enabled = modules_system_settings["deadline"]["enabled"]
if not deadline_enabled:
return
return [], set()

deadline_url = modules_system_settings["deadline"]["deadline_urls"].get("default", "") # noqa
manager = _get_modules_manager()
Expand Down
2 changes: 1 addition & 1 deletion openpype/version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
"""Package declaring Pype version."""

__version__ = "3.16.9-quad-1.12.0"
__version__ = "3.16.9-quad-1.13.0"

0 comments on commit d652e34

Please sign in to comment.