MayaとPyCharmと、時々、VIM（前編）

タイトル古いなぁ

この記事は[Maya-Pythonアドベントカレンダー](http://qiita.com/advent-calendar/2016/maya-python)12月3日の記事です。
（何日目、と書くほどに埋まってないのが悲しい）

今日と明日はMayaとPyCharmの連携について書いていこうと思います。
普段私はVIM命なんですが、思うところあってPyCharmのエディット機能についても再確認していこうと思います。


# 前提条件など

[PyCharm](https://www.jetbrains.com/pycharm/)とは、JetBrains開発のPythonの統合編集環境です。
無料のCommunity版と有料のProfessional版があって、起動中のMaya上でデバッグするリモートデバッグ機能はProfessional版のみの機能となってます。

プログラム開発全般に言えることですが、デバッガーが無い言語はちょっと開発しづらいです。
デバッガーが無いとprintデバッグに頼らざるを得ないし、そこからロガーの管理もおろそかになり、人のコード読みたくなくなるし、全体の設計も妥協の嵐になり・・・と、悪いイメージしか湧きません。（ちょっとこじつけ）

Mayaのプラグイン開発も当然同じことが言えて、MELでの開発は何がつらいってデバッガーが無いことでした。

時はPython時代に移りまして、Eclipse&PyDevとかptvsとかいろいろ試しましたが、

* セットアップめんどくさすぎる
* Eclipse重い・・・

というモヤモヤがありつつ、PyCharmを試したら

* 新規スクリプトの実行が超楽なんですけど
* テストコードの結果見やすいんですけど
* virtualenvのサポートとか神なんですけど

と、次から次へと現れる心打たれる素晴らしい機能の数々から、PyCharmに落ち着きました。

PyCharm 2016.3 Professional
Maya 2016 Extension2

# まずはものすごく便利なデバッガーから

話の順番としては非常によろしくないのですが、いきなり有料のProfessional版にのみ存在するリモートデバッグ機能の話題です。

Mayaをリモートデバッグ。非常に便利です。

リモートデバッグの仕組みの概要は以下の通り。

1. PyCharmでデバッグサーバーを起動
1. 起動中のプロセス（自分が作ってるスクリプト）内から、デバッグサーバーに接続
+ スクリプトにブレイクポイントを設定した状態でMayaでスクリプト実行
+ ステップ実行して処理の流れを確認したり、変数の値を確認したりし放題


ではまずはPyCharmでデバッグ設定を作成して、デバッグサーバーを起動しましょう。

Run/Edit Configurations... を開き
![2016-12-03_20h26_37.png](https://qiita-image-store.s3.amazonaws.com/0/13183/3623aa8a-fa0c-8906-e651-164937c6d92b.png)

「+」を押して「Python Remote Debug」を選択します。
![2016-12-03_20h27_33.png](https://qiita-image-store.s3.amazonaws.com/0/13183/850fb5c1-32dd-405c-22fd-30ba2178b4bb.png)

名前はmayaとかにしつつ、ポートを9999など空いてる番号に設定してOKボタンで設定完了です。
![2016-12-03_20h28_40.png](https://qiita-image-store.s3.amazonaws.com/0/13183/fbc8d36f-a7b1-201b-964d-501aa7adbc59.png)

PyCharm画面右上に起動ボタンなどは集まってます（作成直後は選択された状態になっています）。デバッグボタンを押しましょう
![2016-12-03_20h28_59.png](https://qiita-image-store.s3.amazonaws.com/0/13183/1b568036-99d4-6786-346b-d642f4795d6f.png)

PyCharmのConsoleパネルが現れ、接続待ちのメッセージが表示されているはずです。
![2016-12-03_21h06_29.png](https://qiita-image-store.s3.amazonaws.com/0/13183/4a3aba3e-737d-41fc-f919-6c593e149684.png)



Mayaのスクリプトエディターでデバッグサーバーに接続します。

```py:ScriptEditor
EGG_FILENAME = r"C:\Program Files (x86)\JetBrains\PyCharm 2016.3\debug-eggs\pycharm-debug.egg"
HOST = 'localhost'
PORT = 9999

# PyCharm付属のeggファイルにパスを通す
import sys
if EGG_FILENAME not in sys.path:
    sys.path.append(EGG_FILENAME)

# 起動
import pydevd
pydevd.settrace(HOST, port=PORT, stdoutToServer=True, stderrToServer=True)
```

ちなみに止めるときは

```py:ScriptEditor
import pydevd
pydevd.stoptrace()
```

よく使うので、こんな感じでPythonタブを作っておくと便利だと思います。ポート番号変える可能性もありますからね。

![2016-12-03_20h22_01.png](https://qiita-image-store.s3.amazonaws.com/0/13183/59e0302b-c7d7-234c-3b2e-6d664e513c26.png)

settraceすると起動しているデバッグサーバーに接続されるので、Mayaの処理が停止しているはずです。Mayaが無反応になるので初めての時は焦ります。
落ち着いてPyCharmのConsoleを見てみましょう。おお、繋がってる！
![2016-12-03_20h30_30.png](https://qiita-image-store.s3.amazonaws.com/0/13183/6fce1dae-826a-6813-916a-8d89be02e7d9.png)


F9を押してResumeしましょう。これでMayaに処理が返ってきます。

ではお楽しみはここからです。
ソースを開き、ブレイクポイントを設定します。
![2016-12-03_20h35_29.png](https://qiita-image-store.s3.amazonaws.com/0/13183/1fa48a07-0934-5158-2aea-57e2958f0fe7.png)

Mayaでスクリプトを実行！
![2016-12-03_21h18_16.png](https://qiita-image-store.s3.amazonaws.com/0/13183/648463f1-8330-fc3e-062a-ee24333b6b03.png)


止まった！！
![2016-12-03_21h18_35.png](https://qiita-image-store.s3.amazonaws.com/0/13183/536c4955-df0e-af6d-0935-8d7469548c97.png)

ブレイクポイントで停止すると、Debuggerパネルにフォーカスが移ります。変数が確認できたり、Step Over、Step Intoなどのボタンで1行ずつ進めたりできます。
![2016-12-03_21h18_52.png](https://qiita-image-store.s3.amazonaws.com/0/13183/82cdca85-1f18-eea4-8fe6-782b52e02e09.png)


これでprintデバッグ要らずになりますね。

# さらに...

ブレイクポイントで停止した状態で、Consoleパネルに戻り、「Show Python Prompt」を有効にすると・・・

![2016-12-03_21h21_41.png](https://qiita-image-store.s3.amazonaws.com/0/13183/dffb5286-b58e-f217-70e7-d3cbb6115c54.png)

Mayaに接続した状態でコンソールを扱えるので、超高機能スクリプトエディタとして使えます。こりゃスゴイ

![2016-12-03_21h23_12.png](https://qiita-image-store.s3.amazonaws.com/0/13183/76c3f429-dceb-8c99-1a2a-c3b5f122d5f1.png)



# まとめ

非常にシンプルな仕組みなので、MayaだけじゃなくてMotionBuilderでも便利に使えます。Maxはどうだったかな？・・・誰か試してみてください。

デバッガを使いましょう。


長くなったのでエディット機能の話題は後編に続きます。