Merge pull request #4204 from pypeclub/feature/OP-4596_Flame-loading-multilayer-exr

Flame - loading multilayer with controlled layer names
This commit is contained in:
Jakub Ježek 2022-12-19 21:15:14 +01:00 committed by GitHub
commit 70972504d0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 124 additions and 8 deletions

View file

@ -8,7 +8,7 @@ import qargparse
from Qt import QtCore, QtWidgets
from openpype import style
from openpype.lib import Logger
from openpype.lib import Logger, StringTemplate
from openpype.pipeline import LegacyCreator, LoaderPlugin
from openpype.settings import get_current_project_settings
@ -775,6 +775,11 @@ class OpenClipSolver(flib.MediaInfoFile):
self.feed_colorspace = feed_data.get("colorspace")
self.log.debug("feed_version_name: {}".format(self.feed_version_name))
# layer rename variables
self.layer_rename_template = feed_data["layer_rename_template"]
self.layer_rename_patterns = feed_data["layer_rename_patterns"]
self.context_data = feed_data["context_data"]
# derivate other feed variables
self.feed_basename = os.path.basename(feed_path)
self.feed_dir = os.path.dirname(feed_path)
@ -813,9 +818,11 @@ class OpenClipSolver(flib.MediaInfoFile):
def _create_new_open_clip(self):
self.log.info("Building new openClip")
self.log.debug(">> self.clip_data: {}".format(self.clip_data))
for tmp_xml_track in self.clip_data.iter("track"):
# solve track (layer) name
self._rename_track_name(tmp_xml_track)
tmp_xml_feeds = tmp_xml_track.find('feeds')
tmp_xml_feeds.set('currentVersion', self.feed_version_name)
@ -850,6 +857,48 @@ class OpenClipSolver(flib.MediaInfoFile):
if uid == track_uid:
return xml_track
def _rename_track_name(self, xml_track_data):
layer_uid = xml_track_data.get("uid")
name_obj = xml_track_data.find("name")
layer_name = name_obj.text
if (
self.layer_rename_patterns
and not any(
re.search(lp_.lower(), layer_name.lower())
for lp_ in self.layer_rename_patterns
)
):
return
formating_data = self._update_formating_data(
layerName=layer_name,
layerUID=layer_uid
)
name_obj.text = StringTemplate(
self.layer_rename_template
).format(formating_data)
def _update_formating_data(self, **kwargs):
""" Updating formating data for layer rename
Attributes:
key=value (optional): will be included to formating data
as {key: value}
Returns:
dict: anatomy context data for formating
"""
self.log.debug(">> self.clip_data: {}".format(self.clip_data))
clip_name_obj = self.clip_data.find("name")
data = {
"originalBasename": clip_name_obj.text
}
# include version context data
data.update(self.context_data)
# include input kwargs data
data.update(kwargs)
return data
def _update_open_clip(self):
self.log.info("Updating openClip ..")
@ -857,11 +906,12 @@ class OpenClipSolver(flib.MediaInfoFile):
out_xml = out_xml.getroot()
self.log.debug(">> out_xml: {}".format(out_xml))
self.log.debug(">> self.clip_data: {}".format(self.clip_data))
# loop tmp tracks
updated_any = False
for tmp_xml_track in self.clip_data.iter("track"):
# solve track (layer) name
self._rename_track_name(tmp_xml_track)
# get tmp track uid
tmp_track_uid = tmp_xml_track.get("uid")
self.log.debug(">> tmp_track_uid: {}".format(tmp_track_uid))

View file

