Created
February 27, 2018 14:46
-
-
Save BigRoy/d027323b27bf9de8f92a7c2ea972122a to your computer and use it in GitHub Desktop.
For maya file paths list all files that match a pattern like UDIM patterns or file sequence patterns
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def seq_to_glob(path): | |
"""Takes an image sequence path and returns it in glob format, | |
with the frame number replaced by a '*'. | |
Image sequences may be numerical sequences, e.g. /path/to/file.1001.exr | |
will return as /path/to/file.*.exr. | |
Image sequences may also use tokens to denote sequences, e.g. | |
/path/to/texture.<UDIM>.tif will return as /path/to/texture.*.tif. | |
Args: | |
path (str): the image sequence path | |
Returns: | |
str: Return glob string that matches the filename pattern. | |
""" | |
if path is None: | |
return path | |
# If any of the patterns, convert the pattern | |
patterns = { | |
"<udim>": "<udim>", | |
"<tile>": "<tile>", | |
"<uvtile>": "<uvtile>", | |
"#": "#", | |
"u<u>_v<v>": "<u>|<v>", | |
"<frame0": "<frame0\d+>", | |
"<f>": "<f>" | |
} | |
lower = path.lower() | |
has_pattern = False | |
for pattern, regex_pattern in patterns.items(): | |
if pattern in lower: | |
path = re.sub(regex_pattern, "*", path, flags=re.IGNORECASE) | |
has_pattern = True | |
if has_pattern: | |
return path | |
base = os.path.basename(path) | |
matches = list(re.finditer(r'\d+', base)) | |
if matches: | |
match = matches[-1] | |
new_base = '{0}*{1}'.format(base[:match.start()], | |
base[match.end():]) | |
head = os.path.dirname(path) | |
return os.path.join(head, new_base) | |
else: | |
return path | |
def get_file_node_path(node): | |
"""Get the file path used by a Maya file node. | |
Args: | |
node (str): Name of the Maya file node | |
Returns: | |
str: the file path in use | |
""" | |
# if the path appears to be sequence, use computedFileTextureNamePattern, | |
# this preserves the <> tag | |
if mc.attributeQuery('computedFileTextureNamePattern', node=node, exists=True): | |
texture_pattern = mc.getAttr('{0}.computedFileTextureNamePattern'.format(node)) | |
patterns = ["<udim>", "<tile>", "u<u>_v<v>", "<f>", "<frame0", "<uvtile>"] | |
lower = texture_pattern.lower() | |
if any(pattern in lower for pattern in patterns): | |
return texture_pattern | |
# otherwise use fileTextureName | |
return mc.getAttr('{0}.fileTextureName'.format(node)) | |
def get_file_node_files(node): | |
"""Return the file paths related to the file node | |
Note: | |
Will only return existing files. Returns an empty list | |
if not valid existing files are linked. | |
Returns: | |
list: List of full file paths. | |
""" | |
path = get_file_node_path(node) | |
path = mc.workspace(expandName=path) | |
if node_uses_image_sequence(node): | |
glob_pattern = seq_to_glob(path) | |
return glob.glob(glob_pattern) | |
elif os.path.exists(path): | |
return [path] | |
else: | |
return [] | |
def node_uses_image_sequence(node): | |
"""Return whether file node uses an image sequence or single image. | |
Determine if a node uses an image sequence or just a single image, | |
not always obvious from its file path alone. | |
Args: | |
node (str): Name of the Maya node | |
Returns: | |
bool: True if node uses an image sequence | |
""" | |
# useFrameExtension indicates an explicit image sequence | |
node_path = get_file_node_path(node).lower() | |
# The following tokens imply a sequence | |
patterns = ["<udim>", "<tile>", "<uvtile>", "u<u>_v<v>", "<frame0"] | |
return (mc.getAttr('%s.useFrameExtension' % node) == True or | |
any(pattern in node_path for pattern in patterns)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment