【maya python9限目】スクリプトを保存・呼び出して使おう!

mayapy09 python入門

こんにちは!ビーバー@ゲーム業界歴約20年 です。maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

maya pythonの学習情報って少ないですよね。自分が骨を折った経験をもとに、maya python基礎を最速で習得できる10回のチュートリアルを作ってみたので参考にしていただければ幸いです。

今回は、9回目。pythonスクリプトを保存し、importで呼び出す方法を学びます。「モジュール」や「関数」を扱えるようになると、誰かのツールを利用したり、既存のものに機能を追加していったりすることができますよ!

このチュートリアルでわかること
  • pythonスクリプトを保存する方法
  • 保存したスクリプトをimportで呼び出す方法
  • 「モジュール」「関数」とは何か

>> はじめての方向けMayaPythonの勉強方法はこちら!

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。

スクリプトを保存する方法

スクリプトの保存は2ステップです。

  1. スクリプトの「関数化」を行う
  2. .pyファイルとして保存

今回保存するものは、
8限目で作成した、「コーンのらせん状配置」のスクリプトを使ってみます。

mayapy09_02
スクリプト実行後の様子
cone = "pCone1"
for i in range(15):
    cmds.setAttr("locator1.ry",i*45)
    cone2 = cmds.duplicate(cone)
    cmds.parent(cone2,w=True)
    cone2 = cone2[0]
    cmds.setAttr(cone2+".ty",i*1)
    
meshes = cmds.ls(type="mesh")
conetranses = cmds.listRelatives(meshes,allParents=True)

for trans in conetranses:
    aimcon = cmds.aimConstraint("locator2",trans,offset=(0,0,-90))
    cmds.delete(aimcon)

スクリプトの「関数化」を行う

最初に、スクリプトを関数化しましょう。
関数化とは、複数行にわたって作成した処理を、1つの処理のまとまりとして定義することです。

例えば8限目の「コーンをらせん状に配置するスクリプト」は、
12行で処理を行っていましたが、
それを「関数化」すると、ひとつのコマンドとして呼び出すことができます。

関数は、下記の文章で定義することができます。

def ○○関数名○○():
␣␣␣␣関数化したい処理

コロン以降の処理が、関数になります。

ピヨちゃん
ピヨちゃん

関数名は自由に決めていいんだね。

ハムちゃん
ハムちゃん

そうだよ、「コーンをらせん状に配置するスクリプト」の関数名を
spiralConeとして、関数を定義してみるね。

def spiralCone():
    cone = "pCone1"
    for i in range(15):
        cmds.setAttr("locator1.ry",i*45)
        cone2 = cmds.duplicate(cone)
        cmds.parent(cone2,w=True)
        cone2 = cone2[0]
        cmds.setAttr(cone2+".ty",i*1)   
    meshes = cmds.ls(type="mesh")
    conetranses = cmds.listRelatives(meshes,allParents=True)
    for trans in conetranses:
        aimcon = cmds.aimConstraint("locator2",trans,offset=(0,0,-90))
        cmds.delete(aimcon)
ハムちゃん
ハムちゃん

関数を定義すると、spiralCone()の1行だけでこの処理ができるんだよ!

.pyファイルを保存する

定義した spiralCone() 関数を、.py(python形式)で保存しましょう。
保存された.pyファイルのことを、モジュールと言います。

前処理として、スクリプトの冒頭に「from maya import cmds」を追記します。

from maya import cmds

def spiralCone():
    cone = "pCone1"
    for i in range(15):
        cmds.setAttr("locator1.ry",i*45)
        cone2 = cmds.duplicate(cone)
        cmds.parent(cone2,w=True)
        cone2 = cone2[0]
        cmds.setAttr(cone2+".ty",i*1)   
    meshes = cmds.ls(type="mesh")
    conetranses = cmds.listRelatives(meshes,allParents=True)
    for trans in conetranses:
        aimcon = cmds.aimConstraint("locator2",trans,offset=(0,0,-90))
        cmds.delete(aimcon)

スクリプトエディタの
ファイル>スクリプトの保存… から

マイドキュメント>maya>scripts 以下に
.py形式で保存。名前はmayapy08.pyとします。

モジュールの保存ができました。

.py file

スクリプトをimportで呼び出す方法

次に、保存したスクリプトを別シーンから呼び出す方法を見ていきましょう。
手順は2ステップです。

  1. mayaにモジュールをインポートする
  2. モジュールの中の関数を実行する

スクリプトエディタに以下のように書きます。

import mayapy08
mayapy08.spiralCone()
ハムちゃん
ハムちゃん

1行ずつ解説していくね!

モジュールをインポートする

import mayapy08

モジュールは、pythonコマンドの import で呼び出すことができます。

import ○○○○(モジュール名)

モジュール名の後に、拡張子.pyは必要ありません。
import は、モジュールを読み込むだけで、中身の実行は行わないので注意しましょう。

モジュールの中の関数を実行する

mayapy08.spiralCone()

呼び出したモジュールの中の関数を実行するには、
「モジュール名.関数名()」 と書きます。

モジュール名.関数名()

ピヨちゃん
ピヨちゃん

mayapy08.py の中の spiralCone関数 を呼び出すから、
mayapy08.spiralCone() なんだね!

ハムちゃん
ハムちゃん

そう!簡単でしょ?

スクリプトの保存と実行はこれだけです!

それでは、保存したスクリプトを呼び出して実行してみましょう。
スクリプトを実行するシーンはこちら↓

mayapy09_01

mayapy08.py を呼び出して、spiralCone()関数を実行します。

import mayapy08
mayapy08.spiralCone()
mayapy09_02
スクリプトの実行結果

期待通りの結果がえられました!

まとめ

今回学習した内容のポイントをまとめます。

学習のポイント

スクリプトの保存方法
  処理の関数化を行う
  .py形式で保存する

スクリプトの読み込み方法
  import モジュール名 で読み込む
  モジュール名.関数名() で関数を実行する

ピヨちゃん
ピヨちゃん

4限目で作った、階層内の骨だけ選択するツール
6限目の、アトリビュートのロックツール
なんかをモジュールにしてみようかな!

ハムちゃん
ハムちゃん

いいねえ!よく使う操作を保存しておくと
作業を効率化できそうだね。

次回は、GUIの作成と、ボタンからスクリプトを実行する方法を解説します。
お楽しみに!

maya python基礎

😊 MayaでPythonを学びたい方へ

「ツールを作ってみたいけど、何から始めたらいいんだろう?」そんな方のために、超初心者向けのチュートリアル全10回をまとめました👇
https://kimstation.com/maya-python-summary/

こんなことが、最短で身につきます👇

  • Pythonの知識ゼロから始められる
  • シンプルなUIつきのツールを自分で書けるようになる
  • Mayaコマンドの基礎や、ツールづくりの基本がわかる

「ツールづくりに挑戦したい」という方に向けて、必要最低限の知識だけをしぼってやさしくまとめてます😊ツールを自分で作れるようになると、すごく楽しいですよ~!

オススメの本。pythonが楽しく学べます☆

復習はこちら↓

コメント

タイトルとURLをコピーしました