mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
186 lines
5.6 KiB
Python
186 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""OpenPype script commands to be used directly in Maya."""
|
|
from maya import cmds
|
|
from avalon import api, io
|
|
|
|
|
|
class ToolWindows:
|
|
|
|
_windows = {}
|
|
|
|
@classmethod
|
|
def get_window(cls, tool):
|
|
"""Get widget for specific tool.
|
|
|
|
Args:
|
|
tool (str): Name of the tool.
|
|
|
|
Returns:
|
|
Stored widget.
|
|
|
|
"""
|
|
try:
|
|
return cls._windows[tool]
|
|
except KeyError:
|
|
return None
|
|
|
|
@classmethod
|
|
def set_window(cls, tool, window):
|
|
"""Set widget for the tool.
|
|
|
|
Args:
|
|
tool (str): Name of the tool.
|
|
window (QtWidgets.QWidget): Widget
|
|
|
|
"""
|
|
cls._windows[tool] = window
|
|
|
|
|
|
def edit_shader_definitions():
|
|
from Qt import QtWidgets
|
|
from openpype.hosts.maya.api.shader_definition_editor import (
|
|
ShaderDefinitionsEditor
|
|
)
|
|
from openpype.tools.utils import qt_app_context
|
|
|
|
top_level_widgets = QtWidgets.QApplication.topLevelWidgets()
|
|
main_window = next(widget for widget in top_level_widgets
|
|
if widget.objectName() == "MayaWindow")
|
|
|
|
with qt_app_context():
|
|
window = ToolWindows.get_window("shader_definition_editor")
|
|
if not window:
|
|
window = ShaderDefinitionsEditor(parent=main_window)
|
|
ToolWindows.set_window("shader_definition_editor", window)
|
|
window.show()
|
|
|
|
|
|
def reset_frame_range():
|
|
"""Set frame range to current asset"""
|
|
# Set FPS first
|
|
fps = {15: 'game',
|
|
24: 'film',
|
|
25: 'pal',
|
|
30: 'ntsc',
|
|
48: 'show',
|
|
50: 'palf',
|
|
60: 'ntscf',
|
|
23.98: '23.976fps',
|
|
23.976: '23.976fps',
|
|
29.97: '29.97fps',
|
|
47.952: '47.952fps',
|
|
47.95: '47.952fps',
|
|
59.94: '59.94fps',
|
|
44100: '44100fps',
|
|
48000: '48000fps'
|
|
}.get(float(api.Session.get("AVALON_FPS", 25)), "pal")
|
|
|
|
cmds.currentUnit(time=fps)
|
|
|
|
# Set frame start/end
|
|
asset_name = api.Session["AVALON_ASSET"]
|
|
asset = io.find_one({"name": asset_name, "type": "asset"})
|
|
|
|
frame_start = asset["data"].get("frameStart")
|
|
frame_end = asset["data"].get("frameEnd")
|
|
# Backwards compatibility
|
|
if frame_start is None or frame_end is None:
|
|
frame_start = asset["data"].get("edit_in")
|
|
frame_end = asset["data"].get("edit_out")
|
|
|
|
if frame_start is None or frame_end is None:
|
|
cmds.warning("No edit information found for %s" % asset_name)
|
|
return
|
|
|
|
handles = asset["data"].get("handles") or 0
|
|
handle_start = asset["data"].get("handleStart")
|
|
if handle_start is None:
|
|
handle_start = handles
|
|
|
|
handle_end = asset["data"].get("handleEnd")
|
|
if handle_end is None:
|
|
handle_end = handles
|
|
|
|
frame_start -= int(handle_start)
|
|
frame_end += int(handle_end)
|
|
|
|
cmds.playbackOptions(minTime=frame_start)
|
|
cmds.playbackOptions(maxTime=frame_end)
|
|
cmds.playbackOptions(animationStartTime=frame_start)
|
|
cmds.playbackOptions(animationEndTime=frame_end)
|
|
cmds.playbackOptions(minTime=frame_start)
|
|
cmds.playbackOptions(maxTime=frame_end)
|
|
cmds.currentTime(frame_start)
|
|
|
|
cmds.setAttr("defaultRenderGlobals.startFrame", frame_start)
|
|
cmds.setAttr("defaultRenderGlobals.endFrame", frame_end)
|
|
|
|
|
|
def _resolution_from_document(doc):
|
|
if not doc or "data" not in doc:
|
|
print("Entered document is not valid. \"{}\"".format(str(doc)))
|
|
return None
|
|
|
|
resolution_width = doc["data"].get("resolutionWidth")
|
|
resolution_height = doc["data"].get("resolutionHeight")
|
|
# Backwards compatibility
|
|
if resolution_width is None or resolution_height is None:
|
|
resolution_width = doc["data"].get("resolution_width")
|
|
resolution_height = doc["data"].get("resolution_height")
|
|
|
|
# Make sure both width and heigh are set
|
|
if resolution_width is None or resolution_height is None:
|
|
cmds.warning(
|
|
"No resolution information found for \"{}\"".format(doc["name"])
|
|
)
|
|
return None
|
|
|
|
return int(resolution_width), int(resolution_height)
|
|
|
|
|
|
def reset_resolution():
|
|
# Default values
|
|
resolution_width = 1920
|
|
resolution_height = 1080
|
|
|
|
# Get resolution from asset
|
|
asset_name = api.Session["AVALON_ASSET"]
|
|
asset_doc = io.find_one({"name": asset_name, "type": "asset"})
|
|
resolution = _resolution_from_document(asset_doc)
|
|
# Try get resolution from project
|
|
if resolution is None:
|
|
# TODO go through visualParents
|
|
print((
|
|
"Asset \"{}\" does not have set resolution."
|
|
" Trying to get resolution from project"
|
|
).format(asset_name))
|
|
project_doc = io.find_one({"type": "project"})
|
|
resolution = _resolution_from_document(project_doc)
|
|
|
|
if resolution is None:
|
|
msg = "Using default resolution {}x{}"
|
|
else:
|
|
resolution_width, resolution_height = resolution
|
|
msg = "Setting resolution to {}x{}"
|
|
|
|
print(msg.format(resolution_width, resolution_height))
|
|
|
|
# set for different renderers
|
|
# arnold, vray, redshift, renderman
|
|
|
|
renderer = cmds.getAttr("defaultRenderGlobals.currentRenderer").lower()
|
|
# handle various renderman names
|
|
if renderer.startswith("renderman"):
|
|
renderer = "renderman"
|
|
|
|
# default attributes are usable for Arnold, Renderman and Redshift
|
|
width_attr_name = "defaultResolution.width"
|
|
height_attr_name = "defaultResolution.height"
|
|
|
|
# Vray has its own way
|
|
if renderer == "vray":
|
|
width_attr_name = "vraySettings.width"
|
|
height_attr_name = "vraySettings.height"
|
|
|
|
cmds.setAttr(width_attr_name, resolution_width)
|
|
cmds.setAttr(height_attr_name, resolution_height)
|