建築系Grasshopperが何から始めたらいいかわからない。

## Grasshopper とは
Grasshoppeとは2007年から開発されているRhino用のGAE（Graphical Algorithm Editor）で、プログラミングをパズルで作るようなソフトだというイメージです。建築関係だと図面が手書きだったのがCADでデジタル化したのと同じように、プログラミングをパチパチ、コードを打ち込んでいく作業をもっと手軽にやりたいからパッと見てわかりやすいようにしようという風にしたのがGAEといったところでしょうか。


### Grasshopperの最大の特徴
なので、GAEは**データの流れに注目する**してプログラムをつくっていくという特徴があります。つまりAを入れたらBが出てくるから、次Cを混ぜて…としていって最後の完成品ができるというふうに順序立てて作っていくのが基本です。

普通のプログラムでは大規模開発等で同じやり方をすると混乱しがちなので、もっと別なやり方でプログラムを作ります。Grasshopperのデータに注目すると便利なのはやっぱり、

* どんな流れでデータを処理しているかわかりやすい（Cを混ぜる前の状態のデータってどういう結果になっているのか覗くことができる）
* 別パターンの検討がしやすい（Aという材料で作るんじゃなくてA'で作ったらどうなるのかな、とか検討しやすい）

という大きなメリットがあり、よく使われています。料理を例にすると、「晩ごはんにハンバーガーにするか、ラーメンにするか」みたいな全く別なもの同士を比較することよりも、ハンバーガーの中身はなににするかみたいな「ちょっと変化させた近しい」もので比較することが現実ではほとんどということです。そういった「ちょっと変更した案」を比較したいときに従来であれば２つゼロからA案とB案を作らなければいけなかったところを、「ちょっと変更する部分」だけ誰でも簡単にパソコンにお絵かきで伝えて、マスターの案を元に何案も生み出せるよう置き換えるのがGrasshopperです。

つまり、使う人はバンズだけデザインして、中身の部分はGrasshopperで中身の作り方を指示しておけば、最終成果のハンバーガーにたどり着けるということになります。故にGrasshopperは**データ（材料）の流れ（作り方・手順）に注目する**操作性になっています。

### Grasshopperは「専門」ではなく「教養」でつかえる
そして、このGrasshopperの特徴は**案をデザインする人が使うことに着眼を置いている**ということがポイントです。まさかバンズだけ用意して中身をチーズバーガーにするかフィッシュバーガーにするかは他のコックに頼むなんてことはありません。それは専門技術が要求される部分だけ専門家にアウトソーシングしてモノを作っていく従来のやり方です。そんなことしてたら「うーんこの味付けはもっと濃い方がいいのに。。」とちょっとした案の変更のたびに専門家を呼ばなくてはいけません。

そうならないようにGrasshopperでは最初からそういった部分は「コンポーネント化」されています。コンポーネントと呼ばれる「こういう材料を入れると、こういう処理をするので、こういう結果が出てきます」というパーツが事前に用意されているのです。冒頭でGrasshoppperはパズルみたいにプログラミングができると言ったのはこのコンポーネントを画面に配置してマウスで線を描いていくことで、「これとこれを混ぜてできたものに、あれを加えて…」としていくことでプログラミングができてしまうからです。

![image40876.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/998b29e2-8ff3-67b1-3dac-333ccd7b926f.png)

### Grasshopperの注意すべき点
なんだかいいことずくめのように感じるGrasshopperですが、やはり弱点もあります。この弱点を全員が理解した上で利用しなければGrasshopperは個人レベルの開発では便利ツールですが、組織として使ったときに混乱の大元になること必至です。

#### コンポーネントの難しさ
まずその自由度の高さ故に、材料が適切かどうかはわかりません。材料を何個いれるのか？必ずしも全部入れる必要はないのか？といったことはその都度自分自身でマニュアルで調べる必要があります。ハンバーガーには絶対小麦粉が含まれますが、必ずしもピクルスをいれるかどうかは人の好みです。
ましてやきゅうりのピクルスはOKだけど、人参はNGといった細かい違いで入力する材料が間違えて赤いエラーが表示されることもしょっちゅうです
（ちょっとあまりにも簡単な例に聞こえて馬鹿げていると思うかもしれませんが、かなりここが難しいのです）

