fc2ブログ

    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 )
    
    スポンサーサイト



    プロフィール

    Eske

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

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

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR