ON-BLOG

CGのこと、あれこれ書いてます。

【覚書】maya python入門 其の三

では続き。

前回はSET側のコードで移動させたり、KEYを打ったりしてました。
今回はGET側をやってます。

まず初めに前回の環境を作成します。

import maya.cmds as cmds
cmds.polyCube( n='Cube_Move' )
cmds.move( 5, 1, 1 )
cmds.setKeyframe( at='translateX',v=10 ,time=30 )

f:id:tommy_on:20150621014003p:plain

これで画像みたいな環境ができたと思います。
ここから値を取得して、編集してみたいと思います。

始めに移動値の値を取得します。
値を取るには「getAttr」を使用するみたいです。
※これ以外にもあるのかな??

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
tx = maya.cmds.getAttr('.tx') 
print tx

f:id:tommy_on:20150621013029p:plain
これで取得できました。
getAttr('.tx') この部分の引数を変えてあげると色々取得できますね。
引数についてはこちらを
http://me.autodesk.jp/wam/maya/docs/Maya2009/CommandsPython/getAttr.html
ちなみに「tx」はトランスXです。
もちろん「translateX」と書くことも可能です。
他にも
「ty」「tz」トランスY、トランスZ
「rx」「ry」「rz」ロットXYZ
「sx」「sy」「sz」スケールXYZ
と書きます。
全体を取得したい時は
「translate」「rotation」「scale」と記述して下さい。
それぞれ「X,Y,Z」として取得できます。

では続いてはキーフレームを取得します。
ここについてはやり方が少し分からなかった(他にももっとあると思います)
ので、HELPで引っ掛かった「findKeyframe」を使用してみます。

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
tx = cmds.findKeyframe( 'Cube_Move',timeSlider=True, which='first' )

f:id:tommy_on:20150621013305p:plain

※画像は値が「which='next'」となってますが「which='first'」の間違いです。。。
とりあえずこれで取得できました。
findKeyframeについてはこちらを参照。
findKeyframe command

これ以外だとこんな感じ?

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
tx = cmds.keyframe('Cube_Move.translateX',index=(0,0),query=True);
print tx

※結果は上の画像と全く同じです。

ただこれだと一番初めのキーしか取得できない。
一応逆に最後だけ調節すには、こんな感じで記述します。

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
tx = cmds.keyframe( query=True, lsl=True, timeChange=True )

f:id:tommy_on:20150621013340p:plain

もしくはこんな感じ。

import maya.cmds as cmds
last = cmds.findKeyframe(timeSlider=True, which='last') 
print lastKey

※結果は上の画像と全く同じです。

GetKeyinfo的なものは「findKeyframe」が一番近いですね。
これを使っていきます。

これで取得できました。
次に値の変更をしてみます。
今上の画像をみると「30Fと66F」にキーフレームがあります。
これを30Fを0Fに、66Fを70Fにした後に、その値を「0」にしてみましょう。
考察すると、頭のキーフレームとお尻のキーフレームが取れれば
なんとかなりそうですね。
って事でコード。
まずは先頭のキーを「0F」にしてみます。

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
tx = cmds.keyframe(index=(0,0),timeChange=0)

f:id:tommy_on:20150621014622p:plain

これで先頭は変わりました。
続いてお尻のキーを移動、値変更してみます。
ラストキーフレームはどうやって取得したらいいのか?
全くわからなかったんで、indexで無理やり取得してみました。
値はtimeChange同様にChangevalueで変更できそうです。

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
cmds.keyframe('Cube_Move',index=(0,0),timeChange=0)
cmds.keyframe('Cube_Move',index=(1,1), timeChange=70, valueChange=0 )

f:id:tommy_on:20150621013559p:plain

うーん。。
すごく最終フレームの処理が汚いですね。
indexがあるんだからlastはあってよ…と思いますが。。
他にもTIMEで指定する方法もあったりしますが
どちらにしても汚いっすね。

import maya.cmds as cmds
maya.cmds.select('Cube_Move') 
cmds.keyframe('Cube_Move',index=(0,0),timeChange=0)
cmds.keyframe('Cube_Move',t=(66,66), timeChange=70, valueChange=0 )

※結果は上の画像と全く同じです。

こんな感じで「とりあえず」キーの取得ができました。
ここから拡張するとなると、折角値を取れたんで
キーを全体的にずらす方法を書いてみようと思います。

import maya.cmds as cmds
def Time_Offset():
    Offset_Number = cmds.textField( "Time_Offset", q=True, tx=True )
    selected_object = cmds.ls( type=['animCurveTL','animCurveTU','animCurveTA','animCurveTT'])
    cmds.keyframe(selected_object,edit=True,relative=True,timeChange=Offset_Number)

cmds.window(title="offset")
cmds.columnLayout()
cmds.textField( "Time_Offset" )
cmds.button( l="Offset", command="Time_Offset()" )
cmds.setParent( '..' )
cmds.showWindow()

f:id:tommy_on:20150621015703g:plain


こんなかんじで選択した物を、入力された値全体的にずらします。
内容は関数とか使ってますが、めちゃくちゃ簡単です。

def Time_Offset():
    Offset_Number = cmds.textField( "Time_Offset", q=True, tx=True )
    selected_object = cmds.ls( type=['animCurveTL','animCurveTU','animCurveTA','animCurveTT'])
    cmds.keyframe(selected_object,edit=True,relative=True,timeChange=Offset_Number)

関数部分です。
一行目で関数宣言し、二行目でインプットボックスを作成
三行目で選択した物をフィルタリング。
この時アニメーションしてるものだけに篩をかけております。
四行目はさっきのコマンドに、入力された値をいれているだけです。

cmds.window(title="offset")
cmds.columnLayout()
cmds.textField( "Time_Offset" )
cmds.button( l="Offset", command="Time_Offset()" )
cmds.setParent( '..' )
cmds.showWindow()

この部分はウィンドウ生成部分ですね。
詳しくは省きますが、WEBに腐るほど資料がありますよ…
PySide含めて…

…っと
長くなったので、今回はこの辺りで。
次回はアニメーションされたキーフレームのコピペをベースに行きたいと思います。
以上です。