この弱点が苦手でGrasshopperを挫折する人が実はとても多いです。つまりマニュアルをたどって自力で解決するのが苦手なタイプの方です。そのためチームでGrasshopperを利用するときには事前に頻出のコンポーネントについてはこの材料の扱いに詳しい母国語のマニュアルを用意することがおすすめです。

ちなみに一般のプログラミング言語ではこのような自由度の高さはありません。最初からハンバーガーの中身担当のコックに「これとこれをください」と材料をきっちり指定されます。

#### Grasshopperでできることの限界
なんでもGrasshopperでやろうとすると限界がやがてきます。当たり前です。Grasshopperはあくまでもオルタナティブなものをたくさん作り出すためのツールであり、全く違うものを作り出すときには適切な別ツールでやるのが一番はやいし、わかりやすいのです。ハンバーガーの生産ラインを無理やり応用してラーメンを作るのはコスパ悪すぎです。

（ツールの便利さ故に何でもそれでやってしまう人いますよね。Excelでなんでも文書つくっちゃうとか、何でもイラストレータで作っちゃうとか、それと同じです。規模に見合ったものだけ作るのが、保守メンテ・互換性も考慮するとベストなんですけど）

つまりGrasshopperはコンポーネントをつなげすぎて、大きくなりすぎると煩雑になりすぎるのです。こういうときもチームのGrasshopperエンジニアがある程度のコンポーネントを一つに集約化して再整理してあげるか、わかりやすいテンプレートのクラスタに分けてあげるメンテナンスが必要です。

### Grasshopperの画面
#### Grasshopperでコンポーネントをつないでみる
それでは使ってみましょう。と言っても、ここまで記事を読んでくださった方なら簡単でしょう。
試しにRhinoceros（CAD側）に線を引いてみましょう。みよう見まねで並べてつなげてみてください。
![image41005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/0735a90b-57ba-6c39-41b2-3702a407cb8f.png)
間違ったところに接続してしまった場合は`Ctrl`を押しながら線をもう一度なぞって解除してください。一箇所に複数の線をつなぐときには`Shift`を押しながらつなぎます。ちなみに`Ctrl`+`Alt`を押しながらコンポーネントをクリックするとそのコンポーネントがどこのグループに属しているコンポーネントなのか調べられます。

Grasshopperの初期状態で入っている標準コンポーネントを整理してみるとこんな感じになります。ざっくりで大丈夫なので下図を参考にこういうものはここに固めてあるんだなというイメージを持ってみて下さい。つまづきやすい点としてはリストやデータツリーといったデータそのものを編集するSetタブ。これは難しいので後で別途解説します。

![rect7359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/2d431a8f-bf75-e5a3-3c07-55df0fc2e32d.png)

またその他ではSurfaceタブとMeshタブがややこしいですね。どちらも線と線をつないだ面に対する操作をしますが、Meshは面がそれぞれの頂点の座標を直線で結んだ図形という定義のため曲線が扱えません（逆にこの点と直線しか含まれないという性質を利用したほうが便利なシーンも多いので、需要が少ないわけではありません）。なので面を扱う操作は特別な理由がない限りSurfaceを利用すると思って下さい。

#### CADで扱える図形はシビア（気になる人だけお読み下さい）
![g5499.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/ff050d85-08af-fe43-2a25-61fb9f92736c.png)
上のジオメトリコンポーネントの違いについてあまり触れずに説明を続けようと思いましたが、今後環境系シミュレーションなどを行う上でメッシュでなければ解析できない制限があったりとシビアな部分なので補足説明をつけることにしました。

一番わかりがいいのは数学で習ったことのある二次関数を想像していただければいいかと思います。CAD上ではすべての描いた線の点プロットの座標をパソコン内部に保存しているわけではなく、数式化の上係数で保存しています（イメージです）。たとえば放物線のような曲線をCADのに書き込むと(0,0)、(2,4)、(3,9)…と放物線の点を１つずつ覚えているわけではなく、二次関数$y=ax^2$で表した場合の係数だけを覚えています。記憶すべき情報を最小限にするとても効率のいい方法です。

