UDIM便利ですよねー
ただ、結局ファイルが何枚あるのかがよくわからないので数えてみます。
テスト
こんなノードを作ってみます。
インデックス部分がって書かれてますね。
ここのバリエーションが欲しい。
とりあえず素直に聞いてみます。
cmds.getAttr("file1.fileTextureName")
# Result: D:/test/UDIMtest/udmiTest.1001.png #
これはー、UDIM指定する前に入力したファイルパスですね。
一応 な文字列を取得できないか調べてみます。
うーん この辺ですかねぇ
- computedFileTextureNamePattern
- fileTextureNamePattern
とりあえず聞いてみます。
cmds.getAttr("file1.computedFileTextureNamePattern")
# Result: D:/test/UDIMtest/udmiTest.<UDIM>.png #
あ、これですね。
UDIMのスタートは1001 で maxは9999ですかね?
とりあえず4桁の連番であるという前提で、ファイルを検索してみます。
若干遠回りしてる気もしますが、
- computedFileTextureNamePattern から 表記の文字列を取得して
- 文字列から ディレクトリパス、ファイル名を取得して
- ファイル名の 部分を正規表現に置き換えて
- pathlibでファイル取得して
- ファイル名を正規表現でしらべる
という流れでやってみます。
import os
import pathlib
import re
import maya.cmds as cmds
def getUDIMFileNames(fileNode):
filePath = cmds.getAttr(fileNode + ".computedFileTextureNamePattern")
fileDirPath = os.path.dirname(filePath) + "/"
fileName = os.path.basename(filePath)
fileNameSample = fileName.replace("<UDIM>","([0-9|\-]{4})")
pathNode = pathlib.Path(fileDirPath).iterdir()
UDIMFileNames = []
for node in pathNode:
if node.is_dir():
continue
elif node.is_file():
ID = re.match(fileNameSample,node.name) or None
if ID == None:
continue
UDIMFileNames.append(node.name)
return UDIMFileNames
getUDIMFileNames("file1")
# Result: ['udmiTest.1001.png', 'udmiTest.1002.png', 'udmiTest.1003.png', 'udmiTest.1011.png', 'udmiTest.1012.png', 'udmiTest.1013.png'] #
お、とれましたね。
ちなみにファイルが格納されているフォルダの中身はこのようになってます。