@ -1,3 +1,4 @@
from copy import deepcopy
import os
import flame
from pprint import pformat
@ -25,6 +26,14 @@ class LoadClip(opfapi.ClipLoader):
reel_name = "Loaded"
clip_name_template = "{asset}_{subset}<_{output}>"
""" Anatomy keys from version context data and dynamically added:
- {layerName} - original layer name token
- {layerUID} - original layer UID token
- {originalBasename} - original clip name taken from file
"""
layer_rename_template = "{asset}_{subset}<_{output}>"
layer_rename_patterns = []
def load(self, context, name, namespace, options):
# get flame objects
@ -38,8 +47,16 @@ class LoadClip(opfapi.ClipLoader):
version_name = version.get("name", None)
colorspace = self.get_colorspace(context)
# in case output is not in context replace key to representation
if not context["representation"]["context"].get("output"):
self.clip_name_template = self.clip_name_template.replace(
"output", "representation")
self.layer_rename_template = self.layer_rename_template.replace(
"output", "representation")
formating_data = deepcopy(context["representation"]["context"])
clip_name = StringTemplate(self.clip_name_template).format(
context["representation"]["context"])
formating_data)
# convert colorspace with ocio to flame mapping
# in imageio flame section
@ -62,6 +79,9 @@ class LoadClip(opfapi.ClipLoader):
"path": self.fname.replace("\\", "/"),
"colorspace": colorspace,
"version": "v{:0>3}".format(version_name),
"layer_rename_template": self.layer_rename_template,
"layer_rename_patterns": self.layer_rename_patterns,
"context_data": formating_data
}
self.log.debug(pformat(
loading_context

View file

@ -25,6 +25,14 @@ class LoadClipBatch(opfapi.ClipLoader):
reel_name = "OP_LoadedReel"
clip_name_template = "{batch}_{asset}_{subset}<_{output}>"
""" Anatomy keys from version context data and dynamically added:
- {layerName} - original layer name token
- {layerUID} - original layer UID token
- {originalBasename} - original clip name taken from file
"""
layer_rename_template = "{asset}_{subset}<_{output}>"
layer_rename_patterns = []
def load(self, context, name, namespace, options):
# get flame objects
@ -39,7 +47,10 @@ class LoadClipBatch(opfapi.ClipLoader):
# in case output is not in context replace key to representation
if not context["representation"]["context"].get("output"):
self.clip_name_template.replace("output", "representation")
self.clip_name_template = self.clip_name_template.replace(
"output", "representation")
self.layer_rename_template = self.layer_rename_template.replace(
"output", "representation")
formating_data = deepcopy(context["representation"]["context"])
formating_data["batch"] = self.batch.name.get_value()
@ -69,6 +80,9 @@ class LoadClipBatch(opfapi.ClipLoader):
"path": self.fname.replace("\\", "/"),
"colorspace": colorspace,
"version": "v{:0>3}".format(version_name),
"layer_rename_template": self.layer_rename_template,
"layer_rename_patterns": self.layer_rename_patterns,
"context_data": formating_data
}
self.log.debug(pformat(
loading_context

View file

@ -119,7 +119,12 @@
],
"reel_group_name": "OpenPype_Reels",
"reel_name": "Loaded",
"clip_name_template": "{asset}_{subset}<_{output}>"
"clip_name_template": "{asset}_{subset}<_{output}>",
"layer_rename_template": "{asset}_{subset}<_{output}>",
"layer_rename_patterns": [
"rgb",
"rgba"
]
},
"LoadClipBatch": {
"enabled": true,
@ -142,7 +147,12 @@
"exr16fpdwaa"
],
"reel_name": "OP_LoadedReel",
"clip_name_template": "{batch}_{asset}_{subset}<_{output}>"
"clip_name_template": "{batch}_{asset}_{subset}<_{output}>",
"layer_rename_template": "{asset}_{subset}<_{output}>",
"layer_rename_patterns": [
"rgb",
"rgba"
]
}
}
}

View file

@ -512,6 +512,17 @@
"type": "text",
"key": "clip_name_template",
"label": "Clip name template"
},
{
"type": "text",
"key": "layer_rename_template",
"label": "Layer name template"
},
{
"type": "list",
"key": "layer_rename_patterns",
"label": "Layer rename patters",
"object_type": "text"
}
]
},
@ -554,6 +565,17 @@
"type": "text",
"key": "clip_name_template",
"label": "Clip name template"
},
{
"type": "text",
"key": "layer_rename_template",
"label": "Layer name template"
},
{
"type": "list",
"key": "layer_rename_patterns",
"label": "Layer rename patters",
"object_type": "text"
}
]
}