でも放物線は当然ですが円にはなりません。どう頑張って$a$の値を設定しても円にはなりません。このように実はパソコンではあらゆる線が描けるように見えて事前に準備された範囲のなかでしか線を描けないという事実に気づきます。（二次関数の例で言うところの$a$が上の図のハンドルの長さだったりするわけです。）

そのためいろんな図形の描画法（ベジェ曲線（2次、3次…）、Bスプライン、NURBS）が存在しているわけですが、その関数式の状態で正確に図形をGrasshopper上で扱うのがSurface、ある程度直線で擬似して座標化してしまうのがMeshというわけですね。
環境解析（特に光）の分野では形態係数法など計算エンジンのロジックが座標化されていることを前提に作られているものも多く、このあたりを意識してGrasshopperでコーディングする必要があります。


#### Grasshopperの機能を一通り抑える
ちなみにGrasshopperの画面の説明をすっとばしましたが、画面がシンプルなのでわかりやすいです。
ちなみにGrasshopperの画面の説明をすっとばしましたが、画面がシンプルなのでわかりやすいです。英語なのでとっつきづらい人もいるかも知れませんが大した英語は使っていないのでそのつどGoogle検索しましょう。
![g40794.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/174eff85-dcba-0b8a-8339-a6c47fc265a9.png)
黄色のビックリマークついているところが、便利な「ビューの保存」機能です。いまはコンポーネントをつないでいく数も10～50個程度かもしれませんがどんどんアイデアが広がっていって100を超えるコンポーネントをつなげ始めるといちいち画面移動が億劫になります。そのときに**この機能で所定の画面をブックマークしておけばスマートに広いキャンバスの上を移動できます**ね！

またキャンバスの上で中央ホイールクリックするとこの「よく使うコマンド集」みたいなリングが表示されます。下の図はデフォルトのGrasshopperの状態です。細かい機能は１つ１つ試してほしいところではありますが、この４つだけは覚えておきましょう。初級者でも作業効率に直結します。
![g5128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/a2ad8f30-ec4e-1e31-8000-411d37bade1a.png)
グループ化はコンポーネントをまとめてグループ化する機能、図形出力のbake機能はRhinocerosのオブジェクトとしてGrasshopperから出力するための機能、ナビケートウィンドウは画面を縮小化して手軽にあちこちジャンプできる機能です。

グループ化は単にコンポーネントを扱いしやすくするだけではなく、**コンポーネントを目立たせるためにグループ化する**こともあります。雑多にコンポーネントを配置していくと、後から読み解いたり、メンテンナンスが大変になるので**適宜コメントなどを残す、コンポーネントを整列させる**などのルールを決めて配置していくことが必要です。（チームでGrasshopperで開発していく上ではこういうソフト部分が一番大切）

![image5209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/b3a45a3b-95b0-7f71-1aa6-914000e6b8d9.png)


Grasshopperでは上のFileとかViewといったメニューを開いてなにかするよりも、**上のズラッと並んだコンポーネントをクリックして配置、つなげていき何か設定したくなったら該当コンポーネントを右クリック or 中央ホイールクリックの繰り返し**なので、ここまでの内容をしっかり把握してください。



## Grasshopperの勘所「データツリー」
Grasshopperの解説をする上で避けられないのがデータツリーです。普通のプログラミングで言うところの配列に相当します。ちょっと専門的な話になりますので「データツリーの本質」の段落は個々のプログラミング経験に併せて読むか、読み飛ばすかご判断ください。

### データツリーの本質（必要な人だけお読みください）
データツリーの本質は関数型でコードを書くときののデータに対する考え方に近いです。**任意の配列は何かしらの意味を持ちません。そのためあるコンポーネントによるデータの操作を関数Fとすれば、Fで得られた結果が意味のある結果かどうかもユーザが判断**します。つまり配列の1番目には日付、2番目に気温、3番目に預金残高が入った配列があっても同等に気温を華氏に変換という関数を配列に施すことができてしまいます。もし1番目と3番目の中身は属性の異なるデータなので関数を施すことをやめたいときには、次元を変えることによって階層化し深さを指定して関数を適用します。

