関数の作り方

関数とは

複数の関数などを何度も実行するような場合に、それらの関数などに名前をつけておいて その名前で実行できるようにしておくと便利です。
そのために Python では、ひとまとまりの関数・計算式などを独自の関数として定義・実行できます。
関数にしておくことによって、 関数に変更点がなければ、 Python スクリプトを読み直さなくても、 何回でも同じスクリプトを関数名で実行できます。
関数は他の関数から呼んで使うこともできます。
関数を作るということは Maya で実行できる自分用の関数を作るということだと覚えておいてください。

関数の形式

関数の書式は以下のようになっています。
[ ] で囲まれた部分は省略可能です。


def 関数名([引数...]):
    [Python 文]

関数の書式における各要素の説明は以下のとおりです。
わからない用語は、とりあえず無視して後から必要なときに見直してください。

def
関数であることの宣言です。
関数を定義するときに必ず必要です。
関数が返り値を返す場合でも、返り値の型は必要ありません。
返り値を返すには return 文を使用します。
行末に : が必ず必要です。
関数名
関数の名前は英数字と _ (アンダースコア)の組合せで作られます。
ただし、名前の先頭文字は英字または _ でなければなりません。
引数
関数に渡す引数(パラメータ)がある場合は、変数名を並べて記述します。
2 つ以上の引数がある場合は , (カンマ)で区切って並べます。
引数の与え方は、 自由が利く分だけ MEL に比べて複雑になっています。
Python 文
Python の関数・計算式や制御構造などを記述します。
必ずインデントが必要です。
同じ数のスペース・タブを行頭に挿入します。
途中に空行があってもかまいません。

Tips

関数の名前は他の関数名と同じものでなければ、どんなものでも好きな名前でかまいませんが、 関数の内容をわかりやすく表現するためにも、 少し長めの名前をつけることを推奨します。

関数の名前が、 すでに存在しているコマンド・プロシージャの名前と同じかどうかは type 関数で調べることができます。

type(pymel.core.sphere)
# 結果: <type 'builtin_function_or_method'> #
type(makeSphere1)
# 結果: <type 'function'> #
type(makeSphere1000)
# エラー: name 'makeSphere1000' is not defined
# Traceback (most recent call last):
# File "", line 1, in ?
# NameError: name 'makeSphere1000' is not defined #

上の例のように # 結果: <type 'builtin_function_or_method'> # # 結果: <type 'function'> # などの表示があれば、その名前はすでに使われているので違う名前を考える必要があります。
# エラー: name 'makeSphere1000' is not defined などのようにエラーになる場合は、その名前を使うことができます。

関数の作り方と実行例

最初に引数の無い簡単な関数を作ってみましょう。

  1. エディタ(gvim) を起動して、以下のようにファイルに記述します。
    import pymel.core
    
    def makeSphere1():
        pymel.core.sphere()
        pymel.core.scale([1, 3, 1])
    
  2. makeSphere1.py という名前で Python フォルダーに保存します。
    ここで関数の名前とファイル名の前半が同じ(makeSphere1)であることに注意しておいてください。
  3. ファイルを保存してください。
  4. スクリプト エディタ から ファイル → スクリプトのロード によって makeSphere1.py を読み込み、テンキーの Enter キーなどで実行します。
    この段階では makeSphere1() が実行されないことに注意してください。
  5. スクリプト エディタ のインプットウインドウに makeSphere1() と打ち込んで実行します。
  6. スケールされた球が作成されました。
  7. もしエラーがでた時は makeSphere1.py をエディタによって修正してから保存し、 再実行してください。
    この場合は、もう一度 スクリプト エディタ の ファイル → スクリプトのロード によって読み込み、テンキーの Enter キーなどで実行しなおさないと、 書き直したものが実行されません。

Maya における関数の実行方法

上の実行例でわかったように Python の関数は スクリプト エディタ で読み込んだだけでは実行されません。
それがなぜかを実行例を参考に説明してみましょう。

  1. makeSphere1.py が スクリプト エディタ などから Maya に読み込まれます。
  2. Maya は makeSphere1 という名前の手続き(関数)を覚えておきます。
    この時点では Maya は makeSphere1 という関数名と中身のコマンドを覚えただけで関数自体は実行されません。
  3. スクリプト エディタ などに makeSphere1() と打ち込んで実行します。
  4. すると始めて makeSphere1 の中身の関数である pymel.core.sphere()pymel.core.scale([1, 3, 1]) が実際に実行されます。

Python スクリプトを実行する場合は、それが関数であるかどうかで、 実行方法が少し違うことを覚えてくおいてださい。

Tips

pymel.core モジュールに含まれる関数を実行する時は
pymel.core.sphere()
で実行できますが、import のところで
import pymel.core as pc
としておくと、
pc.sphere()
と実行することもできます。

Python スクリプト(関数)の自動読み込み

もし、普段よく使用する関数がある場合、 Maya を起動するたびにいちいち Python スクリプトを読み込んでいたのでは面倒です。
そのような場合には、 Pythonスクリプトをスクリプトパスと呼ばれる特定のフォルダー(ディレクトリ)にコピーなどして、 その Python スクリプトをインポートしておくとスクリプトエディタで読み込む必要がなくなります。
ただしMaya の使用中にスクリプトパス内の Python スクリプトの内容を書き換えた場合は、もう一度読み込み直す必要があります。

Python スクリプトの自動読み込みの方法は以下のとおりです。

  1. 自動読み込みしたい Python スクリプトが testPython.py というファイル名で、 以下のような関数が定義してあるとします。
    def display():
        print "this is test\n"
    
    定義する関数は、2 つ以上あってもかまいません。
  2. スクリプトパスに Python スクリプトをコピーします。
    スクリプトパスを調べるには pymel.core.internalVar() 関数を使用します。
    pymel.core.internalVar(usd=True)
    u'C:/Documents and Settings/abe/My Documents/maya/8.5/ja_JP/scripts/'
  3. スクリプトパスに userSetup.py という Python スクリプトを以下の内容で作成します。
    import testPython
    
  4. Maya を起動します。
  5. スクリプトエディタで以下のように実行します。
    testPython.display()

練習

まとめ

参考


Prev | Next
Home | Contents
Mail