From 0dd55198ee568f7675507c8a9c984c9cd60e7dcb Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 9 Apr 2021 11:20:34 +0100 Subject: [PATCH 1/5] Set initial project settings. # Conflicts: # pype/hooks/tvpaint/prelaunch.py # pype/hosts/tvpaint/__init__.py --- openpype/hosts/tvpaint/api/__init__.py | 46 ++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/tvpaint/api/__init__.py b/openpype/hosts/tvpaint/api/__init__.py index 068559049b..5bc963742f 100644 --- a/openpype/hosts/tvpaint/api/__init__.py +++ b/openpype/hosts/tvpaint/api/__init__.py @@ -2,13 +2,15 @@ import os import logging from avalon.tvpaint.communication_server import register_localization_file -from avalon.tvpaint import pipeline +from avalon.tvpaint import pipeline, lib +import pype.lib import avalon.api +import avalon.io import pyblish.api from openpype.hosts import tvpaint -log = logging.getLogger("openpype.hosts.tvpaint") +log = logging.getLogger(__name__) HOST_DIR = os.path.dirname(os.path.abspath(tvpaint.__file__)) PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") @@ -34,6 +36,44 @@ def on_instance_toggle(instance, old_value, new_value): pipeline._write_instances(current_instances) +def application_launch(): + # Setup project settings if its the template that's launched. + if "PYPE_TVPAINT_LAUNCHED_TEMPLATE_FILE" in os.environ: + print("Setting up project...") + + project_doc = avalon.io.find_one({"type": "project"}) + project_data = project_doc["data"] + asset_data = pype.lib.get_asset()["data"] + + framerate = asset_data.get("fps", project_data.get("fps", 25)) + + width_key = "resolutionWidth" + height_key = "resolutionHeight" + width = asset_data.get(width_key, project_data.get(width_key, 1920)) + height = asset_data.get(height_key, project_data.get(height_key, 1080)) + + lib.execute_george("tv_resizepage {} {} 0".format(width, height)) + lib.execute_george("tv_framerate {} \"timestretch\"".format(framerate)) + + frame_start = asset_data.get("frameStart") + frame_end = asset_data.get("frameEnd") + + handles = asset_data.get("handles") or 0 + handle_start = asset_data.get("handleStart") + if handle_start is None: + handle_start = handles + + handle_end = asset_data.get("handleEnd") + if handle_end is None: + handle_end = handles + + frame_start -= int(handle_start) + frame_end += int(handle_end) + + lib.execute_george("tv_markin {} set".format(frame_start - 1)) + lib.execute_george("tv_markout {} set".format(frame_end - 1)) + + def install(): log.info("OpenPype - Installing TVPaint integration") localization_file = os.path.join(HOST_DIR, "resources", "avalon.loc") @@ -49,6 +89,8 @@ def install(): if on_instance_toggle not in registered_callbacks: pyblish.api.register_callback("instanceToggled", on_instance_toggle) + avalon.api.on("application.launched", application_launch) + def uninstall(): log.info("OpenPype - Uninstalling TVPaint integration") From 189a18e88ad0164e1c363fa0c3b3cc31f9b718bb Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 9 Apr 2021 12:35:37 +0100 Subject: [PATCH 2/5] Review fixes - moved settings code to lib. - checks for framerate, resolution and frame range. # Conflicts: # pype/hosts/tvpaint/__init__.py --- openpype/hosts/tvpaint/api/__init__.py | 49 ++++++------------------- openpype/hosts/tvpaint/api/lib.py | 51 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/openpype/hosts/tvpaint/api/__init__.py b/openpype/hosts/tvpaint/api/__init__.py index 5bc963742f..01b739bcc9 100644 --- a/openpype/hosts/tvpaint/api/__init__.py +++ b/openpype/hosts/tvpaint/api/__init__.py @@ -2,7 +2,9 @@ import os import logging from avalon.tvpaint.communication_server import register_localization_file -from avalon.tvpaint import pipeline, lib +import avalon.tvpaint.lib +import avalon.tvpaint.pipeline +from . import lib import pype.lib import avalon.api import avalon.io @@ -22,7 +24,7 @@ CREATE_PATH = os.path.join(PLUGINS_DIR, "create") def on_instance_toggle(instance, old_value, new_value): instance_id = instance.data["uuid"] found_idx = None - current_instances = pipeline.list_instances() + current_instances = avalon.tvpaint.pipeline.list_instances() for idx, workfile_instance in enumerate(current_instances): if workfile_instance["uuid"] == instance_id: found_idx = idx @@ -33,45 +35,16 @@ def on_instance_toggle(instance, old_value, new_value): if "active" in current_instances[found_idx]: current_instances[found_idx]["active"] = new_value - pipeline._write_instances(current_instances) + avalon.tvpaint.pipeline._write_instances(current_instances) -def application_launch(): +def initial_launch(): # Setup project settings if its the template that's launched. - if "PYPE_TVPAINT_LAUNCHED_TEMPLATE_FILE" in os.environ: - print("Setting up project...") + if os.environ.get("PYPE_TVPAINT_LAUNCHED_TEMPLATE_FILE") != "1": + return - project_doc = avalon.io.find_one({"type": "project"}) - project_data = project_doc["data"] - asset_data = pype.lib.get_asset()["data"] - - framerate = asset_data.get("fps", project_data.get("fps", 25)) - - width_key = "resolutionWidth" - height_key = "resolutionHeight" - width = asset_data.get(width_key, project_data.get(width_key, 1920)) - height = asset_data.get(height_key, project_data.get(height_key, 1080)) - - lib.execute_george("tv_resizepage {} {} 0".format(width, height)) - lib.execute_george("tv_framerate {} \"timestretch\"".format(framerate)) - - frame_start = asset_data.get("frameStart") - frame_end = asset_data.get("frameEnd") - - handles = asset_data.get("handles") or 0 - handle_start = asset_data.get("handleStart") - if handle_start is None: - handle_start = handles - - handle_end = asset_data.get("handleEnd") - if handle_end is None: - handle_end = handles - - frame_start -= int(handle_start) - frame_end += int(handle_end) - - lib.execute_george("tv_markin {} set".format(frame_start - 1)) - lib.execute_george("tv_markout {} set".format(frame_end - 1)) + print("Setting up project...") + lib.set_context_settings(pype.lib.get_asset()) def install(): @@ -89,7 +62,7 @@ def install(): if on_instance_toggle not in registered_callbacks: pyblish.api.register_callback("instanceToggled", on_instance_toggle) - avalon.api.on("application.launched", application_launch) + avalon.api.on("application.launched", initial_launch) def uninstall(): diff --git a/openpype/hosts/tvpaint/api/lib.py b/openpype/hosts/tvpaint/api/lib.py index 4267129fe6..654773b0f2 100644 --- a/openpype/hosts/tvpaint/api/lib.py +++ b/openpype/hosts/tvpaint/api/lib.py @@ -1,5 +1,8 @@ from PIL import Image +import avalon.io +import avalon.tvpaint.lib + def composite_images(input_image_paths, output_filepath): """Composite images in order from passed list. @@ -18,3 +21,51 @@ def composite_images(input_image_paths, output_filepath): else: img_obj.alpha_composite(_img_obj) img_obj.save(output_filepath) + + +def set_context_settings(asset): + project = avalon.io.find_one({"_id": asset["parent"]}) + + framerate = asset["data"].get("fps", project["data"].get("fps")) + if framerate: + avalon.tvpaint.lib.execute_george( + "tv_framerate {} \"timestretch\"".format(framerate) + ) + else: + print("Framerate was not found!") + + width_key = "resolutionWidth" + height_key = "resolutionHeight" + width = asset["data"].get(width_key, project["data"].get(width_key)) + height = asset["data"].get(height_key, project["data"].get(height_key)) + if width and height: + avalon.tvpaint.lib.execute_george( + "tv_resizepage {} {} 0".format(width, height) + ) + else: + print("Resolution was not found!") + + frame_start = asset["data"].get("frameStart") + frame_end = asset["data"].get("frameEnd") + + if frame_start and frame_end: + handles = asset["data"].get("handles") or 0 + handle_start = asset["data"].get("handleStart") + if handle_start is None: + handle_start = handles + + handle_end = asset["data"].get("handleEnd") + if handle_end is None: + handle_end = handles + + frame_start -= int(handle_start) + frame_end += int(handle_end) + + avalon.tvpaint.lib.execute_george( + "tv_markin {} set".format(frame_start - 1) + ) + avalon.tvpaint.lib.execute_george( + "tv_markout {} set".format(frame_end - 1) + ) + else: + print("Frame range was not found!") From 6352219085b5352e98abbf46b081d674fd1ce4c7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 13 Apr 2021 18:53:08 +0200 Subject: [PATCH 3/5] cleanup imports --- openpype/hosts/tvpaint/api/__init__.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/tvpaint/api/__init__.py b/openpype/hosts/tvpaint/api/__init__.py index 01b739bcc9..9e5dfa13ba 100644 --- a/openpype/hosts/tvpaint/api/__init__.py +++ b/openpype/hosts/tvpaint/api/__init__.py @@ -1,14 +1,11 @@ import os import logging -from avalon.tvpaint.communication_server import register_localization_file -import avalon.tvpaint.lib -import avalon.tvpaint.pipeline -from . import lib -import pype.lib import avalon.api -import avalon.io import pyblish.api +from avalon.tvpaint import pipeline +from avalon.tvpaint.communication_server import register_localization_file +from .lib import set_context_settings from openpype.hosts import tvpaint @@ -24,7 +21,7 @@ CREATE_PATH = os.path.join(PLUGINS_DIR, "create") def on_instance_toggle(instance, old_value, new_value): instance_id = instance.data["uuid"] found_idx = None - current_instances = avalon.tvpaint.pipeline.list_instances() + current_instances = pipeline.list_instances() for idx, workfile_instance in enumerate(current_instances): if workfile_instance["uuid"] == instance_id: found_idx = idx @@ -35,7 +32,7 @@ def on_instance_toggle(instance, old_value, new_value): if "active" in current_instances[found_idx]: current_instances[found_idx]["active"] = new_value - avalon.tvpaint.pipeline._write_instances(current_instances) + pipeline._write_instances(current_instances) def initial_launch(): @@ -43,8 +40,8 @@ def initial_launch(): if os.environ.get("PYPE_TVPAINT_LAUNCHED_TEMPLATE_FILE") != "1": return - print("Setting up project...") - lib.set_context_settings(pype.lib.get_asset()) + log.info("Setting up project...") + set_context_settings() def install(): From 6782062e535d9d98f0cb451f9ecde8b03f844a6b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 13 Apr 2021 18:53:50 +0200 Subject: [PATCH 4/5] make pair values explicit --- openpype/hosts/tvpaint/api/lib.py | 85 ++++++++++++++++++------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/openpype/hosts/tvpaint/api/lib.py b/openpype/hosts/tvpaint/api/lib.py index 654773b0f2..cbc86f7b03 100644 --- a/openpype/hosts/tvpaint/api/lib.py +++ b/openpype/hosts/tvpaint/api/lib.py @@ -1,7 +1,7 @@ from PIL import Image import avalon.io -import avalon.tvpaint.lib +from avalon.tvpaint.lib import execute_george def composite_images(input_image_paths, output_filepath): @@ -23,12 +23,26 @@ def composite_images(input_image_paths, output_filepath): img_obj.save(output_filepath) -def set_context_settings(asset): - project = avalon.io.find_one({"_id": asset["parent"]}) +def set_context_settings(asset_doc=None): + """Set workfile settings by asset document data. - framerate = asset["data"].get("fps", project["data"].get("fps")) - if framerate: - avalon.tvpaint.lib.execute_george( + Change fps, resolution and frame start/end. + """ + if asset_doc is None: + # Use current session asset if not passed + asset_doc = avalon.io.find_one({ + "type": "asset", + "name": avalon.io.Session["AVALON_ASSET"] + }) + + project_doc = avalon.io.find_one({"type": "project"}) + + framerate = asset_doc["data"].get("fps") + if framerate is None: + framerate = project_doc["data"].get("fps") + + if framerate is not None: + execute_george( "tv_framerate {} \"timestretch\"".format(framerate) ) else: @@ -36,36 +50,35 @@ def set_context_settings(asset): width_key = "resolutionWidth" height_key = "resolutionHeight" - width = asset["data"].get(width_key, project["data"].get(width_key)) - height = asset["data"].get(height_key, project["data"].get(height_key)) - if width and height: - avalon.tvpaint.lib.execute_george( - "tv_resizepage {} {} 0".format(width, height) - ) - else: + + width = asset_doc["data"].get(width_key) + height = asset_doc["data"].get(height_key) + if width is None or height is None: + width = project_doc["data"].get(width_key) + height = project_doc["data"].get(height_key) + + if width is None or height is None: print("Resolution was not found!") - - frame_start = asset["data"].get("frameStart") - frame_end = asset["data"].get("frameEnd") - - if frame_start and frame_end: - handles = asset["data"].get("handles") or 0 - handle_start = asset["data"].get("handleStart") - if handle_start is None: - handle_start = handles - - handle_end = asset["data"].get("handleEnd") - if handle_end is None: - handle_end = handles - - frame_start -= int(handle_start) - frame_end += int(handle_end) - - avalon.tvpaint.lib.execute_george( - "tv_markin {} set".format(frame_start - 1) - ) - avalon.tvpaint.lib.execute_george( - "tv_markout {} set".format(frame_end - 1) - ) else: + execute_george("tv_resizepage {} {} 0".format(width, height)) + + frame_start = asset_doc["data"].get("frameStart") + frame_end = asset_doc["data"].get("frameEnd") + + if frame_start is None or frame_end is None: print("Frame range was not found!") + return + + handles = asset_doc["data"].get("handles") or 0 + handle_start = asset_doc["data"].get("handleStart") + handle_end = asset_doc["data"].get("handleEnd") + + if handle_start is None or handle_end is None: + handle_start = handles + handle_end = handles + + frame_start -= int(handle_start) + frame_end += int(handle_end) + + execute_george("tv_markin {} set".format(frame_start - 1)) + execute_george("tv_markout {} set".format(frame_end - 1)) From 0ce878e7c2d5f69bd3165611dc6cab1100a8caff Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 13 Apr 2021 19:05:40 +0200 Subject: [PATCH 5/5] changed logic of setting tvpaint data on start for Pype 3 --- openpype/hosts/tvpaint/api/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/tvpaint/api/__init__.py b/openpype/hosts/tvpaint/api/__init__.py index 9e5dfa13ba..bd9ef51a76 100644 --- a/openpype/hosts/tvpaint/api/__init__.py +++ b/openpype/hosts/tvpaint/api/__init__.py @@ -37,7 +37,10 @@ def on_instance_toggle(instance, old_value, new_value): def initial_launch(): # Setup project settings if its the template that's launched. - if os.environ.get("PYPE_TVPAINT_LAUNCHED_TEMPLATE_FILE") != "1": + # TODO also check for template creation when it's possible to define + # templates + last_workfile = os.environ.get("AVALON_LAST_WORKFILE") + if not last_workfile or os.path.exists(last_workfile): return log.info("Setting up project...")