### データツリーとリスト
Grasshopperにスライダーというツールがあります。これはマウスでバーを移動することで変数の値を手軽に変更できるのですが、難点としては一つの数しか扱えません。例えば座標で10mおきに点を打ちたいというときにはどうするのでしょう。10ずつ足したスライダーを作りますか？？なんだかもっといい方法がある気がします。そのときに使うのが**リスト（配列）**です。
![image7369.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/2482f949-370e-11c7-0aa8-b905dd1bb2ef.png)
等差数列という響きが懐かしいような気もしますが、このようにするといくらでも規則性のある数値の羅列をカタマリとして取り出すことができます。このようにGrasshopper上で複数のデータを「あたかも」一つのデータのようにあつかうことができる点がすごいのです。（まだ現時点では凄さはわからなくても大丈夫です）

Grasshopperは最初にお話したとおり「データの流れに注目」するソフトの特徴があります。なので１本の線の中を1つのデータが流れているから使っている私達は「ふむふむ、ここのコンポーネントまではこういうデータが流れてきているんだな」と川上から探れるわけです。それが新キャラのリストによってわかりにくくなりましたので、Grasshopperでは**１つのデータではなくリストが流れているときには二重線で表示する**というルールがあります（上図参照）。

イメージとしては一本で流れてきた川が分流したイメージでしょうか。
さらにさらに、この分流した川を更に分流すると、**データパス（多次元配列）**というデータ構造になります。
![image7475.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/d0ee3557-a933-0a04-3f10-4b7479033e73.png)
こうすることで**コンポーネント同士をつないだデータ操作の流れ道に、リストやデータパスを用いることで複数のデータを流し込むことができる**ようになりました。

### リストやデータパスを使えば条件分けや繰り返し処理を行うことができる
使い方はともかくリストやデータパスの使い方をマスターすることができました。リストとデータパスが使えると嬉しいのはこれを用いて繰り返し処理や条件分岐を模擬できるところです。つまり**「この案に対して、X=1のときと、X=2のとき、X=3のとき…、10の場合まで10ケース試してみたいな」と思えば、Xを代入するときにデータの流れを1から10に分岐させてやればいい**のです。

この点がGrasshopperでデータツリーを使える便利さの最大の点とも言えます。条件分岐も同様にY=1、Y=2のときとデータの流れをリストを使って分流してあげれば事足ります。もちろん分流したデータの流れを後ほど合流させることもできます。

![rect7666.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/313e9f51-726d-34f7-736b-a43e6b0d0f28.png)

実はGrasshopperの結果側の線をつなぐ出口部分を右クリックすると上のような選択肢が出てくるようになっています（コンポーネントの中身によってはこの機能が性質的にないものもある）。これは**材料をコンポーネントが処理した結果複数の結果が出てくるような場合に「どのように分流しますか？」というのをコントロールできる機能**です。これを使うとリストやデータパスを自由自在に扱って複雑な処理を行えるようになるので覚えておきましょう。

実際の使い所については別で記事にしていますのでそちらをご参考にしてください。（こちらの記事で紹介→執筆中）

## 終わりに
いかがだったでしょうか。ざっと一通り、Grasshopperの機能に触れてみました。ここまでの基礎知識と操作方法を身につければあとは

1. よく使うコンポーネントの使い方を覚える（こちらの記事で紹介→執筆中）
2. Grasshopperに標準的に入っていな機能はプラグインを追加して利用する

というステップアップになります。この記事を一通りこなすことができればGrasshopperが何者なのかというような未知に対する恐怖感や嫌悪感はなくなっているはずですので、マニュアルや掲示板などを利用して学習を進めていただければと思います。

良いGrasshopperライフを。

