Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2816 from pypeclub/bugfix/dynamic_parsed_groups_t…
Browse files Browse the repository at this point in the history
…exture_batch

StandalonePublisher: use dynamic groups in subset names
  • Loading branch information
kalisp authored Mar 4, 2022
2 parents d481d5d + f65b202 commit 1f147cf
Showing 1 changed file with 103 additions and 39 deletions.
142 changes: 103 additions & 39 deletions openpype/hosts/standalonepublisher/plugins/publish/collect_texture.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,10 @@ def process(self, context):
parsed_subset = instance.data["subset"].replace(
instance.data["family"], '')

fill_pairs = {
explicit_data = {
"subset": parsed_subset
}

fill_pairs = prepare_template_data(fill_pairs)
workfile_subset = format_template_with_optional_keys(
fill_pairs, self.workfile_subset_template)

processed_instance = False
for repre in instance.data["representations"]:
ext = repre["ext"].replace('.', '')
Expand All @@ -102,6 +98,21 @@ def process(self, context):
if ext in self.main_workfile_extensions or \
ext in self.other_workfile_extensions:

formatting_data = self._get_parsed_groups(
repre_file,
self.input_naming_patterns["workfile"],
self.input_naming_groups["workfile"],
self.color_space
)
self.log.info("Parsed groups from workfile "
"name '{}': {}".format(repre_file,
formatting_data))

formatting_data.update(explicit_data)
fill_pairs = prepare_template_data(formatting_data)
workfile_subset = format_template_with_optional_keys(
fill_pairs, self.workfile_subset_template)

asset_build = self._get_asset_build(
repre_file,
self.input_naming_patterns["workfile"],
Expand Down Expand Up @@ -148,32 +159,47 @@ def process(self, context):
resource_files[workfile_subset].append(item)

if ext in self.texture_extensions:
formatting_data = self._get_parsed_groups(
repre_file,
self.input_naming_patterns["textures"],
self.input_naming_groups["textures"],
self.color_space
)

self.log.info("Parsed groups from texture "
"name '{}': {}".format(repre_file,
formatting_data))

c_space = self._get_color_space(
repre_file,
self.color_space
)

# optional value
channel = self._get_channel_name(
repre_file,
self.input_naming_patterns["textures"],
self.input_naming_groups["textures"],
self.color_space
)

# optional value
shader = self._get_shader_name(
repre_file,
self.input_naming_patterns["textures"],
self.input_naming_groups["textures"],
self.color_space
)

formatting_data = {
explicit_data = {
"color_space": c_space or '', # None throws exception
"channel": channel or '',
"shader": shader or '',
"subset": parsed_subset or ''
}

formatting_data.update(explicit_data)

fill_pairs = prepare_template_data(formatting_data)
subset = format_template_with_optional_keys(
fill_pairs, self.texture_subset_template)
Expand Down Expand Up @@ -243,6 +269,13 @@ def _create_new_instances(self, context, asset, asset_builds,
for asset_build, version, subset, family in asset_builds:
if not main_version:
main_version = version

try:
version_int = int(version or main_version or 1)
except ValueError:
self.log.error("Parsed version {} is not "
"an number".format(version))

new_instance = context.create_instance(subset)
new_instance.data.update(
{
Expand All @@ -251,7 +284,7 @@ def _create_new_instances(self, context, asset, asset_builds,
"label": subset,
"name": subset,
"family": family,
"version": int(version or main_version or 1),
"version": version_int,
"asset_build": asset_build # remove in validator
}
)
Expand Down Expand Up @@ -320,13 +353,14 @@ def _get_asset_build(self, name,
"""
asset_name = "NOT_AVAIL"

return self._parse(name, input_naming_patterns, input_naming_groups,
color_spaces, 'asset') or asset_name
return (self._parse_key(name, input_naming_patterns,
input_naming_groups, color_spaces, 'asset') or
asset_name)

def _get_version(self, name, input_naming_patterns, input_naming_groups,
color_spaces):
found = self._parse(name, input_naming_patterns, input_naming_groups,
color_spaces, 'version')
found = self._parse_key(name, input_naming_patterns,
input_naming_groups, color_spaces, 'version')

if found:
return found.replace('v', '')
Expand All @@ -336,8 +370,8 @@ def _get_version(self, name, input_naming_patterns, input_naming_groups,
def _get_udim(self, name, input_naming_patterns, input_naming_groups,
color_spaces):
"""Parses from 'name' udim value."""
found = self._parse(name, input_naming_patterns, input_naming_groups,
color_spaces, 'udim')
found = self._parse_key(name, input_naming_patterns,
input_naming_groups, color_spaces, 'udim')
if found:
return found

Expand Down Expand Up @@ -375,12 +409,15 @@ def _get_shader_name(self, name, input_naming_patterns,
Unknown format of channel name and color spaces >> cs are known
list - 'color_space' used as a placeholder
"""
found = self._parse(name, input_naming_patterns, input_naming_groups,
color_spaces, 'shader')
if found:
return found
found = None
try:
found = self._parse_key(name, input_naming_patterns,
input_naming_groups, color_spaces,
'shader')
except ValueError:
self.log.warning("Didn't find shader in {}".format(name))

self.log.warning("Didn't find shader in {}".format(name))
return found

def _get_channel_name(self, name, input_naming_patterns,
input_naming_groups, color_spaces):
Expand All @@ -389,15 +426,18 @@ def _get_channel_name(self, name, input_naming_patterns,
Unknown format of channel name and color spaces >> cs are known
list - 'color_space' used as a placeholder
"""
found = self._parse(name, input_naming_patterns, input_naming_groups,
color_spaces, 'channel')
if found:
return found

self.log.warning("Didn't find channel in {}".format(name))

def _parse(self, name, input_naming_patterns, input_naming_groups,
color_spaces, key):
found = None
try:
found = self._parse_key(name, input_naming_patterns,
input_naming_groups, color_spaces,
'channel')
except ValueError:
self.log.warning("Didn't find channel in {}".format(name))

return found

def _parse_key(self, name, input_naming_patterns, input_naming_groups,
color_spaces, key):
"""Universal way to parse 'name' with configurable regex groups.
Args:
Expand All @@ -411,23 +451,47 @@ def _parse(self, name, input_naming_patterns, input_naming_groups,
Raises:
ValueError - if broken 'input_naming_groups'
"""
parsed_groups = self._get_parsed_groups(name,
input_naming_patterns,
input_naming_groups,
color_spaces)

try:
parsed_value = parsed_groups[key]
return parsed_value
except (IndexError, KeyError):
msg = ("'Textures group positions' must " +
"have '{}' key".format(key))
raise ValueError(msg)

def _get_parsed_groups(self, name, input_naming_patterns,
input_naming_groups, color_spaces):
"""Universal way to parse 'name' with configurable regex groups.
Args:
name (str): workfile name or texture name
input_naming_patterns (list):
[workfile_pattern] or [texture_pattern]
input_naming_groups (list)
ordinal position of regex groups matching to input_naming..
color_spaces (list) - predefined color spaces
Returns:
(dict) {group_name:parsed_value}
"""
for input_pattern in input_naming_patterns:
for cs in color_spaces:
pattern = input_pattern.replace('{color_space}', cs)
regex_result = re.findall(pattern, name)
if regex_result:
idx = list(input_naming_groups).index(key)
if idx < 0:
msg = "input_naming_groups must " +\
"have '{}' key".format(key)
raise ValueError(msg)

try:
parsed_value = regex_result[0][idx]
return parsed_value
except IndexError:
self.log.warning("Wrong index, probably "
"wrong name {}".format(name))
if len(regex_result[0]) == len(input_naming_groups):
return dict(zip(input_naming_groups, regex_result[0]))
else:
self.log.warning("No of parsed groups doesn't match "
"no of group labels")

raise ValueError("Name '{}' cannot be parsed by any "
"'{}' patterns".format(name, input_naming_patterns))

def _update_representations(self, upd_representations):
"""Frames dont have sense for textures, add collected udims instead."""
Expand Down

0 comments on commit 1f147cf

Please sign in to comment.