Pymel 覚書1 - Attributeクラス
最近コードはPymelを使って書くことにしてます。
基本的にはMelのコードを移植して書いてるだけのmayaPythonと比較して、OOP(オブジェクト指向プログラミング)で記述できるってのが最大の違いのようですが、他にも各ノードクラスごとに便利メソッドがあるのも非常に魅力的です。
■Attributeクラス
その中で、色々オペレーションする上でかなりの頻度で登場するMELコマンド「listConnections」のラッパ「inputs」「outputs」メソッドについてのメモです。
listConnectionsでは-sフラグと-dフラグで入力・出力のフィルタしますが、pymelではinputsで入力・outputsで出力をそれぞれリストできます。(コッチの方がわかりやすいですよね)
またlistConnectionsのフラグをほとんど使用できるので、シンプルな分、使い勝手は非常にいいです。
そこで登場するのがAttributeクラスです。Attributeクラスは指定したノードアトリビュートに関する操作を受け持つクラスです。このクラスがあるので、ノードから派生するクラスにはinputs・outputsでアトリビュート指定できないんですね。
上記例でpolyCubeShape1のinMeshアトリビュートのAttributeクラスのインスタンスを作るには
Attributeクラスにもinputs・outputsメソッドがあり、このクラスからアクセスした場合はAttributeクラスが保持しているアトリビュートに接続されているノードしか返ってこなくなります。
また、このAttributeクラスでは他のノードアトリビュートとの接続(connect)・接続解除(disconnect)や、値の取得(get)をはじめさまざまなメソッドを持ってます。(getAttrとsetAttrとattributeQueryとconnectAttrとdisconnectAttrと・・・って感じでアトリビュート操作系コマンドを全部ひっくるめた感じのクラス)
因みにinputs・outputsメソッドでplugフラグを指定している場合は、このAttributeクラスが返ってきます。
ノードのクラスを作成せずに、直接Attributeクラスを作成する場合は
一つのアトリビュートをこねくりまわす場合はアトリビュートクラスのインスタンスを作っておくと大変便利ですね。
素晴らしきOOP!
[追記]
tai先生のご指摘により、attrメソッドを使わなくてもいい事が判明しました。例えばcubeShapeのinMeshアトリビュートのインスタンスが欲しい場合
なんですと!(°Д°)こっちの方が便利ヤン!
ありがとうございますー
[追記2] attrメソッドの使い道ありました。。。よく考えたら、アトリビュート名を文字列で与えたい時なんかで使えますね。
基本的にはMelのコードを移植して書いてるだけのmayaPythonと比較して、OOP(オブジェクト指向プログラミング)で記述できるってのが最大の違いのようですが、他にも各ノードクラスごとに便利メソッドがあるのも非常に魅力的です。
■Attributeクラス
その中で、色々オペレーションする上でかなりの頻度で登場するMELコマンド「listConnections」のラッパ「inputs」「outputs」メソッドについてのメモです。
listConnectionsでは-sフラグと-dフラグで入力・出力のフィルタしますが、pymelではinputsで入力・outputsで出力をそれぞれリストできます。(コッチの方がわかりやすいですよね)
またlistConnectionsのフラグをほとんど使用できるので、シンプルな分、使い勝手は非常にいいです。
import pymel.core as pm cube = pm.polyCube() cubeShape = cube[0].getShape() # Shapeを取得 print( cubeShape.inputs() ) # Shapeの入力コネクションを取得し、出力する # Result : [PolyCube(u'polyCube1')] #しかし、実はinputs・outputsではどのアトリビュートに接続しているノードをしらべるかは指定できません。
//MEL これはOK listConnections -s true -d false "pCubeShape1.inMesh"
# Pymel アトリビュートの指定が無効 lcubeShape.inputs( 'inMesh' )
そこで登場するのがAttributeクラスです。Attributeクラスは指定したノードアトリビュートに関する操作を受け持つクラスです。このクラスがあるので、ノードから派生するクラスにはinputs・outputsでアトリビュート指定できないんですね。
上記例でpolyCubeShape1のinMeshアトリビュートのAttributeクラスのインスタンスを作るには
inMeshAttr = cubeShape.attr( 'inMesh' )と言う感じでattrメソッドを使います。
Attributeクラスにもinputs・outputsメソッドがあり、このクラスからアクセスした場合はAttributeクラスが保持しているアトリビュートに接続されているノードしか返ってこなくなります。
inMeshAttr = cubeShape.attr( 'inMesh' )ちょっと例が悪かったかも。。。
inMeshAttr.inputs()
また、このAttributeクラスでは他のノードアトリビュートとの接続(connect)・接続解除(disconnect)や、値の取得(get)をはじめさまざまなメソッドを持ってます。(getAttrとsetAttrとattributeQueryとconnectAttrとdisconnectAttrと・・・って感じでアトリビュート操作系コマンドを全部ひっくるめた感じのクラス)
因みにinputs・outputsメソッドでplugフラグを指定している場合は、このAttributeクラスが返ってきます。
cubeShape.inputs( p=True ) # Result: [Attribute(u'polyCube6.output')] #
ノードのクラスを作成せずに、直接Attributeクラスを作成する場合は
pm.Attribute( 'pCubeShape1.inMesh' )でOK?
一つのアトリビュートをこねくりまわす場合はアトリビュートクラスのインスタンスを作っておくと大変便利ですね。
素晴らしきOOP!
[追記]
tai先生のご指摘により、attrメソッドを使わなくてもいい事が判明しました。例えばcubeShapeのinMeshアトリビュートのインスタンスが欲しい場合
inMeshAttr = cubeShape.inMeshだけでOKとの事。もしくは直接アクセスもあり
cubeShape.inMesh.inputs()
なんですと!(°Д°)こっちの方が便利ヤン!
ありがとうございますー
[追記2] attrメソッドの使い道ありました。。。よく考えたら、アトリビュート名を文字列で与えたい時なんかで使えますね。
import pymel.core as pm node = pm.createNode( 'transform' ) for attrname in ['hoge', 'age']: node.addAttr( attrname, at='double' ) nodeAttr = node.attr( attrname ) nodeAttr.setKeyable( True )もっとも、attrメソッドの代わりにgetattr使ってもいいんですけど
import pymel.core as pm node = pm.createNode( 'transform' ) for attrname in ['hoge', 'age']: node.addAttr( attrname, at='double' ) nodeAttr = getattr( node, attrname ) nodeAttr.setKeyable( True )
スポンサーサイト