fixed imports to use in-DCC imports from resolve.api

This commit is contained in:
Jakub Trllo 2022-08-11 19:01:24 +02:00
parent 8ba5d00799
commit 07d89fc23b
19 changed files with 233 additions and 300 deletions

View file

@ -1,129 +0,0 @@
from .api.utils import (
setup,
get_resolve_module
)
from .api.pipeline import (
install,
uninstall,
ls,
containerise,
update_container,
publish,
launch_workfiles_app,
maintained_selection,
remove_instance,
list_instances
)
from .api.lib import (
maintain_current_timeline,
publish_clip_color,
get_project_manager,
get_current_project,
get_current_timeline,
create_bin,
get_media_pool_item,
create_media_pool_item,
create_timeline_item,
get_timeline_item,
get_video_track_names,
get_current_timeline_items,
get_pype_timeline_item_by_name,
get_timeline_item_pype_tag,
set_timeline_item_pype_tag,
imprint,
set_publish_attribute,
get_publish_attribute,
create_compound_clip,
swap_clips,
get_pype_clip_metadata,
set_project_manager_to_folder_name,
get_otio_clip_instance_data,
get_reformated_path
)
from .api.menu import launch_pype_menu
from .api.plugin import (
ClipLoader,
TimelineItemLoader,
Creator,
PublishClip
)
from .api.workio import (
open_file,
save_file,
current_file,
has_unsaved_changes,
file_extensions,
work_root
)
from .api.testing_utils import TestGUI
__all__ = [
# pipeline
"install",
"uninstall",
"ls",
"containerise",
"update_container",
"reload_pipeline",
"publish",
"launch_workfiles_app",
"maintained_selection",
"remove_instance",
"list_instances",
# utils
"setup",
"get_resolve_module",
# lib
"maintain_current_timeline",
"publish_clip_color",
"get_project_manager",
"get_current_project",
"get_current_timeline",
"create_bin",
"get_media_pool_item",
"create_media_pool_item",
"create_timeline_item",
"get_timeline_item",
"get_video_track_names",
"get_current_timeline_items",
"get_pype_timeline_item_by_name",
"get_timeline_item_pype_tag",
"set_timeline_item_pype_tag",
"imprint",
"set_publish_attribute",
"get_publish_attribute",
"create_compound_clip",
"swap_clips",
"get_pype_clip_metadata",
"set_project_manager_to_folder_name",
"get_otio_clip_instance_data",
"get_reformated_path",
# menu
"launch_pype_menu",
# plugin
"ClipLoader",
"TimelineItemLoader",
"Creator",
"PublishClip",
# workio
"open_file",
"save_file",
"current_file",
"has_unsaved_changes",
"file_extensions",
"work_root",
"TestGUI"
]

View file

@ -1,11 +1,137 @@
"""
resolve api
"""
import os
bmdvr = None
bmdvf = None
API_DIR = os.path.dirname(os.path.abspath(__file__))
HOST_DIR = os.path.dirname(API_DIR)
PLUGINS_DIR = os.path.join(HOST_DIR, "plugins")
from .utils import (
get_resolve_module
)
from .pipeline import (
install,
uninstall,
ls,
containerise,
update_container,
publish,
launch_workfiles_app,
maintained_selection,
remove_instance,
list_instances
)
from .lib import (
maintain_current_timeline,
publish_clip_color,
get_project_manager,
get_current_project,
get_current_timeline,
create_bin,
get_media_pool_item,
create_media_pool_item,
create_timeline_item,
get_timeline_item,
get_video_track_names,
get_current_timeline_items,
get_pype_timeline_item_by_name,
get_timeline_item_pype_tag,
set_timeline_item_pype_tag,
imprint,
set_publish_attribute,
get_publish_attribute,
create_compound_clip,
swap_clips,
get_pype_clip_metadata,
set_project_manager_to_folder_name,
get_otio_clip_instance_data,
get_reformated_path
)
from .menu import launch_pype_menu
from .plugin import (
ClipLoader,
TimelineItemLoader,
Creator,
PublishClip
)
from .workio import (
open_file,
save_file,
current_file,
has_unsaved_changes,
file_extensions,
work_root
)
from .testing_utils import TestGUI
__all__ = [
"bmdvr",
"bmdvf",
# pipeline
"install",
"uninstall",
"ls",
"containerise",
"update_container",
"reload_pipeline",
"publish",
"launch_workfiles_app",
"maintained_selection",
"remove_instance",
"list_instances",
# utils
"get_resolve_module",
# lib
"maintain_current_timeline",
"publish_clip_color",
"get_project_manager",
"get_current_project",
"get_current_timeline",
"create_bin",
"get_media_pool_item",
"create_media_pool_item",
"create_timeline_item",
"get_timeline_item",
"get_video_track_names",
"get_current_timeline_items",
"get_pype_timeline_item_by_name",
"get_timeline_item_pype_tag",
"set_timeline_item_pype_tag",
"imprint",
"set_publish_attribute",
"get_publish_attribute",
"create_compound_clip",
"swap_clips",
"get_pype_clip_metadata",
"set_project_manager_to_folder_name",
"get_otio_clip_instance_data",
"get_reformated_path",
# menu
"launch_pype_menu",
# plugin
"ClipLoader",
"TimelineItemLoader",
"Creator",
"PublishClip",
# workio
"open_file",
"save_file",
"current_file",
"has_unsaved_changes",
"file_extensions",
"work_root",
"TestGUI"
]

