2005年12月05日

MEL小物

自分が後々参考にするためのメモ
とりあえず作った物ばかりなのであまり実用性は無いかも

キーフレームのコピー→ペーストをひとつにまとめた
グラフエディタとドープシートの両方で使えるので意外と便利
proc CopyAndPasteKeys()
{
copyKey ;
int $t = `eval("currentTime -query")`;
pasteKey -time $t -float 11 -option merge -copies 1 -connect 0 -timeOffset 0 -floatOffset 0 -valueOffset 0;
}
CopyAndPasteKeys();


選択したファンクションカーブ(ひとつのみ)を反転
今ならKeyframerというスクリプトを使う
proc InvertKeyValues()
{
float $t[] = `keyframe -query -sl`;
float $kv[] = `keyframe -query -valueChange`;
int $nKey = `keyframe -query -keyframeCount`;
string $na[] = `keyframe -query -name`;

for( $i = 0; $i < $nKey; $i++ ){
selectKey -clear;
selectKey -add -k -t $t[$i] $na;
$kv[$i] *= -1;
keyframe -valueChange $kv[$i];
}
for( $i = 0; $i < $nKey; $i++ ){
selectKey -add -k -t $t[$i] $na;
}
}
InvertKeyValues();


0でミラーコピー
MaYAの操作に慣れるとほとんど使わないかも
//X=0, Y=1, Z=2
proc tkMirrorAxis(int $axis)
{
string $scale[] = {".scaleX", ".scaleY", ".scaleZ"};
string $src[] = `ls -sl`;
string $dist[];
string $newName[];

int $i = 0;
for($o in $src){
$dist = `duplicate -rr $o`;
setAttr ($dist[0] + $scale[$axis]) -1;
$newName = `polyUnite -ch 1 $o $dist[0]`;
rename $newName[0] $o;
$src[$i] = "|" + $o;
$i++;
}
select $src;
DeleteHistory;
}

{
string $winName = `window -title "MirrorAxis"`;
columnLayout;
button -label "--- X ---" -command ("tkMirrorAxis(0);deleteUI "+$winName);
button -label "--- Y ---" -command ("tkMirrorAxis(1);deleteUI "+$winName);
button -label "--- Z ---" -command ("tkMirrorAxis(2);deleteUI "+$winName);
showWindow;
}

tkMirrorAxisGUI();


最初に選択したオブジェクトに位置と回転をあわせる(同じ階層でフリーズしてない場合のみ)
階層が違うと使えないのでまったく役に立たなかった
proc AlignPosRot()
{
string $names[] = `ls -sl`;
float $pos[] = `getAttr ($names[0] + ".translate")`;
float $rot[] = `getAttr ($names[0] + ".rotate")`;

if( 1 == `getAttr -se ($names[1] + ".tx")` )
setAttr ($names[1] + ".tx") $pos[0];
if( 1 == `getAttr -se ($names[1] + ".ty")` )
setAttr ($names[1] + ".ty") $pos[1];
if( 1 == `getAttr -se ($names[1] + ".tz")` )
setAttr ($names[1] + ".tz") $pos[2];

if( 1 == `getAttr -se ($names[1] + ".rx")` )
setAttr ($names[1] + ".rx") $rot[0];
if( 1 == `getAttr -se ($names[1] + ".ry")` )
setAttr ($names[1] + ".ry") $rot[1];
if( 1 == `getAttr -se ($names[1] + ".rz")` )
setAttr ($names[1] + ".rz") $rot[2];
}

AlignPosRot();


キャラクターセットのポーズをファイルに保存
//export CharPose

proc getExpCharPosePath(string $filename, string $filetype)
{
if( "" == $filename ) return;

string $sel[] = `ls -sl -type "character"`;

string $fileParts [];
if (`tokenize $filename "." $fileParts` < 2) $filename += ".chp";

int $fileID = `fopen $filename "w"`;
if( 0 == $fileID ) return;

fprint $fileID "CharcterSetPoseFile\n\n";

string $charMembers[] = `character -q $sel[0]`;
//print $charMembers;
string $mem;
for( $mem in $charMembers ){
float $val = `getAttr $mem`;
//print ($mem + " : " + $val + "\n");
fprint $fileID ($mem + "\t" + $val + "\n");
}

fclose $fileID;
}


proc expCharPose()
{
string $sel[] = `ls -sl -type "character"`;
if( "" == $sel[0] ){
error "Select CharacterSet.";
return;
}

fileBrowser ("getExpCharPosePath", "CharcterPose", "", 1);
//fileBrowserDialog -m 1 -fc "getExpCharPosePath" -ft "Export";
}


expCharPose();


//Import CharPose

proc impCharPose()
{
string $sel[] = `ls -sl -type "character"`;
if( "" == $sel[0] ){
error "Select CharacterSet.";
return;
}

string $filename = `fileDialog -dm "*.chp"`;
//print ( $filename + "\n" );
if( "" == $filename ) return;

int $fileID = `fopen $filename "r"`;
if( 0 == $fileID ) return;

string $buf = `fgetline $fileID`;
if( "CharcterSetPoseFile\n" != $buf ){
error " ";
return;
}
fgetline $fileID;

string $charMembers[] = `character -q $sel[0]`;
string $mem;
while( 0 == `feof $fileID` ){
$buf = `fgetline $fileID`;
string $tokens[];
int $nTokens = `tokenize $buf "\t" $tokens`;
if( 2 == $nTokens ){
for( $mem in $charMembers ){
if( $mem == $tokens[0] ){
float $val = $tokens[1];
setAttr $mem $val;
break;
}
}
}
}


fclose $fileID;
}


impCharPose();

posted by toka at 15:34| Comment(0) | TrackBack(0) | MEL | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。