SublimeText3 ＋ MayaPython な環境を構築する

こんにちは

[MayaPython Advent Calender 2017](https://qiita.com/advent-calendar/2017/maya-python)の1日目の記事です。

この記事ではSublimeText3とMayaを連携する方法を紹介します。

似たような記事は沢山ある（というか自分もそれらを見て環境構築した）のですが、実際に自分で構築してみたらいくつか躓いた点があったので、今回は自分なりの補足などを加えつつ備忘録も兼ねて紹介できればと思います。
稚拙な文章ですがお許しください。

## 前提のお話
[SublimeText3](https://www.sublimetext.com/)はWin/Mac/Linuxで使えるプログラミング向けの**有料**テキストエディタです。

今更SublimeText？と思う方もいるかと思いますが、実は最近[5年ぶりのメジャーアップデート](https://www.sublimetext.com/blog/articles/sublime-text-3-point-0)があり、SublimeText3は晴れてベータ版から正式版になりました。

SublimeText2と比べると以下のような更新があるようです。
(参考：[SublimeText2→SublimeText3の変更点一覧](https://www.sublimetext.com/2to3))

- 定義へ移動する機能の追加
- 新しい構文強調エンジン
- 新しいUI
- 拡張されたAPIの導入
- 高DPIモニターのサポート
- スペルチェック機能の強化
- 起動速度、ファイルを開く速度、スクロール速度の改善

時間制限なし・機能制限なしの太っ腹な無料評価版も用意されており、こちらは起動中に低頻度で購入を促すダイアログが表示されますが今のところ無料・無期限に思う存分評価することができます。

一つ注意点として、ネットではよく「無料で使える」とだけ紹介されていることが多いですが、あくまで評価版なので継続・商用利用する場合は購入しましょう。ライセンスについては[@MiyakoDev](https://qiita.com/MiyakoDev)さんの[Sublime Textライセンス関連文章の日本語訳（非公式）](https://qiita.com/MiyakoDev/items/9723cf825a4dde14c279)という記事が分かりやすかったです。

※お金を払うのが億劫な方には同じような機能を持ったテキストエディタとしてGitHub製の[Atom](https://atom.io/)やMicrosoft製の[Visual Studio Code](https://code.visualstudio.com/)があり、こちらは**完全無償**で提供されています。
どちらも高機能でプラグインも豊富、見た目もオシャレ、また開発スピードが早いことから今最も注目を集めている人気のテキストエディタだと思います。



※はじめに言っておくとリモートデバッグ機能は現状無い？というか自分は用意できませんでした。
デバッガーが無いとやだ！という方は昨年のカレンダーで@sportyさんが投稿された[MayaとPyCharmと、時々、VIM](https://qiita.com/sporty/items/c012905ccd51cae75dfe)という記事がおすすめです。PyCharmというPythonの統合編集環境とMayaとの連携について書かれており、前編・後編に分けて分かりやすく解説されています。

# 環境

- Windows10
- Maya2016 SP6
- SublimeText3　Build 3143

## SublimeText3のインストール
まずは[SublimeText3](https://www.sublimetext.com/)のインストールから。

SublimeText3を導入するときの定番として、以下のような流れがあります。

1. SublimeText3をインストール
2. PackageControlの導入
3. 日本語化

そして、その全てを[@I-201](https://qiita.com/I-201)さんの[WindowsでSublimeText3日本語化は意外と分かりづらい（mac版追記）](https://qiita.com/I-201/items/0869a288eb6e4ed5a274)という記事が説明してくれているので、こちらを参照して導入してください。

##Maya Developer Kit の導入
次にMaya Developer Kit(以降devkit)というMayaのプラグイン開発に必要なデータをダウンロードします。（この記事ではmaya.cmdsやpymelのオートコンプリートを行うために使います）
Maya2015までは標準で導入されていたのですが、Maya2016からはmental rayと同様に個別でインストールする必要があるようです。
今回はMaya2016SP6なので[こちら](https://github.com/autodesk-adn/Maya-devkit/releases/tag/2016)からダウンロードします。
Maya2016 Ext2の方は[Autodesk App Store](https://apps.autodesk.com/MAYA/en/Detail/Index?id=5595681162321676385&os=Win64&appLang=en)からダウンロードできるようです。
インストール方法は[こちら](http://help.autodesk.com/view/MAYAUL/2016/JPN/?guid=__files_Setting_up_your_build_env_Windows_env_32bit_and_64bit_htm)を参照してください。

## SublimeText3とMayaを連携するPackageのインストール
SublimeText3とMayaと連携するためのPackageをインストールします。
PackageControlで以下のPackageをインストールしてください。

- [MayaSublime](https://github.com/justinfx/MayaSublime)
    - SublimeTextからMayaにコマンドを送信できるようになる
- [Jedi](https://github.com/srusskih/SublimeJEDI)
    - maya.cmdsとpymelのオートコンプリートとか出来るようになる

インストール手順は以下のような感じです

1. SublimeText3上でShift+Ctrl+Pを押してコマンドパレットを表示
2. コマンドパレットの入力欄で`Package Control：Install Package`と入力して検索し、実行する
3. インストールしたいPackage名を入力して検索（今回はMayaSublimeとJedi）
4. 検索結果の中から目的のPackageを選択してエンターするとインストールが開始する

インストールが完了したらPackageの設定を行います。

## Packageの設定
###MayaSublime
まずはMayaSublimeの設定から。
以下の設定を行うとMayaの実行結果をcommandPortに送信されるようになる、端的に言えばSublimeText上で表示できるようになります。

`基本設定→PackageSetting→MayaSublime→Setting-User`から`MayaSublime.sublime-settings`を開き、以下のコードを記入して保存してください。

```json
{
    "receive_maya_output": true
}
```


###Jedi
次にJediの設定の説明です。ここで先ほど導入したdevkitを使用します。
この設定を行うとmaya.cmdsやpymelのオートコンプリートを表示できるようになります。

先ほどと同じく`基本設定→PackageSetting→Jedi→Setting-User`から`sublime_jedi.sublime-settings`を開き、以下のコードを記入して保存してください。

```json
{
    "python_package_paths": [
    	"C:/Program Files/Autodesk/Maya2016/devkit/other/pymel/extras/completion/py",
    ],
}
```
するとこんな感じになります。
![mayasublime_jedi.png](https://qiita-image-store.s3.amazonaws.com/0/212052/c819e273-e394-4adf-f8de-978deb736368.png)
これでひとまず準備完了です。というかもうほぼ終わったも同然です。
次はいよいよMayaと連携していきます。


## SublimeText3からMayaにコマンドを送信する
SublimeText3からMayaにコマンドを送信するには、まずはMayaのコマンドポートを開く必要があります。
MayaのスクリプトエディタでPythonのタブを開き、以下のコードをコピペして実行してください。

```py
# -*- coding: utf-8 -*-
import maya.cmds as cmds
cmds.commandPort(name=":7001", sourceType="mel", echoOutput=True)
cmds.commandPort(name=":7002", sourceType="python", echoOutput=True)
```

これでMayaがSublimeText3から送られてきたコマンドを受け付ける状態になりました。
※この操作はMayaを起動するたびに行う必要があるので、使用頻度の高い方は`userSetup.py`に記載しておくと便利です。
`userSetup.py`とは、プログラムを記載して以下のディレクトリに置いておくと、Mayaを起動するときに記載されているプログラムを一度だけ実行してくれます。
`C:\Users\<ユーザ名>\Documents\maya\<使用バージョン>\ja_JP\scripts`

あとはSublimeText3で適当にプログラムを書いて、Ctrl+Enter(SublimeText3からMayaに送信するショートカット)を押して、Mayaでコマンドが実行されれば終わりです。

しかし、なにやら`UnicodeEncodeError: 'ascii' codec can't encode characters~`みたいなエラーがでてませんか？
もし出ているようでしたら次の説明に進んでください。

##MayaのDefaultEncodeをUTF-8にする
ここが自分にとっては最大の躓きポイントでした。
少し調べたところ、`commandPort`の`echoOutput`というフラグをONにした途端に
`UnicodeEncodeError: 'ascii' codec can't encode characters~`というエラーが起きているようでした。
`echoOutput`フラグが無いとSublimeText3で処理結果を表示できません。

エラーの原因はなんとなくSublimeText3とMayaで扱うエンコードが違うことで発生したエラーなのかな？と思っていたのですが、Mayaのポートを開く際に使用した[commandPort](http://me.autodesk.jp/wam/maya/docs/Maya2009/CommandsPython/commandPort.html)というコマンドの説明文を読むと、
>マルチバイト コマンドをサポートし、トランスフォーム フォーマットとして utf-8 を使用します。utf8 コマンド文字列を受信し、Maya のネイディブ コーディングにデコードします。結果は、utf-8 にエンコードしてから返信されます。

とあるので、SublimeText3もutf-8を扱っているから問題ないじゃん！と混乱していました。
そんなとき、@kodai100さんの[AutodeskMAYAにpip, numpy をインストールする方法](https://qiita.com/kodai100/items/4ddd76145c11d8099c17)という記事の中に以下のような文章を見つけました。
>うまくダウンロードできなかった方は、以下のようなエラーが赤字で表示されていませんか？

>`UnicodeDecodeError: 'ascii' codec can't decode byte 0x8d in position 1: ordinal not in range(128)`
>これはいずれかのディレクトリまたは管理者名に日本語が含まれていることに起因するエラーのようです。
>これを防ぐために、mayapy の site-packages フォルダ内に設定のカスタマイズを行うスクリプトを配置します。
>マイコンピュータから C:/Program Files/Autodesk/Maya2016/Python/Lib/site-packages に移動し、
>"sitecustomize.py"というファイルを作成し、以下のスクリプトを記述してください。

>```pysitecustomize.py
>import sys
>sys.setdefaultencoding("cp932")
>```
>そして再び先程の get-pip.py を実行するとうまくインストールができるはずです。

もしかしてこれが原因では？と思い、マネして`C:/Program Files/Autodesk/Maya2016/Python/Lib/site-packages`以下にpysitecustomize.pyを作成し、コードの`cp932`の箇所を`utf-8`に書き換えて試してみたところ・・・

![mayasublime_fin.png](https://qiita-image-store.s3.amazonaws.com/0/212052/c8713d01-f2b7-8553-5f69-a970e562cadc.png)

なんとか立派なpolyCubeが生成され、SublimeText3の出力画面でMayaの実行結果(`print(sel)`の箇所)が表示されるようになりました。

おしまい。

##まとめ
さて、なんかSublimeText3の布教記事っぽくなりましたが、実は特にSublimeText3に拘りがあるわけではありません。

自分がSublimeText3を使っている理由は「Mayaの処理結果をエディタの出力画面にも表示したい」という拘りがあるだけで、 それがSublimeText3だと他のエディタよりも比較的簡単に実現できたからです。

AtomやVSCodeの出現でSublimeText3の影がとても薄くなったもののなんだかんだで良いテキストエディタだと思うのでこの記事で興味が沸いたなら是非触ってみてください。

以上、失礼しました。

2017/12/01:追記
ちゃっかりMELも送信できます