filePathをsubstituteする時の注意点

Windowsの場合、ファイルパスを区切るには、 / の二種類があり、どちらでもファイルパスは認識されます。
が、スクリプトを使用したときにはやや違いがあり、 スクリプト的には、ノードのテキストボックス上では マークで区切られていても、内部的には / として保持されています。

これが、問題になるのが、ファイルパスを一括で置換しようとするスクリプトを書く場合。
書き換えるパスを、テキストボックス(表に出ている) で区切られたパスで置換しようとすると、エラーになります。
凄い分かりにくい。

さらに、テクスチャパスを置換しようとすると1つ問題が発生します。
手でパスを書き換えた場合 無効なパスであったとしても、パスの書き換えは可能ですが、(その場合テクスチャは読み込まれなくなる)setAttrで値をセットしようとすると、Result的には書き換わりましたとかかれはするのですが、実際のパスは書き換わりません。

もう一つの特性として、もとのパスにファイルがない場合 projectフォルダのsourceimagesをチェックしに行き、同じファイル名があった場合、setAttrで与えたパスではなく、sourceimagesの中のファイルにパスは書き換わります。

まとめると

fileTextureNameのパスが通っている場合、
1 setAttrしたPathが通っていれば、そのパスに書き換わる
2 通っていない場合、置換はされずそのままのパスになる

fileTextureNameのパスが通っていない場合
1 setAttrしたPathが正しい物ならば、そのパスに書き換わる
2 正しくない場合、同名のファイルがprojectFolder内のsourceimagesにあるかどうかチェックし、
あった場合は、そのパスに書き換わる
3 sourceimagesにもない場合、書き換わらない

と、setAttr時にこんな挙動をとります。非常に美味しくない

まぁ、正しくないパスに書き換えることができないというのは 理屈としては間違っていないのですが。
イマイチこのへんの挙動がよくわからなくて、パス書き換え系のスクリプトを書くのに困ります。要検討

とりあえず↓は、簡単なテクスチャの一括変換スクリプト

[cpp] global proc replaceTextureFilePath(string $before,string $after){

string $node[] = ls -type file;

for ($fileNode in $node){

string $path = getAttr ($fileNode + ".fileTextureName");
string $changePath = substitute $before $path $after;
setAttr -type "string" ($fileNode + ".fileTextureName") $changePath;
}

}
[/cpp]

コメントを残す

メールアドレスが公開されることはありません。

*