mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 08:24:53 +01:00
Merge branch 'develop' into enhancement/maya_yeti_rig_load_create_cache_instance
This commit is contained in:
commit
1230f96376
58 changed files with 298 additions and 97 deletions
|
|
@ -14,3 +14,15 @@ AYON_SERVER_ENABLED = True
|
||||||
# Indicate if AYON entities should be used instead of OpenPype entities
|
# Indicate if AYON entities should be used instead of OpenPype entities
|
||||||
USE_AYON_ENTITIES = True
|
USE_AYON_ENTITIES = True
|
||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
"__version__",
|
||||||
|
|
||||||
|
# Deprecated
|
||||||
|
"AYON_CORE_ROOT",
|
||||||
|
"PACKAGE_DIR",
|
||||||
|
"PLUGINS_DIR",
|
||||||
|
"AYON_SERVER_ENABLED",
|
||||||
|
"USE_AYON_ENTITIES",
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
import warnings
|
|
||||||
|
|
||||||
|
|
||||||
class Commands:
|
class Commands:
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ __all__ = [
|
||||||
"get_stub",
|
"get_stub",
|
||||||
|
|
||||||
# pipeline
|
# pipeline
|
||||||
|
"AfterEffectsHost",
|
||||||
"ls",
|
"ls",
|
||||||
"containerise",
|
"containerise",
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,11 @@
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import tempfile
|
import tempfile
|
||||||
import attr
|
|
||||||
|
|
||||||
|
import attr
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
from ayon_core.settings import get_project_settings
|
|
||||||
from ayon_core.pipeline import publish
|
from ayon_core.pipeline import publish
|
||||||
from ayon_core.pipeline.publish import RenderInstance
|
from ayon_core.pipeline.publish import RenderInstance
|
||||||
|
|
||||||
from ayon_core.hosts.aftereffects.api import get_stub
|
from ayon_core.hosts.aftereffects.api import get_stub
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import bpy
|
||||||
|
|
||||||
from ayon_core.pipeline import publish
|
from ayon_core.pipeline import publish
|
||||||
from ayon_core.hosts.blender.api import plugin
|
from ayon_core.hosts.blender.api import plugin
|
||||||
from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY
|
|
||||||
|
|
||||||
|
|
||||||
class ExtractCameraABC(publish.Extractor, publish.OptionalPyblishPluginMixin):
|
class ExtractCameraABC(publish.Extractor, publish.OptionalPyblishPluginMixin):
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import bpy
|
||||||
|
|
||||||
from ayon_core.pipeline import publish
|
from ayon_core.pipeline import publish
|
||||||
from ayon_core.hosts.blender.api import plugin
|
from ayon_core.hosts.blender.api import plugin
|
||||||
from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY
|
|
||||||
|
|
||||||
|
|
||||||
class ExtractFBX(publish.Extractor, publish.OptionalPyblishPluginMixin):
|
class ExtractFBX(publish.Extractor, publish.OptionalPyblishPluginMixin):
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ from .lib import (
|
||||||
reset_segment_selection,
|
reset_segment_selection,
|
||||||
get_segment_attributes,
|
get_segment_attributes,
|
||||||
get_clips_in_reels,
|
get_clips_in_reels,
|
||||||
get_reformated_filename,
|
get_reformatted_filename,
|
||||||
get_frame_from_filename,
|
get_frame_from_filename,
|
||||||
get_padding_from_filename,
|
get_padding_from_filename,
|
||||||
maintained_object_duplication,
|
maintained_object_duplication,
|
||||||
|
|
@ -101,7 +101,7 @@ __all__ = [
|
||||||
"reset_segment_selection",
|
"reset_segment_selection",
|
||||||
"get_segment_attributes",
|
"get_segment_attributes",
|
||||||
"get_clips_in_reels",
|
"get_clips_in_reels",
|
||||||
"get_reformated_filename",
|
"get_reformatted_filename",
|
||||||
"get_frame_from_filename",
|
"get_frame_from_filename",
|
||||||
"get_padding_from_filename",
|
"get_padding_from_filename",
|
||||||
"maintained_object_duplication",
|
"maintained_object_duplication",
|
||||||
|
|
|
||||||
|
|
@ -607,7 +607,7 @@ def get_clips_in_reels(project):
|
||||||
return output_clips
|
return output_clips
|
||||||
|
|
||||||
|
|
||||||
def get_reformated_filename(filename, padded=True):
|
def get_reformatted_filename(filename, padded=True):
|
||||||
"""
|
"""
|
||||||
Return fixed python expression path
|
Return fixed python expression path
|
||||||
|
|
||||||
|
|
@ -618,7 +618,7 @@ def get_reformated_filename(filename, padded=True):
|
||||||
type: string with reformatted path
|
type: string with reformatted path
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
get_reformated_filename("plate.1001.exr") > plate.%04d.exr
|
get_reformatted_filename("plate.1001.exr") > plate.%04d.exr
|
||||||
|
|
||||||
"""
|
"""
|
||||||
found = FRAME_PATTERN.search(filename)
|
found = FRAME_PATTERN.search(filename)
|
||||||
|
|
|
||||||
|
|
@ -256,7 +256,7 @@ def create_otio_reference(clip_data, fps=None):
|
||||||
|
|
||||||
if not otio_ex_ref_item:
|
if not otio_ex_ref_item:
|
||||||
dirname, file_name = os.path.split(path)
|
dirname, file_name = os.path.split(path)
|
||||||
file_name = utils.get_reformated_filename(file_name, padded=False)
|
file_name = utils.get_reformatted_filename(file_name, padded=False)
|
||||||
reformated_path = os.path.join(dirname, file_name)
|
reformated_path = os.path.join(dirname, file_name)
|
||||||
# in case old OTIO or video file create `ExternalReference`
|
# in case old OTIO or video file create `ExternalReference`
|
||||||
otio_ex_ref_item = otio.schema.ExternalReference(
|
otio_ex_ref_item = otio.schema.ExternalReference(
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ def frames_to_seconds(frames, framerate):
|
||||||
return otio.opentime.to_seconds(rt)
|
return otio.opentime.to_seconds(rt)
|
||||||
|
|
||||||
|
|
||||||
def get_reformated_filename(filename, padded=True):
|
def get_reformatted_filename(filename, padded=True):
|
||||||
"""
|
"""
|
||||||
Return fixed python expression path
|
Return fixed python expression path
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ def get_reformated_filename(filename, padded=True):
|
||||||
type: string with reformatted path
|
type: string with reformatted path
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
get_reformated_filename("plate.1001.exr") > plate.%04d.exr
|
get_reformatted_filename("plate.1001.exr") > plate.%04d.exr
|
||||||
|
|
||||||
"""
|
"""
|
||||||
found = FRAME_PATTERN.search(filename)
|
found = FRAME_PATTERN.search(filename)
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ from ayon_core.tools.utils import host_tools
|
||||||
|
|
||||||
from .lib import (
|
from .lib import (
|
||||||
get_current_comp,
|
get_current_comp,
|
||||||
comp_lock_and_undo_chunk,
|
|
||||||
validate_comp_prefs
|
validate_comp_prefs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,11 @@
|
||||||
from ayon_core.lib import EnumDef
|
from ayon_core.lib import (
|
||||||
|
UILabelDef,
|
||||||
|
NumberDef,
|
||||||
|
EnumDef
|
||||||
|
)
|
||||||
|
|
||||||
from ayon_core.hosts.fusion.api.plugin import GenericCreateSaver
|
from ayon_core.hosts.fusion.api.plugin import GenericCreateSaver
|
||||||
|
from ayon_core.hosts.fusion.api.lib import get_current_comp
|
||||||
|
|
||||||
|
|
||||||
class CreateSaver(GenericCreateSaver):
|
class CreateSaver(GenericCreateSaver):
|
||||||
|
|
@ -45,6 +50,7 @@ class CreateSaver(GenericCreateSaver):
|
||||||
self._get_reviewable_bool(),
|
self._get_reviewable_bool(),
|
||||||
self._get_frame_range_enum(),
|
self._get_frame_range_enum(),
|
||||||
self._get_image_format_enum(),
|
self._get_image_format_enum(),
|
||||||
|
*self._get_custom_frame_range_attribute_defs()
|
||||||
]
|
]
|
||||||
return attr_defs
|
return attr_defs
|
||||||
|
|
||||||
|
|
@ -53,6 +59,7 @@ class CreateSaver(GenericCreateSaver):
|
||||||
"current_folder": "Current Folder context",
|
"current_folder": "Current Folder context",
|
||||||
"render_range": "From render in/out",
|
"render_range": "From render in/out",
|
||||||
"comp_range": "From composition timeline",
|
"comp_range": "From composition timeline",
|
||||||
|
"custom_range": "Custom frame range",
|
||||||
}
|
}
|
||||||
|
|
||||||
return EnumDef(
|
return EnumDef(
|
||||||
|
|
@ -61,3 +68,82 @@ class CreateSaver(GenericCreateSaver):
|
||||||
label="Frame range source",
|
label="Frame range source",
|
||||||
default=self.default_frame_range_option
|
default=self.default_frame_range_option
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_custom_frame_range_attribute_defs() -> list:
|
||||||
|
|
||||||
|
# Define custom frame range defaults based on current comp
|
||||||
|
# timeline settings (if a comp is currently open)
|
||||||
|
comp = get_current_comp()
|
||||||
|
if comp is not None:
|
||||||
|
attrs = comp.GetAttrs()
|
||||||
|
frame_defaults = {
|
||||||
|
"frameStart": int(attrs["COMPN_GlobalStart"]),
|
||||||
|
"frameEnd": int(attrs["COMPN_GlobalEnd"]),
|
||||||
|
"handleStart": int(
|
||||||
|
attrs["COMPN_RenderStart"] - attrs["COMPN_GlobalStart"]
|
||||||
|
),
|
||||||
|
"handleEnd": int(
|
||||||
|
attrs["COMPN_GlobalEnd"] - attrs["COMPN_RenderEnd"]
|
||||||
|
),
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
frame_defaults = {
|
||||||
|
"frameStart": 1001,
|
||||||
|
"frameEnd": 1100,
|
||||||
|
"handleStart": 0,
|
||||||
|
"handleEnd": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
UILabelDef(
|
||||||
|
label="<br><b>Custom Frame Range</b><br>"
|
||||||
|
"<i>only used with 'Custom frame range' source</i>"
|
||||||
|
),
|
||||||
|
NumberDef(
|
||||||
|
"custom_frameStart",
|
||||||
|
label="Frame Start",
|
||||||
|
default=frame_defaults["frameStart"],
|
||||||
|
minimum=0,
|
||||||
|
decimals=0,
|
||||||
|
tooltip=(
|
||||||
|
"Set the start frame for the export.\n"
|
||||||
|
"Only used if frame range source is 'Custom frame range'."
|
||||||
|
)
|
||||||
|
),
|
||||||
|
NumberDef(
|
||||||
|
"custom_frameEnd",
|
||||||
|
label="Frame End",
|
||||||
|
default=frame_defaults["frameEnd"],
|
||||||
|
minimum=0,
|
||||||
|
decimals=0,
|
||||||
|
tooltip=(
|
||||||
|
"Set the end frame for the export.\n"
|
||||||
|
"Only used if frame range source is 'Custom frame range'."
|
||||||
|
)
|
||||||
|
),
|
||||||
|
NumberDef(
|
||||||
|
"custom_handleStart",
|
||||||
|
label="Handle Start",
|
||||||
|
default=frame_defaults["handleStart"],
|
||||||
|
minimum=0,
|
||||||
|
decimals=0,
|
||||||
|
tooltip=(
|
||||||
|
"Set the start handles for the export, this will be "
|
||||||
|
"added before the start frame.\n"
|
||||||
|
"Only used if frame range source is 'Custom frame range'."
|
||||||
|
)
|
||||||
|
),
|
||||||
|
NumberDef(
|
||||||
|
"custom_handleEnd",
|
||||||
|
label="Handle End",
|
||||||
|
default=frame_defaults["handleEnd"],
|
||||||
|
minimum=0,
|
||||||
|
decimals=0,
|
||||||
|
tooltip=(
|
||||||
|
"Set the end handles for the export, this will be added "
|
||||||
|
"after the end frame.\n"
|
||||||
|
"Only used if frame range source is 'Custom frame range'."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,14 @@ class CollectInstanceData(pyblish.api.InstancePlugin):
|
||||||
start_with_handle = comp_start
|
start_with_handle = comp_start
|
||||||
end_with_handle = comp_end
|
end_with_handle = comp_end
|
||||||
|
|
||||||
|
if frame_range_source == "custom_range":
|
||||||
|
start = int(instance.data["custom_frameStart"])
|
||||||
|
end = int(instance.data["custom_frameEnd"])
|
||||||
|
handle_start = int(instance.data["custom_handleStart"])
|
||||||
|
handle_end = int(instance.data["custom_handleEnd"])
|
||||||
|
start_with_handle = start - handle_start
|
||||||
|
end_with_handle = end + handle_end
|
||||||
|
|
||||||
frame = instance.data["creator_attributes"].get("frame")
|
frame = instance.data["creator_attributes"].get("frame")
|
||||||
# explicitly publishing only single frame
|
# explicitly publishing only single frame
|
||||||
if frame is not None:
|
if frame is not None:
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import os
|
import os
|
||||||
import pyblish.api
|
|
||||||
|
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
|
|
||||||
class CollectAudio(pyblish.api.InstancePlugin):
|
class CollectAudio(pyblish.api.InstancePlugin):
|
||||||
"""
|
"""
|
||||||
Collect relative path for audio file to instance.
|
Collect relative path for audio file to instance.
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import hiero.core.events
|
import hiero.core.events
|
||||||
|
|
||||||
from ayon_core.lib import Logger, register_event_callback
|
from ayon_core.lib import Logger, register_event_callback
|
||||||
|
|
||||||
from .lib import (
|
from .lib import (
|
||||||
sync_avalon_data_to_workfile,
|
sync_avalon_data_to_workfile,
|
||||||
launch_workfiles_app,
|
launch_workfiles_app,
|
||||||
selection_changed_timeline,
|
|
||||||
before_project_save,
|
before_project_save,
|
||||||
)
|
)
|
||||||
from .tags import add_tags_to_workfile
|
from .tags import add_tags_to_workfile
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,11 @@
|
||||||
# Note: This only prints the text data that is visible in the active Spreadsheet View.
|
# Note: This only prints the text data that is visible in the active Spreadsheet View.
|
||||||
# If you've filtered text, only the visible text will be printed to the CSV file
|
# If you've filtered text, only the visible text will be printed to the CSV file
|
||||||
# Usage: Copy to ~/.hiero/Python/StartupUI
|
# Usage: Copy to ~/.hiero/Python/StartupUI
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
|
||||||
import hiero.core.events
|
import hiero.core.events
|
||||||
import hiero.ui
|
import hiero.ui
|
||||||
import os, csv
|
|
||||||
try:
|
try:
|
||||||
from PySide.QtGui import *
|
from PySide.QtGui import *
|
||||||
from PySide.QtCore import *
|
from PySide.QtCore import *
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from itertools import product
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -447,7 +447,7 @@ def maintained_selection():
|
||||||
node.setSelected(on=True)
|
node.setSelected(on=True)
|
||||||
|
|
||||||
|
|
||||||
def reset_framerange():
|
def reset_framerange(fps=True, frame_range=True):
|
||||||
"""Set frame range and FPS to current folder."""
|
"""Set frame range and FPS to current folder."""
|
||||||
|
|
||||||
project_name = get_current_project_name()
|
project_name = get_current_project_name()
|
||||||
|
|
@ -456,29 +456,32 @@ def reset_framerange():
|
||||||
folder_entity = ayon_api.get_folder_by_path(project_name, folder_path)
|
folder_entity = ayon_api.get_folder_by_path(project_name, folder_path)
|
||||||
folder_attributes = folder_entity["attrib"]
|
folder_attributes = folder_entity["attrib"]
|
||||||
|
|
||||||
# Get FPS
|
# Set FPS
|
||||||
fps = get_folder_fps(folder_entity)
|
if fps:
|
||||||
|
fps = get_folder_fps(folder_entity)
|
||||||
|
print("Setting scene FPS to {}".format(int(fps)))
|
||||||
|
set_scene_fps(fps)
|
||||||
|
|
||||||
# Get Start and End Frames
|
if frame_range:
|
||||||
frame_start = folder_attributes.get("frameStart")
|
|
||||||
frame_end = folder_attributes.get("frameEnd")
|
|
||||||
|
|
||||||
if frame_start is None or frame_end is None:
|
# Set Start and End Frames
|
||||||
log.warning("No edit information found for '{}'".format(folder_path))
|
frame_start = folder_attributes.get("frameStart")
|
||||||
return
|
frame_end = folder_attributes.get("frameEnd")
|
||||||
|
|
||||||
handle_start = folder_attributes.get("handleStart", 0)
|
if frame_start is None or frame_end is None:
|
||||||
handle_end = folder_attributes.get("handleEnd", 0)
|
log.warning("No edit information found for '%s'", folder_path)
|
||||||
|
return
|
||||||
|
|
||||||
frame_start -= int(handle_start)
|
handle_start = folder_attributes.get("handleStart", 0)
|
||||||
frame_end += int(handle_end)
|
handle_end = folder_attributes.get("handleEnd", 0)
|
||||||
|
|
||||||
# Set frame range and FPS
|
frame_start -= int(handle_start)
|
||||||
print("Setting scene FPS to {}".format(int(fps)))
|
frame_end += int(handle_end)
|
||||||
set_scene_fps(fps)
|
|
||||||
hou.playbar.setFrameRange(frame_start, frame_end)
|
# Set frame range and FPS
|
||||||
hou.playbar.setPlaybackRange(frame_start, frame_end)
|
hou.playbar.setFrameRange(frame_start, frame_end)
|
||||||
hou.setFrame(frame_start)
|
hou.playbar.setPlaybackRange(frame_start, frame_end)
|
||||||
|
hou.setFrame(frame_start)
|
||||||
|
|
||||||
|
|
||||||
def get_main_window():
|
def get_main_window():
|
||||||
|
|
@ -993,3 +996,84 @@ def add_self_publish_button(node):
|
||||||
template = node.parmTemplateGroup()
|
template = node.parmTemplateGroup()
|
||||||
template.insertBefore((0,), button_parm)
|
template.insertBefore((0,), button_parm)
|
||||||
node.setParmTemplateGroup(template)
|
node.setParmTemplateGroup(template)
|
||||||
|
|
||||||
|
|
||||||
|
def update_content_on_context_change():
|
||||||
|
"""Update all Creator instances to current asset"""
|
||||||
|
host = registered_host()
|
||||||
|
context = host.get_current_context()
|
||||||
|
|
||||||
|
folder_path = context["folder_path"]
|
||||||
|
task = context["task_name"]
|
||||||
|
|
||||||
|
create_context = CreateContext(host, reset=True)
|
||||||
|
|
||||||
|
for instance in create_context.instances:
|
||||||
|
instance_folder_path = instance.get("folderPath")
|
||||||
|
if instance_folder_path and instance_folder_path != folder_path:
|
||||||
|
instance["folderPath"] = folder_path
|
||||||
|
instance_task = instance.get("task")
|
||||||
|
if instance_task and instance_task != task:
|
||||||
|
instance["task"] = task
|
||||||
|
|
||||||
|
create_context.save_changes()
|
||||||
|
|
||||||
|
|
||||||
|
def prompt_reset_context():
|
||||||
|
"""Prompt the user what context settings to reset.
|
||||||
|
This prompt is used on saving to a different task to allow the scene to
|
||||||
|
get matched to the new context.
|
||||||
|
"""
|
||||||
|
# TODO: Cleanup this prototyped mess of imports and odd dialog
|
||||||
|
from ayon_core.tools.attribute_defs.dialog import (
|
||||||
|
AttributeDefinitionsDialog
|
||||||
|
)
|
||||||
|
from ayon_core.style import load_stylesheet
|
||||||
|
from ayon_core.lib import BoolDef, UILabelDef
|
||||||
|
|
||||||
|
definitions = [
|
||||||
|
UILabelDef(
|
||||||
|
label=(
|
||||||
|
"You are saving your workfile into a different folder or task."
|
||||||
|
"\n\n"
|
||||||
|
"Would you like to update some settings to the new context?\n"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
BoolDef(
|
||||||
|
"fps",
|
||||||
|
label="FPS",
|
||||||
|
tooltip="Reset workfile FPS",
|
||||||
|
default=True
|
||||||
|
),
|
||||||
|
BoolDef(
|
||||||
|
"frame_range",
|
||||||
|
label="Frame Range",
|
||||||
|
tooltip="Reset workfile start and end frame ranges",
|
||||||
|
default=True
|
||||||
|
),
|
||||||
|
BoolDef(
|
||||||
|
"instances",
|
||||||
|
label="Publish instances",
|
||||||
|
tooltip="Update all publish instance's folder and task to match "
|
||||||
|
"the new folder and task",
|
||||||
|
default=True
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
dialog = AttributeDefinitionsDialog(definitions)
|
||||||
|
dialog.setWindowTitle("Saving to different context.")
|
||||||
|
dialog.setStyleSheet(load_stylesheet())
|
||||||
|
if not dialog.exec_():
|
||||||
|
return None
|
||||||
|
|
||||||
|
options = dialog.get_values()
|
||||||
|
if options["fps"] or options["frame_range"]:
|
||||||
|
reset_framerange(
|
||||||
|
fps=options["fps"],
|
||||||
|
frame_range=options["frame_range"]
|
||||||
|
)
|
||||||
|
|
||||||
|
if options["instances"]:
|
||||||
|
update_content_on_context_change()
|
||||||
|
|
||||||
|
dialog.deleteLater()
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Pipeline tools for OpenPype Houdini integration."""
|
"""Pipeline tools for OpenPype Houdini integration."""
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import hou # noqa
|
import hou # noqa
|
||||||
|
|
@ -39,6 +38,9 @@ LOAD_PATH = os.path.join(PLUGINS_DIR, "load")
|
||||||
CREATE_PATH = os.path.join(PLUGINS_DIR, "create")
|
CREATE_PATH = os.path.join(PLUGINS_DIR, "create")
|
||||||
INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory")
|
INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory")
|
||||||
|
|
||||||
|
# Track whether the workfile tool is about to save
|
||||||
|
ABOUT_TO_SAVE = False
|
||||||
|
|
||||||
|
|
||||||
class HoudiniHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
|
class HoudiniHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
|
||||||
name = "houdini"
|
name = "houdini"
|
||||||
|
|
@ -61,10 +63,12 @@ class HoudiniHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
|
||||||
log.info("Installing callbacks ... ")
|
log.info("Installing callbacks ... ")
|
||||||
# register_event_callback("init", on_init)
|
# register_event_callback("init", on_init)
|
||||||
self._register_callbacks()
|
self._register_callbacks()
|
||||||
|
register_event_callback("workfile.save.before", before_workfile_save)
|
||||||
register_event_callback("before.save", before_save)
|
register_event_callback("before.save", before_save)
|
||||||
register_event_callback("save", on_save)
|
register_event_callback("save", on_save)
|
||||||
register_event_callback("open", on_open)
|
register_event_callback("open", on_open)
|
||||||
register_event_callback("new", on_new)
|
register_event_callback("new", on_new)
|
||||||
|
register_event_callback("taskChanged", on_task_changed)
|
||||||
|
|
||||||
self._has_been_setup = True
|
self._has_been_setup = True
|
||||||
|
|
||||||
|
|
@ -287,6 +291,11 @@ def ls():
|
||||||
yield parse_container(container)
|
yield parse_container(container)
|
||||||
|
|
||||||
|
|
||||||
|
def before_workfile_save(event):
|
||||||
|
global ABOUT_TO_SAVE
|
||||||
|
ABOUT_TO_SAVE = True
|
||||||
|
|
||||||
|
|
||||||
def before_save():
|
def before_save():
|
||||||
return lib.validate_fps()
|
return lib.validate_fps()
|
||||||
|
|
||||||
|
|
@ -298,6 +307,21 @@ def on_save():
|
||||||
# update houdini vars
|
# update houdini vars
|
||||||
lib.update_houdini_vars_context_dialog()
|
lib.update_houdini_vars_context_dialog()
|
||||||
|
|
||||||
|
nodes = lib.get_id_required_nodes()
|
||||||
|
for node, new_id in lib.generate_ids(nodes):
|
||||||
|
lib.set_id(node, new_id, overwrite=False)
|
||||||
|
|
||||||
|
# We are now starting the actual save directly
|
||||||
|
global ABOUT_TO_SAVE
|
||||||
|
ABOUT_TO_SAVE = False
|
||||||
|
|
||||||
|
|
||||||
|
def on_task_changed():
|
||||||
|
global ABOUT_TO_SAVE
|
||||||
|
if not IS_HEADLESS and ABOUT_TO_SAVE:
|
||||||
|
# Let's prompt the user to update the context settings or not
|
||||||
|
lib.prompt_reset_context()
|
||||||
|
|
||||||
|
|
||||||
def _show_outdated_content_popup():
|
def _show_outdated_content_popup():
|
||||||
# Get main window
|
# Get main window
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ from ayon_core.hosts.max.api.lib import (
|
||||||
maintained_selection,
|
maintained_selection,
|
||||||
object_transform_set
|
object_transform_set
|
||||||
)
|
)
|
||||||
from ayon_core.hosts.max.api.lib import maintained_selection
|
|
||||||
from ayon_core.hosts.max.api.pipeline import (
|
from ayon_core.hosts.max.api.pipeline import (
|
||||||
containerise,
|
containerise,
|
||||||
get_previous_loaded_object,
|
get_previous_loaded_object,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
from ayon_core.pipeline import PublishValidationError
|
from ayon_core.pipeline import PublishValidationError
|
||||||
from pymxs import runtime as rt
|
|
||||||
|
|
||||||
|
|
||||||
class ValidateCameraContent(pyblish.api.InstancePlugin):
|
class ValidateCameraContent(pyblish.api.InstancePlugin):
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ from ayon_core.hosts.maya.api.lib import (
|
||||||
unique_namespace,
|
unique_namespace,
|
||||||
get_attribute_input,
|
get_attribute_input,
|
||||||
maintained_selection,
|
maintained_selection,
|
||||||
convert_to_maya_fps
|
|
||||||
)
|
)
|
||||||
from ayon_core.hosts.maya.api.pipeline import containerise
|
from ayon_core.hosts.maya.api.pipeline import containerise
|
||||||
from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type
|
from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
import os
|
|
||||||
|
|
||||||
import maya.cmds as cmds
|
import maya.cmds as cmds
|
||||||
|
|
||||||
from ayon_core.hosts.maya.api.pipeline import containerise
|
from ayon_core.hosts.maya.api.pipeline import containerise
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
import os
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from ayon_core.lib import EnumDef
|
from ayon_core.lib import EnumDef
|
||||||
from ayon_core.pipeline import (
|
from ayon_core.pipeline import (
|
||||||
load,
|
load,
|
||||||
get_representation_context,
|
|
||||||
get_current_host_name,
|
get_current_host_name,
|
||||||
)
|
)
|
||||||
from ayon_core.pipeline.load.utils import get_representation_path_from_context
|
from ayon_core.pipeline.load.utils import get_representation_path_from_context
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Create Unreal Skeletal Mesh data to be extracted as FBX."""
|
"""Create Unreal Skeletal Mesh data to be extracted as FBX."""
|
||||||
import os
|
import os
|
||||||
from contextlib import contextmanager
|
|
||||||
|
|
||||||
from maya import cmds # noqa
|
from maya import cmds # noqa
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ from maya import cmds
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
from ayon_core.hosts.maya.api.lib import extract_alembic
|
from ayon_core.hosts.maya.api.lib import extract_alembic
|
||||||
from ayon_core.pipeline import publish
|
from ayon_core.pipeline import publish
|
||||||
from ayon_core.lib import StringTemplate
|
|
||||||
|
|
||||||
|
|
||||||
class ExtractWorkfileXgen(publish.Extractor):
|
class ExtractWorkfileXgen(publish.Extractor):
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ from ayon_core.pipeline import publish
|
||||||
from ayon_core.hosts.maya.api.lib import (
|
from ayon_core.hosts.maya.api.lib import (
|
||||||
maintained_selection, attribute_values, write_xgen_file, delete_after
|
maintained_selection, attribute_values, write_xgen_file, delete_after
|
||||||
)
|
)
|
||||||
from ayon_core.lib import StringTemplate
|
|
||||||
|
|
||||||
|
|
||||||
class ExtractXgen(publish.Extractor):
|
class ExtractXgen(publish.Extractor):
|
||||||
|
|
|
||||||
|
|
@ -30,13 +30,11 @@ from ayon_core.tools.utils import host_tools
|
||||||
from ayon_core.hosts.nuke import NUKE_ROOT_DIR
|
from ayon_core.hosts.nuke import NUKE_ROOT_DIR
|
||||||
from ayon_core.tools.workfile_template_build import open_template_ui
|
from ayon_core.tools.workfile_template_build import open_template_ui
|
||||||
|
|
||||||
from .command import viewer_update_and_undo_stop
|
|
||||||
from .lib import (
|
from .lib import (
|
||||||
Context,
|
Context,
|
||||||
ROOT_DATA_KNOB,
|
ROOT_DATA_KNOB,
|
||||||
INSTANCE_DATA_KNOB,
|
INSTANCE_DATA_KNOB,
|
||||||
get_main_window,
|
get_main_window,
|
||||||
add_publish_knob,
|
|
||||||
WorkfileSettings,
|
WorkfileSettings,
|
||||||
# TODO: remove this once workfile builder will be removed
|
# TODO: remove this once workfile builder will be removed
|
||||||
process_workfile_builder,
|
process_workfile_builder,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import six
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
from collections import OrderedDict, defaultdict
|
from collections import OrderedDict, defaultdict
|
||||||
from abc import abstractmethod
|
|
||||||
|
|
||||||
from ayon_core.settings import get_current_project_settings
|
from ayon_core.settings import get_current_project_settings
|
||||||
from ayon_core.lib import (
|
from ayon_core.lib import (
|
||||||
|
|
@ -14,7 +13,6 @@ from ayon_core.lib import (
|
||||||
EnumDef
|
EnumDef
|
||||||
)
|
)
|
||||||
from ayon_core.pipeline import (
|
from ayon_core.pipeline import (
|
||||||
LegacyCreator,
|
|
||||||
LoaderPlugin,
|
LoaderPlugin,
|
||||||
CreatorError,
|
CreatorError,
|
||||||
Creator as NewCreator,
|
Creator as NewCreator,
|
||||||
|
|
@ -34,18 +32,13 @@ from ayon_core.lib.transcoding import (
|
||||||
from .lib import (
|
from .lib import (
|
||||||
INSTANCE_DATA_KNOB,
|
INSTANCE_DATA_KNOB,
|
||||||
Knobby,
|
Knobby,
|
||||||
check_product_name_exists,
|
|
||||||
maintained_selection,
|
maintained_selection,
|
||||||
get_avalon_knob_data,
|
get_avalon_knob_data,
|
||||||
set_avalon_knob_data,
|
|
||||||
add_publish_knob,
|
|
||||||
get_nuke_imageio_settings,
|
|
||||||
set_node_knobs_from_settings,
|
set_node_knobs_from_settings,
|
||||||
set_node_data,
|
set_node_data,
|
||||||
get_node_data,
|
get_node_data,
|
||||||
get_view_process_node,
|
get_view_process_node,
|
||||||
get_viewer_config_from_string,
|
get_viewer_config_from_string,
|
||||||
deprecated,
|
|
||||||
get_filenames_without_hash,
|
get_filenames_without_hash,
|
||||||
link_knobs
|
link_knobs
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import os
|
import os
|
||||||
import math
|
import math
|
||||||
from pprint import pformat
|
|
||||||
|
|
||||||
import nuke
|
import nuke
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import json
|
||||||
|
|
||||||
import nuke
|
import nuke
|
||||||
import six
|
import six
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import os
|
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import clique
|
import clique
|
||||||
|
|
||||||
from ayon_core.pipeline import PublishXmlValidationError
|
from ayon_core.pipeline import PublishXmlValidationError
|
||||||
from ayon_core.pipeline.publish import get_errored_instances_from_context
|
from ayon_core.pipeline.publish import get_errored_instances_from_context
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from wsrpc_aiohttp import (
|
||||||
import ayon_api
|
import ayon_api
|
||||||
from qtpy import QtCore
|
from qtpy import QtCore
|
||||||
|
|
||||||
from ayon_core.lib import Logger, StringTemplate
|
from ayon_core.lib import Logger
|
||||||
from ayon_core.pipeline import (
|
from ayon_core.pipeline import (
|
||||||
registered_host,
|
registered_host,
|
||||||
Anatomy,
|
Anatomy,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Close PS after publish. For Webpublishing only."""
|
"""Close PS after publish. For Webpublishing only."""
|
||||||
import os
|
|
||||||
|
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
from ayon_core.hosts.photoshop import api as photoshop
|
from ayon_core.hosts.photoshop import api as photoshop
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,14 @@ import substance_painter.project
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
|
|
||||||
from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost
|
from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost
|
||||||
from ayon_core.settings import (
|
from ayon_core.settings import get_current_project_settings
|
||||||
get_current_project_settings,
|
|
||||||
get_project_settings,
|
|
||||||
)
|
|
||||||
|
|
||||||
from ayon_core.pipeline.template_data import get_template_data_with_names
|
from ayon_core.pipeline.template_data import get_template_data_with_names
|
||||||
from ayon_core.pipeline import (
|
from ayon_core.pipeline import (
|
||||||
register_creator_plugin_path,
|
register_creator_plugin_path,
|
||||||
register_loader_plugin_path,
|
register_loader_plugin_path,
|
||||||
AVALON_CONTAINER_ID,
|
AVALON_CONTAINER_ID,
|
||||||
Anatomy
|
Anatomy,
|
||||||
)
|
)
|
||||||
from ayon_core.lib import (
|
from ayon_core.lib import (
|
||||||
StringTemplate,
|
StringTemplate,
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
import os
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import unreal
|
import unreal
|
||||||
|
import pyblish.api
|
||||||
|
|
||||||
from ayon_core.pipeline import get_current_project_name
|
from ayon_core.pipeline import get_current_project_name
|
||||||
from ayon_core.pipeline import Anatomy
|
from ayon_core.pipeline import Anatomy
|
||||||
from ayon_core.hosts.unreal.api import pipeline
|
from ayon_core.hosts.unreal.api import pipeline
|
||||||
import pyblish.api
|
|
||||||
|
|
||||||
|
|
||||||
class CollectRenderInstances(pyblish.api.InstancePlugin):
|
class CollectRenderInstances(pyblish.api.InstancePlugin):
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
# Backwards compatibility support
|
||||||
|
# - TODO should be removed before release 1.0.0
|
||||||
from ayon_core.addon import (
|
from ayon_core.addon import (
|
||||||
AYONAddon,
|
AYONAddon,
|
||||||
AddonsManager,
|
AddonsManager,
|
||||||
|
|
@ -12,3 +14,16 @@ from ayon_core.addon.base import (
|
||||||
ModulesManager = AddonsManager
|
ModulesManager = AddonsManager
|
||||||
TrayModulesManager = TrayAddonsManager
|
TrayModulesManager = TrayAddonsManager
|
||||||
load_modules = load_addons
|
load_modules = load_addons
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
"AYONAddon",
|
||||||
|
"AddonsManager",
|
||||||
|
"TrayAddonsManager",
|
||||||
|
"load_addons",
|
||||||
|
"OpenPypeModule",
|
||||||
|
"OpenPypeAddOn",
|
||||||
|
"ModulesManager",
|
||||||
|
"TrayModulesManager",
|
||||||
|
"load_modules",
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import time
|
|
||||||
import json
|
import json
|
||||||
import datetime
|
import datetime
|
||||||
import requests
|
import requests
|
||||||
|
|
|
||||||
|
|
@ -651,7 +651,6 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
|
||||||
return job_info, attr.asdict(plugin_info)
|
return job_info, attr.asdict(plugin_info)
|
||||||
|
|
||||||
def _get_arnold_render_payload(self, data):
|
def _get_arnold_render_payload(self, data):
|
||||||
from maya import cmds
|
|
||||||
# Job Info
|
# Job Info
|
||||||
job_info = copy.deepcopy(self.job_info)
|
job_info = copy.deepcopy(self.job_info)
|
||||||
job_info.Name = self._job_info_label("Render")
|
job_info.Name = self._job_info_label("Render")
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ from Deadline.Plugins import PluginType, DeadlinePlugin
|
||||||
from Deadline.Scripting import (
|
from Deadline.Scripting import (
|
||||||
StringUtils,
|
StringUtils,
|
||||||
FileUtils,
|
FileUtils,
|
||||||
DirectoryUtils,
|
|
||||||
RepositoryUtils
|
RepositoryUtils
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ from Deadline.Scripting import (
|
||||||
RepositoryUtils,
|
RepositoryUtils,
|
||||||
FileUtils,
|
FileUtils,
|
||||||
DirectoryUtils,
|
DirectoryUtils,
|
||||||
ProcessUtils,
|
|
||||||
)
|
)
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.0.1"
|
||||||
VERSION_REGEX = re.compile(
|
VERSION_REGEX = re.compile(
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
"""Submitting render job to RoyalRender."""
|
"""Submitting render job to RoyalRender."""
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import platform
|
|
||||||
import re
|
import re
|
||||||
import tempfile
|
import tempfile
|
||||||
import uuid
|
import uuid
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Submit jobs to RoyalRender."""
|
"""Submit jobs to RoyalRender."""
|
||||||
import tempfile
|
import tempfile
|
||||||
import platform
|
|
||||||
|
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
from ayon_core.modules.royalrender.api import (
|
from ayon_core.modules.royalrender.api import (
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
import ayon_api
|
|
||||||
|
|
||||||
from ayon_core.settings import get_project_settings
|
from ayon_core.settings import get_project_settings
|
||||||
from ayon_core.lib import filter_profiles, prepare_template_data
|
from ayon_core.lib import filter_profiles, prepare_template_data
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
from ayon_core.pipeline import Anatomy
|
from ayon_core.pipeline import Anatomy
|
||||||
from typing import Tuple, Union, List
|
from typing import Tuple, List
|
||||||
|
|
||||||
|
|
||||||
class TimeData:
|
class TimeData:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from ayon_core.settings import get_project_settings
|
from ayon_core.settings import get_project_settings
|
||||||
from ayon_core.pipeline import schema
|
|
||||||
from ayon_core.pipeline.plugin_discover import (
|
from ayon_core.pipeline.plugin_discover import (
|
||||||
discover,
|
discover,
|
||||||
register_plugin,
|
register_plugin,
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import inspect
|
||||||
from abc import ABCMeta
|
from abc import ABCMeta
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
from pyblish.plugin import MetaPlugin, ExplicitMetaPlugin
|
from pyblish.plugin import MetaPlugin, ExplicitMetaPlugin
|
||||||
from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS
|
|
||||||
from ayon_core.lib import BoolDef
|
from ayon_core.lib import BoolDef
|
||||||
|
|
||||||
from .lib import (
|
from .lib import (
|
||||||
|
|
|
||||||
|
|
@ -13,3 +13,21 @@ from .items import (
|
||||||
)
|
)
|
||||||
from .lib import create_slates
|
from .lib import create_slates
|
||||||
from .example import example
|
from .example import example
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
"FontFactory",
|
||||||
|
"BaseObj",
|
||||||
|
"load_default_style",
|
||||||
|
"MainFrame",
|
||||||
|
"Layer",
|
||||||
|
"BaseItem",
|
||||||
|
"ItemImage",
|
||||||
|
"ItemRectangle",
|
||||||
|
"ItemPlaceHolder",
|
||||||
|
"ItemText",
|
||||||
|
"ItemTable",
|
||||||
|
"TableField",
|
||||||
|
"create_slates",
|
||||||
|
"example",
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from qtpy import QtWidgets, QtCore, QtGui
|
from qtpy import QtWidgets, QtCore
|
||||||
|
|
||||||
from ayon_core.lib.events import QueuedEventSystem
|
from ayon_core.lib.events import QueuedEventSystem
|
||||||
from ayon_core.tools.utils import PlaceholderLineEdit, GoToCurrentButton
|
from ayon_core.tools.utils import PlaceholderLineEdit, GoToCurrentButton
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from qtpy import QtWidgets, QtCore, QtGui
|
from qtpy import QtWidgets
|
||||||
|
|
||||||
from ayon_core.lib.events import QueuedEventSystem
|
from ayon_core.lib.events import QueuedEventSystem
|
||||||
from ayon_core.tools.utils import PlaceholderLineEdit, FoldersWidget
|
from ayon_core.tools.utils import PlaceholderLineEdit, FoldersWidget
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,3 @@
|
||||||
import os
|
|
||||||
import json
|
|
||||||
import time
|
|
||||||
|
|
||||||
from qtpy import QtWidgets, QtCore
|
from qtpy import QtWidgets, QtCore
|
||||||
|
|
||||||
from .widgets import (
|
from .widgets import (
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from qtpy import QtWidgets, QtCore, QtGui
|
from qtpy import QtCore, QtGui
|
||||||
|
|
||||||
from ayon_core.style import get_default_entity_icon_color
|
from ayon_core.style import get_default_entity_icon_color
|
||||||
from ayon_core.tools.utils import get_qt_icon
|
from ayon_core.tools.utils import get_qt_icon
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,6 @@ from __future__ import (
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import numbers
|
|
||||||
import copy
|
|
||||||
import collections
|
import collections
|
||||||
|
|
||||||
from qtpy import QtCore
|
from qtpy import QtCore
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ from qtpy import QtWidgets, QtCore, QtGui
|
||||||
import qtawesome
|
import qtawesome
|
||||||
|
|
||||||
from ayon_core.style import (
|
from ayon_core.style import (
|
||||||
get_default_entity_icon_color,
|
|
||||||
get_objected_colors,
|
get_objected_colors,
|
||||||
get_app_icon_path,
|
get_app_icon_path,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import re
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import qtpy
|
import qtpy
|
||||||
from qtpy import QtCore, QtGui
|
from qtpy import QtCore
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
import json
|
|
||||||
import shutil
|
import shutil
|
||||||
import argparse
|
import argparse
|
||||||
import zipfile
|
import zipfile
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from ayon_server.settings import (
|
from ayon_server.settings import (
|
||||||
BaseSettingsModel,
|
BaseSettingsModel,
|
||||||
SettingsField,
|
SettingsField,
|
||||||
ensure_unique_names
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from .general import (
|
from .general import (
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from ayon_server.settings import (
|
from ayon_server.settings import (
|
||||||
BaseSettingsModel,
|
BaseSettingsModel,
|
||||||
SettingsField,
|
SettingsField,
|
||||||
ensure_unique_names,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from .imageio import TVPaintImageIOModel
|
from .imageio import TVPaintImageIOModel
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue