#735 - fixes for After Effects

Changed collect_render family to 'render' to get
correct name from Creator tool
Changed outputDir to point to rendered location for
metadata.json file
Pulling startFrame, endFrame from AE
Added files for handling this to stub
This commit is contained in:
Petr Kalis 2020-11-20 14:15:55 +01:00
parent fe43a25edd
commit 825a31f20b
4 changed files with 94 additions and 50 deletions

View file

@ -12,41 +12,36 @@ class CreateRender(api.Creator):
name = "renderDefault"
label = "Render on Farm"
family = "render.farm"
family = "render"
def process(self):
# Photoshop can have multiple LayerSets with the same name, which does
# not work with Avalon.
txt = "Instance with name \"{}\" already exists.".format(self.name)
stub = aftereffects.stub() # only after After Effects is up
for layer in stub.get_items(comps=True,
folders=False,
footages=False):
if self.name.lower() == layer.name.lower():
msg = Qt.QtWidgets.QMessageBox()
msg.setIcon(Qt.QtWidgets.QMessageBox.Warning)
msg.setText(txt)
msg.exec_()
return False
log.debug("options:: {}".format(self.options))
print("options:: {}".format(self.options))
if (self.options or {}).get("useSelection"):
log.debug("useSelection")
print("useSelection")
items = stub.get_selected_items(comps=True,
folders=False,
footages=False)
else:
items = stub.get_items(comps=True,
folders=False,
footages=False)
log.debug("items:: {}".format(items))
print("items:: {}".format(items))
self._show_msg("Please select only single composition at time.")
return False
if not items:
raise ValueError("Nothing to create. Select composition " +
"if 'useSelection' or create at least " +
"one composition.")
self._show_msg("Nothing to create. Select composition " +
"if 'useSelection' or create at least " +
"one composition.")
return False
for item in items:
txt = "Instance with name \"{}\" already exists.".format(self.name)
if self.name.lower() == item.name.lower():
self._show_msg(txt)
return False
stub.imprint(item, self.data)
stub.set_label_color(item.id, 14) # Cyan options 0 - 16
stub.rename_item(item, self.data["subset"])
def _show_msg(self, txt):
msg = Qt.QtWidgets.QMessageBox()
msg.setIcon(Qt.QtWidgets.QMessageBox.Warning)
msg.setText(txt)
msg.exec_()

View file

@ -1,7 +1,6 @@
from pype.lib import abstract_collect_render
from pype.lib.abstract_collect_render import RenderInstance
import pyblish.api
import copy
import attr
import os
@ -38,10 +37,20 @@ class CollectAERender(abstract_collect_render.AbstractCollectRender):
# loaded asset container skip it
if schema and 'container' in schema:
continue
if inst["family"] == "render.farm" and inst["active"]:
work_area_info = aftereffects.stub().get_work_area(int(item_id))
frameStart = round(float(work_area_info.workAreaStart) *
float(work_area_info.frameRate))
frameEnd = round(float(work_area_info.workAreaStart) *
float(work_area_info.frameRate) +
float(work_area_info.workAreaDuration) *
float(work_area_info.frameRate))
if inst["family"] == "render" and inst["active"]:
instance = AERenderInstance(
family=inst["family"],
families=[inst["family"]],
family="render.farm", # other way integrate would catch it
families=["render.farm"],
version=version,
time="",
source=current_file,
@ -63,8 +72,8 @@ class CollectAERender(abstract_collect_render.AbstractCollectRender):
tileRendering=False,
tilesX=0,
tilesY=0,
frameStart=int(asset_entity["data"]["frameStart"]),
frameEnd=int(asset_entity["data"]["frameEnd"]),
frameStart=frameStart,
frameEnd=frameEnd,
frameStep=1,
toBeRenderedOn='deadline'
)
@ -101,6 +110,7 @@ class CollectAERender(abstract_collect_render.AbstractCollectRender):
# render to folder of workfile
base_dir = os.path.dirname(render_instance.source)
base_dir = os.path.join(base_dir, 'renders', 'aftereffects')
expected_files = []
for frame in range(start, end + 1):
path = os.path.join(base_dir, "{}_{}_{}.{}.{}".format(
@ -116,26 +126,17 @@ class CollectAERender(abstract_collect_render.AbstractCollectRender):
def _get_output_dir(self, render_instance):
"""
Returns dir path of published asset. Required for
'submit_publish_job'.
It is different from rendered files (expectedFiles), these are
collected first in some 'staging' area, published later.
Returns dir path of rendered files, used in submit_publish_job
for metadata.json location
Args:
render_instance (RenderInstance): to pull anatomy and parts used
in url
render_instance (RenderInstance):
Returns:
(str): absolute path to published files
(str): absolute path to rendered files
"""
anatomy = render_instance._anatomy
anatomy_data = copy.deepcopy(render_instance.anatomyData)
anatomy_data["family"] = render_instance.family
anatomy_data["version"] = render_instance.version
anatomy_data["subset"] = render_instance.subset
anatomy_filled = anatomy.format(anatomy_data)
base_dir = os.path.dirname(render_instance.source)
base_dir = os.path.join(base_dir, 'renders', 'aftereffects')
# for submit_publish_job
return anatomy_filled["render"]["folder"]
return base_dir

View file

@ -3,7 +3,6 @@ from pype.lib.abstract_submit_deadline import DeadlineJobInfo
import pyblish.api
import os
import attr
import json
import getpass
from avalon import api
@ -17,7 +16,6 @@ class DeadlinePluginInfo():
StartupDirectory = attr.ib(default=None)
Arguments = attr.ib(default=None)
ProjectPath = attr.ib(default=None)
SceneFile = attr.ib(default=None)
AWSAssetFile0 = attr.ib(default=None)
Version = attr.ib(default=None)
@ -27,7 +25,7 @@ class AfterEffectsSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline
label = "Submit AE to Deadline"
order = pyblish.api.IntegratorOrder
hosts = ["aftereffects"]
families = ["render.farm"]
families = ["render.farm"] # cannot be "render' as that is integrated
use_published = False
def get_job_info(self):