## 番外編）Grasshopperの皮をかぶったGrasshopperではないものに騙されるな
筆者が建築系でRhinocerosとGrasshopperを利用しているので、Grasshopperにプラグインを導入して使うのも必然的に解析系のものが多くなります。特に建築環境シミュレーションが多いのですが、そうなると一番多いのがLadybugとHanybee[^1]といったプラグインを使ったシミュレーションとなります。しかしこれらのプラグインは**いままで説明してきたGrasshopperのコンポーネントと見た目は同じだが全くの別物**と考えてください。同じものだろうと思ってインストールして使い始めると挫折します。あらかじめ違いを抑えておいてください。

[^1]: ）2013年にMostaphaらが環境工学解析を手軽に行えるように諸計算をGrasshopperでコード化した。2014年には続いてHanybeeによってRadianceやDAYSIM、EnergyPlus、Openstudio等を連携。2013年当時は書きやすい言語でLadybugを開発したため（これをレガシーコードといい、ダウンロード時にもレガシー版として現在も残されているが使用の推奨はされない）、フルスクラッチにより今Python版がDynamoとGHをどちらでも利用できるクロスプラットフォーム版（故に有償のGrasshopperを必須するわけではない）として2016年から公開されている。


### そもそもプラグインの内部の計算ソフトの話
専門的な話なのであまり詳しい中身には立ち入りませんが、建築設計の解析ソフトは大学初等数学・物理程度で解析される事が多いのでプログラムコードもとても昔に書かれたものをテコ入れして使いまわしていることが多いです。故にインターフェースもいわゆるコマンドラインと呼ばれるキーボードからコマンドを打ち込んで操作するものが非常に多いです。

![g41198.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339767/d7ddae40-7a1f-972b-7725-245effcfa23f.png)

そしてこういったコマンドラインから実行するプログラムは**「１つのプログラムには１つの結果・ゴール」**という思想がある（**UNIX的思想**）ため、エンジニアがほしい解析結果を得るためには、複数のコマンドを連続して実行する必要があります。するとエンジニアとして基本的な専門知識とは別に解析のためにどの順序で解析を行えばよいかを事前に知っておかなくては行けないという不便さがあるのです。
（まあ単純にコマンドラインの画面ってとっつにくいですよね）

### それをGrasshopperで「操作」できるようにしたのがプラグイン
ところでこの上の図でオプション値とコマンドの関係はGrasshopperの材料とコンポーネントの関係に非常に似ています。というか、そのものです。オプション値がコマンドを実行する上で必要な材料なので、コマンドはコンポーネントと置き換えてしまえばまったく同じように操作できそう！

ということで開発されたのがLadybugやHanybeeなどの解析**支援**ソフトです。建築系以外の解析ソフトでもプラグインインストール時にGrasshopperファイル以外の外部エンジンのインストールも一緒に要求するプラグインはこのパターンでしょう。
つまりよく考えるとこういったプラグインは**入力をキーボードからコマンドを打ち込むのか、Grasshopper上でマウスでつなげながら操作するのかの違いしかなく、エンジニアがどの順序でどのコンポーネントを実行するかやオプション名のを暗記する必要がある点についてはなんら改善されていない**ことをよくよく認識しておかなくてはいけません。

### じゃあなぜGrasshopperを利用したプラグインとするのか
以上のことからGrasshopperのLadybugやHanybeeはコマンドラインタイプのソフトがもつ問題点をあまり解決できたとは言い難いのです。GrasshopperはCUIとGUIの中間にちょうどいる存在といえるかもしれません。ではなぜGrasshopperのためにわざわざプラグインを作ったのかといえば、いわゆる**パラメトリックデザイン**のためでしょう。エンジニアに計算エンジン部分をGrasshopperで作ってもらえれば、中でどんな計算が行われているかを知らずともその結果を直接CAD側の図形に反映させていろいろな案を比較できます。

つまりLadybugやHanybeeはエンジニアとデザイナーの間に立ってスタディするためのツールです。結局裏ではガチものの大きな計算エンジンが動いていますがその能力の10%も利用できていません。なぜならデザイナーがよく頻出で使いそうな解析コマンドをGrasshopperというインターフェースで提供しているに過ぎないからです。

