feat(resolve): integration wip

This commit is contained in:
Jakub Jezek 2020-05-28 14:24:51 +02:00
parent 0da0364221
commit 157a9e3498
No known key found for this signature in database
GPG key ID: C4B96E101D2A47F3
14 changed files with 92 additions and 55 deletions

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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():

View file

@ -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;
}

View file

@ -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"""

View file

@ -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

View file

@ -27,6 +27,7 @@ def main(env):
return False
avalon.api.install(host_module)
avalon.api.register_host("resolve")
if __name__ == "__main__":

View file

@ -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):

View file

@ -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]