Houdiniの文字モジしたUIたち

Houdini Advent Calendarを眺めてみたところ12/8が空いておりましたので小ネタにて参戦させていただきます。
Advent Calendarというものには初参加で緊張します。。。

# これはなに？

Textport、Python Shell、Python Source Editor、Python Panel Editorという
Houdini内の文字モジしたUIたちについて概観してみたいと思います。

メニューでいうとこのへん
<img width="474" src="https://qiita-image-store.s3.amazonaws.com/0/102581/aec7b24d-300e-d493-8010-104db0922e25.png">

# Textport

メニューだとHscript Textportですが、Houdini メインウィンドウ内では単に「Textport」です。
ドキュメントでも「Textport window」と呼ばれてます。

デスクトップを「Technical」（←個人的にお気に入り）にしていると、**Python Shellの隣**に並んでます。
![textport.png](https://qiita-image-store.s3.amazonaws.com/0/102581/0572b8fd-8b85-2530-dc3c-efbc6a7cd00a.png)


## なにをするもの？

**Hscript**でHoudiniとやりとりするのに使います。
オーソドックスなところで、`help`を唱えてみます。
<img width="179" src="https://qiita-image-store.s3.amazonaws.com/0/102581/dda57620-123b-ba3e-11f3-0bb592a65cbc.png">

<img width="583" src="https://qiita-image-store.s3.amazonaws.com/0/102581/9b8817f1-9ab0-fc29-f0e2-351d00cd6906.png">

びゅわーっとHscriptに存在するコマンドが並びます。
H15におけるHscriptのドキュメントはこちら
https://www.sidefx.com/docs/houdini15.0/commands/_index

また、`exhelp`というのを唱えますと、エクスプレッションがぶわーっと確認できます。
<img width="168" src="https://qiita-image-store.s3.amazonaws.com/0/102581/63674b96-b100-b028-ee0e-eb56be1a8588.png">

<img width="603" src="https://qiita-image-store.s3.amazonaws.com/0/102581/9baad357-adf8-5e1e-ba60-9738157a60e3.png">

なおH15におけるExpressionのドキュメントはこちら
https://www.sidefx.com/docs/houdini15.0/expressions/_index

Textportでは、
一度に表示できるのは8KB分まで、コマンドラインに渡せる引数は最大1024までとのこと。

## ヘルプ

日本語では、H12.1のものがこちら
http://sidefx.jp/doc/ref/windows/textport.html

H15はこちら
https://www.sidefx.com/docs/houdini15.0/ref/windows/textport

## 備考

Hscript自体は、ドキュメントを眺めていると
割と「旧来もの」扱いされているのをちらほら見かけます。
これから学習するならPythonの方をよろしく的なことのようです。

# Python Shell

HscriptではなくPythonでHoudiniとやりとりするためのUIです。
ここで動いているPythonは、WindowsではHoudiniと一緒にインストールされたもの、
LinuxとmacOSではシステムにインストールされているものが使われます。

`dir`してみると
<img width="598" src="https://qiita-image-store.s3.amazonaws.com/0/102581/aae4911b-2045-11b8-d69f-0d4473997e51.png">

最初からhouモジュールが読み込まれているのがわかります。

hou.py自体は5万行近い1.5MBほどのものですが、SWIG出力されたもので、
本体は _hou.so になります。こちらは7.1MBほどと大きいです。
<img width="700" src="https://qiita-image-store.s3.amazonaws.com/0/102581/f89291d4-ba77-3898-6a0c-9d71041b73c3.png">

os.environを見てみると、Hから始まる環境変数が大量に追加されていることがわかります。
これらは平時Houdiniを使っている時に登場する「$HFS」などのことですね。

```python
import os
os.environ.keys()
['HOUDINI_USER_PREF_DIR', 'HFS', 'HT', 'HH', 'LOGNAME', 'USER', 'HOME', 'HB', 'PATH', 'DISPLAY', 'HD', 'HIP', '__CF_USER_TEXT_ENCODING', 'SHELL', 'SECURITYSESSIONID', 'HOUDINI_OS', 'XPC_FLAGS', 'DBUS_LAUNCHD_SESSION_BUS_SOCKET', 'JOB', 'HOUDINI_VERSION', 'XPC_SERVICE_NAME', 'HSITE', 'H', 'SSH_AUTH_SOCK', 'CLASSPATH', 'ACTIVETAKE', 'Apple_PubSub_Socket_Render', 'HOUDINI_TEMP_DIR', 'TMPDIR', 'HTB', 'POSE', 'HHC', 'HIPNAME', 'HOUDINI_DESKTOP_DIR']
```
<img width="1055" src="https://qiita-image-store.s3.amazonaws.com/0/102581/e22f9f58-a4d7-d5a9-037e-e66564f27884.png">

※比較としてHoudini Python Shellの外でのos.environの例

```python
import os
os.environ.keys()
['TERM_PROGRAM_VERSION', 'LOGNAME', 'USER', 'PATH', 'HOME', 'DISPLAY', 'TERM_PROGRAM', 'LANG', 'TERM', 'Apple_PubSub_Socket_Render', 'SHLVL', 'SECURITYSESSIONID', 'XPC_FLAGS', 'DBUS_LAUNCHD_SESSION_BUS_SOCKET', '_', 'TERM_SESSION_ID', 'XPC_SERVICE_NAME', 'PYTHONPATH', 'SSH_AUTH_SOCK', 'SHELL', 'TMPDIR', '__CF_USER_TEXT_ENCODING', 'PWD']
```
<img width="669" src="https://qiita-image-store.s3.amazonaws.com/0/102581/00619d98-0e01-e009-d3bc-5937d62e5850.png">

あとHoudiniのPython環境ではnumpyが使えます。PySideと。
**hutil**とかhou以外のSideFx謹製モジュールもあります。

<img width="754" src="https://qiita-image-store.s3.amazonaws.com/0/102581/1cb966f3-bf66-c8e8-4cbf-e55658764abf.png">

ていうかhou.pyと同じ並びに **〜util** 系モジュールめちゃいっぱい置かれてます。
UI云々の話からは逸脱しますが。

## ヘルプ

H15ドキュメントの中には個別にヘルプがない気がします。
もっともそれっぽいのはこちら
**Accessing hou from a Regular Python Shell**
http://www.sidefx.com/docs/houdini15.0/hom/commandline

そしてPython Scriptingについてはこちら
http://www.sidefx.com/docs/houdini15.0/hom/

houモジュールについてはこちら
http://www.sidefx.com/docs/houdini15.0/hom/hou/_index

# Python Source Editor

**hou.session**モジュールを編集するためのエディタです。
hou.sessionはカスタムなクラス、関数、変数を定義するのに使われ、ここに書いた内容は .hip ファイルに保存されます。要はシーン内埋め込みスクリプトに関するエディタ。

<img width="621" src="https://qiita-image-store.s3.amazonaws.com/0/102581/8fc1dcdb-0d1a-f5b2-124f-60b95c305eaa.png">

hou.sessionについてはこちら
http://www.sidefx.com/docs/houdini15.0/hom/hou/session
http://sidefx.jp/doc/hom/session.html

定義したものは次のようにして呼び出します。

```python
# Python Source Editor内でこのように定義
import os

def envkey_print():
    print(os.environ.keys())
```

<img width="278" src="https://qiita-image-store.s3.amazonaws.com/0/102581/6eec5e9d-4681-79d8-5725-84e96c62950d.png">


↓呼び出すときは、このように `hou.session.〜` します。

```python
hou.session.envkey_print()
```

<img width="230" src="https://qiita-image-store.s3.amazonaws.com/0/102581/91b68a07-dead-3fca-e1ca-289cf7f68b7c.png">

<img width="516" src="https://qiita-image-store.s3.amazonaws.com/0/102581/56bae2b1-31fb-05f1-0b62-a689b211002e.png">

また、Python Source Editorでなにを書いてるかは、次のように取得できます。

```python
hou.sessionModuleSource()
'import os\n\ndef envkey_print():\n    print(os.environ.keys())\n\n'
```

<img width="471" src="https://qiita-image-store.s3.amazonaws.com/0/102581/dd039acb-0167-b6a0-6da9-807dcd4a9847.png">

文字列で返ってきます。

## ヘルプ

Python Source Editorも独立したドキュメントは見当たらない気がします
（見落としだったらすいません…）


# Python Panel Editor

Python Source Editorと名前の印象が近くて紛らわしいですが、
こちらは、PyQtやPySideを使ってUIを作るためのエディタです。

<img width="724" src="https://qiita-image-store.s3.amazonaws.com/0/102581/f6915320-a023-46ec-55e3-5b4cec33de85.png">

作ったUIは、Pane Tabのプルダウンから指定して呼び出せます。

<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/102581/e59dfed2-08b5-7a7f-40e9-7d0cf275c918.png">

デフォルトで**「Pose Library」「Character Picker」**の2種が用意されています。

<img width="1731" alt="pythonPanes.png" src="https://qiita-image-store.s3.amazonaws.com/0/102581/71bb081a-ea4f-d755-4d18-7567edf5bdf4.png">

保存される時のファイル拡張子は `.pypanel` です。

## ヘルプ

http://www.sidefx.com/docs/houdini15.0/ref/windows/pythonpaneleditor
先ほどの2種のほか、ここでは6種のサンプルもロードできます。

# ほか

houdini本体と同じbin以下に、`hython`や`hscript`というショートカットが置かれており、
houdiniメインウィンドウを開かずにコマンドラインベースであれこれできます。
上記TextportやPython Shellの独立したものです。
http://www.sidefx.com/docs/houdini15.0/render/batch#hython-and-hbatch

ついでにこの辺りも多少関係ありそうということで付記しておきます
**Stand-alone utilities**
http://www.sidefx.com/docs/houdini15.0/ref/utils/_index

# まとめ

Houdini色々できて楽しいですね。
とりあえず「python2.7libs」以下をしっかり眺めるだけで何かと勉強になりそうです。

次は takavfx さんの「Bento Toolsetに関して紹介してみる。」です！