### だから見た目に騙されないように。
故にGrasshopperを初めて触る方はLadybugやHanybeeから始めるのではなく、この記事に掲載されているようなCADの図形を簡単に操作する基本的な使い方に慣れてから解析系のプラグインに進むことを強くおすすめします。**やりたいことをかたちにするときや、エラーで修正を迫られて原因を探るときにGrasshopperの使い方がわかっていないのか、計算エンジンのコマンドの理解が足りないのか原因探索を楽にするため**です。

このような、「よりコマンド系に近い」解析系のプラグインの扱いは別記事に譲りたいと思います。（記事はこちら→「執筆中」）


## 補記
### 頭の片隅に先に叩き込む
とりあえずプログラミングとは別で先にショートカットキーやその他のショートカットコマンドについて覚えておいてください。もちろん必須ではなく操作を毎度メニューのリボンから選択することもできますが、やはり使用頻度が高いものは覚えておきましょう。

また、地味にこういったちょっとした操作が入門書を読んでいてつまづきやすい（例：このコマンドのボタンは自分の画面にないのにどうして解説だと出てきてるんだ？？とか悩んでいるとショートカットキーで画面上にない機能だったりするのはよくある話です）部分ですので、GHの概要を把握する意味でもこちらを一読しておくと良いと思います。

#### ショートカットコマンド
`//`：パネル作成
`^`：パネル作成
`+3`：四則演算パネル作成
`+3`：スライダー作成

#### ショートカットキー
`Ctrl` + `Shift` + `Q`：クイックスクリーンショット
`Alt` + `左クリック`：オブジェクトの複製（イラレと同じ）

### 学習のための参考サイトや書籍
Grasshopperの本というのはとても少ない＆わかりにくいことも多いので、メインの情報ソースはなるべく公式マニュアルや海外サイトで配布されているテンプレートを参考にするのが一番だと思っています。

* [Grasshopperコンポーネント解説（英語）](https://grasshopperdocs.com/)
* [Grasshopperコンポーネント解説（日本語）](https://www.applicraft.com/ghcp_index/)
* **Rhinocerosで学ぶ建築モデリング入門**（著：山梨ら）これは最初の１冊、チュートリアル的な。
* **Parametric Design with Grasshopper**（著：石津ら）作りたい形イメージできてるけどコンポーネントなにつかったらいいかわからないという人が手に取ると参考になるかも。広く浅く。
* **Grasshopper for Architectural Design**（著：AMD lab）構造・環境エンジニアが最初に読むにはいいかも。解析系の入り口サンプル集。
* **コンピュテーショナル・モデリング 入門から応用 Grasshopper × スクリプトで極めるアルゴリズミック・デザイン**（著：中島ら）もういちいちこんな簡単なコンポーネントの接続やってられるか！！スクリプトでやらせろ！ってレベルまで（そもそもそういう人はプログラミングを簡単にするためにGrasshopperを使っているのではなくCAD側の立体オブジェクトを簡易に操作できるからGrasshopper使っている人ですよね）到達した人向け。

ちょっとGrasshopper勉強し始めた方なら「あれ、、あの本は？」と思うかもしれませんが、今回は本当にわかりやすくて正しく使えそうなものを選びました。ご容赦ください。

### GHを利用する上で便利なプラグイン
下記はインストールしておくと便利なプラグイン。

#### どんなひとにもおすすめ
* [Bifocals【コンポーネントの名前がわかる】](https://www.food4rhino.com/app/bifocals)
* [Anemone【ループ処理を行える】](https://www.food4rhino.com/app/anemone)
* [Kangaroo【物理演算ができる】](https://www.food4rhino.com/app/kangaroo-physics)

#### 建築系のプラグイン
* [Lunchbox【トラスなどの構造体を作れる】](https://www.food4rhino.com/app/lunchbox)

ちなみにGrasshopperの追加したプラグインなでのファイルがどこに行ったのか知りたいときにはRhinoのコマンドバーに`GrasshopperFolders`と打ち込んで確認してください。