From 46c831e585ac95c98675fd3edbb3028f43c7e22d Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 19 May 2020 13:31:01 +0200 Subject: [PATCH 01/15] feat(resolve): adding resolve host basics --- pype/hooks/resolve/prelaunch.py | 42 +++++++++++++++ pype/resolve/README.markdown | 1 + pype/resolve/__init__.py | 71 +++++++++++++++++++++++++ pype/resolve/lib.py | 89 ++++++++++++++++++++++++++++++++ res/app_icons/resolve.png | Bin 0 -> 252602 bytes 5 files changed, 203 insertions(+) create mode 100644 pype/hooks/resolve/prelaunch.py create mode 100644 pype/resolve/README.markdown create mode 100644 pype/resolve/__init__.py create mode 100644 pype/resolve/lib.py create mode 100644 res/app_icons/resolve.png diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py new file mode 100644 index 0000000000..0020677c4c --- /dev/null +++ b/pype/hooks/resolve/prelaunch.py @@ -0,0 +1,42 @@ +import os +import traceback +from pype.lib import PypeHook +from pypeapp import Logger +from pype.resolve import lib as rlib + + +class ResolvePrelaunch(PypeHook): + """ + This hook will check if current workfile path has Resolve + project inside. IF not, it initialize it and finally it pass + path to the project by environment variable to Premiere launcher + shell script. + """ + + def __init__(self, logger=None): + if not logger: + self.log = Logger().get_logger(self.__class__.__name__) + else: + self.log = logger + + self.signature = "( {} )".format(self.__class__.__name__) + + def execute(self, *args, env: dict = None) -> bool: + + if not env: + env = os.environ + + try: + __import__("pype.resolve") + __import__("pyblish") + + except ImportError as e: + print(traceback.format_exc()) + print("pyblish: Could not load integration: %s " % e) + + else: + # Resolve Setup integration + # importlib.reload(prlib) + rlib.setup(env) + + return True diff --git a/pype/resolve/README.markdown b/pype/resolve/README.markdown new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/pype/resolve/README.markdown @@ -0,0 +1 @@ + diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py new file mode 100644 index 0000000000..1e6c7c2274 --- /dev/null +++ b/pype/resolve/__init__.py @@ -0,0 +1,71 @@ +import os +from avalon import api as avalon +from pyblish import api as pyblish +from pypeapp import Logger + + +from .lib import ( + setup, + reload_pipeline, + ls, + LOAD_PATH, + CREATE_PATH, + PUBLISH_PATH +) + +__all__ = [ + "setup", + "reload_pipeline", + "ls" +] + +log = Logger().get_logger(__name__, "resolve") + + +def install(): + """Install resolve-specific functionality of avalon-core. + + This is where you install menus and register families, data + and loaders into resolve. + + It is called automatically when installing via `api.install(resolve)`. + + See the Maya equivalent for inspiration on how to implement this. + + """ + + # Disable all families except for the ones we explicitly want to see + family_states = [ + "imagesequence", + "mov" + ] + avalon.data["familiesStateDefault"] = False + avalon.data["familiesStateToggled"] = family_states + + log.info("pype.resolve installed") + + pyblish.register_host("resolve") + pyblish.register_plugin_path(PUBLISH_PATH) + log.info("Registering Premiera plug-ins..") + + avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + + +def uninstall(): + """Uninstall all tha was installed + + This is where you undo everything that was done in `install()`. + That means, removing menus, deregistering families and data + and everything. It should be as though `install()` was never run, + because odds are calling this function means the user is interested + in re-installing shortly afterwards. If, for example, he has been + modifying the menu or registered families. + + """ + pyblish.deregister_host("resolve") + pyblish.deregister_plugin_path(PUBLISH_PATH) + log.info("Deregistering Premiera plug-ins..") + + avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) + avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py new file mode 100644 index 0000000000..012bcdd80c --- /dev/null +++ b/pype/resolve/lib.py @@ -0,0 +1,89 @@ +import os +import sys +import shutil +import json +from pysync import walktree +import requests + +from avalon import api +from pype.widgets.message_window import message +from pypeapp import Logger + + +log = Logger().get_logger(__name__, "resolve") + +self = sys.modules[__name__] +self._has_been_setup = False +self._registered_gui = None + +AVALON_CONFIG = os.environ["AVALON_CONFIG"] + +PARENT_DIR = os.path.dirname(__file__) +PACKAGE_DIR = os.path.dirname(PARENT_DIR) +PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") + +self.EXTENSIONS_PATH_REMOTE = os.path.join(PARENT_DIR, "extensions") +self.EXTENSIONS_PATH_LOCAL = None +self.EXTENSIONS_CACHE_PATH = None + +self.LOAD_PATH = os.path.join(PLUGINS_DIR, "resolve", "load") +self.CREATE_PATH = os.path.join(PLUGINS_DIR, "resolve", "create") +self.INVENTORY_PATH = os.path.join(PLUGINS_DIR, "resolve", "inventory") + +self.PUBLISH_PATH = os.path.join( + PLUGINS_DIR, "resolve", "publish" +).replace("\\", "/") + +if os.getenv("PUBLISH_PATH", None): + if self.PUBLISH_PATH not in os.environ["PUBLISH_PATH"]: + os.environ["PUBLISH_PATH"] = os.pathsep.join( + os.environ["PUBLISH_PATH"].split(os.pathsep) + + [self.PUBLISH_PATH] + ) +else: + os.environ["PUBLISH_PATH"] = self.PUBLISH_PATH + + +def ls(): + pass + + +def reload_pipeline(): + """Attempt to reload pipeline at run-time. + + CAUTION: This is primarily for development and debugging purposes. + + """ + + import importlib + import pype.resolve + + api.uninstall() + + for module in ("avalon.io", + "avalon.lib", + "avalon.pipeline", + "avalon.api", + "avalon.tools", + + "{}".format(AVALON_CONFIG), + "{}.resolve".format(AVALON_CONFIG), + "{}.resolve.lib".format(AVALON_CONFIG) + ): + log.info("Reloading module: {}...".format(module)) + try: + module = importlib.import_module(module) + importlib.reload(module) + except Exception as e: + log.warning("Cannot reload module: {}".format(e)) + + api.install(pype.resolve) + + +def setup(env=None): + """ Running wrapper + """ + if not env: + env = os.environ + + log.info("Resolve Pype wrapper has been installed") diff --git a/res/app_icons/resolve.png b/res/app_icons/resolve.png new file mode 100644 index 0000000000000000000000000000000000000000..d084288d906e6628c1e78676bd1d581aced26a86 GIT binary patch literal 252602 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 K4aMhTVW61-YdWEnkf6gM?w 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

