print デバッグから卒業したい人のための Maya+PyCharm


これは、[MayaPythonアドベントカレンダー 2017](https://qiita.com/advent-calendar/2017/maya-python) の16日目記事です。
昨年のアドベントカレンダーに引き続き out-of-the-box 型エディタの PyCharm で、
Mayaスクリプト開発を便利でストレスフリーに行う方法を紹介します。

## 🗒 はじめに
今までに、SublimeText や Atom, VsCode など色々なテキストエディタを試してきました。
MEL を書くだけなら上記エディタで事足りていたのですが、Python を使っていると不満が貯まります。(Maya のテキストエディタつらいです)

PythonのIDEはデータサイエンスで使われるものを含めると結構な数があるのですが、
その中でもPyCharm というエディタはWEB開発の Python 使いにも好評で、
これを使ってMayaのツール開発を楽にできないか模索し始めました。

実際には、[@sportyさん](https://qiita.com/sporty/items/c012905ccd51cae75dfe) が紹介されていた手法に、私なりのアレンジを加えてまとめ直した形になります。
情報共有ありがとうございました。

...

この設定を行うとMayaのスクリプティング作業で、

1. コピペの繰り返し作業から解放される
2. オートコンプリートが効くようになる
3. Break Point で止まるので、print debug から卒業できる

ようになります。いいことづくめですね。



## 🎼 操作手順
初回設定項目が多いですが、一度設定してしまえば使いまわせます。

1. PyCharm Plugin の MayaCharm を導入
2. Python Interpreter を mayapy に変更
3. Maya Script エディター上で実行
4. PyCharm から PythonRemoteDebug 起動
5. PyCharm から MayaCharm Remote Script 起動

Jetbrains のIDEは、設定が各所にあるので慣れるまで大変です。

## 💻 実際の手順
#### 1. PyCharm Plugin の MayaCharm を導入
![2017-11-28_17h10_48.png](https://qiita-image-store.s3.amazonaws.com/0/48607/624b8fd7-5b33-ce40-2a91-2bb6299a57e2.png)

* *Settings > Plugins > Browse repositories* から、**MayaCharm** を install して 再起動

* *Settings > OtherSettings > MayaCharm* のHostName と Port Number を設定
これらは後の設定で使うので、メモしておきます。

#### 2. Python Interpreter を mayapy に変更

![2017-11-28_17h12_24.png](https://qiita-image-store.s3.amazonaws.com/0/48607/ce97371a-68ba-6fa8-8906-709bd316ca2e.png)


*Settings > Project > ProjectInterpreter* の ドロップダウンに

```bash
C:/Program Files/Autodesk/Maya2017/bin/mayapy.exe
```

を追加します。mayapy の環境は、適宜読み替えて下さい。



#### 3. Maya Script エディター上で実行
Maya Script Editor の Pythonタブに貼り付けて実行します。

私は [toolbox](https://www.jetbrains.com/toolbox/) を通して、Pycharmを使っているので、
*pycharm-debug.egg* と *pydevd* までのパスが少し異なっています。

```python
# encoding: utf-8
from __future__ import print_function

import sys
import os 
import time

import maya.cmds as cmds
import maya.utils

PORT = 10000
USER = "C:/Users/{USER_NAME}/AppData/Local/JetBrains/Toolbox/apps/PyCharm-P/ch-0"
PTH = [p for p in os.listdir(USER) if os.path.isdir("{}/{}".format(USER, p))]
EGG = "{}/{}/debug-eggs/pycharm-debug.egg".format(USER, PTH[0 if len(PTH) == 1 else -1])
PDV = "{}/{}/helpers/pydev".format(USER, PTH[0 if len(PTH) == 1 else -1])


def main():
    for lib in [EGG, PDV]:
        if lib not in sys.path:
            sys.path.insert(0, lib)

    import pydevd
    try:
        if not cmds.commandPort(':{}'.format(PORT), q=1):
            cmds.commandPort(n=':{}'.format(PORT))
        print(cmds.commandPort(':{}'.format(PORT), q=1))

        pydevd.stoptrace()
        pydevd.settrace(
            "localhost", port=PORT - 1, stdoutToServer=True, stderrToServer=True
        )
        print("trace start")

    except:
        pydevd.stoptrace()
        cmds.commandPort(n=':{}'.format(PORT), close=1)
        print ("trace stop", "maya port {}".format(cmds.commandPort(':{}'.format(PORT), q=1)))


if __name__ == '__main__':
    maya.utils.executeDeferred(main)
```

*userSetup.py* を使ってMaya起動時に待機状態にしたいのですが、まだうまく行っていません。


#### 4. Pycharm から Python Remote Debug 起動

![2017-11-28_17h13_30.png](https://qiita-image-store.s3.amazonaws.com/0/48607/7dbb5cb9-5694-bd5d-756b-74ecc5272381.png)

*Edit Configuration > Python Remote Debug* より

先程メモしておいた、Local host name と Port 番号を入力して作成。
次回以降は、Debugボタンを押すだけです。
待機状態になるので、F9 でステップを進めます。


#### 5. Pycharm から Mayacharm Remote Script 実行
![2017-11-28_17h14_16.jpg](https://qiita-image-store.s3.amazonaws.com/0/48607/5db2359c-9493-2d81-5464-9cbca22fe8ab.jpeg)

*Edit Configuration > Mayacharm Debugger* より

1. Attach Debugger and execute file を選択
2. スクリプトファイルのパスを指定
3. Host Name と Port Number の設定


#### 実行
![2017-11-28_17h21_35.png](https://qiita-image-store.s3.amazonaws.com/0/48607/26bf80b3-4f3d-0555-cae4-4c805107fd31.png)


PyCharm上のブレイクポイントで止まりました。お疲れ様でした。
次回以降、手順の3~5を繰り返します。

Maya command でも Pyside でもブレイクポイントが効いて、その変数の中身も確認できるので、
手の込んだGUIとコマンドが組み込まれたツール開発でも十分に対応できます。


##### 補足 : Bynary Skeltonsによるオートコンプリート
![2017-11-28_17h15_15.png](https://qiita-image-store.s3.amazonaws.com/0/48607/07d55dee-896d-45d3-f880-0315fcefdb96.png)

Python Interpreter を変更した時点で、Binary Skeltons という pyd ファイルからキャッシュファイルを書き出す処理が走って待たされます。それ以後 PySide2 及び OpenMaya 等のオートコンプリートが効きます。

*Projectタブ > Show in Explorer* で実際のファイルも見えます。(詳細な引数、ドキュメントはありませんが...)

ちなみにこれは devkit をインストールした
```C:/Program Files/Autodesk/Maya2017/devkit/other/pymel/extras/completion/py``` に
自分でパスを通すことと同じです。一長一短なのでどちらでも良いと思います。


## 📗 まとめ
Maya 使いにはプログラマー寄りのテクニカルとアーティスト寄りのテクニカルがいると感じます。
もしプログラマー寄りでプロダクション向けのツール開発することが多い方に
ここで書いた以外にも、Python周辺のサポートが手厚い Pycharm はぜひオススメです。


### 参考リンク
https://qiita.com/sporty/items/c012905ccd51cae75dfe
http://flame-blaze.net/archives/5467
http://www.robg3d.com/2013/01/maya-and-pycharm/