mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
135 lines
3.5 KiB
Python
135 lines
3.5 KiB
Python
import logging
|
|
import contextlib
|
|
import nuke
|
|
|
|
from avalon import api, io
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
def reset_frame_range():
|
|
""" Set frame range to current asset
|
|
Also it will set a Viewer range with
|
|
displayed handles
|
|
"""
|
|
|
|
fps = float(api.Session.get("AVALON_FPS", 25))
|
|
|
|
nuke.root()["fps"].setValue(fps)
|
|
name = api.Session["AVALON_ASSET"]
|
|
asset = io.find_one({"name": name, "type": "asset"})
|
|
asset_data = asset["data"]
|
|
|
|
handles = get_handles(asset)
|
|
|
|
frame_start = int(asset_data.get(
|
|
"frameStart",
|
|
asset_data.get("edit_in")))
|
|
|
|
frame_end = int(asset_data.get(
|
|
"frameEnd",
|
|
asset_data.get("edit_out")))
|
|
|
|
if not all([frame_start, frame_end]):
|
|
missing = ", ".join(["frame_start", "frame_end"])
|
|
msg = "'{}' are not set for asset '{}'!".format(missing, name)
|
|
log.warning(msg)
|
|
nuke.message(msg)
|
|
return
|
|
|
|
frame_start -= handles
|
|
frame_end += handles
|
|
|
|
nuke.root()["first_frame"].setValue(frame_start)
|
|
nuke.root()["last_frame"].setValue(frame_end)
|
|
|
|
# setting active viewers
|
|
vv = nuke.activeViewer().node()
|
|
vv["frame_range_lock"].setValue(True)
|
|
vv["frame_range"].setValue("{0}-{1}".format(
|
|
int(asset_data["frameStart"]),
|
|
int(asset_data["frameEnd"]))
|
|
)
|
|
|
|
|
|
def get_handles(asset):
|
|
""" Gets handles data
|
|
|
|
Arguments:
|
|
asset (dict): avalon asset entity
|
|
|
|
Returns:
|
|
handles (int)
|
|
"""
|
|
data = asset["data"]
|
|
if "handles" in data and data["handles"] is not None:
|
|
return int(data["handles"])
|
|
|
|
parent_asset = None
|
|
if "visualParent" in data:
|
|
vp = data["visualParent"]
|
|
if vp is not None:
|
|
parent_asset = io.find_one({"_id": io.ObjectId(vp)})
|
|
|
|
if parent_asset is None:
|
|
parent_asset = io.find_one({"_id": io.ObjectId(asset["parent"])})
|
|
|
|
if parent_asset is not None:
|
|
return get_handles(parent_asset)
|
|
else:
|
|
return 0
|
|
|
|
|
|
def reset_resolution():
|
|
"""Set resolution to project resolution."""
|
|
project = io.find_one({"type": "project"})
|
|
p_data = project["data"]
|
|
|
|
width = p_data.get("resolution_width",
|
|
p_data.get("resolutionWidth"))
|
|
height = p_data.get("resolution_height",
|
|
p_data.get("resolutionHeight"))
|
|
|
|
if not all([width, height]):
|
|
missing = ", ".join(["width", "height"])
|
|
msg = "No resolution information `{0}` found for '{1}'.".format(
|
|
missing,
|
|
project["name"])
|
|
log.warning(msg)
|
|
nuke.message(msg)
|
|
return
|
|
|
|
current_width = nuke.root()["format"].value().width()
|
|
current_height = nuke.root()["format"].value().height()
|
|
|
|
if width != current_width or height != current_height:
|
|
|
|
fmt = None
|
|
for f in nuke.formats():
|
|
if f.width() == width and f.height() == height:
|
|
fmt = f.name()
|
|
|
|
if not fmt:
|
|
nuke.addFormat(
|
|
"{0} {1} {2}".format(int(width), int(height), project["name"])
|
|
)
|
|
fmt = project["name"]
|
|
|
|
nuke.root()["format"].setValue(fmt)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def viewer_update_and_undo_stop():
|
|
"""Lock viewer from updating and stop recording undo steps"""
|
|
try:
|
|
# stop active viewer to update any change
|
|
viewer = nuke.activeViewer()
|
|
if viewer:
|
|
viewer.stop()
|
|
else:
|
|
log.warning("No available active Viewer")
|
|
nuke.Undo.disable()
|
|
yield
|
|
finally:
|
|
nuke.Undo.enable()
|