S{aj3H{MHWV-rPc`LRtXOI(OchP7NkU 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

mGb7C!t8n<#iL;Xm^qncuSd0Gf;#gF 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 Date: Fri, 22 May 2020 18:32:52 +0200 Subject: [PATCH 02/15] feat(resolve): launching with pre imported resolve python console --- pype/hooks/resolve/prelaunch.py | 3 ++ pype/resolve/pre_python_console_script.py | 26 +++++++++++++++++ pype/resolve/python_get_resolve.py | 34 +++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 pype/resolve/pre_python_console_script.py create mode 100644 pype/resolve/python_get_resolve.py diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index 0020677c4c..ebf101dc1d 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -26,6 +26,9 @@ class ResolvePrelaunch(PypeHook): if not env: env = os.environ + env["PRE_PYTHON_SCRIPT"] = os.path.normpath(env["PRE_PYTHON_SCRIPT"]) + self.log.info(env["PRE_PYTHON_SCRIPT"]) + try: __import__("pype.resolve") __import__("pyblish") diff --git a/pype/resolve/pre_python_console_script.py b/pype/resolve/pre_python_console_script.py new file mode 100644 index 0000000000..1c1aceaddd --- /dev/null +++ b/pype/resolve/pre_python_console_script.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +import time +from python_get_resolve import GetResolve + +wait_delay = 2.5 +wait = 0.00 +ready = None +while True: + try: + # Create project and set parameters: + resolve = GetResolve() + PM = resolve.GetProjectManager() + P = PM.GetCurrentProject() + if P.GetName() == "Untitled Project": + ready = None + else: + ready = True + except AttributeError: + pass + + if ready is None: + time.sleep(wait_delay) + print(f"Waiting {wait}s for Resolve to be open inproject") + wait += wait_delay + else: + break diff --git a/pype/resolve/python_get_resolve.py b/pype/resolve/python_get_resolve.py new file mode 100644 index 0000000000..862a5bb758 --- /dev/null +++ b/pype/resolve/python_get_resolve.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +""" +This file serves to return a DaVinci Resolve object +""" + +import sys + +def GetResolve(): + try: + # The PYTHONPATH needs to be set correctly for this import statement to work. + # An alternative is to import the DaVinciResolveScript by specifying absolute path (see ExceptionHandler logic) + import DaVinciResolveScript as bmd + except ImportError: + if sys.platform.startswith("darwin"): + expectedPath="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules/" + elif sys.platform.startswith("win") or sys.platform.startswith("cygwin"): + import os + expectedPath=os.getenv('PROGRAMDATA') + "\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\Modules\\" + elif sys.platform.startswith("linux"): + expectedPath="/opt/resolve/libs/Fusion/Modules/" + + # check if the default path has it... + print("Unable to find module DaVinciResolveScript from $PYTHONPATH - trying default locations") + try: + import imp + bmd = imp.load_source('DaVinciResolveScript', expectedPath+"DaVinciResolveScript.py") + except ImportError: + # No fallbacks ... report error: + print("Unable to find module DaVinciResolveScript - please ensure that the module DaVinciResolveScript is discoverable by python") + print("For a default DaVinci Resolve installation, the module is expected to be located in: "+expectedPath) + sys.exit() + + return bmd.scriptapp("Resolve") From 1dc624cdc6d3b4caf0bda30657e64d415efb3910 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 25 May 2020 19:54:43 +0200 Subject: [PATCH 03/15] feat(resolve): updating resolve integration --- pype/hooks/resolve/prelaunch.py | 25 ++++++- pype/resolve/__init__.py | 12 ++-- pype/resolve/lib.py | 48 +++++++++---- .../python_get_resolve.py | 0 .../resolve_utility_scripts/resolveapitest.py | 72 +++++++++++++++++++ pype/resolve/resolve_utility_scripts/test.py | 8 +++ .../pre_python_console_script.py | 0 pype/resolve/utility/python_get_resolve.py | 34 +++++++++ 8 files changed, 176 insertions(+), 23 deletions(-) rename pype/resolve/{ => resolve_utility_scripts}/python_get_resolve.py (100%) create mode 100644 pype/resolve/resolve_utility_scripts/resolveapitest.py create mode 100644 pype/resolve/resolve_utility_scripts/test.py rename pype/resolve/{ => utility}/pre_python_console_script.py (100%) create mode 100644 pype/resolve/utility/python_get_resolve.py diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index ebf101dc1d..e3e1c83077 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -26,8 +26,28 @@ class ResolvePrelaunch(PypeHook): if not env: env = os.environ - env["PRE_PYTHON_SCRIPT"] = os.path.normpath(env["PRE_PYTHON_SCRIPT"]) - self.log.info(env["PRE_PYTHON_SCRIPT"]) + # making sure pyton 3.6 is installed at provided path + py36_dir = os.path.normpath(env.get("PYTHON36_RES", "")) + assert os.path.isdir(py36_dir), ( + "Python 3.6 is not installed at the provided folder path. Either " + "make sure the `environments\resolve.json` is having correctly set " + "`PYTHON36_RES` or make sure Python 3.6 is installed in given path." + f"\nPYTHON36_RES: `{py36_dir}`" + ) + env["PYTHON36_RES"] = py36_dir + + # setting utility scripts dir for scripts syncing + us_dir = os.path.normpath(env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "")) + assert os.path.isdir(us_dir), ( + "Resolve utility script dir does not exists. Either make sure " + "the `environments\resolve.json` is having correctly set " + "`RESOLVE_UTILITY_SCRIPTS_DIR` or reinstall DaVinci Resolve. \n" + f"RESOLVE_UTILITY_SCRIPTS_DIR: `{us_dir}`" + ) + + # correctly format path for pre python script + pre_py_sc = os.path.normpath(env.get("PRE_PYTHON_SCRIPT", "")) + env["PRE_PYTHON_SCRIPT"] = pre_py_sc try: __import__("pype.resolve") @@ -39,7 +59,6 @@ class ResolvePrelaunch(PypeHook): else: # Resolve Setup integration - # importlib.reload(prlib) rlib.setup(env) return True diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py index 1e6c7c2274..0683cfa92f 100644 --- a/pype/resolve/__init__.py +++ b/pype/resolve/__init__.py @@ -8,8 +8,8 @@ from .lib import ( setup, reload_pipeline, ls, - LOAD_PATH, - CREATE_PATH, + # LOAD_PATH, + # CREATE_PATH, PUBLISH_PATH ) @@ -48,8 +48,8 @@ def install(): pyblish.register_plugin_path(PUBLISH_PATH) log.info("Registering Premiera plug-ins..") - avalon.register_plugin_path(avalon.Loader, LOAD_PATH) - avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + # avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + # avalon.register_plugin_path(avalon.Creator, CREATE_PATH) def uninstall(): @@ -67,5 +67,5 @@ def uninstall(): pyblish.deregister_plugin_path(PUBLISH_PATH) log.info("Deregistering Premiera plug-ins..") - avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) - avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) + # avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) + # avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py index 012bcdd80c..95586b00eb 100644 --- a/pype/resolve/lib.py +++ b/pype/resolve/lib.py @@ -1,34 +1,21 @@ import os import sys import shutil -import json -from pysync import walktree -import requests from avalon import api from pype.widgets.message_window import message from pypeapp import Logger - log = Logger().get_logger(__name__, "resolve") self = sys.modules[__name__] -self._has_been_setup = False -self._registered_gui = None AVALON_CONFIG = os.environ["AVALON_CONFIG"] - PARENT_DIR = os.path.dirname(__file__) PACKAGE_DIR = os.path.dirname(PARENT_DIR) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") -self.EXTENSIONS_PATH_REMOTE = os.path.join(PARENT_DIR, "extensions") -self.EXTENSIONS_PATH_LOCAL = None -self.EXTENSIONS_CACHE_PATH = None - -self.LOAD_PATH = os.path.join(PLUGINS_DIR, "resolve", "load") -self.CREATE_PATH = os.path.join(PLUGINS_DIR, "resolve", "create") -self.INVENTORY_PATH = os.path.join(PLUGINS_DIR, "resolve", "inventory") +self.UTILITY_SCRIPTS = os.path.join(PARENT_DIR, "resolve_utility_scripts") self.PUBLISH_PATH = os.path.join( PLUGINS_DIR, "resolve", "publish" @@ -48,6 +35,36 @@ def ls(): pass +def sync_utility_scripts(env=None): + """ Synchronizing basic utlility scripts for resolve. + + To be able to run scripts from inside `Resolve/Workspace/Scripts` menu + all scripts has to be accessible from defined folder. + """ + if not env: + env = os.environ + + us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "") + scripts = os.listdir(self.UTILITY_SCRIPTS) + + log.info(f"Utility Scripts Dir: `{self.UTILITY_SCRIPTS}`") + log.info(f"Utility Scripts: `{scripts}`") + + # make sure no script file is in folder + if next((s for s in os.listdir(us_dir)), None): + for s in os.listdir(us_dir): + path = os.path.join(us_dir, s) + log.info(f"Removing `{path}`...") + os.remove(path) + + # copy scripts into Resolve's utility scripts dir + for s in scripts: + src = os.path.join(self.UTILITY_SCRIPTS, s) + dst = os.path.join(us_dir, s) + log.info(f"Copying `{src}` to `{dst}`...") + shutil.copy2(src, dst) + + def reload_pipeline(): """Attempt to reload pipeline at run-time. @@ -86,4 +103,7 @@ def setup(env=None): if not env: env = os.environ + # synchronize resolve utility scripts + sync_utility_scripts(env) + log.info("Resolve Pype wrapper has been installed") diff --git a/pype/resolve/python_get_resolve.py b/pype/resolve/resolve_utility_scripts/python_get_resolve.py similarity index 100% rename from pype/resolve/python_get_resolve.py rename to pype/resolve/resolve_utility_scripts/python_get_resolve.py diff --git a/pype/resolve/resolve_utility_scripts/resolveapitest.py b/pype/resolve/resolve_utility_scripts/resolveapitest.py new file mode 100644 index 0000000000..e7cc32a864 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/resolveapitest.py @@ -0,0 +1,72 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# This script tests Resolve 15 scripting API on MacOS. +# We suspect an issue with import of fusionscript.so. +# To test launch Resolve Studio first and then run this script. +# The script will save a text report. +# igor@hdhead.com + +from datetime import datetime +import os +import sys +import imp + +eol = '\n' +pathLib = 'C:\\Program Files\\Blackmagic Design\\DaVinci Resolve\\fusionscript.dll' + +reportDir = "C:\\Users\\jezsc" + +# Create initial report file. It will overwrite existing! +reportName = 'Resolve_API_Report.txt' +reportPath = os.path.join(reportDir, reportName) +reportfile = open(reportPath, 'w') +reportfile.close() + + +def report(entry): + # Print to console + print entry + + # Write a report entry + reportfile = open(reportPath, 'a') + reportfile.write(entry) + reportfile.write(eol) + reportfile.close() + + +# These are the values we'll discover and save +report('Time: ' + str(datetime.now())) +report('Python Version: ' + sys.version) +report('Interpreter Path: ' + sys.executable) +report('___________________________________' + eol) + +report('If no lines follow we have likely experienced a Fatal Python Error.') + +try: + # Will the API library import? Does it exist? + smodule = imp.load_dynamic('fusionscript', pathLib) + report('Imported fusionscript.so') + + # It looks like the library imported. Can we create a resolve instance now? + try: + resolve = smodule.scriptapp('Resolve') + if 'None' in str(type(resolve)): + report('Resolve instance is created, but Resolve is not found.') + sys.exit() + if 'PyRemoteObject' in str(type(resolve)): + report('Resolve instance is created and Resolve is responsive.') + except Exception, e: + report(str(e)) + + # Let's go nuts and count how many projects are in the Project Manager + try: + projman = resolve.GetProjectManager() + projects = projman.GetProjectsInCurrentFolder() + report('Project Count: ' + str(len(projects))) + report('All is well!') + except Exception, e: + report(str(e)) + +except Exception, e: + report(str(e)) diff --git a/pype/resolve/resolve_utility_scripts/test.py b/pype/resolve/resolve_utility_scripts/test.py new file mode 100644 index 0000000000..7d32aabfe5 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/test.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3.6 +from python_get_resolve import GetResolve + +resolve = GetResolve() +PM = resolve.GetProjectManager() +P = PM.GetCurrentProject() + +print(P.GetName()) diff --git a/pype/resolve/pre_python_console_script.py b/pype/resolve/utility/pre_python_console_script.py similarity index 100% rename from pype/resolve/pre_python_console_script.py rename to pype/resolve/utility/pre_python_console_script.py diff --git a/pype/resolve/utility/python_get_resolve.py b/pype/resolve/utility/python_get_resolve.py new file mode 100644 index 0000000000..862a5bb758 --- /dev/null +++ b/pype/resolve/utility/python_get_resolve.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +""" +This file serves to return a DaVinci Resolve object +""" + +import sys + +def GetResolve(): + try: + # The PYTHONPATH needs to be set correctly for this import statement to work. + # An alternative is to import the DaVinciResolveScript by specifying absolute path (see ExceptionHandler logic) + import DaVinciResolveScript as bmd + except ImportError: + if sys.platform.startswith("darwin"): + expectedPath="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules/" + elif sys.platform.startswith("win") or sys.platform.startswith("cygwin"): + import os + expectedPath=os.getenv('PROGRAMDATA') + "\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\Modules\\" + elif sys.platform.startswith("linux"): + expectedPath="/opt/resolve/libs/Fusion/Modules/" + + # check if the default path has it... + print("Unable to find module DaVinciResolveScript from $PYTHONPATH - trying default locations") + try: + import imp + bmd = imp.load_source('DaVinciResolveScript', expectedPath+"DaVinciResolveScript.py") + except ImportError: + # No fallbacks ... report error: + print("Unable to find module DaVinciResolveScript - please ensure that the module DaVinciResolveScript is discoverable by python") + print("For a default DaVinci Resolve installation, the module is expected to be located in: "+expectedPath) + sys.exit() + + return bmd.scriptapp("Resolve") From 341379e546807e1dfa6794402e9dffcea3931088 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 27 May 2020 18:20:52 +0200 Subject: [PATCH 04/15] feat(resolve): wip integration workio, pipeline and basic avalon methods, menu, --- pype/hooks/resolve/prelaunch.py | 13 +- pype/plugins/resolve/publish/collect_host.py | 17 ++ pype/resolve/__init__.py | 106 ++++------ pype/resolve/action.py | 53 +++++ pype/resolve/lib.py | 109 ----------- pype/resolve/menu.py | 133 +++++++++++++ pype/resolve/menu_style.qss | 34 ++++ pype/resolve/pipeline.py | 184 ++++++++++++++++++ pype/resolve/plugin.py | 75 +++++++ pype/resolve/preload_console.py | 29 +++ .../resolve_utility_scripts/Pype_menu.py | 34 ++++ .../resolve_utility_scripts/README.markdown | 1 + .../resolve_utility_scripts/__test_gui.py | 111 +++++++++++ .../resolve_utility_scripts/__test_pyblish.py | 57 ++++++ .../__test_subprocess.py | 36 ++++ .../python_get_resolve.py | 34 ---- .../resolve_utility_scripts/resolveapitest.py | 72 ------- pype/resolve/resolve_utility_scripts/test.py | 8 - .../utility/pre_python_console_script.py | 26 --- pype/resolve/utility/python_get_resolve.py | 34 ---- pype/resolve/utils.py | 114 +++++++++++ pype/resolve/workio.py | 88 +++++++++ 22 files changed, 1014 insertions(+), 354 deletions(-) create mode 100644 pype/plugins/resolve/publish/collect_host.py create mode 100644 pype/resolve/action.py create mode 100644 pype/resolve/menu.py create mode 100644 pype/resolve/menu_style.qss create mode 100644 pype/resolve/pipeline.py create mode 100644 pype/resolve/plugin.py create mode 100644 pype/resolve/preload_console.py create mode 100644 pype/resolve/resolve_utility_scripts/Pype_menu.py create mode 100644 pype/resolve/resolve_utility_scripts/README.markdown create mode 100644 pype/resolve/resolve_utility_scripts/__test_gui.py create mode 100644 pype/resolve/resolve_utility_scripts/__test_pyblish.py create mode 100644 pype/resolve/resolve_utility_scripts/__test_subprocess.py delete mode 100644 pype/resolve/resolve_utility_scripts/python_get_resolve.py delete mode 100644 pype/resolve/resolve_utility_scripts/resolveapitest.py delete mode 100644 pype/resolve/resolve_utility_scripts/test.py delete mode 100644 pype/resolve/utility/pre_python_console_script.py delete mode 100644 pype/resolve/utility/python_get_resolve.py create mode 100644 pype/resolve/utils.py create mode 100644 pype/resolve/workio.py diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index e3e1c83077..d0b7448a41 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -2,7 +2,7 @@ import os import traceback from pype.lib import PypeHook from pypeapp import Logger -from pype.resolve import lib as rlib +from pype.resolve import utils class ResolvePrelaunch(PypeHook): @@ -27,14 +27,15 @@ class ResolvePrelaunch(PypeHook): env = os.environ # making sure pyton 3.6 is installed at provided path - py36_dir = os.path.normpath(env.get("PYTHON36_RES", "")) + py36_dir = os.path.normpath(env.get("PYTHON36_RESOLVE", "")) assert os.path.isdir(py36_dir), ( "Python 3.6 is not installed at the provided folder path. Either " "make sure the `environments\resolve.json` is having correctly set " - "`PYTHON36_RES` or make sure Python 3.6 is installed in given path." - f"\nPYTHON36_RES: `{py36_dir}`" + "`PYTHON36_RESOLVE` or make sure Python 3.6 is installed in given path." + f"\nPYTHON36_RESOLVE: `{py36_dir}`" ) - env["PYTHON36_RES"] = py36_dir + self.log.info(f"Path to Resolve Python folder: `{py36_dir}`...") + env["PYTHON36_RESOLVE"] = py36_dir # setting utility scripts dir for scripts syncing us_dir = os.path.normpath(env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "")) @@ -59,6 +60,6 @@ class ResolvePrelaunch(PypeHook): else: # Resolve Setup integration - rlib.setup(env) + utils.setup(env) return True diff --git a/pype/plugins/resolve/publish/collect_host.py b/pype/plugins/resolve/publish/collect_host.py new file mode 100644 index 0000000000..9119ba1f4f --- /dev/null +++ b/pype/plugins/resolve/publish/collect_host.py @@ -0,0 +1,17 @@ +import pyblish.api +from python_get_resolve import GetResolve + + +class CollectProject(pyblish.api.ContextPlugin): + """Collect Project object""" + + order = pyblish.api.CollectorOrder - 0.1 + label = "Collect Project" + hosts = ["resolve"] + + def process(self, context): + resolve = GetResolve() + PM = resolve.GetProjectManager() + P = PM.GetCurrentProject() + + self.log.info(P.GetName()) diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py index 0683cfa92f..966d7aef4c 100644 --- a/pype/resolve/__init__.py +++ b/pype/resolve/__init__.py @@ -1,71 +1,47 @@ -import os -from avalon import api as avalon -from pyblish import api as pyblish -from pypeapp import Logger - - -from .lib import ( - setup, - reload_pipeline, +from .pipeline import ( + install, + uninstall, ls, - # LOAD_PATH, - # CREATE_PATH, - PUBLISH_PATH + containerise, + reload_pipeline, + publish, + launch_workfiles_app ) +from .utils import ( + setup, + get_resolve_module +) + +from .workio import ( + open_file, + save_file, + current_file, + has_unsaved_changes, + file_extensions, + work_root +) + +# from .lib import ( +# +# ) + __all__ = [ - "setup", + "install", + "uninstall", + "ls", + "containerise", "reload_pipeline", - "ls" + "publish", + "launch_workfiles_app", + + "setup", + "get_resolve_module", + + "open_file", + "save_file", + "current_file", + "has_unsaved_changes", + "file_extensions", + "work_root" ] - -log = Logger().get_logger(__name__, "resolve") - - -def install(): - """Install resolve-specific functionality of avalon-core. - - This is where you install menus and register families, data - and loaders into resolve. - - It is called automatically when installing via `api.install(resolve)`. - - See the Maya equivalent for inspiration on how to implement this. - - """ - - # Disable all families except for the ones we explicitly want to see - family_states = [ - "imagesequence", - "mov" - ] - avalon.data["familiesStateDefault"] = False - avalon.data["familiesStateToggled"] = family_states - - log.info("pype.resolve installed") - - pyblish.register_host("resolve") - pyblish.register_plugin_path(PUBLISH_PATH) - log.info("Registering Premiera plug-ins..") - - # avalon.register_plugin_path(avalon.Loader, LOAD_PATH) - # avalon.register_plugin_path(avalon.Creator, CREATE_PATH) - - -def uninstall(): - """Uninstall all tha was installed - - This is where you undo everything that was done in `install()`. - That means, removing menus, deregistering families and data - and everything. It should be as though `install()` was never run, - because odds are calling this function means the user is interested - in re-installing shortly afterwards. If, for example, he has been - modifying the menu or registered families. - - """ - pyblish.deregister_host("resolve") - pyblish.deregister_plugin_path(PUBLISH_PATH) - log.info("Deregistering Premiera plug-ins..") - - # avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) - # avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) diff --git a/pype/resolve/action.py b/pype/resolve/action.py new file mode 100644 index 0000000000..94d0f5eb67 --- /dev/null +++ b/pype/resolve/action.py @@ -0,0 +1,53 @@ +# absolute_import is needed to counter the `module has no cmds error` in Maya +from __future__ import absolute_import + +import pyblish.api + + +from ..action import get_errored_instances_from_context + + +class SelectInvalidAction(pyblish.api.Action): + """Select invalid clips in Resolve timeline when plug-in failed. + + To retrieve the invalid nodes this assumes a static `get_invalid()` + method is available on the plugin. + + """ + label = "Select invalid" + on = "failed" # This action is only available on a failed plug-in + icon = "search" # Icon from Awesome Icon + + def process(self, context, plugin): + + try: + from pype.resolve.utils import get_resolve_module + resolve = get_resolve_module() + except ImportError: + raise ImportError("Current host is not Resolve") + + errored_instances = get_errored_instances_from_context(context) + + # Apply pyblish.logic to get the instances for the plug-in + instances = pyblish.api.instances_by_plugin(errored_instances, plugin) + + # Get the invalid nodes for the plug-ins + self.log.info("Finding invalid clips..") + invalid = list() + for instance in instances: + invalid_nodes = plugin.get_invalid(instance) + if invalid_nodes: + if isinstance(invalid_nodes, (list, tuple)): + invalid.extend(invalid_nodes) + else: + self.log.warning("Plug-in returned to be invalid, " + "but has no selectable nodes.") + + # Ensure unique (process each node only once) + invalid = list(set(invalid)) + + if invalid: + self.log.info("Selecting invalid nodes: %s" % ", ".join(invalid)) + # TODO: select resolve timeline track items in current timeline + else: + self.log.info("No invalid nodes found.") diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py index 95586b00eb..e69de29bb2 100644 --- a/pype/resolve/lib.py +++ b/pype/resolve/lib.py @@ -1,109 +0,0 @@ -import os -import sys -import shutil - -from avalon import api -from pype.widgets.message_window import message -from pypeapp import Logger - -log = Logger().get_logger(__name__, "resolve") - -self = sys.modules[__name__] - -AVALON_CONFIG = os.environ["AVALON_CONFIG"] -PARENT_DIR = os.path.dirname(__file__) -PACKAGE_DIR = os.path.dirname(PARENT_DIR) -PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") - -self.UTILITY_SCRIPTS = os.path.join(PARENT_DIR, "resolve_utility_scripts") - -self.PUBLISH_PATH = os.path.join( - PLUGINS_DIR, "resolve", "publish" -).replace("\\", "/") - -if os.getenv("PUBLISH_PATH", None): - if self.PUBLISH_PATH not in os.environ["PUBLISH_PATH"]: - os.environ["PUBLISH_PATH"] = os.pathsep.join( - os.environ["PUBLISH_PATH"].split(os.pathsep) + - [self.PUBLISH_PATH] - ) -else: - os.environ["PUBLISH_PATH"] = self.PUBLISH_PATH - - -def ls(): - pass - - -def sync_utility_scripts(env=None): - """ Synchronizing basic utlility scripts for resolve. - - To be able to run scripts from inside `Resolve/Workspace/Scripts` menu - all scripts has to be accessible from defined folder. - """ - if not env: - env = os.environ - - us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "") - scripts = os.listdir(self.UTILITY_SCRIPTS) - - log.info(f"Utility Scripts Dir: `{self.UTILITY_SCRIPTS}`") - log.info(f"Utility Scripts: `{scripts}`") - - # make sure no script file is in folder - if next((s for s in os.listdir(us_dir)), None): - for s in os.listdir(us_dir): - path = os.path.join(us_dir, s) - log.info(f"Removing `{path}`...") - os.remove(path) - - # copy scripts into Resolve's utility scripts dir - for s in scripts: - src = os.path.join(self.UTILITY_SCRIPTS, s) - dst = os.path.join(us_dir, s) - log.info(f"Copying `{src}` to `{dst}`...") - shutil.copy2(src, dst) - - -def reload_pipeline(): - """Attempt to reload pipeline at run-time. - - CAUTION: This is primarily for development and debugging purposes. - - """ - - import importlib - import pype.resolve - - api.uninstall() - - for module in ("avalon.io", - "avalon.lib", - "avalon.pipeline", - "avalon.api", - "avalon.tools", - - "{}".format(AVALON_CONFIG), - "{}.resolve".format(AVALON_CONFIG), - "{}.resolve.lib".format(AVALON_CONFIG) - ): - log.info("Reloading module: {}...".format(module)) - try: - module = importlib.import_module(module) - importlib.reload(module) - except Exception as e: - log.warning("Cannot reload module: {}".format(e)) - - api.install(pype.resolve) - - -def setup(env=None): - """ Running wrapper - """ - if not env: - env = os.environ - - # synchronize resolve utility scripts - sync_utility_scripts(env) - - log.info("Resolve Pype wrapper has been installed") diff --git a/pype/resolve/menu.py b/pype/resolve/menu.py new file mode 100644 index 0000000000..9f45ec9b70 --- /dev/null +++ b/pype/resolve/menu.py @@ -0,0 +1,133 @@ +import os +import sys + +from Qt import QtWidgets, QtCore + + +def load_stylesheet(): + path = os.path.join(os.path.dirname(__file__), "menu_style.qss") + if not os.path.exists(path): + print("Unable to load stylesheet, file not found in resources") + return "" + + with open(path, "r") as file_stream: + stylesheet = file_stream.read() + return stylesheet + + +class Spacer(QtWidgets.QWidget): + def __init__(self, height, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + + self.setFixedHeight(height) + + real_spacer = QtWidgets.QWidget(self) + real_spacer.setObjectName("Spacer") + real_spacer.setFixedHeight(int(height / 3)) + + layout = QtWidgets.QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(real_spacer) + + self.setLayout(layout) + + +class PypeMenu(QtWidgets.QWidget): + def __init__(self, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + + self.setObjectName("PypeMenu") + + self.setWindowFlags( + QtCore.Qt.Window + | QtCore.Qt.CustomizeWindowHint + | QtCore.Qt.WindowTitleHint + | QtCore.Qt.WindowCloseButtonHint + | QtCore.Qt.WindowStaysOnTopHint + ) + + self.setWindowTitle("Pype") + workfiles_btn = QtWidgets.QPushButton("Workfiles", self) + create_btn = QtWidgets.QPushButton("Create", self) + publish_btn = QtWidgets.QPushButton("Publish", self) + load_btn = QtWidgets.QPushButton("Load", self) + inventory_btn = QtWidgets.QPushButton("Inventory", self) + rename_btn = QtWidgets.QPushButton("Rename", self) + set_colorspace_btn = QtWidgets.QPushButton( + "Set colorspace from presets", self + ) + reset_resolution_btn = QtWidgets.QPushButton( + "Reset Resolution from peresets", self + ) + reload_pipeline_btn = QtWidgets.QPushButton("Reload pipeline", self) + + layout = QtWidgets.QVBoxLayout(self) + layout.setContentsMargins(10, 10, 10, 10) + + layout.addWidget(workfiles_btn) + layout.addWidget(create_btn) + layout.addWidget(publish_btn) + layout.addWidget(load_btn) + layout.addWidget(inventory_btn) + + layout.addWidget(Spacer(20, self)) + + layout.addWidget(rename_btn) + layout.addWidget(set_colorspace_btn) + layout.addWidget(reset_resolution_btn) + + layout.addWidget(Spacer(20, self)) + + layout.addWidget(reload_pipeline_btn) + + self.setLayout(layout) + + workfiles_btn.clicked.connect(self.on_reload_pipeline_clicked) + create_btn.clicked.connect(self.on_create_clicked) + publish_btn.clicked.connect(self.on_publish_clicked) + load_btn.clicked.connect(self.on_load_clicked) + inventory_btn.clicked.connect(self.on_inventory_clicked) + rename_btn.clicked.connect(self.on_rename_clicked) + set_colorspace_btn.clicked.connect(self.on_set_colorspace_clicked) + reset_resolution_btn.clicked.connect(self.on_reset_resolution_clicked) + reload_pipeline_btn.clicked.connect(self.on_reload_pipeline_clicked) + + def on_workfile_clicked(self): + print("Clicked Workfile") + + def on_create_clicked(self): + print("Clicked Create") + + def on_publish_clicked(self): + print("Clicked Publish") + + def on_load_clicked(self): + print("Clicked Load") + + def on_inventory_clicked(self): + print("Clicked Inventory") + + def on_rename_clicked(self): + print("Clicked Rename") + + def on_set_colorspace_clicked(self): + print("Clicked Set Colorspace") + + def on_reset_resolution_clicked(self): + print("Clicked Reset Resolution") + + def on_reload_pipeline_clicked(self): + print("Clicked Reload Pipeline") + + +def launch_pype_menu(): + app = QtWidgets.QApplication(sys.argv) + + pype_menu = PypeMenu() + + stylesheet = load_stylesheet() + pype_menu.setStyleSheet(stylesheet) + + pype_menu.show() + + sys.exit(app.exec_()) diff --git a/pype/resolve/menu_style.qss b/pype/resolve/menu_style.qss new file mode 100644 index 0000000000..52672364db --- /dev/null +++ b/pype/resolve/menu_style.qss @@ -0,0 +1,34 @@ +QWidget { + background-color: #3a3939; + border-radius: 5; +} + +QPushButton { + border: 1px solid #6d6d6d; + background-color: #201f1f; + color: #6d6d6d; + padding: 5; +} + +QPushButton:focus { + background-color: "#272525"; +} + +QPushButton:pressed { + background-color: "#686464"; + color: #333333; +} + +QPushButton:hover { + color: #d0d0d0; + background-color: "#343232"; +} + +#PypeMenu { + border: 1px solid #333333; +} + +#Spacer { + padding: 10; + background-color: #464646; +} diff --git a/pype/resolve/pipeline.py b/pype/resolve/pipeline.py new file mode 100644 index 0000000000..b6cae307b0 --- /dev/null +++ b/pype/resolve/pipeline.py @@ -0,0 +1,184 @@ +""" +Basic avalon integration +""" +import os +import sys +from avalon.tools import workfiles +from avalon import api as avalon +from pyblish import api as pyblish +from pypeapp import Logger + +log = Logger().get_logger(__name__, "resolve") + +# self = sys.modules[__name__] + +AVALON_CONFIG = os.environ["AVALON_CONFIG"] +PARENT_DIR = os.path.dirname(__file__) +PACKAGE_DIR = os.path.dirname(PARENT_DIR) +PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") + +LOAD_PATH = os.path.join(PLUGINS_DIR, "resolve", "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "resolve", "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "resolve", "inventory") + +PUBLISH_PATH = os.path.join( + PLUGINS_DIR, "resolve", "publish" +).replace("\\", "/") + +AVALON_CONTAINERS = ":AVALON_CONTAINERS" +# IS_HEADLESS = not hasattr(cmds, "about") or cmds.about(batch=True) + + +def install(): + """Install resolve-specific functionality of avalon-core. + + This is where you install menus and register families, data + and loaders into resolve. + + It is called automatically when installing via `api.install(resolve)`. + + See the Maya equivalent for inspiration on how to implement this. + + """ + from .menu import launch_pype_menu + + # Disable all families except for the ones we explicitly want to see + family_states = [ + "imagesequence", + "mov" + ] + avalon.data["familiesStateDefault"] = False + avalon.data["familiesStateToggled"] = family_states + + log.info("pype.resolve installed") + + pyblish.register_host("resolve") + pyblish.register_plugin_path(PUBLISH_PATH) + log.info("Registering DaVinci Resovle plug-ins..") + + avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) + + # opening menu + launch_pype_menu() + + +def uninstall(): + """Uninstall all tha was installed + + This is where you undo everything that was done in `install()`. + That means, removing menus, deregistering families and data + and everything. It should be as though `install()` was never run, + because odds are calling this function means the user is interested + in re-installing shortly afterwards. If, for example, he has been + modifying the menu or registered families. + + """ + pyblish.deregister_host("resolve") + pyblish.deregister_plugin_path(PUBLISH_PATH) + log.info("Deregistering DaVinci Resovle plug-ins..") + + avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) + avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) + avalon.deregister_plugin_path(avalon.InventoryAction, INVENTORY_PATH) + + +def containerise(obj, + name, + namespace, + context, + loader=None, + data=None): + """Bundle Resolve's object into an assembly and imprint it with metadata + + Containerisation enables a tracking of version, author and origin + for loaded assets. + + Arguments: + obj (obj): Resolve's object to imprint as container + name (str): Name of resulting assembly + namespace (str): Namespace under which to host container + context (dict): Asset information + loader (str, optional): Name of node used to produce this container. + + Returns: + obj (obj): containerised object + + """ + pass + + +def ls(): + """List available containers. + + This function is used by the Container Manager in Nuke. You'll + need to implement a for-loop that then *yields* one Container at + a time. + + See the `container.json` schema for details on how it should look, + and the Maya equivalent, which is in `avalon.maya.pipeline` + """ + pass + + +def parse_container(container): + """Return the container node's full container data. + + Args: + container (str): A container node name. + + Returns: + dict: The container schema data for this container node. + + """ + pass + + +def launch_workfiles_app(*args): + workdir = os.environ["AVALON_WORKDIR"] + workfiles.show(workdir) + + +def reload_pipeline(): + """Attempt to reload pipeline at run-time. + + CAUTION: This is primarily for development and debugging purposes. + + """ + + import importlib + import pype.resolve + + avalon.uninstall() + + # get avalon config name + config = os.getenv("AVALON_CONFIG", "pype") + + for module in ("avalon.io", + "avalon.lib", + "avalon.pipeline", + "avalon.api", + "avalon.tools", + + "{}".format(config), + "{}.resolve".format(config), + "{}.resolve.lib".format(config), + "{}.resolve.menu".format(config), + "{}.resolve.plugin".format(config), + "{}.resolve.pipeline".format(config) + ): + log.info("Reloading module: {}...".format(module)) + try: + module = importlib.import_module(module) + importlib.reload(module) + except Exception as e: + log.warning("Cannot reload module: {}".format(e)) + + avalon.install(pype.resolve) + + +def publish(parent): + """Shorthand to publish from within host""" + from avalon.tools import publish + return publish.show(parent) diff --git a/pype/resolve/plugin.py b/pype/resolve/plugin.py new file mode 100644 index 0000000000..a463495af3 --- /dev/null +++ b/pype/resolve/plugin.py @@ -0,0 +1,75 @@ +from avalon import api +from pype.resolve import lib as drlib +from avalon.vendor import qargparse + + +def get_reference_node_parents(ref): + """Return all parent reference nodes of reference node + + Args: + ref (str): reference node. + + Returns: + list: The upstream parent reference nodes. + + """ + parents = [] + return parents + + +class SequenceLoader(api.Loader): + """A basic SequenceLoader for Resolve + + This will implement the basic behavior for a loader to inherit from that + will containerize the reference and will implement the `remove` and + `update` logic. + + """ + + options = [ + qargparse.Toggle( + "handles", + label="Include handles", + default=0, + help="Load with handles or without?" + ), + qargparse.Choice( + "load_to", + label="Where to load clips", + items=[ + "Current timeline", + "New timeline" + ], + default=0, + help="Where do you want clips to be loaded?" + ), + qargparse.Choice( + "load_how", + label="How to load clips", + items=[ + "original timing", + "sequential in order" + ], + default=0, + help="Would you like to place it at orignal timing?" + ) + ] + + def load( + self, + context, + name=None, + namespace=None, + options=None + ): + pass + + def update(self, container, representation): + """Update an existing `container` + """ + pass + + def remove(self, container): + """Remove an existing `container` + """ + pass diff --git a/pype/resolve/preload_console.py b/pype/resolve/preload_console.py new file mode 100644 index 0000000000..7d602df339 --- /dev/null +++ b/pype/resolve/preload_console.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +import time +from pype.resolve.utils import get_resolve_module +from pypeapp import Logger + +log = Logger().get_logger(__name__, "resolve") + +wait_delay = 2.5 +wait = 0.00 +ready = None +while True: + try: + # Create project and set parameters: + resolve = get_resolve_module() + pm = resolve.GetProjectManager() + p = pm.GetCurrentProject() + if p.GetName() == "Untitled Project": + ready = None + else: + ready = True + except AttributeError: + pass + + if ready is None: + time.sleep(wait_delay) + log.info(f"Waiting {wait}s for Resolve to be open in project") + wait += wait_delay + else: + break diff --git a/pype/resolve/resolve_utility_scripts/Pype_menu.py b/pype/resolve/resolve_utility_scripts/Pype_menu.py new file mode 100644 index 0000000000..e9f5d68d70 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/Pype_menu.py @@ -0,0 +1,34 @@ +import os +import sys +import importlib +import avalon +import pype + +from pypeapp import Logger + +log = Logger().get_logger(__name__) + + +def main(env): + # Registers pype's Global pyblish plugins + pype.install() + + # Register Host (and it's pyblish plugins) + host_name = env["AVALON_APP"] + host_import_str = "pype.resolve" + + try: + host_module = importlib.import_module(host_import_str) + except ModuleNotFoundError: + log.error(( + f"Host \"{host_name}\" can't be imported." + f" Import string \"{host_import_str}\" failed." + )) + return False + + avalon.api.install(host_module) + + +if __name__ == "__main__": + result = main(os.environ) + sys.exit(not bool(result)) diff --git a/pype/resolve/resolve_utility_scripts/README.markdown b/pype/resolve/resolve_utility_scripts/README.markdown new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/README.markdown @@ -0,0 +1 @@ + diff --git a/pype/resolve/resolve_utility_scripts/__test_gui.py b/pype/resolve/resolve_utility_scripts/__test_gui.py new file mode 100644 index 0000000000..2b91732667 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/__test_gui.py @@ -0,0 +1,111 @@ +#! python3 +# -*- coding: utf-8 -*- + +# DaVinci Resolve scripting proof of concept. Resolve page external switcher. +# Local or TCP/IP control mode. +# Refer to Resolve V15 public beta 2 scripting API documentation for host setup. +# Copyright 2018 Igor Riđanović, www.hdhead.com +from Qt.QtGui import * +from Qt.QtWidgets import * +from Qt.QtCore import * + +import sys + +# If API module not found assume we"re working as a remote control +try: + import DaVinciResolveScript + # Instantiate Resolve object + resolve = DaVinciResolveScript.scriptapp("Resolve") + checkboxState = False +except ImportError: + print("Resolve API not found.") + checkboxState = True + +try: + _encoding = QApplication.UnicodeUTF8 + + def _translate(context, text, disambig): + return QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QApplication.translate(context, text, disambig) + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName(str("Resolve Page Switcher")) + Form.resize(561, 88) + Form.setStyleSheet(str(( + "background-color: #282828;" + "border-color: #555555;" + "color: #929292;" + "font-size: 13px;" + ))) + self.horizontalLayout = QHBoxLayout(Form) + self.horizontalLayout.setObjectName(str("horizontalLayout")) + self.mediaButton = QPushButton(Form) + self.mediaButton.setObjectName(str("mediaButton")) + self.horizontalLayout.addWidget(self.mediaButton) + self.editButton = QPushButton(Form) + self.editButton.setObjectName(str("editButton")) + self.horizontalLayout.addWidget(self.editButton) + self.fusionButton = QPushButton(Form) + self.fusionButton.setObjectName(str("fusionButton")) + self.horizontalLayout.addWidget(self.fusionButton) + self.colorButton = QPushButton(Form) + self.colorButton.setObjectName(str("colorButton")) + self.horizontalLayout.addWidget(self.colorButton) + self.fairlightButton = QPushButton(Form) + self.fairlightButton.setObjectName(str("fairlightButton")) + self.horizontalLayout.addWidget(self.fairlightButton) + self.deliverButton = QPushButton(Form) + self.deliverButton.setObjectName(str("deliverButton")) + self.horizontalLayout.addWidget(self.deliverButton) + + self.mediaButton.clicked.connect(lambda: self.pageswitch("media")) + self.editButton.clicked.connect(lambda: self.pageswitch("edit")) + self.fusionButton.clicked.connect(lambda: self.pageswitch("fusion")) + self.colorButton.clicked.connect(lambda: self.pageswitch("color")) + self.fairlightButton.clicked.connect( + lambda: self.pageswitch("fairlight")) + self.deliverButton.clicked.connect(lambda: self.pageswitch("deliver")) + + self.mediaButton.setStyleSheet(str("background-color: #181818;")) + self.editButton.setStyleSheet(str("background-color: #181818;")) + self.fusionButton.setStyleSheet( + str("background-color: #181818;")) + self.colorButton.setStyleSheet(str("background-color: #181818;")) + self.fairlightButton.setStyleSheet( + str("background-color: #181818;")) + self.deliverButton.setStyleSheet( + str("background-color: #181818;")) + + self.retranslateUi(Form) + QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + Form.setWindowTitle(_translate("Resolve Page Switcher", + "Resolve Page Switcher", None)) + self.mediaButton.setText(_translate("Form", "Media", None)) + self.editButton.setText(_translate("Form", "Edit", None)) + self.fusionButton.setText(_translate("Form", "Fusion", None)) + self.colorButton.setText(_translate("Form", "Color", None)) + self.fairlightButton.setText(_translate("Form", "Fairlight", None)) + self.deliverButton.setText(_translate("Form", "Deliver", None)) + + def pageswitch(self, page): + # Send page name to server to switch remote Resolve"s page + try: + resolve.OpenPage(page) + print(f"Switched to {page}") + except NameError: + print("Resolve API not found. Run in remote mode instead?") + + +if __name__ == "__main__": + app = QApplication(sys.argv) + Form = QWidget() + ui = Ui_Form() + ui.setupUi(Form) + Form.show() + sys.exit(app.exec_()) diff --git a/pype/resolve/resolve_utility_scripts/__test_pyblish.py b/pype/resolve/resolve_utility_scripts/__test_pyblish.py new file mode 100644 index 0000000000..a6fe991025 --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/__test_pyblish.py @@ -0,0 +1,57 @@ +import os +import sys +import pype +import importlib +import pyblish.api +import pyblish.util +import avalon.api +from avalon.tools import publish +from pypeapp import Logger + +log = Logger().get_logger(__name__) + + +def main(env): + # Registers pype's Global pyblish plugins + pype.install() + + # Register Host (and it's pyblish plugins) + host_name = env["AVALON_APP"] + # TODO not sure if use "pype." or "avalon." for host import + host_import_str = f"pype.{host_name}" + + try: + host_module = importlib.import_module(host_import_str) + except ModuleNotFoundError: + log.error(( + f"Host \"{host_name}\" can't be imported." + f" Import string \"{host_import_str}\" failed." + )) + return False + + avalon.api.install(host_module) + + # Register additional paths + addition_paths_str = env.get("PUBLISH_PATHS") or "" + addition_paths = addition_paths_str.split(os.pathsep) + for path in addition_paths: + path = os.path.normpath(path) + if not os.path.exists(path): + continue + + pyblish.api.register_plugin_path(path) + + # Register project specific plugins + project_name = os.environ["AVALON_PROJECT"] + project_plugins_paths = env.get("PYPE_PROJECT_PLUGINS") or "" + for path in project_plugins_paths.split(os.pathsep): + plugin_path = os.path.join(path, project_name, "plugins") + if os.path.exists(plugin_path): + pyblish.api.register_plugin_path(plugin_path) + + return publish.show() + + +if __name__ == "__main__": + result = main(os.environ) + sys.exit(not bool(result)) diff --git a/pype/resolve/resolve_utility_scripts/__test_subprocess.py b/pype/resolve/resolve_utility_scripts/__test_subprocess.py new file mode 100644 index 0000000000..438b1f716c --- /dev/null +++ b/pype/resolve/resolve_utility_scripts/__test_subprocess.py @@ -0,0 +1,36 @@ +#! python3 +# -*- coding: utf-8 -*- +import os +import sys +from pypeapp import execute, Logger +from pype.resolve.utils import get_resolve_module + +log = Logger().get_logger("Resolve") + +CURRENT_DIR = os.getenv("RESOLVE_UTILITY_SCRIPTS_DIR", "") +python_dir = os.getenv("PYTHON36_RESOLVE") +python_exe = os.path.normpath( + os.path.join(python_dir, "python.exe") +) + +resolve = get_resolve_module() +PM = resolve.GetProjectManager() +P = PM.GetCurrentProject() + +log.info(P.GetName()) + + +# ______________________________________________________ +# testing subprocessing Scripts +testing_py = os.path.join(CURRENT_DIR, "ResolvePageSwitcher.py") +testing_py = os.path.normpath(testing_py) +log.info(f"Testing path to script: `{testing_py}`") + +returncode = execute( + [python_exe, os.path.normpath(testing_py)], + env=dict(os.environ) +) + +# Check if output file exists +if returncode != 0: + log.error("Executing failed!") diff --git a/pype/resolve/resolve_utility_scripts/python_get_resolve.py b/pype/resolve/resolve_utility_scripts/python_get_resolve.py deleted file mode 100644 index 862a5bb758..0000000000 --- a/pype/resolve/resolve_utility_scripts/python_get_resolve.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -""" -This file serves to return a DaVinci Resolve object -""" - -import sys - -def GetResolve(): - try: - # The PYTHONPATH needs to be set correctly for this import statement to work. - # An alternative is to import the DaVinciResolveScript by specifying absolute path (see ExceptionHandler logic) - import DaVinciResolveScript as bmd - except ImportError: - if sys.platform.startswith("darwin"): - expectedPath="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules/" - elif sys.platform.startswith("win") or sys.platform.startswith("cygwin"): - import os - expectedPath=os.getenv('PROGRAMDATA') + "\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\Modules\\" - elif sys.platform.startswith("linux"): - expectedPath="/opt/resolve/libs/Fusion/Modules/" - - # check if the default path has it... - print("Unable to find module DaVinciResolveScript from $PYTHONPATH - trying default locations") - try: - import imp - bmd = imp.load_source('DaVinciResolveScript', expectedPath+"DaVinciResolveScript.py") - except ImportError: - # No fallbacks ... report error: - print("Unable to find module DaVinciResolveScript - please ensure that the module DaVinciResolveScript is discoverable by python") - print("For a default DaVinci Resolve installation, the module is expected to be located in: "+expectedPath) - sys.exit() - - return bmd.scriptapp("Resolve") diff --git a/pype/resolve/resolve_utility_scripts/resolveapitest.py b/pype/resolve/resolve_utility_scripts/resolveapitest.py deleted file mode 100644 index e7cc32a864..0000000000 --- a/pype/resolve/resolve_utility_scripts/resolveapitest.py +++ /dev/null @@ -1,72 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# This script tests Resolve 15 scripting API on MacOS. -# We suspect an issue with import of fusionscript.so. -# To test launch Resolve Studio first and then run this script. -# The script will save a text report. -# igor@hdhead.com - -from datetime import datetime -import os -import sys -import imp - -eol = '\n' -pathLib = 'C:\\Program Files\\Blackmagic Design\\DaVinci Resolve\\fusionscript.dll' - -reportDir = "C:\\Users\\jezsc" - -# Create initial report file. It will overwrite existing! -reportName = 'Resolve_API_Report.txt' -reportPath = os.path.join(reportDir, reportName) -reportfile = open(reportPath, 'w') -reportfile.close() - - -def report(entry): - # Print to console - print entry - - # Write a report entry - reportfile = open(reportPath, 'a') - reportfile.write(entry) - reportfile.write(eol) - reportfile.close() - - -# These are the values we'll discover and save -report('Time: ' + str(datetime.now())) -report('Python Version: ' + sys.version) -report('Interpreter Path: ' + sys.executable) -report('___________________________________' + eol) - -report('If no lines follow we have likely experienced a Fatal Python Error.') - -try: - # Will the API library import? Does it exist? - smodule = imp.load_dynamic('fusionscript', pathLib) - report('Imported fusionscript.so') - - # It looks like the library imported. Can we create a resolve instance now? - try: - resolve = smodule.scriptapp('Resolve') - if 'None' in str(type(resolve)): - report('Resolve instance is created, but Resolve is not found.') - sys.exit() - if 'PyRemoteObject' in str(type(resolve)): - report('Resolve instance is created and Resolve is responsive.') - except Exception, e: - report(str(e)) - - # Let's go nuts and count how many projects are in the Project Manager - try: - projman = resolve.GetProjectManager() - projects = projman.GetProjectsInCurrentFolder() - report('Project Count: ' + str(len(projects))) - report('All is well!') - except Exception, e: - report(str(e)) - -except Exception, e: - report(str(e)) diff --git a/pype/resolve/resolve_utility_scripts/test.py b/pype/resolve/resolve_utility_scripts/test.py deleted file mode 100644 index 7d32aabfe5..0000000000 --- a/pype/resolve/resolve_utility_scripts/test.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python3.6 -from python_get_resolve import GetResolve - -resolve = GetResolve() -PM = resolve.GetProjectManager() -P = PM.GetCurrentProject() - -print(P.GetName()) diff --git a/pype/resolve/utility/pre_python_console_script.py b/pype/resolve/utility/pre_python_console_script.py deleted file mode 100644 index 1c1aceaddd..0000000000 --- a/pype/resolve/utility/pre_python_console_script.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -import time -from python_get_resolve import GetResolve - -wait_delay = 2.5 -wait = 0.00 -ready = None -while True: - try: - # Create project and set parameters: - resolve = GetResolve() - PM = resolve.GetProjectManager() - P = PM.GetCurrentProject() - if P.GetName() == "Untitled Project": - ready = None - else: - ready = True - except AttributeError: - pass - - if ready is None: - time.sleep(wait_delay) - print(f"Waiting {wait}s for Resolve to be open inproject") - wait += wait_delay - else: - break diff --git a/pype/resolve/utility/python_get_resolve.py b/pype/resolve/utility/python_get_resolve.py deleted file mode 100644 index 862a5bb758..0000000000 --- a/pype/resolve/utility/python_get_resolve.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -""" -This file serves to return a DaVinci Resolve object -""" - -import sys - -def GetResolve(): - try: - # The PYTHONPATH needs to be set correctly for this import statement to work. - # An alternative is to import the DaVinciResolveScript by specifying absolute path (see ExceptionHandler logic) - import DaVinciResolveScript as bmd - except ImportError: - if sys.platform.startswith("darwin"): - expectedPath="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules/" - elif sys.platform.startswith("win") or sys.platform.startswith("cygwin"): - import os - expectedPath=os.getenv('PROGRAMDATA') + "\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\Modules\\" - elif sys.platform.startswith("linux"): - expectedPath="/opt/resolve/libs/Fusion/Modules/" - - # check if the default path has it... - print("Unable to find module DaVinciResolveScript from $PYTHONPATH - trying default locations") - try: - import imp - bmd = imp.load_source('DaVinciResolveScript', expectedPath+"DaVinciResolveScript.py") - except ImportError: - # No fallbacks ... report error: - print("Unable to find module DaVinciResolveScript - please ensure that the module DaVinciResolveScript is discoverable by python") - print("For a default DaVinci Resolve installation, the module is expected to be located in: "+expectedPath) - sys.exit() - - return bmd.scriptapp("Resolve") diff --git a/pype/resolve/utils.py b/pype/resolve/utils.py new file mode 100644 index 0000000000..e421d02de5 --- /dev/null +++ b/pype/resolve/utils.py @@ -0,0 +1,114 @@ +#! python3 + +""" +Resolve's tools for setting environment +""" + +import sys +import os +import shutil + +from pypeapp import Logger + +log = Logger().get_logger(__name__, "resolve") + +UTILITY_SCRIPTS = os.path.join( + os.path.dirname(__file__), + "resolve_utility_scripts" +) + + +def get_resolve_module(): + try: + """ + The PYTHONPATH needs to be set correctly for this import + statement to work. An alternative is to import the + DaVinciResolveScript by specifying absolute path + (see ExceptionHandler logic) + """ + import DaVinciResolveScript as bmd + except ImportError: + if sys.platform.startswith("darwin"): + expected_path = ("/Library/Application Support/Blackmagic Design" + "/DaVinci Resolve/Developer/Scripting/Modules") + elif sys.platform.startswith("win") \ + or sys.platform.startswith("cygwin"): + expected_path = os.path.normpath( + os.getenv('PROGRAMDATA') + ( + "/Blackmagic Design/DaVinci Resolve/Support/Developer" + "/Scripting/Modules" + ) + ) + elif sys.platform.startswith("linux"): + expected_path = "/opt/resolve/libs/Fusion/Modules" + + # check if the default path has it... + print(("Unable to find module DaVinciResolveScript from " + "$PYTHONPATH - trying default locations")) + + module_path = os.path.normpath( + os.path.join( + expected_path, + "DaVinciResolveScript.py" + ) + ) + + try: + import imp + bmd = imp.load_source('DaVinciResolveScript', module_path) + except ImportError: + # No fallbacks ... report error: + log.error( + ("Unable to find module DaVinciResolveScript - please " + "ensure that the module DaVinciResolveScript is " + "discoverable by python") + ) + log.error( + ("For a default DaVinci Resolve installation, the " + f"module is expected to be located in: {expected_path}") + ) + sys.exit() + + return bmd.scriptapp("Resolve") + + +def _sync_utility_scripts(env=None): + """ Synchronizing basic utlility scripts for resolve. + + To be able to run scripts from inside `Resolve/Workspace/Scripts` menu + all scripts has to be accessible from defined folder. + """ + if not env: + env = os.environ + + us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "") + scripts = os.listdir(UTILITY_SCRIPTS) + + log.info(f"Utility Scripts Dir: `{UTILITY_SCRIPTS}`") + log.info(f"Utility Scripts: `{scripts}`") + + # make sure no script file is in folder + if next((s for s in os.listdir(us_dir)), None): + for s in os.listdir(us_dir): + path = os.path.join(us_dir, s) + log.info(f"Removing `{path}`...") + os.remove(path) + + # copy scripts into Resolve's utility scripts dir + for s in scripts: + src = os.path.join(UTILITY_SCRIPTS, s) + dst = os.path.join(us_dir, s) + log.info(f"Copying `{src}` to `{dst}`...") + shutil.copy2(src, dst) + + +def setup(env=None): + """ Wrapper installer started from pype.hooks.resolve.ResolvePrelaunch() + """ + if not env: + env = os.environ + + # synchronize resolve utility scripts + _sync_utility_scripts(env) + + log.info("Resolve Pype wrapper has been installed") diff --git a/pype/resolve/workio.py b/pype/resolve/workio.py new file mode 100644 index 0000000000..49c027259b --- /dev/null +++ b/pype/resolve/workio.py @@ -0,0 +1,88 @@ +"""Host API required Work Files tool""" + +import os +import sys +from pypeapp import Logger +from .utils import get_resolve_module + +log = Logger().get_logger(__name__, "nukestudio") + +exported_projet_ext = ".drp" + +self = sys.modules[__name__] +self.pm = None + + +def get_project_manager(): + if not self.pm: + resolve = get_resolve_module() + self.pm = resolve.GetProjectManager() + return self.pm + + +def file_extensions(): + return [exported_projet_ext] + + +def has_unsaved_changes(): + get_project_manager().SaveProject() + return False + + +def save_file(filepath): + pm = get_project_manager() + file = os.path.basename(filepath) + fname, _ = os.path.splitext(file) + project = pm.GetCurrentProject() + name = project.GetName() + + if "Untitled Project" not in name: + log.info("Saving project: `{}` as '{}'".format(name, file)) + pm.ExportProject(name, filepath) + else: + log.info("Creating new project...") + pm.CreateProject(fname) + pm.ExportProject(name, filepath) + + +def open_file(filepath): + """ + Loading project + """ + pm = get_project_manager() + file = os.path.basename(filepath) + fname, _ = os.path.splitext(file) + + # deal with current project + project = pm.GetCurrentProject() + pm.SaveProject() + pm.CloseProject(project) + + try: + # load project from input path + project = pm.LoadProject(fname) + log.info(f"Project {project.GetName()} opened...") + return True + except NameError as E: + log.error(f"Project with name `{fname}` does not exist!\n\nError: {E}") + return False + + +def current_file(): + pm = get_project_manager() + current_dir = os.getenv("AVALON_WORKDIR") + project = pm.GetCurrentProject() + name = project.GetName() + fname = name + exported_projet_ext + current_file = os.path.join(current_dir, fname) + normalised = os.path.normpath(current_file) + + # Unsaved current file + if normalised == "": + return None + + return normalised + + +def work_root(session): + return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/") From 157a9e3498727e569c265eff92b565340f7e832a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 28 May 2020 14:24:51 +0200 Subject: [PATCH 05/15] feat(resolve): integration wip --- pype/hooks/resolve/prelaunch.py | 2 + pype/plugins/resolve/publish/collect_host.py | 4 +- pype/resolve/lib.py | 12 +++++ pype/resolve/menu.py | 30 ++++++++--- pype/resolve/menu_style.qss | 25 ++++----- pype/resolve/pipeline.py | 5 -- pype/resolve/preload_console.py | 3 ++ .../Pype_menu.py | 1 + .../README.markdown | 0 .../__test_gui.py | 0 .../__test_pyblish.py | 0 .../__test_subprocess.py | 0 pype/resolve/utils.py | 51 +++++++++++++------ pype/resolve/workio.py | 14 +---- 14 files changed, 92 insertions(+), 55 deletions(-) rename pype/resolve/{resolve_utility_scripts => utility_scripts}/Pype_menu.py (94%) rename pype/resolve/{resolve_utility_scripts => utility_scripts}/README.markdown (100%) rename pype/resolve/{resolve_utility_scripts => utility_scripts}/__test_gui.py (100%) rename pype/resolve/{resolve_utility_scripts => utility_scripts}/__test_pyblish.py (100%) rename pype/resolve/{resolve_utility_scripts => utility_scripts}/__test_subprocess.py (100%) diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index d0b7448a41..ccc5e48dfd 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -1,5 +1,6 @@ import os import traceback +import importlib from pype.lib import PypeHook from pypeapp import Logger from pype.resolve import utils @@ -60,6 +61,7 @@ class ResolvePrelaunch(PypeHook): else: # Resolve Setup integration + importlib.reload(utils) utils.setup(env) return True diff --git a/pype/plugins/resolve/publish/collect_host.py b/pype/plugins/resolve/publish/collect_host.py index 9119ba1f4f..7579be487c 100644 --- a/pype/plugins/resolve/publish/collect_host.py +++ b/pype/plugins/resolve/publish/collect_host.py @@ -1,5 +1,5 @@ import pyblish.api -from python_get_resolve import GetResolve +from pype.resolve.utils import get_resolve_module class CollectProject(pyblish.api.ContextPlugin): @@ -10,7 +10,7 @@ class CollectProject(pyblish.api.ContextPlugin): hosts = ["resolve"] def process(self, context): - resolve = GetResolve() + resolve = get_resolve_module() PM = resolve.GetProjectManager() P = PM.GetCurrentProject() diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py index e69de29bb2..a6f10a1533 100644 --- a/pype/resolve/lib.py +++ b/pype/resolve/lib.py @@ -0,0 +1,12 @@ +import sys +from .utils import get_resolve_module + +self = sys.modules[__name__] +self.pm = None + + +def get_project_manager(): + if not self.pm: + resolve = get_resolve_module() + self.pm = resolve.GetProjectManager() + return self.pm diff --git a/pype/resolve/menu.py b/pype/resolve/menu.py index 9f45ec9b70..6edf2e8f0c 100644 --- a/pype/resolve/menu.py +++ b/pype/resolve/menu.py @@ -3,6 +3,18 @@ import sys from Qt import QtWidgets, QtCore +from .pipeline import ( + publish, + launch_workfiles_app, + reload_pipeline + ) + +from avalon.tools import ( + creator, + loader, + sceneinventory, + libraryloader +) def load_stylesheet(): path = os.path.join(os.path.dirname(__file__), "menu_style.qss") @@ -23,10 +35,10 @@ class Spacer(QtWidgets.QWidget): real_spacer = QtWidgets.QWidget(self) real_spacer.setObjectName("Spacer") - real_spacer.setFixedHeight(int(height / 3)) + real_spacer.setFixedHeight(height) layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) + layout.setContentsMargins(0, 11, 0, 0) layout.addWidget(real_spacer) self.setLayout(layout) @@ -62,7 +74,7 @@ class PypeMenu(QtWidgets.QWidget): reload_pipeline_btn = QtWidgets.QPushButton("Reload pipeline", self) layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(10, 10, 10, 10) + layout.setContentsMargins(10, 20, 10, 20) layout.addWidget(workfiles_btn) layout.addWidget(create_btn) @@ -70,19 +82,19 @@ class PypeMenu(QtWidgets.QWidget): layout.addWidget(load_btn) layout.addWidget(inventory_btn) - layout.addWidget(Spacer(20, self)) + layout.addWidget(Spacer(11, self)) layout.addWidget(rename_btn) layout.addWidget(set_colorspace_btn) layout.addWidget(reset_resolution_btn) - layout.addWidget(Spacer(20, self)) + layout.addWidget(Spacer(11, self)) layout.addWidget(reload_pipeline_btn) self.setLayout(layout) - workfiles_btn.clicked.connect(self.on_reload_pipeline_clicked) + workfiles_btn.clicked.connect(self.on_workfile_clicked) create_btn.clicked.connect(self.on_create_clicked) publish_btn.clicked.connect(self.on_publish_clicked) load_btn.clicked.connect(self.on_load_clicked) @@ -94,18 +106,23 @@ class PypeMenu(QtWidgets.QWidget): def on_workfile_clicked(self): print("Clicked Workfile") + launch_workfiles_app() def on_create_clicked(self): print("Clicked Create") + creator.show() def on_publish_clicked(self): print("Clicked Publish") + publish(None) def on_load_clicked(self): print("Clicked Load") + loader.show(use_context=True) def on_inventory_clicked(self): print("Clicked Inventory") + sceneinventory.show() def on_rename_clicked(self): print("Clicked Rename") @@ -118,6 +135,7 @@ class PypeMenu(QtWidgets.QWidget): def on_reload_pipeline_clicked(self): print("Clicked Reload Pipeline") + reload_pipeline() def launch_pype_menu(): diff --git a/pype/resolve/menu_style.qss b/pype/resolve/menu_style.qss index 52672364db..b74ed46868 100644 --- a/pype/resolve/menu_style.qss +++ b/pype/resolve/menu_style.qss @@ -1,34 +1,29 @@ QWidget { - background-color: #3a3939; - border-radius: 5; + background-color: #282828; + border-radius: 3; } QPushButton { - border: 1px solid #6d6d6d; + border: 1px solid #090909; background-color: #201f1f; - color: #6d6d6d; + color: #ffffff; padding: 5; } QPushButton:focus { - background-color: "#272525"; -} - -QPushButton:pressed { - background-color: "#686464"; - color: #333333; + background-color: "#171717"; + color: #d0d0d0; } QPushButton:hover { - color: #d0d0d0; - background-color: "#343232"; + background-color: "#171717"; + color: #e64b3d; } #PypeMenu { - border: 1px solid #333333; + border: 1px solid #fef9ef; } #Spacer { - padding: 10; - background-color: #464646; + background-color: #121212; } diff --git a/pype/resolve/pipeline.py b/pype/resolve/pipeline.py index b6cae307b0..377c5ae161 100644 --- a/pype/resolve/pipeline.py +++ b/pype/resolve/pipeline.py @@ -150,8 +150,6 @@ def reload_pipeline(): import importlib import pype.resolve - avalon.uninstall() - # get avalon config name config = os.getenv("AVALON_CONFIG", "pype") @@ -164,7 +162,6 @@ def reload_pipeline(): "{}".format(config), "{}.resolve".format(config), "{}.resolve.lib".format(config), - "{}.resolve.menu".format(config), "{}.resolve.plugin".format(config), "{}.resolve.pipeline".format(config) ): @@ -175,8 +172,6 @@ def reload_pipeline(): except Exception as e: log.warning("Cannot reload module: {}".format(e)) - avalon.install(pype.resolve) - def publish(parent): """Shorthand to publish from within host""" diff --git a/pype/resolve/preload_console.py b/pype/resolve/preload_console.py index 7d602df339..c1b70de11d 100644 --- a/pype/resolve/preload_console.py +++ b/pype/resolve/preload_console.py @@ -26,4 +26,7 @@ while True: log.info(f"Waiting {wait}s for Resolve to be open in project") wait += wait_delay else: + print(f"Preloaded variables: \n\n\tResolve module: " + f"`resolve` > {type(resolve)} \n\tProject manager: " + f"`pm` > {type(pm)} \n\tCurrent project: `p` > {type(p)}") break diff --git a/pype/resolve/resolve_utility_scripts/Pype_menu.py b/pype/resolve/utility_scripts/Pype_menu.py similarity index 94% rename from pype/resolve/resolve_utility_scripts/Pype_menu.py rename to pype/resolve/utility_scripts/Pype_menu.py index e9f5d68d70..10d8d8939d 100644 --- a/pype/resolve/resolve_utility_scripts/Pype_menu.py +++ b/pype/resolve/utility_scripts/Pype_menu.py @@ -27,6 +27,7 @@ def main(env): return False avalon.api.install(host_module) + avalon.api.register_host("resolve") if __name__ == "__main__": diff --git a/pype/resolve/resolve_utility_scripts/README.markdown b/pype/resolve/utility_scripts/README.markdown similarity index 100% rename from pype/resolve/resolve_utility_scripts/README.markdown rename to pype/resolve/utility_scripts/README.markdown diff --git a/pype/resolve/resolve_utility_scripts/__test_gui.py b/pype/resolve/utility_scripts/__test_gui.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_gui.py rename to pype/resolve/utility_scripts/__test_gui.py diff --git a/pype/resolve/resolve_utility_scripts/__test_pyblish.py b/pype/resolve/utility_scripts/__test_pyblish.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_pyblish.py rename to pype/resolve/utility_scripts/__test_pyblish.py diff --git a/pype/resolve/resolve_utility_scripts/__test_subprocess.py b/pype/resolve/utility_scripts/__test_subprocess.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_subprocess.py rename to pype/resolve/utility_scripts/__test_subprocess.py diff --git a/pype/resolve/utils.py b/pype/resolve/utils.py index e421d02de5..252a43da8d 100644 --- a/pype/resolve/utils.py +++ b/pype/resolve/utils.py @@ -12,13 +12,14 @@ from pypeapp import Logger log = Logger().get_logger(__name__, "resolve") -UTILITY_SCRIPTS = os.path.join( - os.path.dirname(__file__), - "resolve_utility_scripts" -) - +self = sys.modules[__name__] +self.bmd = None def get_resolve_module(): + # dont run if already loaded + if self.bmd: + return self.bmd + try: """ The PYTHONPATH needs to be set correctly for this import @@ -52,7 +53,7 @@ def get_resolve_module(): "DaVinciResolveScript.py" ) ) - + try: import imp bmd = imp.load_source('DaVinciResolveScript', module_path) @@ -68,8 +69,9 @@ def get_resolve_module(): f"module is expected to be located in: {expected_path}") ) sys.exit() - - return bmd.scriptapp("Resolve") + # assign global var and return + self.bmd = bmd.scriptapp("Resolve") + return self.bmd def _sync_utility_scripts(env=None): @@ -81,10 +83,26 @@ def _sync_utility_scripts(env=None): if not env: env = os.environ + # initiate inputs + scripts = {} + us_env = env.get("RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR") us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "") - scripts = os.listdir(UTILITY_SCRIPTS) + us_paths = [os.path.join( + os.path.dirname(__file__), + "utility_scripts" + )] - log.info(f"Utility Scripts Dir: `{UTILITY_SCRIPTS}`") + # collect script dirs + if us_env: + log.info(f"Utility Scripts Env: `{us_env}`") + us_paths = us_env.split( + os.pathsep) + us_paths + + # collect scripts from dirs + for path in us_paths: + scripts.update({path: os.listdir(path)}) + + log.info(f"Utility Scripts Dir: `{us_paths}`") log.info(f"Utility Scripts: `{scripts}`") # make sure no script file is in folder @@ -95,11 +113,14 @@ def _sync_utility_scripts(env=None): os.remove(path) # copy scripts into Resolve's utility scripts dir - for s in scripts: - src = os.path.join(UTILITY_SCRIPTS, s) - dst = os.path.join(us_dir, s) - log.info(f"Copying `{src}` to `{dst}`...") - shutil.copy2(src, dst) + for d, sl in scripts.items(): + # directory and scripts list + for s in sl: + # script in script list + src = os.path.join(d, s) + dst = os.path.join(us_dir, s) + log.info(f"Copying `{src}` to `{dst}`...") + shutil.copy2(src, dst) def setup(env=None): diff --git a/pype/resolve/workio.py b/pype/resolve/workio.py index 49c027259b..b9562449bf 100644 --- a/pype/resolve/workio.py +++ b/pype/resolve/workio.py @@ -1,24 +1,14 @@ """Host API required Work Files tool""" import os -import sys from pypeapp import Logger -from .utils import get_resolve_module +from .lib import get_project_manager + log = Logger().get_logger(__name__, "nukestudio") exported_projet_ext = ".drp" -self = sys.modules[__name__] -self.pm = None - - -def get_project_manager(): - if not self.pm: - resolve = get_resolve_module() - self.pm = resolve.GetProjectManager() - return self.pm - def file_extensions(): return [exported_projet_ext] From 1e6e6fd7c338161e0e3e761093f0a20df1a90140 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 12:32:33 +0200 Subject: [PATCH 06/15] clean(resolve): print outs too long --- pype/hooks/resolve/prelaunch.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index ccc5e48dfd..6f5c22a7d0 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -31,9 +31,9 @@ class ResolvePrelaunch(PypeHook): py36_dir = os.path.normpath(env.get("PYTHON36_RESOLVE", "")) assert os.path.isdir(py36_dir), ( "Python 3.6 is not installed at the provided folder path. Either " - "make sure the `environments\resolve.json` is having correctly set " - "`PYTHON36_RESOLVE` or make sure Python 3.6 is installed in given path." - f"\nPYTHON36_RESOLVE: `{py36_dir}`" + "make sure the `environments\resolve.json` is having correctly " + "set `PYTHON36_RESOLVE` or make sure Python 3.6 is installed " + f"in given path. \nPYTHON36_RESOLVE: `{py36_dir}`" ) self.log.info(f"Path to Resolve Python folder: `{py36_dir}`...") env["PYTHON36_RESOLVE"] = py36_dir From d0aa618f1abc55c452f3a21f030e7f7822ad78b1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 13:11:42 +0200 Subject: [PATCH 07/15] feat(resolve): integration wip --- pype/resolve/__init__.py | 13 +- pype/resolve/action.py | 1 + pype/resolve/menu.py | 33 +++--- pype/resolve/menu_style.qss | 2 +- pype/resolve/pipeline.py | 39 +----- pype/resolve/plugin.py | 2 +- pype/resolve/utility_scripts/Pype_menu.py | 22 +--- pype/resolve/utility_scripts/__test_gui.py | 111 ------------------ .../utility_scripts/__test_subprocess.py | 1 - pype/resolve/utils.py | 1 + 10 files changed, 38 insertions(+), 187 deletions(-) delete mode 100644 pype/resolve/utility_scripts/__test_gui.py diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py index 966d7aef4c..ea5946381c 100644 --- a/pype/resolve/__init__.py +++ b/pype/resolve/__init__.py @@ -3,7 +3,6 @@ from .pipeline import ( uninstall, ls, containerise, - reload_pipeline, publish, launch_workfiles_app ) @@ -22,9 +21,11 @@ from .workio import ( work_root ) -# from .lib import ( -# -# ) +from .lib import ( + get_project_manager +) + +from .menu import launch_pype_menu __all__ = [ "install", @@ -38,6 +39,10 @@ __all__ = [ "setup", "get_resolve_module", + "get_project_manager" + + "launch_pype_menu", + "open_file", "save_file", "current_file", diff --git a/pype/resolve/action.py b/pype/resolve/action.py index 94d0f5eb67..dfbe23087c 100644 --- a/pype/resolve/action.py +++ b/pype/resolve/action.py @@ -23,6 +23,7 @@ class SelectInvalidAction(pyblish.api.Action): try: from pype.resolve.utils import get_resolve_module resolve = get_resolve_module() + self.log.debug(resolve) except ImportError: raise ImportError("Current host is not Resolve") diff --git a/pype/resolve/menu.py b/pype/resolve/menu.py index 6edf2e8f0c..73ea937513 100644 --- a/pype/resolve/menu.py +++ b/pype/resolve/menu.py @@ -5,9 +5,8 @@ from Qt import QtWidgets, QtCore from .pipeline import ( publish, - launch_workfiles_app, - reload_pipeline - ) + launch_workfiles_app +) from avalon.tools import ( creator, @@ -16,6 +15,7 @@ from avalon.tools import ( libraryloader ) + def load_stylesheet(): path = os.path.join(os.path.dirname(__file__), "menu_style.qss") if not os.path.exists(path): @@ -38,7 +38,7 @@ class Spacer(QtWidgets.QWidget): real_spacer.setFixedHeight(height) layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 11, 0, 0) + layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(real_spacer) self.setLayout(layout) @@ -64,6 +64,7 @@ class PypeMenu(QtWidgets.QWidget): publish_btn = QtWidgets.QPushButton("Publish", self) load_btn = QtWidgets.QPushButton("Load", self) inventory_btn = QtWidgets.QPushButton("Inventory", self) + libload_btn = QtWidgets.QPushButton("Library", self) rename_btn = QtWidgets.QPushButton("Rename", self) set_colorspace_btn = QtWidgets.QPushButton( "Set colorspace from presets", self @@ -71,7 +72,6 @@ class PypeMenu(QtWidgets.QWidget): reset_resolution_btn = QtWidgets.QPushButton( "Reset Resolution from peresets", self ) - reload_pipeline_btn = QtWidgets.QPushButton("Reload pipeline", self) layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(10, 20, 10, 20) @@ -82,16 +82,19 @@ class PypeMenu(QtWidgets.QWidget): layout.addWidget(load_btn) layout.addWidget(inventory_btn) - layout.addWidget(Spacer(11, self)) + layout.addWidget(Spacer(15, self)) + + layout.addWidget(libload_btn) + + layout.addWidget(Spacer(15, self)) layout.addWidget(rename_btn) + + layout.addWidget(Spacer(15, self)) + layout.addWidget(set_colorspace_btn) layout.addWidget(reset_resolution_btn) - layout.addWidget(Spacer(11, self)) - - layout.addWidget(reload_pipeline_btn) - self.setLayout(layout) workfiles_btn.clicked.connect(self.on_workfile_clicked) @@ -99,10 +102,10 @@ class PypeMenu(QtWidgets.QWidget): publish_btn.clicked.connect(self.on_publish_clicked) load_btn.clicked.connect(self.on_load_clicked) inventory_btn.clicked.connect(self.on_inventory_clicked) + libload_btn.clicked.connect(self.on_libload_clicked) rename_btn.clicked.connect(self.on_rename_clicked) set_colorspace_btn.clicked.connect(self.on_set_colorspace_clicked) reset_resolution_btn.clicked.connect(self.on_reset_resolution_clicked) - reload_pipeline_btn.clicked.connect(self.on_reload_pipeline_clicked) def on_workfile_clicked(self): print("Clicked Workfile") @@ -124,6 +127,10 @@ class PypeMenu(QtWidgets.QWidget): print("Clicked Inventory") sceneinventory.show() + def on_libload_clicked(self): + print("Clicked Library") + libraryloader.show() + def on_rename_clicked(self): print("Clicked Rename") @@ -133,10 +140,6 @@ class PypeMenu(QtWidgets.QWidget): def on_reset_resolution_clicked(self): print("Clicked Reset Resolution") - def on_reload_pipeline_clicked(self): - print("Clicked Reload Pipeline") - reload_pipeline() - def launch_pype_menu(): app = QtWidgets.QApplication(sys.argv) diff --git a/pype/resolve/menu_style.qss b/pype/resolve/menu_style.qss index b74ed46868..df4fd7e949 100644 --- a/pype/resolve/menu_style.qss +++ b/pype/resolve/menu_style.qss @@ -25,5 +25,5 @@ QPushButton:hover { } #Spacer { - background-color: #121212; + background-color: #282828; } diff --git a/pype/resolve/pipeline.py b/pype/resolve/pipeline.py index 377c5ae161..7b7829a8a8 100644 --- a/pype/resolve/pipeline.py +++ b/pype/resolve/pipeline.py @@ -2,7 +2,7 @@ Basic avalon integration """ import os -import sys +# import sys from avalon.tools import workfiles from avalon import api as avalon from pyblish import api as pyblish @@ -40,7 +40,6 @@ def install(): See the Maya equivalent for inspiration on how to implement this. """ - from .menu import launch_pype_menu # Disable all families except for the ones we explicitly want to see family_states = [ @@ -60,9 +59,6 @@ def install(): avalon.register_plugin_path(avalon.Creator, CREATE_PATH) avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) - # opening menu - launch_pype_menu() - def uninstall(): """Uninstall all tha was installed @@ -140,39 +136,6 @@ def launch_workfiles_app(*args): workfiles.show(workdir) -def reload_pipeline(): - """Attempt to reload pipeline at run-time. - - CAUTION: This is primarily for development and debugging purposes. - - """ - - import importlib - import pype.resolve - - # get avalon config name - config = os.getenv("AVALON_CONFIG", "pype") - - for module in ("avalon.io", - "avalon.lib", - "avalon.pipeline", - "avalon.api", - "avalon.tools", - - "{}".format(config), - "{}.resolve".format(config), - "{}.resolve.lib".format(config), - "{}.resolve.plugin".format(config), - "{}.resolve.pipeline".format(config) - ): - log.info("Reloading module: {}...".format(module)) - try: - module = importlib.import_module(module) - importlib.reload(module) - except Exception as e: - log.warning("Cannot reload module: {}".format(e)) - - def publish(parent): """Shorthand to publish from within host""" from avalon.tools import publish diff --git a/pype/resolve/plugin.py b/pype/resolve/plugin.py index a463495af3..610fc6bcfe 100644 --- a/pype/resolve/plugin.py +++ b/pype/resolve/plugin.py @@ -1,5 +1,5 @@ from avalon import api -from pype.resolve import lib as drlib +# from pype.resolve import lib as drlib from avalon.vendor import qargparse diff --git a/pype/resolve/utility_scripts/Pype_menu.py b/pype/resolve/utility_scripts/Pype_menu.py index 10d8d8939d..c7066930d5 100644 --- a/pype/resolve/utility_scripts/Pype_menu.py +++ b/pype/resolve/utility_scripts/Pype_menu.py @@ -1,7 +1,6 @@ import os import sys -import importlib -import avalon +import avalon.api as avalon import pype from pypeapp import Logger @@ -10,25 +9,16 @@ log = Logger().get_logger(__name__) def main(env): + import pype.resolve as bmdvr # Registers pype's Global pyblish plugins pype.install() - # Register Host (and it's pyblish plugins) - host_name = env["AVALON_APP"] - host_import_str = "pype.resolve" + # activate resolve from pype + avalon.install(bmdvr) - try: - host_module = importlib.import_module(host_import_str) - except ModuleNotFoundError: - log.error(( - f"Host \"{host_name}\" can't be imported." - f" Import string \"{host_import_str}\" failed." - )) - return False - - avalon.api.install(host_module) - avalon.api.register_host("resolve") + log.info(f"Avalon registred hosts: {avalon.registered_host()}") + bmdvr.launch_pype_menu() if __name__ == "__main__": result = main(os.environ) diff --git a/pype/resolve/utility_scripts/__test_gui.py b/pype/resolve/utility_scripts/__test_gui.py deleted file mode 100644 index 2b91732667..0000000000 --- a/pype/resolve/utility_scripts/__test_gui.py +++ /dev/null @@ -1,111 +0,0 @@ -#! python3 -# -*- coding: utf-8 -*- - -# DaVinci Resolve scripting proof of concept. Resolve page external switcher. -# Local or TCP/IP control mode. -# Refer to Resolve V15 public beta 2 scripting API documentation for host setup. -# Copyright 2018 Igor Riđanović, www.hdhead.com -from Qt.QtGui import * -from Qt.QtWidgets import * -from Qt.QtCore import * - -import sys - -# If API module not found assume we"re working as a remote control -try: - import DaVinciResolveScript - # Instantiate Resolve object - resolve = DaVinciResolveScript.scriptapp("Resolve") - checkboxState = False -except ImportError: - print("Resolve API not found.") - checkboxState = True - -try: - _encoding = QApplication.UnicodeUTF8 - - def _translate(context, text, disambig): - return QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QApplication.translate(context, text, disambig) - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName(str("Resolve Page Switcher")) - Form.resize(561, 88) - Form.setStyleSheet(str(( - "background-color: #282828;" - "border-color: #555555;" - "color: #929292;" - "font-size: 13px;" - ))) - self.horizontalLayout = QHBoxLayout(Form) - self.horizontalLayout.setObjectName(str("horizontalLayout")) - self.mediaButton = QPushButton(Form) - self.mediaButton.setObjectName(str("mediaButton")) - self.horizontalLayout.addWidget(self.mediaButton) - self.editButton = QPushButton(Form) - self.editButton.setObjectName(str("editButton")) - self.horizontalLayout.addWidget(self.editButton) - self.fusionButton = QPushButton(Form) - self.fusionButton.setObjectName(str("fusionButton")) - self.horizontalLayout.addWidget(self.fusionButton) - self.colorButton = QPushButton(Form) - self.colorButton.setObjectName(str("colorButton")) - self.horizontalLayout.addWidget(self.colorButton) - self.fairlightButton = QPushButton(Form) - self.fairlightButton.setObjectName(str("fairlightButton")) - self.horizontalLayout.addWidget(self.fairlightButton) - self.deliverButton = QPushButton(Form) - self.deliverButton.setObjectName(str("deliverButton")) - self.horizontalLayout.addWidget(self.deliverButton) - - self.mediaButton.clicked.connect(lambda: self.pageswitch("media")) - self.editButton.clicked.connect(lambda: self.pageswitch("edit")) - self.fusionButton.clicked.connect(lambda: self.pageswitch("fusion")) - self.colorButton.clicked.connect(lambda: self.pageswitch("color")) - self.fairlightButton.clicked.connect( - lambda: self.pageswitch("fairlight")) - self.deliverButton.clicked.connect(lambda: self.pageswitch("deliver")) - - self.mediaButton.setStyleSheet(str("background-color: #181818;")) - self.editButton.setStyleSheet(str("background-color: #181818;")) - self.fusionButton.setStyleSheet( - str("background-color: #181818;")) - self.colorButton.setStyleSheet(str("background-color: #181818;")) - self.fairlightButton.setStyleSheet( - str("background-color: #181818;")) - self.deliverButton.setStyleSheet( - str("background-color: #181818;")) - - self.retranslateUi(Form) - QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - Form.setWindowTitle(_translate("Resolve Page Switcher", - "Resolve Page Switcher", None)) - self.mediaButton.setText(_translate("Form", "Media", None)) - self.editButton.setText(_translate("Form", "Edit", None)) - self.fusionButton.setText(_translate("Form", "Fusion", None)) - self.colorButton.setText(_translate("Form", "Color", None)) - self.fairlightButton.setText(_translate("Form", "Fairlight", None)) - self.deliverButton.setText(_translate("Form", "Deliver", None)) - - def pageswitch(self, page): - # Send page name to server to switch remote Resolve"s page - try: - resolve.OpenPage(page) - print(f"Switched to {page}") - except NameError: - print("Resolve API not found. Run in remote mode instead?") - - -if __name__ == "__main__": - app = QApplication(sys.argv) - Form = QWidget() - ui = Ui_Form() - ui.setupUi(Form) - Form.show() - sys.exit(app.exec_()) diff --git a/pype/resolve/utility_scripts/__test_subprocess.py b/pype/resolve/utility_scripts/__test_subprocess.py index 438b1f716c..30613feb22 100644 --- a/pype/resolve/utility_scripts/__test_subprocess.py +++ b/pype/resolve/utility_scripts/__test_subprocess.py @@ -1,7 +1,6 @@ #! python3 # -*- coding: utf-8 -*- import os -import sys from pypeapp import execute, Logger from pype.resolve.utils import get_resolve_module diff --git a/pype/resolve/utils.py b/pype/resolve/utils.py index 252a43da8d..f5add53a6b 100644 --- a/pype/resolve/utils.py +++ b/pype/resolve/utils.py @@ -15,6 +15,7 @@ log = Logger().get_logger(__name__, "resolve") self = sys.modules[__name__] self.bmd = None + def get_resolve_module(): # dont run if already loaded if self.bmd: From e0166d0e395eff1c1a4ef285a9a6df41562749ea Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 13:14:38 +0200 Subject: [PATCH 08/15] clean(resolve): hound suggestions --- pype/resolve/__init__.py | 7 ++++++- pype/resolve/utility_scripts/Pype_menu.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py index ea5946381c..70163718c1 100644 --- a/pype/resolve/__init__.py +++ b/pype/resolve/__init__.py @@ -28,6 +28,7 @@ from .lib import ( from .menu import launch_pype_menu __all__ = [ + # pipeline "install", "uninstall", "ls", @@ -36,13 +37,17 @@ __all__ = [ "publish", "launch_workfiles_app", + # utils "setup", "get_resolve_module", - "get_project_manager" + # lib + "get_project_manager", + # menu "launch_pype_menu", + # workio "open_file", "save_file", "current_file", diff --git a/pype/resolve/utility_scripts/Pype_menu.py b/pype/resolve/utility_scripts/Pype_menu.py index c7066930d5..5c68fb431b 100644 --- a/pype/resolve/utility_scripts/Pype_menu.py +++ b/pype/resolve/utility_scripts/Pype_menu.py @@ -20,6 +20,7 @@ def main(env): bmdvr.launch_pype_menu() + if __name__ == "__main__": result = main(os.environ) sys.exit(not bool(result)) From c5213d3fba6f878a48478398de07c8927845d7e9 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 14:39:50 +0200 Subject: [PATCH 09/15] feat(resolve): adding official api readme --- pype/resolve/RESOLVE_API_README.txt | 189 ++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 pype/resolve/RESOLVE_API_README.txt diff --git a/pype/resolve/RESOLVE_API_README.txt b/pype/resolve/RESOLVE_API_README.txt new file mode 100644 index 0000000000..139b66bc24 --- /dev/null +++ b/pype/resolve/RESOLVE_API_README.txt @@ -0,0 +1,189 @@ +Updated as of 08 March 2019 + +-------------------------- +In this package, you will find a brief introduction to the Scripting API for DaVinci Resolve Studio. Apart from this README.txt file, this package contains folders containing the basic import modules for scripting access (DaVinciResolve.py) and some representative examples. + +Overview +-------- + +As with Blackmagic Design Fusion scripts, user scripts written in Lua and Python programming languages are supported. By default, scripts can be invoked from the Console window in the Fusion page, or via command line. This permission can be changed in Resolve Preferences, to be only from Console, or to be invoked from the local network. Please be aware of the security implications when allowing scripting access from outside of the Resolve application. + + +Using a script +-------------- +DaVinci Resolve needs to be running for a script to be invoked. + +For a Resolve script to be executed from an external folder, the script needs to know of the API location. +You may need to set the these environment variables to allow for your Python installation to pick up the appropriate dependencies as shown below: + + Mac OS X: + RESOLVE_SCRIPT_API="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/" + RESOLVE_SCRIPT_LIB="/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so" + PYTHONPATH="$PYTHONPATH:$RESOLVE_SCRIPT_API/Modules/" + + Windows: + RESOLVE_SCRIPT_API="%PROGRAMDATA%\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\" + RESOLVE_SCRIPT_LIB="C:\\Program Files\\Blackmagic Design\\DaVinci Resolve\\fusionscript.dll" + PYTHONPATH="%PYTHONPATH%;%RESOLVE_SCRIPT_API%\\Modules\\" + + Linux: + RESOLVE_SCRIPT_API="/opt/resolve/Developer/Scripting/" + RESOLVE_SCRIPT_LIB="/opt/resolve/libs/Fusion/fusionscript.so" + PYTHONPATH="$PYTHONPATH:$RESOLVE_SCRIPT_API/Modules/" + (Note: For standard ISO Linux installations, the path above may need to be modified to refer to /home/resolve instead of /opt/resolve) + +As with Fusion scripts, Resolve scripts can also be invoked via the menu and the Console. + +On startup, DaVinci Resolve scans the Utility Scripts directory and enumerates the scripts found in the Script application menu. Placing your script in this folder and invoking it from this menu is the easiest way to use scripts. The Utility Scripts folder is located in: + Mac OS X: /Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Comp/ + Windows: %APPDATA%\Blackmagic Design\DaVinci Resolve\Fusion\Scripts\Comp\ + Linux: /opt/resolve/Fusion/Scripts/Comp/ (or /home/resolve/Fusion/Scripts/Comp/ depending on installation) + +The interactive Console window allows for an easy way to execute simple scripting commands, to query or modify properties, and to test scripts. The console accepts commands in Python 2.7, Python 3.6 and Lua and evaluates and executes them immediately. For more information on how to use the Console, please refer to the DaVinci Resolve User Manual. + +This example Python script creates a simple project: + #!/usr/bin/env python + import DaVinciResolveScript as dvr_script + resolve = dvr_script.scriptapp("Resolve") + fusion = resolve.Fusion() + projectManager = resolve.GetProjectManager() + projectManager.CreateProject("Hello World") + +The resolve object is the fundamental starting point for scripting via Resolve. As a native object, it can be inspected for further scriptable properties - using table iteration and `getmetatable` in Lua and dir, help etc in Python (among other methods). A notable scriptable object above is fusion - it allows access to all existing Fusion scripting functionality. + +Running DaVinci Resolve in headless mode +---------------------------------------- + +DaVinci Resolve can be launched in a headless mode without the user interface using the -nogui command line option. When DaVinci Resolve is launched using this option, the user interface is disabled. However, the various scripting APIs will continue to work as expected. + +Basic Resolve API +----------------- + +Some commonly used API functions are described below (*). As with the resolve object, each object is inspectable for properties and functions. + + +Resolve + Fusion() --> Fusion # Returns the Fusion object. Starting point for Fusion scripts. + GetMediaStorage() --> MediaStorage # Returns media storage object to query and act on media locations. + GetProjectManager() --> ProjectManager # Returns project manager object for currently open database. + OpenPage(pageName) --> None # Switches to indicated page in DaVinci Resolve. Input can be one of ("media", "edit", "fusion", "color", "fairlight", "deliver"). +ProjectManager + CreateProject(projectName) --> Project # Creates and returns a project if projectName (text) is unique, and None if it is not. + LoadProject(projectName) --> Project # Loads and returns the project with name = projectName (text) if there is a match found, and None if there is no matching Project. + GetCurrentProject() --> Project # Returns the currently loaded Resolve project. + SaveProject() --> Bool # Saves the currently loaded project with its own name. Returns True if successful. + CreateFolder(folderName) --> Bool # Creates a folder if folderName (text) is unique. + GetProjectsInCurrentFolder() --> [project names...] # Returns an array of project names in current folder. + GetFoldersInCurrentFolder() --> [folder names...] # Returns an array of folder names in current folder. + GotoRootFolder() --> Bool # Opens root folder in database. + GotoParentFolder() --> Bool # Opens parent folder of current folder in database if current folder has parent. + OpenFolder(folderName) --> Bool # Opens folder under given name. + ImportProject(filePath) --> Bool # Imports a project under given file path. Returns true in case of success. + ExportProject(projectName, filePath) --> Bool # Exports a project based on given name into provided file path. Returns true in case of success. + RestoreProject(filePath) --> Bool # Restores a project under given backup file path. Returns true in case of success. +Project + GetMediaPool() --> MediaPool # Returns the Media Pool object. + GetTimelineCount() --> int # Returns the number of timelines currently present in the project. + GetTimelineByIndex(idx) --> Timeline # Returns timeline at the given index, 1 <= idx <= project.GetTimelineCount() + GetCurrentTimeline() --> Timeline # Returns the currently loaded timeline. + SetCurrentTimeline(timeline) --> Bool # Sets given timeline as current timeline for the project. Returns True if successful. + GetName() --> string # Returns project name. + SetName(projectName) --> Bool # Sets project name if given projectname (text) is unique. + GetPresets() --> [presets...] # Returns a table of presets and their information. + SetPreset(presetName) --> Bool # Sets preset by given presetName (string) into project. + GetRenderJobs() --> [render jobs...] # Returns a table of render jobs and their information. + GetRenderPresets() --> [presets...] # Returns a table of render presets and their information. + StartRendering(index1, index2, ...) --> Bool # Starts rendering for given render jobs based on their indices. If no parameter is given rendering would start for all render jobs. + StartRendering([idxs...]) --> Bool # Starts rendering for given render jobs based on their indices. If no parameter is given rendering would start for all render jobs. + StopRendering() --> None # Stops rendering for all render jobs. + IsRenderingInProgress() --> Bool # Returns true is rendering is in progress. + AddRenderJob() --> Bool # Adds render job to render queue. + DeleteRenderJobByIndex(idx) --> Bool # Deletes render job based on given job index (int). + DeleteAllRenderJobs() --> Bool # Deletes all render jobs. + LoadRenderPreset(presetName) --> Bool # Sets a preset as current preset for rendering if presetName (text) exists. + SaveAsNewRenderPreset(presetName) --> Bool # Creates a new render preset by given name if presetName(text) is unique. + SetRenderSettings([settings map]) --> Bool # Sets given settings for rendering. Settings map is a map, keys of map are: "SelectAllFrames", "MarkIn", "MarkOut", "TargetDir", "CustomName". + GetRenderJobStatus(idx) --> [status info] # Returns job status and completion rendering percentage of the job by given job index (int). + GetSetting(settingName) --> string # Returns setting value by given settingName (string) if the setting exist. With empty settingName the function returns a full list of settings. + SetSetting(settingName, settingValue) --> Bool # Sets project setting base on given name (string) and value (string). + GetRenderFormats() --> [render formats...]# Returns a list of available render formats. + GetRenderCodecs(renderFormat) --> [render codecs...] # Returns a list of available codecs for given render format (string). + GetCurrentRenderFormatAndCodec() --> [format, codec] # Returns currently selected render format and render codec. + SetCurrentRenderFormatAndCodec(format, codec) --> Bool # Sets given render format (string) and render codec (string) as options for rendering. +MediaStorage + GetMountedVolumes() --> [paths...] # Returns an array of folder paths corresponding to mounted volumes displayed in Resolve’s Media Storage. + GetSubFolders(folderPath) --> [paths...] # Returns an array of folder paths in the given absolute folder path. + GetFiles(folderPath) --> [paths...] # Returns an array of media and file listings in the given absolute folder path. Note that media listings may be logically consolidated entries. + RevealInStorage(path) --> None # Expands and displays a given file/folder path in Resolve’s Media Storage. + AddItemsToMediaPool(item1, item2, ...) --> [clips...] # Adds specified file/folder paths from Media Store into current Media Pool folder. Input is one or more file/folder paths. + AddItemsToMediaPool([items...]) --> [clips...] # Adds specified file/folder paths from Media Store into current Media Pool folder. Input is an array of file/folder paths. +MediaPool + GetRootFolder() --> Folder # Returns the root Folder of Media Pool + AddSubFolder(folder, name) --> Folder # Adds a new subfolder under specified Folder object with the given name. + CreateEmptyTimeline(name) --> Timeline # Adds a new timeline with given name. + AppendToTimeline(clip1, clip2...) --> Bool # Appends specified MediaPoolItem objects in the current timeline. Returns True if successful. + AppendToTimeline([clips]) --> Bool # Appends specified MediaPoolItem objects in the current timeline. Returns True if successful. + CreateTimelineFromClips(name, clip1, clip2, ...)--> Timeline # Creates a new timeline with specified name, and appends the specified MediaPoolItem objects. + CreateTimelineFromClips(name, [clips]) --> Timeline # Creates a new timeline with specified name, and appends the specified MediaPoolItem objects. + ImportTimelineFromFile(filePath) --> Timeline # Creates timeline based on parameters within given file. + GetCurrentFolder() --> Folder # Returns currently selected Folder. + SetCurrentFolder(Folder) --> Bool # Sets current folder by given Folder. +Folder + GetClips() --> [clips...] # Returns a list of clips (items) within the folder. + GetName() --> string # Returns user-defined name of the folder. + GetSubFolders() --> [folders...] # Returns a list of subfolders in the folder. +MediaPoolItem + GetMetadata(metadataType) --> [[types],[values]] # Returns a value of metadataType. If parameter is not specified returns all set metadata parameters. + SetMetadata(metadataType, metadataValue) --> Bool # Sets metadata by given type and value. Returns True if successful. + GetMediaId() --> string # Returns a unique ID name related to MediaPoolItem. + AddMarker(frameId, color, name, note, duration) --> Bool # Creates a new marker at given frameId position and with given marker information. + GetMarkers() --> [markers...] # Returns a list of all markers and their information. + AddFlag(color) --> Bool # Adds a flag with given color (text). + GetFlags() --> [colors...] # Returns a list of flag colors assigned to the item. + GetClipColor() --> string # Returns an item color as a string. + GetClipProperty(propertyName) --> [[types],[values]] # Returns property value related to the item based on given propertyName (string). if propertyName is empty then it returns a full list of properties. + SetClipProperty(propertyName, propertyValue) --> Bool # Sets into given propertyName (string) propertyValue (string). +Timeline + GetName() --> string # Returns user-defined name of the timeline. + SetName(timelineName) --> Bool # Sets timeline name is timelineName (text) is unique. + GetStartFrame() --> int # Returns frame number at the start of timeline. + GetEndFrame() --> int # Returns frame number at the end of timeline. + GetTrackCount(trackType) --> int # Returns a number of track based on specified track type ("audio", "video" or "subtitle"). + GetItemsInTrack(trackType, index) --> [items...] # Returns an array of Timeline items on the video or audio track (based on trackType) at specified index. 1 <= index <= GetTrackCount(trackType). + AddMarker(frameId, color, name, note, duration) --> Bool # Creates a new marker at given frameId position and with given marker information. + GetMarkers() --> [markers...] # Returns a list of all markers and their information. + ApplyGradeFromDRX(path, gradeMode, item1, item2, ...)--> Bool # Loads a still from given file path (string) and applies grade to Timeline Items with gradeMode (int): 0 - "No keyframes", 1 - "Source Timecode aligned", 2 - "Start Frames aligned". + ApplyGradeFromDRX(path, gradeMode, [items]) --> Bool # Loads a still from given file path (string) and applies grade to Timeline Items with gradeMode (int): 0 - "No keyframes", 1 - "Source Timecode aligned", 2 - "Start Frames aligned". + GetCurrentTimecode() --> string # Returns a string representing a timecode for current position of the timeline, while on Cut, Edit, Color and Deliver page. + GetCurrentVideoItem() --> item # Returns current video timeline item. + GetCurrentClipThumbnailImage() --> [width, height, format, data] # Returns raw thumbnail image data (This image data is encoded in base 64 format and the image format is RGB 8 bit) for the current media in the Color Page in the format of dictionary (in Python) and table (in Lua). Information return are "width", "height", "format" and "data". Example is provided in 6_get_current_media_thumbnail.py in Example folder. +TimelineItem + GetName() --> string # Returns a name of the item. + GetDuration() --> int # Returns a duration of item. + GetEnd() --> int # Returns a position of end frame. + GetFusionCompCount() --> int # Returns the number of Fusion compositions associated with the timeline item. + GetFusionCompByIndex(compIndex) --> fusionComp # Returns Fusion composition object based on given index. 1 <= compIndex <= timelineItem.GetFusionCompCount() + GetFusionCompNames() --> [names...] # Returns a list of Fusion composition names associated with the timeline item. + GetFusionCompByName(compName) --> fusionComp # Returns Fusion composition object based on given name. + GetLeftOffset() --> int # Returns a maximum extension by frame for clip from left side. + GetRightOffset() --> int # Returns a maximum extension by frame for clip from right side. + GetStart() --> int # Returns a position of first frame. + AddMarker(frameId, color, name, note, duration) --> Bool # Creates a new marker at given frameId position and with given marker information. + GetMarkers() --> [markers...] # Returns a list of all markers and their information. + GetFlags() --> [colors...] # Returns a list of flag colors assigned to the item. + GetClipColor() --> string # Returns an item color as a string. + AddFusionComp() --> fusionComp # Adds a new Fusion composition associated with the timeline item. + ImportFusionComp(path) --> fusionComp # Imports Fusion composition from given file path by creating and adding a new composition for the item. + ExportFusionComp(path, compIndex) --> Bool # Exports Fusion composition based on given index into provided file name path. + DeleteFusionCompByName(compName) --> Bool # Deletes Fusion composition by provided name. + LoadFusionCompByName(compName) --> fusionComp # Loads Fusion composition by provided name and sets it as active composition. + RenameFusionCompByName(oldName, newName) --> Bool # Renames Fusion composition by provided name with new given name. + AddVersion(versionName, versionType) --> Bool # Adds a new Version associated with the timeline item. versionType: 0 - local, 1 - remote. + DeleteVersionByName(versionName, versionType) --> Bool # Deletes Version by provided name. versionType: 0 - local, 1 - remote. + LoadVersionByName(versionName, versionType) --> Bool # Loads Version by provided name and sets it as active Version. versionType: 0 - local, 1 - remote. + RenameVersionByName(oldName, newName, versionType)--> Bool # Renames Version by provided name with new given name. versionType: 0 - local, 1 - remote. + GetMediaPoolItem() --> MediaPoolItem # Returns a corresponding to the timeline item media pool item if it exists. + GetVersionNames(versionType) --> [strings...] # Returns a list of version names by provided versionType: 0 - local, 1 - remote. + GetStereoConvergenceValues() --> [offset, value] # Returns a table of keyframe offsets and respective convergence values + GetStereoLeftFloatingWindowParams() --> [offset, value] # For the LEFT eye -> returns a table of keyframe offsets and respective floating window params. Value at particular offset includes the left, right, top and bottom floating window values + GetStereoRightFloatingWindowParams() --> [offset, value] # For the RIGHT eye -> returns a table of keyframe offsets and respective floating window params. Value at particular offset includes the left, right, top and bottom floating window values From ad9f4b340bfcefd8533dc3ab27d7816bc156414e Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 14:47:26 +0200 Subject: [PATCH 10/15] fix(resolve): workio was not opening project --- pype/resolve/workio.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pype/resolve/workio.py b/pype/resolve/workio.py index b9562449bf..8e6e50a1ed 100644 --- a/pype/resolve/workio.py +++ b/pype/resolve/workio.py @@ -5,7 +5,7 @@ from pypeapp import Logger from .lib import get_project_manager -log = Logger().get_logger(__name__, "nukestudio") +log = Logger().get_logger(__name__, "resolve") exported_projet_ext = ".drp" @@ -45,17 +45,24 @@ def open_file(filepath): # deal with current project project = pm.GetCurrentProject() + log.info(f"Test `pm`: {pm}") pm.SaveProject() - pm.CloseProject(project) try: # load project from input path project = pm.LoadProject(fname) log.info(f"Project {project.GetName()} opened...") return True - except NameError as E: - log.error(f"Project with name `{fname}` does not exist!\n\nError: {E}") - return False + except AttributeError: + log.warning((f"Project with name `{fname}` does not exist! It will " + f"be imported from {filepath} and then loaded...")) + if pm.ImportProject(filepath): + # load project from input path + project = pm.LoadProject(fname) + log.info(f"Project imported/loaded {project.GetName()}...") + return True + else: + return False def current_file(): From af5957b0c5fedcca15a6d868a5ed4ba6ca0ec838 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 29 May 2020 15:43:41 +0200 Subject: [PATCH 11/15] feat(resolve): workfiles are creating project folder in manager --- pype/resolve/__init__.py | 4 ++- pype/resolve/lib.py | 66 ++++++++++++++++++++++++++++++++++++++++ pype/resolve/workio.py | 9 +++++- 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/pype/resolve/__init__.py b/pype/resolve/__init__.py index 70163718c1..72d6314b5e 100644 --- a/pype/resolve/__init__.py +++ b/pype/resolve/__init__.py @@ -22,7 +22,8 @@ from .workio import ( ) from .lib import ( - get_project_manager + get_project_manager, + set_project_manager_to_folder_name ) from .menu import launch_pype_menu @@ -43,6 +44,7 @@ __all__ = [ # lib "get_project_manager", + "set_project_manager_to_folder_name", # menu "launch_pype_menu", diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py index a6f10a1533..2576136df5 100644 --- a/pype/resolve/lib.py +++ b/pype/resolve/lib.py @@ -1,5 +1,8 @@ import sys from .utils import get_resolve_module +from pypeapp import Logger + +log = Logger().get_logger(__name__, "resolve") self = sys.modules[__name__] self.pm = None @@ -10,3 +13,66 @@ def get_project_manager(): resolve = get_resolve_module() self.pm = resolve.GetProjectManager() return self.pm + + +def set_project_manager_to_folder_name(folder_name): + """ + Sets context of Project manager to given folder by name. + + Searching for folder by given name from root folder to nested. + If no existing folder by name it will create one in root folder. + + Args: + folder_name (str): name of searched folder + + Returns: + bool: True if success + + Raises: + Exception: Cannot create folder in root + + """ + # initialize project manager + get_project_manager() + + set_folder = False + + # go back to root folder + if self.pm.GotoRootFolder(): + log.info(f"Testing existing folder: {folder_name}") + folders = convert_resolve_list_type( + self.pm.GetFoldersInCurrentFolder()) + log.info(f"Testing existing folders: {folders}") + # get me first available folder object + # with the same name as in `folder_name` else return False + if next((f for f in folders if f in folder_name), False): + log.info(f"Found existing folder: {folder_name}") + set_folder = self.pm.OpenFolder(folder_name) + + if set_folder: + return True + + # if folder by name is not existent then create one + # go back to root folder + log.info(f"Folder `{folder_name}` not found and will be created") + if self.pm.GotoRootFolder(): + try: + # create folder by given name + self.pm.CreateFolder(folder_name) + self.pm.OpenFolder(folder_name) + return True + except NameError as e: + log.error((f"Folder with name `{folder_name}` cannot be created!" + f"Error: {e}")) + return False + + +def convert_resolve_list_type(resolve_list): + """ Resolve is using indexed dictionary as list type. + `{1.0: 'vaule'}` + This will convert it to normal list class + """ + assert isinstance(resolve_list, dict), ( + "Input argument should be dict() type") + + return [resolve_list[i] for i in sorted(resolve_list.keys())] diff --git a/pype/resolve/workio.py b/pype/resolve/workio.py index 8e6e50a1ed..e1e30a8734 100644 --- a/pype/resolve/workio.py +++ b/pype/resolve/workio.py @@ -2,7 +2,10 @@ import os from pypeapp import Logger -from .lib import get_project_manager +from .lib import ( + get_project_manager, + set_project_manager_to_folder_name +) log = Logger().get_logger(__name__, "resolve") @@ -42,6 +45,7 @@ def open_file(filepath): pm = get_project_manager() file = os.path.basename(filepath) fname, _ = os.path.splitext(file) + dname, _ = fname.split("_v") # deal with current project project = pm.GetCurrentProject() @@ -49,6 +53,9 @@ def open_file(filepath): pm.SaveProject() try: + log.info(f"Test `dname`: {dname}") + if not set_project_manager_to_folder_name(dname): + raise # load project from input path project = pm.LoadProject(fname) log.info(f"Project {project.GetName()} opened...") From f2df4d602e9f87b74396ffd616ef9cf17402ae10 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 2 Jun 2020 11:29:55 +0200 Subject: [PATCH 12/15] feat(resolve): compoud clip dev --- .../utility_scripts/__dev_compound_clip.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 pype/resolve/utility_scripts/__dev_compound_clip.py diff --git a/pype/resolve/utility_scripts/__dev_compound_clip.py b/pype/resolve/utility_scripts/__dev_compound_clip.py new file mode 100644 index 0000000000..fe47008c70 --- /dev/null +++ b/pype/resolve/utility_scripts/__dev_compound_clip.py @@ -0,0 +1,65 @@ +#! python3 +# -*- coding: utf-8 -*- + + +# convert clip def +def convert_clip(timeline=None): + """Convert timeline item (clip) into compound clip pype container + + Args: + timeline (MediaPool.Timeline): Object of timeline + + Returns: + bool: `True` if success + + Raises: + Exception: description + + """ + pass + + +# decorator function create_current_timeline_media_bin() +def create_current_timeline_media_bin(timeline=None): + """Convert timeline item (clip) into compound clip pype container + + Args: + timeline (MediaPool.Timeline): Object of timeline + + Returns: + bool: `True` if success + + Raises: + Exception: description + + """ + pass + + +# decorator function get_selected_track_items() +def get_selected_track_items(): + """Convert timeline item (clip) into compound clip pype container + + Args: + timeline (MediaPool.Timeline): Object of timeline + + Returns: + bool: `True` if success + + Raises: + Exception: description + + """ + print("testText") + + +# PypeCompoundClip() class +class PypeCompoundClip(object): + """docstring for .""" + + def __init__(self, arg): + super(self).__init__() + self.arg = arg + + def create_compound_clip(self): + pass From 3722155c4845d0782de03e67bfa535824b9b7d5f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 2 Jun 2020 11:30:51 +0200 Subject: [PATCH 13/15] fix(resolve): removing project preload --- pype/resolve/preload_console.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pype/resolve/preload_console.py b/pype/resolve/preload_console.py index c1b70de11d..4f783fffbe 100644 --- a/pype/resolve/preload_console.py +++ b/pype/resolve/preload_console.py @@ -13,8 +13,7 @@ while True: # Create project and set parameters: resolve = get_resolve_module() pm = resolve.GetProjectManager() - p = pm.GetCurrentProject() - if p.GetName() == "Untitled Project": + if pm: ready = None else: ready = True @@ -23,10 +22,10 @@ while True: if ready is None: time.sleep(wait_delay) - log.info(f"Waiting {wait}s for Resolve to be open in project") + log.info(f"Waiting {wait}s for Resolve to have opened Project Manager") wait += wait_delay else: print(f"Preloaded variables: \n\n\tResolve module: " f"`resolve` > {type(resolve)} \n\tProject manager: " - f"`pm` > {type(pm)} \n\tCurrent project: `p` > {type(p)}") + f"`pm` > {type(pm)}") break From 1570ab0bca987e59ada820e70545164d58c22e97 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 2 Jun 2020 14:58:44 +0200 Subject: [PATCH 14/15] feat(resolve): new hosts structure --- pype/{ => hosts}/resolve/README.markdown | 0 pype/{ => hosts}/resolve/RESOLVE_API_README.txt | 0 pype/{ => hosts}/resolve/__init__.py | 0 pype/{ => hosts}/resolve/action.py | 4 ++-- pype/{ => hosts}/resolve/lib.py | 0 pype/{ => hosts}/resolve/menu.py | 0 pype/{ => hosts}/resolve/menu_style.qss | 0 pype/{ => hosts}/resolve/pipeline.py | 2 +- pype/{ => hosts}/resolve/plugin.py | 2 +- pype/{ => hosts}/resolve/preload_console.py | 2 +- pype/{ => hosts}/resolve/utility_scripts/Pype_menu.py | 2 +- pype/{ => hosts}/resolve/utility_scripts/README.markdown | 0 .../resolve/utility_scripts/__dev_compound_clip.py | 0 pype/{ => hosts}/resolve/utility_scripts/__test_pyblish.py | 0 pype/{ => hosts}/resolve/utility_scripts/__test_subprocess.py | 2 +- pype/{ => hosts}/resolve/utils.py | 0 pype/{ => hosts}/resolve/workio.py | 0 pype/plugins/resolve/publish/collect_host.py | 2 +- 18 files changed, 8 insertions(+), 8 deletions(-) rename pype/{ => hosts}/resolve/README.markdown (100%) rename pype/{ => hosts}/resolve/RESOLVE_API_README.txt (100%) rename pype/{ => hosts}/resolve/__init__.py (100%) rename pype/{ => hosts}/resolve/action.py (93%) rename pype/{ => hosts}/resolve/lib.py (100%) rename pype/{ => hosts}/resolve/menu.py (100%) rename pype/{ => hosts}/resolve/menu_style.qss (100%) rename pype/{ => hosts}/resolve/pipeline.py (98%) rename pype/{ => hosts}/resolve/plugin.py (97%) rename pype/{ => hosts}/resolve/preload_console.py (93%) rename pype/{ => hosts}/resolve/utility_scripts/Pype_menu.py (92%) rename pype/{ => hosts}/resolve/utility_scripts/README.markdown (100%) rename pype/{ => hosts}/resolve/utility_scripts/__dev_compound_clip.py (100%) rename pype/{ => hosts}/resolve/utility_scripts/__test_pyblish.py (100%) rename pype/{ => hosts}/resolve/utility_scripts/__test_subprocess.py (93%) rename pype/{ => hosts}/resolve/utils.py (100%) rename pype/{ => hosts}/resolve/workio.py (100%) diff --git a/pype/resolve/README.markdown b/pype/hosts/resolve/README.markdown similarity index 100% rename from pype/resolve/README.markdown rename to pype/hosts/resolve/README.markdown diff --git a/pype/resolve/RESOLVE_API_README.txt b/pype/hosts/resolve/RESOLVE_API_README.txt similarity index 100% rename from pype/resolve/RESOLVE_API_README.txt rename to pype/hosts/resolve/RESOLVE_API_README.txt diff --git a/pype/resolve/__init__.py b/pype/hosts/resolve/__init__.py similarity index 100% rename from pype/resolve/__init__.py rename to pype/hosts/resolve/__init__.py diff --git a/pype/resolve/action.py b/pype/hosts/resolve/action.py similarity index 93% rename from pype/resolve/action.py rename to pype/hosts/resolve/action.py index dfbe23087c..31830937c1 100644 --- a/pype/resolve/action.py +++ b/pype/hosts/resolve/action.py @@ -4,7 +4,7 @@ from __future__ import absolute_import import pyblish.api -from ..action import get_errored_instances_from_context +from ...action import get_errored_instances_from_context class SelectInvalidAction(pyblish.api.Action): @@ -21,7 +21,7 @@ class SelectInvalidAction(pyblish.api.Action): def process(self, context, plugin): try: - from pype.resolve.utils import get_resolve_module + from pype.hosts.resolve.utils import get_resolve_module resolve = get_resolve_module() self.log.debug(resolve) except ImportError: diff --git a/pype/resolve/lib.py b/pype/hosts/resolve/lib.py similarity index 100% rename from pype/resolve/lib.py rename to pype/hosts/resolve/lib.py diff --git a/pype/resolve/menu.py b/pype/hosts/resolve/menu.py similarity index 100% rename from pype/resolve/menu.py rename to pype/hosts/resolve/menu.py diff --git a/pype/resolve/menu_style.qss b/pype/hosts/resolve/menu_style.qss similarity index 100% rename from pype/resolve/menu_style.qss rename to pype/hosts/resolve/menu_style.qss diff --git a/pype/resolve/pipeline.py b/pype/hosts/resolve/pipeline.py similarity index 98% rename from pype/resolve/pipeline.py rename to pype/hosts/resolve/pipeline.py index 7b7829a8a8..967aed1436 100644 --- a/pype/resolve/pipeline.py +++ b/pype/hosts/resolve/pipeline.py @@ -49,7 +49,7 @@ def install(): avalon.data["familiesStateDefault"] = False avalon.data["familiesStateToggled"] = family_states - log.info("pype.resolve installed") + log.info("pype.hosts.resolve installed") pyblish.register_host("resolve") pyblish.register_plugin_path(PUBLISH_PATH) diff --git a/pype/resolve/plugin.py b/pype/hosts/resolve/plugin.py similarity index 97% rename from pype/resolve/plugin.py rename to pype/hosts/resolve/plugin.py index 610fc6bcfe..628d4bdb26 100644 --- a/pype/resolve/plugin.py +++ b/pype/hosts/resolve/plugin.py @@ -1,5 +1,5 @@ from avalon import api -# from pype.resolve import lib as drlib +# from pype.hosts.resolve import lib as drlib from avalon.vendor import qargparse diff --git a/pype/resolve/preload_console.py b/pype/hosts/resolve/preload_console.py similarity index 93% rename from pype/resolve/preload_console.py rename to pype/hosts/resolve/preload_console.py index 4f783fffbe..ea1bd4f180 100644 --- a/pype/resolve/preload_console.py +++ b/pype/hosts/resolve/preload_console.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import time -from pype.resolve.utils import get_resolve_module +from pype.hosts.resolve.utils import get_resolve_module from pypeapp import Logger log = Logger().get_logger(__name__, "resolve") diff --git a/pype/resolve/utility_scripts/Pype_menu.py b/pype/hosts/resolve/utility_scripts/Pype_menu.py similarity index 92% rename from pype/resolve/utility_scripts/Pype_menu.py rename to pype/hosts/resolve/utility_scripts/Pype_menu.py index 5c68fb431b..1f5cd36277 100644 --- a/pype/resolve/utility_scripts/Pype_menu.py +++ b/pype/hosts/resolve/utility_scripts/Pype_menu.py @@ -9,7 +9,7 @@ log = Logger().get_logger(__name__) def main(env): - import pype.resolve as bmdvr + import pype.hosts.resolve as bmdvr # Registers pype's Global pyblish plugins pype.install() diff --git a/pype/resolve/utility_scripts/README.markdown b/pype/hosts/resolve/utility_scripts/README.markdown similarity index 100% rename from pype/resolve/utility_scripts/README.markdown rename to pype/hosts/resolve/utility_scripts/README.markdown diff --git a/pype/resolve/utility_scripts/__dev_compound_clip.py b/pype/hosts/resolve/utility_scripts/__dev_compound_clip.py similarity index 100% rename from pype/resolve/utility_scripts/__dev_compound_clip.py rename to pype/hosts/resolve/utility_scripts/__dev_compound_clip.py diff --git a/pype/resolve/utility_scripts/__test_pyblish.py b/pype/hosts/resolve/utility_scripts/__test_pyblish.py similarity index 100% rename from pype/resolve/utility_scripts/__test_pyblish.py rename to pype/hosts/resolve/utility_scripts/__test_pyblish.py diff --git a/pype/resolve/utility_scripts/__test_subprocess.py b/pype/hosts/resolve/utility_scripts/__test_subprocess.py similarity index 93% rename from pype/resolve/utility_scripts/__test_subprocess.py rename to pype/hosts/resolve/utility_scripts/__test_subprocess.py index 30613feb22..bdc57bbf00 100644 --- a/pype/resolve/utility_scripts/__test_subprocess.py +++ b/pype/hosts/resolve/utility_scripts/__test_subprocess.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- import os from pypeapp import execute, Logger -from pype.resolve.utils import get_resolve_module +from pype.hosts.resolve.utils import get_resolve_module log = Logger().get_logger("Resolve") diff --git a/pype/resolve/utils.py b/pype/hosts/resolve/utils.py similarity index 100% rename from pype/resolve/utils.py rename to pype/hosts/resolve/utils.py diff --git a/pype/resolve/workio.py b/pype/hosts/resolve/workio.py similarity index 100% rename from pype/resolve/workio.py rename to pype/hosts/resolve/workio.py diff --git a/pype/plugins/resolve/publish/collect_host.py b/pype/plugins/resolve/publish/collect_host.py index 7579be487c..a5c4b0936c 100644 --- a/pype/plugins/resolve/publish/collect_host.py +++ b/pype/plugins/resolve/publish/collect_host.py @@ -1,5 +1,5 @@ import pyblish.api -from pype.resolve.utils import get_resolve_module +from pype.hosts.resolve.utils import get_resolve_module class CollectProject(pyblish.api.ContextPlugin): From a63aebcfbdc5cade56d37be2e5b711fe9bd2c32b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 3 Jun 2020 11:23:39 +0200 Subject: [PATCH 15/15] fix(resolve): missing hosts path bit in import --- pype/hooks/resolve/prelaunch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index 6f5c22a7d0..bddeccf4a3 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -3,7 +3,7 @@ import traceback import importlib from pype.lib import PypeHook from pypeapp import Logger -from pype.resolve import utils +from pype.hosts.resolve import utils class ResolvePrelaunch(PypeHook):

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