スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    Pymel 覚書1 - Attributeクラス

     最近コードはPymelを使って書くことにしてます。
     基本的には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 )
    
    スポンサーサイト

    コメントの投稿

    非公開コメント

    No title

    お、attrメソッドなんてあったんですね!
    僕は割といつも直接、obj.attrname って感じで使ってました。
    なので上記の例で言うと、僕なら inMeshAttrは作らずに、
    cubeShape.inMesh.inputs() とやると思います。

    直接アクセスしたらAttributeのインスタンスが取れるとか素敵!です:D

    なんと!?

    おぉぉぉぉ、アトリビュートの直接アクセスなんて出来たんですね。
    しかもそれがAttributeのインスタンスなんて、素敵過ぎる・・・
    いやぁ勉強になります!

    そうなるとattrメソッドって何のためにあるんですかね。。。

    No title

    attrメソッドはたぶん文字列でアクセスしたいときですかね?
    僕それ知らなかったので、 Attribute(obj.name() + 'attrname') って感じで
    オブジェクト化しちゃってました:P

    なのでどちらも有益!!:D

    No title

     ボクもノード系クラスを解さずAttributeのインスタンス作るときは同じ方法とってました。
     色々選択肢を用意してくれてるって事でしょうかネ(・ω・) listConnectionとinputs/outputsみたいに導入しやすいように(かな?)機能が被ってるメソッドもありますし。

     奥深い。。。
    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。