View file

@ -4,7 +4,7 @@ from __future__ import absolute_import
import pyblish.api
from ...action import get_errored_instances_from_context
from openpype.action import get_errored_instances_from_context
class SelectInvalidAction(pyblish.api.Action):

View file

@ -4,13 +4,13 @@ import re
import os
import contextlib
from opentimelineio import opentime
from openpype.lib import Logger
from openpype.pipeline.editorial import is_overlapping_otio_ranges
from ..otio import davinci_export as otio_export
from openpype.api import Logger
log = Logger().get_logger(__name__)
log = Logger.get_logger(__name__)
self = sys.modules[__name__]
self.project_manager = None

View file

@ -3,13 +3,13 @@ import sys
from Qt import QtWidgets, QtCore
from openpype.tools.utils import host_tools
from .pipeline import (
publish,
launch_workfiles_app
)
from openpype.tools.utils import host_tools
def load_stylesheet():
path = os.path.join(os.path.dirname(__file__), "menu_style.qss")

View file

@ -7,7 +7,7 @@ from collections import OrderedDict
from pyblish import api as pyblish
from openpype.api import Logger
from openpype.lib import Logger
from openpype.pipeline import (
schema,
register_loader_plugin_path,
@ -16,11 +16,15 @@ from openpype.pipeline import (
deregister_creator_plugin_path,
AVALON_CONTAINER_ID,
)
from . import lib
from . import PLUGINS_DIR
from openpype.tools.utils import host_tools
log = Logger().get_logger(__name__)
from . import lib
from .utils import get_resolve_module
log = Logger.get_logger(__name__)
HOST_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
PLUGINS_DIR = os.path.join(HOST_DIR, "plugins")
PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish")
LOAD_PATH = os.path.join(PLUGINS_DIR, "load")
CREATE_PATH = os.path.join(PLUGINS_DIR, "create")
@ -39,7 +43,6 @@ def install():
See the Maya equivalent for inspiration on how to implement this.
"""
from .. import get_resolve_module
log.info("openpype.hosts.resolve installed")

View file

@ -1,9 +1,9 @@
#!/usr/bin/env python
import time
from openpype.hosts.resolve.utils import get_resolve_module
from openpype.api import Logger
from openpype.lib import Logger
log = Logger().get_logger(__name__)
log = Logger.get_logger(__name__)
wait_delay = 2.5
wait = 0.00

View file

@ -4,21 +4,21 @@
Resolve's tools for setting environment
"""
import sys
import os
import shutil
from . import HOST_DIR
from openpype.api import Logger
log = Logger().get_logger(__name__)
import sys
from openpype.lib import Logger
log = Logger.get_logger(__name__)
def get_resolve_module():
from openpype.hosts import resolve
from openpype.hosts.resolve import api
# dont run if already loaded
if resolve.api.bmdvr:
if api.bmdvr:
log.info(("resolve module is assigned to "
f"`pype.hosts.resolve.api.bmdvr`: {resolve.api.bmdvr}"))
return resolve.api.bmdvr
f"`pype.hosts.resolve.api.bmdvr`: {api.bmdvr}"))
return api.bmdvr
try:
"""
The PYTHONPATH needs to be set correctly for this import
@ -71,79 +71,9 @@ def get_resolve_module():
# assign global var and return
bmdvr = bmd.scriptapp("Resolve")
bmdvf = bmd.scriptapp("Fusion")
resolve.api.bmdvr = bmdvr
resolve.api.bmdvf = bmdvf
api.bmdvr = bmdvr
api.bmdvf = bmdvf
log.info(("Assigning resolve module to "
f"`pype.hosts.resolve.api.bmdvr`: {resolve.api.bmdvr}"))
f"`pype.hosts.resolve.api.bmdvr`: {api.bmdvr}"))
log.info(("Assigning resolve module to "
f"`pype.hosts.resolve.api.bmdvf`: {resolve.api.bmdvf}"))
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
# initiate inputs
scripts = {}
us_env = env.get("RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR")
us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "")
us_paths = [os.path.join(
HOST_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
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}`...")
if os.path.isdir(path):
shutil.rmtree(path, onerror=None)
else:
os.remove(path)
# copy scripts into Resolve's utility scripts dir
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}`...")
if os.path.isdir(src):
shutil.copytree(
src, dst, symlinks=False,
ignore=None, ignore_dangling_symlinks=False
)
else:
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 OpenPype wrapper has been installed")
f"`pype.hosts.resolve.api.bmdvf`: {api.bmdvf}"))

View file

@ -2,14 +2,14 @@
import os
from openpype.api import Logger
from .. import (
from .lib import (
get_project_manager,
get_current_project,
set_project_manager_to_folder_name
)
log = Logger().get_logger(__name__)
log = Logger.get_logger(__name__)
exported_projet_ext = ".drp"
@ -60,7 +60,7 @@ def open_file(filepath):
# load project from input path
project = pm.LoadProject(fname)
log.info(f"Project {project.GetName()} opened...")
return True
except AttributeError:
log.warning((f"Project with name `{fname}` does not exist! It will "
f"be imported from {filepath} and then loaded..."))
@ -69,9 +69,8 @@ def open_file(filepath):
project = pm.LoadProject(fname)
log.info(f"Project imported/loaded {project.GetName()}...")
return True
else:
return False
return False
return True
def current_file():
pm = get_project_manager()
@ -80,13 +79,9 @@ def current_file():
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 == "":
if not current_file:
return None
return normalised
return os.path.normpath(current_file)
def work_root(session):

View file

@ -1,7 +1,7 @@
import os
import importlib
from openpype.lib import PreLaunchHook
from openpype.hosts.resolve.api import utils
from openpype.hosts.resolve.utils import setup
class ResolvePrelaunch(PreLaunchHook):
@ -43,18 +43,6 @@ class ResolvePrelaunch(PreLaunchHook):
self.launch_context.env.get("PRE_PYTHON_SCRIPT", ""))
self.launch_context.env["PRE_PYTHON_SCRIPT"] = pre_py_sc
self.log.debug(f"-- pre_py_sc: `{pre_py_sc}`...")
try:
__import__("openpype.hosts.resolve")
__import__("pyblish")
except ImportError:
self.log.warning(
"pyblish: Could not load Resolve integration.",
exc_info=True
)
else:
# Resolve Setup integration
importlib.reload(utils)
self.log.debug(f"-- utils.__file__: `{utils.__file__}`")
utils.setup(self.launch_context.env)
# Resolve Setup integration
setup(self.launch_context.env)

View file

@ -1,9 +1,12 @@
# from pprint import pformat
from openpype.hosts import resolve
from openpype.hosts.resolve.api import lib
from openpype.hosts.resolve.api import plugin, lib
from openpype.hosts.resolve.api.lib import (
get_video_track_names,
create_bin,
)
class CreateShotClip(resolve.Creator):
class CreateShotClip(plugin.Creator):
"""Publishable clip"""
label = "Create Publishable Clip"
@ -11,7 +14,7 @@ class CreateShotClip(resolve.Creator):
icon = "film"
defaults = ["Main"]
gui_tracks = resolve.get_video_track_names()
gui_tracks = get_video_track_names()
gui_name = "OpenPype publish attributes creator"
gui_info = "Define sequential rename and fill hierarchy data."
gui_inputs = {
@ -250,7 +253,7 @@ class CreateShotClip(resolve.Creator):
sq_markers = self.timeline.GetMarkers()
# create media bin for compound clips (trackItems)
mp_folder = resolve.create_bin(self.timeline.GetName())
mp_folder = create_bin(self.timeline.GetName())
kwargs = {
"ui_inputs": widget.result,
@ -264,6 +267,6 @@ class CreateShotClip(resolve.Creator):
self.rename_index = i
self.log.info(track_item_data)
# convert track item to timeline media pool item
track_item = resolve.PublishClip(
track_item = plugin.PublishClip(
self, track_item_data, **kwargs).convert()
track_item.SetClipColor(lib.publish_clip_color)

View file

@ -1,21 +1,22 @@
from copy import deepcopy
from importlib import reload
from openpype.client import (
get_version_by_id,
get_last_version_by_subset_id,
)
from openpype.hosts import resolve
# from openpype.hosts import resolve
from openpype.pipeline import (
get_representation_path,
legacy_io,
)
from openpype.hosts.resolve.api import lib, plugin
reload(plugin)
reload(lib)
from openpype.hosts.resolve.api.pipeline import (
containerise,
update_container,
)
class LoadClip(resolve.TimelineItemLoader):
class LoadClip(plugin.TimelineItemLoader):
"""Load a subset to timeline as clip
Place clip to timeline on its asset origin timings collected
@ -46,7 +47,7 @@ class LoadClip(resolve.TimelineItemLoader):
})
# load clip to timeline and get main variables
timeline_item = resolve.ClipLoader(
timeline_item = plugin.ClipLoader(
self, context, **options).load()
namespace = namespace or timeline_item.GetName()
version = context['version']
@ -80,7 +81,7 @@ class LoadClip(resolve.TimelineItemLoader):
self.log.info("Loader done: `{}`".format(name))
return resolve.containerise(
return containerise(
timeline_item,
name, namespace, context,
self.__class__.__name__,
@ -98,7 +99,7 @@ class LoadClip(resolve.TimelineItemLoader):
context.update({"representation": representation})
name = container['name']
namespace = container['namespace']
timeline_item_data = resolve.get_pype_timeline_item_by_name(namespace)
timeline_item_data = lib.get_pype_timeline_item_by_name(namespace)
timeline_item = timeline_item_data["clip"]["item"]
project_name = legacy_io.active_project()
version = get_version_by_id(project_name, representation["parent"])
@ -109,7 +110,7 @@ class LoadClip(resolve.TimelineItemLoader):
self.fname = get_representation_path(representation)
context["version"] = {"data": version_data}
loader = resolve.ClipLoader(self, context)
loader = plugin.ClipLoader(self, context)
timeline_item = loader.update(timeline_item)
# add additional metadata from the version to imprint Avalon knob
@ -136,7 +137,7 @@ class LoadClip(resolve.TimelineItemLoader):
# update color of clip regarding the version order
self.set_item_color(timeline_item, version)
return resolve.update_container(timeline_item, data_imprint)
return update_container(timeline_item, data_imprint)
@classmethod
def set_item_color(cls, timeline_item, version):

View file

@ -1,7 +1,7 @@
import os
import pyblish.api
import openpype.api
from openpype.hosts import resolve
from openpype.hosts.resolve.api.lib import get_project_manager
class ExtractWorkfile(openpype.api.Extractor):
@ -29,7 +29,7 @@ class ExtractWorkfile(openpype.api.Extractor):
os.path.join(staging_dir, drp_file_name))
# write out the drp workfile
resolve.get_project_manager().ExportProject(
get_project_manager().ExportProject(
project.GetName(), drp_file_path)
# create drp workfile representation

View file

@ -1,9 +1,15 @@
import pyblish
from openpype.hosts import resolve
# # developer reload modules
from pprint import pformat
import pyblish
from openpype.hosts.resolve.api.lib import (
get_current_timeline_items,
get_timeline_item_pype_tag,
publish_clip_color,
get_publish_attribute,
get_otio_clip_instance_data,
)
class PrecollectInstances(pyblish.api.ContextPlugin):
"""Collect all Track items selection."""
@ -14,8 +20,8 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
def process(self, context):
otio_timeline = context.data["otioTimeline"]
selected_timeline_items = resolve.get_current_timeline_items(
filter=True, selecting_color=resolve.publish_clip_color)
selected_timeline_items = get_current_timeline_items(
filter=True, selecting_color=publish_clip_color)
self.log.info(
"Processing enabled track items: {}".format(
@ -27,7 +33,7 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
timeline_item = timeline_item_data["clip"]["item"]
# get pype tag data
tag_data = resolve.get_timeline_item_pype_tag(timeline_item)
tag_data = get_timeline_item_pype_tag(timeline_item)
self.log.debug(f"__ tag_data: {pformat(tag_data)}")
if not tag_data:
@ -67,7 +73,7 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
"asset": asset,
"item": timeline_item,
"families": families,
"publish": resolve.get_publish_attribute(timeline_item),
"publish": get_publish_attribute(timeline_item),
"fps": context.data["fps"],
"handleStart": handle_start,
"handleEnd": handle_end,
@ -75,7 +81,7 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
})
# otio clip data
otio_data = resolve.get_otio_clip_instance_data(
otio_data = get_otio_clip_instance_data(
otio_timeline, timeline_item_data) or {}
data.update(otio_data)
@ -134,7 +140,7 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
"asset": asset,
"family": family,
"families": [],
"publish": resolve.get_publish_attribute(timeline_item)
"publish": get_publish_attribute(timeline_item)
})
context.create_instance(**data)

View file

@ -6,10 +6,11 @@ from openpype.pipeline import install_host
def main(env):
import openpype.hosts.resolve as bmdvr
from openpype.hosts.resolve.utils import setup
import openpype.hosts.resolve.api as bmdvr
# Registers openpype's Global pyblish plugins
install_host(bmdvr)
bmdvr.setup(env)
setup(env)
if __name__ == "__main__":

View file

@ -2,13 +2,13 @@ import os
import sys
from openpype.pipeline import install_host
from openpype.api import Logger
from openpype.lib import Logger
log = Logger().get_logger(__name__)
log = Logger.get_logger(__name__)
def main(env):
import openpype.hosts.resolve as bmdvr
import openpype.hosts.resolve.api as bmdvr
# activate resolve from openpype
install_host(bmdvr)

View file

@ -6,8 +6,8 @@ import opentimelineio as otio
from openpype.pipeline import install_host
from openpype.hosts.resolve import TestGUI
import openpype.hosts.resolve as bmdvr
import openpype.hosts.resolve.api as bmdvr
from openpype.hosts.resolve.api.testing_utils import TestGUI
from openpype.hosts.resolve.otio import davinci_export as otio_export

View file

@ -2,11 +2,16 @@
import os
import sys
from openpype.pipeline import install_host
from openpype.hosts.resolve import TestGUI
import openpype.hosts.resolve as bmdvr
import clique
from openpype.pipeline import install_host
from openpype.hosts.resolve.api.testing_utils import TestGUI
import openpype.hosts.resolve.api as bmdvr
from openpype.hosts.resolve.api.lib import (
create_media_pool_item,
create_timeline_item,
)
class ThisTestGUI(TestGUI):
extensions = [".exr", ".jpg", ".mov", ".png", ".mp4", ".ari", ".arx"]
@ -55,10 +60,10 @@ class ThisTestGUI(TestGUI):
# skip if unwanted extension
if ext not in self.extensions:
return
media_pool_item = bmdvr.create_media_pool_item(fpath)
media_pool_item = create_media_pool_item(fpath)
print(media_pool_item)
track_item = bmdvr.create_timeline_item(media_pool_item)
track_item = create_timeline_item(media_pool_item)
print(track_item)

View file

@ -1,13 +1,17 @@
#! python3
from openpype.pipeline import install_host
import openpype.hosts.resolve as bmdvr
from openpype.hosts.resolve import api as bmdvr
from openpype.hosts.resolve.api.lib import (
create_media_pool_item,
create_timeline_item,
)
def file_processing(fpath):
media_pool_item = bmdvr.create_media_pool_item(fpath)
media_pool_item = create_media_pool_item(fpath)
print(media_pool_item)
track_item = bmdvr.create_timeline_item(media_pool_item)
track_item = create_timeline_item(media_pool_item)
print(track_item)