HEXA BLOG

その他

HEXA BLOGその他2016.1.25

本日のpymel

皆さま、スープカレーは食べていますか。

ヨセミテです。

 

   IMG_4767

先日、スープカレーShantiに行ってまいりました。

関東の店舗数が多く、そこそこ通い易い距離なので何度か食べに行ってます。

とてもおしゃれな店内が印象的なお店です。

さっぱり目のスープカレーでチキンがやわらかく、美味しく頂きました。

 

皆さんの快適なスープカレーライフを心より望んでおります。

 


 

▼Pymelの話

以前のブログで書かさせていただいたとおり、今回からPythonについて書いていこうかな、と思っていました。

Maya上でスクリプトを利用する場合、mel、cmds、Pymelなどがあります。

 

入社時はcmdsを利用していたのでが、

最近制作の主軸はめっきりPymelになってきています。

MEL → cmds に乗り換えたときも作業工程を短縮できた実感があったのですが、

Pymelはその時と比較にならないほど工程を短縮できているように感じます。

 

Pymelでblogを書くにあたって毎回一つ、

自分の勉強のためにも簡単なMayaのスクリプトを作成していこうかと思います。

 

今回ブログのために作成したスクリプトは、

Mayaのツール作成の際に不可欠な機能のひとつ、

選択機能についてスポットを当てたスクリプトです

 

mayaのスクリプトエディタに貼り付けて実行すればウィンドウが作成されると思います。

import pymel.core as pm
import pymel.core.nodetypes as pmnode

class simpleTypeSelector(object):
    def __init__(self):
        self.windowManageName     = "simpleTypeSelectorWindowName"
        self.windowTitle          = "simpleTypeSelector"

        self.windowSize           = [400,300] # ウィンドウのサイズ
        self.addButtonSize        = [400,30]  # ボタン追加ボタンのサイズ
        self.singleButtonSize     = [100,30]  # ボタンのサイズ
        self.buttonsGridColumnNum = 4         # ボタンの横の並びの数

        # 初期に作成するノードのタイプ
        self.selectionTypeList = [pmnode.Transform,pmnode.Mesh,pmnode.Joint,pmnode.CurveShape]

    def selectButtonAction(self, nodeType):
        # === 選択ボタンの挙動 ===
        selectTarget = pm.ls(type= nodeType)
        pm.select(selectTarget)

    def createSingleSelectionButton(self, nodeType):
        # === ボタン作成 ===
        pm.button(l = nodeType, c = pm.Callback(self.selectButtonAction,nodeType))

    def checkWindowOverlap(self):
        # === windowの重複確認 ===
        if pm.window(self.windowManageName, ex = True):
            pm.deleteUI(self.windowManageName)

    def buttonCreateButton(self):
        # ボタンを作成するボタン
        pm.button(u"選択からノードタイプを作成", w = self.addButtonSize[0], h = self.addButtonSize[1],
                  c = pm.Callback(self.buttonCreateButtonAction))

    def buttonCreateButtonAction(self):
        # ボタン作成ボタン動作
        # 選択オブジェクトの先頭のノードタイプからボタンを作成
        selection = pm.ls(sl = True)
        nodeType  = selection[0].nodeType()   # ------ ※
        with self.buttonField:
            pm.button(l = nodeType, c = pm.Callback(self.selectButtonAction,nodeType))
        
    def main(self):
        # === windowの作成 ===
        self.checkWindowOverlap()
        window = pm.window(self.windowManageName, t = self.windowTitle,
                           w = self.windowSize[0], h = self.windowSize[1])
        with pm.columnLayout():
            self.buttonCreateButton()
            self.buttonField = pm.gridLayout(cw = self.singleButtonSize[0], ch = self.singleButtonSize[1],
                                             nc = self.buttonsGridColumnNum)
            with self.buttonField:
                for nodeType in self.selectionTypeList:
                    self.createSingleSelectionButton(nodeType)
        window.show()

# 実行文
simpleTypeSelectorIns = simpleTypeSelector()
simpleTypeSelectorIns.main()

 ノードタイプを一括選択するためのウィンドウを作成するツールです。

  

ノードタイプのボタンをクリックするとそのノードタイプが選ばれます。

 simpleSTypeelector_1

足りないものは上のボタンを押すと選択したノードタイプがUI上に追加されるようにしました。

 simpleSTypeelector_3

 

 

Pymelで組むことの利点として、(※印の部分)

なんとPymelのlsで取得したノードは、自らのノードタイプを自分で取得する機能を持っているのです!

 

ノード名だけに限らず頂点グループだったらそのインデックス番号を持っていたり、

フェースだったら隣接するフェースの取得や、自らの法線方向を取得する機能を使えたりします。

 

MELやcmdsではわざわざ取得する専用の関数を判定モードで呼びだして・・・。

いくつも手順も踏んでいたような・・・。

 

Pymel、すごい便利!

 

ドキュメントが英語しかないのが日本人には少し難点なのですが・・・。

 

予定外で作成要望のでたDCCツールは大体がとにかく今必要!

というものがほとんどな気がします。

ですので、要望から完成までの期間はとにかく早い方がよい、と考えています。

その点へのPymelの貢献力はとても大きいと感じています。

 

cmdsユーザーは是非使ってみてください!

MELユーザーも(Pythonを覚えるとこからになっちゃいますが・・・)

使ってみるとその効率に驚けると思います。


 

 

▼次はどんなネタにしよう

次回はmayaでPySideを使ってUIを作る、をしてみたいなぁと思う今日この頃。

次回までにPySideを覚えていなければ引き続きPymelで何かすると思います。

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE