（きっとそっちじゃない）スワップとフリップについて

# これは何？

フリップとスワップについての話です

![zannen_01.png](https://qiita-image-store.s3.amazonaws.com/0/102581/46c91c35-bafc-8c3f-f964-fc8d3dcfd65a.png)

![zannen_02.png](https://qiita-image-store.s3.amazonaws.com/0/102581/5089c2cb-d39d-0443-9050-16bbd710869e.png)

吹き出しからはみ出しても整える気力がない！

# 承前

[Houdini Advent Calendar 2017](https://qiita.com/advent-calendar/2017/houdini) 13日目の記事でした。
遅れてすみませんでした。。。

取り上げるのは何の話かというと、これです
![swap_01.png](https://qiita-image-store.s3.amazonaws.com/0/102581/15b18c4d-2f09-6135-0d91-3e2fb2c41341.png)
![kore.png](https://qiita-image-store.s3.amazonaws.com/0/102581/bcf07561-998b-36bf-65b8-9179a8a53c1c.png)

この、UIの仕切り（**Split**）の真ん中にある
ペイン切り替えUIについてです。

上図の場合、真ん中の点々は「`左クリック`で **スワップ**、`alt + 左クリック`でオリエンテーションをフリップ」とあります。**オリエンテーションをフリップ** というのは、仕切りの向きを入れ替えるもので、左右に分割する仕切りであれば上下分割に、上下に分割する仕切りであれば左右分割に切り替わります。hou的には `.splitRotate`ですかね

その点々の上下には三角印があって、向いた方向にペインを広げる（向いた側のペインをミニマイズする）スイッチになっています

![swap_02.png](https://qiita-image-store.s3.amazonaws.com/0/102581/5115df2b-c86f-282c-13ce-0192baad9db6.png)　![swap_03.png](https://qiita-image-store.s3.amazonaws.com/0/102581/1e81a1f9-3b78-aeb5-07af-bae918fb72f5.png)

特にスワップ（ペインの入れ替え）はワンクリックでドラスティックに見た目がかわってしまうので
ちょっと**怖かった**のですが、
克服するためにその挙動を確認してみたい　というのが今回の趣旨です

# 「Build」デスクトップを観察

ペイン構成はデスクトップを切り替えるとごっそり入れ替えることができます。デフォルトは **「Build」** です。

![swap_reload.png](https://qiita-image-store.s3.amazonaws.com/0/102581/9f9ac681-45c7-f6bc-0b2a-a4dd5b587f0e.png)
（いろいろいじった後は、Reload Current Desktopで元に戻すことができます）

Buildデスクトップは大きく左右に分割されており、左にビューポートとツリービュー、右にパラメータとネットワークエディタがあります。

真ん中のSplitは「ビューポート/ツリービュー」と「パラメータ/ネットワーク」をスワップします。
同じ縦の仕切りでも、ツリービューのところにあるsplit（初期状態では閉じてある）はビューポートとツリービューをスワップします。

ツリービューと「ビューポート/パラメータ/ネットワーク」が入れ替わるということはなく、影響範囲が「ビューポート/ツリービュー」の範囲に収まります
つまりsplitにも**階層関係**、**親子関係**があると言えそうです

![split.png](https://qiita-image-store.s3.amazonaws.com/0/102581/d84c6883-0093-85ad-d54e-a98b307eacd3.png)
(▲)赤が第一次split、青が第二次split

## Pythonから確認してみる

デスクトップを取得してペインを取得して、splitSwapを試みます。

いま適用しているデスクトップは`hou.ui.curDesktop()`で取得できます。そのデスクトップで開かれているペインは `.panes()`メソッドで取得します。

```python
bd = hou.ui.curDesktop()

for p_obj in bd.panes():
    print(p_obj.currentTab())

<hou.TreeView panetab14>
<hou.SceneViewer panetab1>
<hou.Parm panetab5>
<hou.NetworkEditor panetab7>
```

ペインオブジェクトの`.splitSwap()`メソッドでペインをスワップできます。

```python
p1 = bd.panes()[0]

p1.splitSwap()
```

![swap_view_tree.png](https://qiita-image-store.s3.amazonaws.com/0/102581/800722ba-9d84-4e93-61c2-898626b4c2ef.png)

(▲)treeviewペインでスワップしてみたところ

## 上位のsplitをスワップしたい

ペインを取得してスワップしても、
同じ階層のペイン同士しかスワップできません。
どうしよう…

あるペインの上のsplitを取得するために、`.getSplitParent()`ていうのがあります。

```python
p1 = bd.panes()[0]

p1.getSplitParent()
<hou.Pane 3>
```

`Pane 3`というのが返ってきました。これは単純に`.panes()`したのでは取得できないペインです。
これを取得してスワップしてみると、

```python
p3 = p1.getSplitParent()

p3.splitSwap()
```

![parent_swap.png](https://qiita-image-store.s3.amazonaws.com/0/102581/b09f8102-27bb-24f0-f0ee-7e97d3599df0.png)

「ビューポート/ツリービュー」と「パラメータ/ネットワーク」をスワップできました。

### 思うところ

こういうとき発生してしまうのが、**splitが隣り合ってしまう** 現象です。
「ビューポート/ツリービュー」の側は、左隅にツリービューがミニマイズされている状態でした。
これをフリップしたことで、「デスクトップを左右に割っていたsplit」と「ビューポート/ツリービューを割っていたsplit」が隣り合ってしまいました。

![dual_split.png](https://qiita-image-store.s3.amazonaws.com/0/102581/3ee89838-9000-d93f-9c02-b68abc2df272.png)

どっち押せば元に戻るのか一瞬わからなくて
ﾋｪｰってなります。

左右を入れ替えるスワップは`alt + 左クリック`によるローテートがありますが、
ペインを閉じた状態での「閉じてるペイント開いてるペインのスワップ」は、`alt + 左クリック`がない、という違いがあります。
見た目も、よくみると上下の三角アイコンの向きが違います。

## `.desk`ファイルを見てみる

![desktopfile.png](https://qiita-image-store.s3.amazonaws.com/0/102581/f39e5048-8538-6488-8976-7ec481b1261f.png)

デスクトップを分割していっているのは、`root {～～` 以下のjsonみたいな構造のところです。
`split`の直後に書かれている数字が、分割する割合です。
階層構造があって、一回割ってそのあとさらに一回ずつ割っていることがよくわかります。

例えばBuildデスクトップの中央の仕切りは`0.677215`とのことですが、`.getSplitFraction()`メソッドで取得できます。

```python
p3 = p1.getSplitParent()

print( p3.getSplitFraction() )
```

![067715.png](https://qiita-image-store.s3.amazonaws.com/0/102581/f82b4716-b3ce-da20-f4ed-0feda9432c19.png)

ファイルに記載されているのよりも細かい数値で返ってきました（右下の小窓）

# Build以外のデスクトップも見てみる

他のデスクトップで、どのsplitがメインか、そうじゃないかを見ていきたいと思います。

## Animate

![desktop_anim.png](https://qiita-image-store.s3.amazonaws.com/0/102581/f5fbf5fa-ce6d-76e0-4f1b-a382f958b557.png)

左のチャンネルリストのところが最上位、次に「ビューポート/アニメーションエディタ」「パラメータ/ネットワークエディタ」の間が仕切られています

## Games

![desktop_game.png](https://qiita-image-store.s3.amazonaws.com/0/102581/d5ea8081-3a1e-3d5b-7138-248c2239fd92.png)

パラメータ/ネットワークの組み合わせが二つ用意されているのが特徴です。右側のそれは`out`になっています。
最初の分割はど真ん中と分かりやすいですが、二次分割が二本、三次分割が三本あります。

## Grooming

![desktop_grooming.png](https://qiita-image-store.s3.amazonaws.com/0/102581/51d662ae-3d8d-b368-98d3-647081bf0238.png)

ほぼBuildと同じですが、ツリービューがなく、ペインタブも少なくなっています。

## Image

![desctop_img.png](https://qiita-image-store.s3.amazonaws.com/0/102581/1de6776f-26ed-553e-81a0-ef773e58fabd.png)

こちらも分割はそんなに凝ってません
がGroomingよりさらに思い切った構成になりました。

## LookDev

![desktop_lookdev.png](https://qiita-image-store.s3.amazonaws.com/0/102581/b40f3957-1750-0005-bb3d-f4c9505da931.png)

非常に複雑に分割されています。シェルフセットはシンプルですが。
右側の「三段データツリー」と「それ以外」がまず仕切られていて、
次に、左側は「パラメータ/ネットワーク」と「それ以外」、右側は「下段」と「上段・中段」が仕切られています。
左側、ビューポートの枠が上下に割ってあるsplitが実に四次めの分割です

## Modeling

![desktop_modeling.png](https://qiita-image-store.s3.amazonaws.com/0/102581/153a66c9-1d5c-8705-f1e0-8f6beb5d0bf9.png)

分割的にはBuildと全く同じですね。左側のフリップ閉じてあるやつがツリービューというのも同じです。
ペインタブやシェルフセットが違います

## Output

![desktop_output.png](https://qiita-image-store.s3.amazonaws.com/0/102581/92aab60d-f15f-ee2a-3150-fee2f74db495.png)

Buildの、左側がレンダリング向けになったやつ、
みたいな構成です。シェルフセットも同じだし。

## Technical

![desktop_tech.png](https://qiita-image-store.s3.amazonaws.com/0/102581/8d1bb1b5-4f5c-27cb-3298-cb07df5a882d.png)

なんか分割もテクニカルです。
右に「パラメータ/ネットワーク」というのはいつも通りではあるんですが、上下が逆になってます。パラメータが下。なぜ。
そして左側にツリービュー、というのもBuildと一緒なんですが、デフォルトで開いた状態。

**一番凝っている**のがビューポートのところで、
Python Shellとで上下に仕切ったあと、
ビューポートの下側に「ジオメトリスプレッドシートとか」、上側に「レンダービュー」を仕舞っています。
この上下にしまわれたペインは、フリップすると窮屈になるので
スワップして、ビューポートと**排他利用**という運用が想定されていると感じます。

splitの**スワップ・フリップ**の性質をもっとも活用したデスクトップな気がします。

## Terrain

![desktop_terr.png](https://qiita-image-store.s3.amazonaws.com/0/102581/d3b499d9-c1b4-f38b-88dc-da846c15fe37.png)

いまをときめく地形作成用のデスクトップです。
ImageやGroomingと同様 **特定用途につきシンプルに** という感じを受けますが、
ビューポートの右側に **コンポジットビュー** が仕舞ってあり、
Technicalの上下のあれらと同様、排他で使うっぽい感じが出てます。

## Textport

![desktop_text.png](https://qiita-image-store.s3.amazonaws.com/0/102581/a488eb83-37ab-1c5a-62d3-85d9f6b0dfd2.png)

**分割一切なし**、シェルフも閉じてあります。
求道者モード。

このデスクトップを選択するような人はマウスでちくちくネットワーク選択しないし、タブを切り替えたりしながらパラメータ入力なんてかったるいぜ、出た絵は外部のビューアーで好きにみるぜ
的なハードボイルドな精神が滲んでやまない。

# まとめ

最後に、よく見かけるデスクトップも同じ文脈で触れてみます。

![desktop_etc.png](https://qiita-image-store.s3.amazonaws.com/0/102581/75fa3c28-b888-e5b8-700b-994e9efbd09e.png)

まず左右に分割して、右がおおきくネットワーク。パラメータは必要な時に`p`キーから入力するスタイル
左側は、左端にツリービューをたたんでおいて、上段にビューポート、下段にジオメトリスプレッドシート。

……といろいろ眺めてきて、だいぶsplitを押すのも怖くなくなってきました。
リハビリは成功と言えそうです。

# 心残り

結局タイトルに載せていたのにもかかわらず **Flip** にはあまり触れずでした。
**houモジュール** からスワップしたり、分割比率を取ったり、最大化・最小化はできることが分かったのですが、
ただ開く**「Flip」**は、はて、どうやるんでしょうか。

houの抜け穴なんでしょうか。。。

***

次の記事は@yuya_torii
[Houdini Engine For Maya を調べてみる](https://qiita.com/yuya_torii/items/001642040a5354cd9f89)
です！

# 参考

- Houdini 16.5 > Basics > Houdini user interface  
http://www.sidefx.com/docs/houdini/basics/ui.html
- Houdini 16.5 > Basics > Desktops and panes  
http://www.sidefx.com/docs/houdini/basics/panes.html
- hou.Pane class   
http://www.sidefx.com/docs/houdini/hom/hou/Pane.html
- hou.Desktop class  
http://www.sidefx.com/docs/houdini/hom/hou/Desktop.html
- hou.ui module   
http://www.sidefx.com/docs/houdini/hom/hou/ui.html