皆様こんにちは。
AMDlabの齋藤です。
今回はGrasshopperで扱えるPythonの初級・中級編を簡単なプログラムを作成して、まとめていきたいと思います。
それでは始めましょう。
今回のデータはこちらに挙げております。
https://github.com/AMDlab/TechBlog-GrasshopperPythonBeginners
GrasshopperのPythonとは
GrasshopperのPythonとは、そのままGrasshopper内でPythonを扱うことができるものです。
For文やWhile文、再帰処理を行うのに、Anemone等カスタムコンポーネントで行うことができますが、既存のコンポーネントではPythonを呼び出して行うことができます。
さらに、元々Pythonのようなテキストでのプログラミングを行っており、ビジュアルプログラミングを初めて触る方には、Grasshopperに慣れる1つの方法だと思います。
GrasshopperのPythonは、はじめはfood4rhinoからダウンロード、インストールをするGhPythonというカスタムコンポーネントのようでした。
それからRhinoに標準実装され、Rhino 7まではIronPythonを利用してPython 2.7が使えるコンポーネントで、
Rhino 8からは新しくIronPython 2 Script, CPythonを利用したPython 3 Scriptコンポーネントとして使えるようになっています。
今回はPython 3 Scriptを触りながら使い方をまとめようと思います。
Python 3 Script コンポーネントを配置
まず、Python 3 Scriptコンポーネントを配置します。
キーワード検索では「Python」で、UI上では「Maths」>「Script」>「Python 3 Script」で配置できます。
Scriptコンポーネントから始める場合は
キーワード検索では「Script」で、UI上では「Maths」>「Script」>「Script」でScriptコンポーネントを配置できます。
配置したScriptをPython 3 Scriptにする場合は、コンポーネントの一番下の三点リーダーから、「Edit Python 3」を押してください。
これでPython 3 Scriptが配置できました。
コンポーネント入出力設定
次にPythonを触る前に、Pythonへ入れる、返される変数の設定をコンポーネントの入力や出力でしていきます。
コンポーネントの入力や出力は少し特殊で、個数を変更できます。
コンポーネントに向かって拡大すると、MergeやEntwineコンポーネントと同じように、入出力のパラメータを追加、削除する表示がでます。
これを操作することで、入出力の個数を変更することができます。
今回は入力を3つ、出力を2つ(out合わせて3つ)と設定します。
次にパラメータ名を変更します。
パラメータ名は変更しなくてもアルゴリズム上は問題ないですが、共有する人がいたり、後日プログラムを確認する場合にパラメータ名が設定してあるとわかりやすいです。
変更したいパラメータを右クリックして、一番上の項目を編集するとパラメータ名を変更できます。
今回は
x を
pt 、
y を
step_ls 、
z を
angle 、
a を
points 、
b を
lines
のように変更しました。
次は入力にType Hintsを与えます。
これは入力されるパラメータがPointなのか、数値なのかのヒントを与えます。
このヒントはGrasshopperのパラメータに準拠しています。
これを設定することで、Python内での意図しない入力によるエラーを防げることが可能です。
入力パラメータを右クリックし、下のType Hintsから指定したいパラメータをクリックします。
今回は、
pt を
Point3d 、
step_ls を
float 、
angle を
float
と設定しました。
最後に、Access方法を設定します。
これはItem Access, List Access, Tree Accessを設定することができます。
これによって、中のプログラムで扱う変数を1個だけでなく、配列やGrasshopperのTreeのデータを入力することができます。
入力パラメータを右クリックし、下のItem Access, List Access, Tree Accessから指定したいAccess方法をクリックします。
今回は、
pt をItem Access、
step_ls をList Access、
angle をItem Access
と設定しました。
これで、コンポーネント入出力の設定は終わりです。
次のプログラムの入力後に再度、入出力の設定を変更することは可能ですが、プログラムの入力で想定されていた変数から変わるため、そのエラーの対応を逐次しなければならないです。
できるだけ、入出力のパラメータ名やType Hints、Access方法は先に固定させておきたいところです。
プログラムの入力
次にコンポーネント内にプログラムを入力します。
まず、コンポーネント本体をダブルクリック、もしくは右クリックから「Open Script Editor」を押して、エディタを開いてください。
この中にプログラムを書いてきます。
今回は適当なプログラムを用意したので、それを実装したいと思います。
以下のプログラムをコピーして貼り付けてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import Rhino.Geometry as rg # 初期点を原点に設定 points = [rg.Point3d.Origin] # ステップごとに点を追加 for i in range(len(step_ls)): step_len = step_ls[i] # 方向係数:1, 1, -1, -1, ... d = (-1) ** ((i // 2) % 2) # 軸の切り替え:X軸, Y軸, X軸, Y軸 ax_sw = [(i + 1) % 2, (i + 2) % 2] ax_mask = [i % 2, (i + 1) % 2] new_x = points[-1].X * ax_mask[0] + step_len * d * ax_sw[0] new_y = points[-1].Y * ax_mask[1] + step_len * d * ax_sw[1] points.append(rg.Point3d(new_x, new_y, 0)) # 平行移動と回転の変換を作成 rotation = rg.Transform.Rotation(angle, pt) translation = rg.Transform.Translation(pt.X, pt.Y, pt.Z) transform = rotation * translation # すべての点に変換を適用 for p in points: p.Transform(transform) # 線分を作成 lines = [] for i in range(len(points) - 1): lines.append(rg.Line(points[i], points[i + 1])) |
これで一度実行してみます。エディタの右上にある再生ボタンのような実行ボタンをおしてみてください。
すると以下のようにエラーとなります。
これは
pt や
step_ls 、
angle の入力がないためです。
次は適当な入力を作成して、接続してみます。
Editorを一度閉じて、入力を作成してみましょう。
今回は、Pointパラメータ、Gene Pool、Digit Scroller(Number Sliderでも可)を接続します。
ちゃんと動いたようです。
現在Rhino上で表示されているものはPython 3 Scriptから出力されている
points と
lines です。
outに出力されるものは、Pythonを動かしたときのコンソール上の出力となり。主にprintされたメッセージや、エラーの出力がテキストとして出力されます。
入出力にTreeを使う場合、 ghpythonlib.treehelpers が使いやすい
入力を多次元配列のように配列の配列のような感じの入力を行いたいときには、Tree Accessを利用すると思います。
しかし、入力された変数はDataTreeとなり、Treeのプログラミング上の使い方をよくわかっていなければ、扱いにくいデータが入力されます。
また多次元配列を出力するときは、そのまま取得してしまうと、Listデータそのままを出力してしまい、Treeでの出力ができません。そこで、 ghpythonlib.treehelpers を利用してPython内で使えるデータ、出力できるデータとします。
具体的には以下のような方法です。tree_to_list 関数で入力されたTreeデータをlist in list(多次元配列)へ変更できます。
引数の2番目はPathに関する設定です。普段は設定しなくてもよいですが、simplifyさせた場合は lambda x: x を入力しないとうまく動かない場合があります。list_to_tree 関数で入力されたlist in list(多次元配列)をTreeデータへ変更できます。
Grasshopperコンポーネントを使いたい場合は ghpythonlib.components で使える。
Grasshopperのコンポーネントの処理をPython内で利用したい場合は ghpythonlib.components で利用できます。
このライブラリではGrasshopper標準のコンポーネントを呼び出すことができます。
ただし、RhinoCommonと比べると処理に時間がかかる傾向があります。
具体的には以下のように呼び出せます。Grasshopperコンポーネントの名前の頭文字が数字の場合、Pythonの構文上、識別子の頭文字を数字とできないため、xが頭についたコンポーネント名で呼び出すことができるようになっています。
よく使われるライブラリ
最後によく使われるGrasshopper Python独自のライブラリを紹介して終わりにしたいと思います。
rhinoscriptsyntax
Rhino上でさまざまな操作を実行する使いやすい関数をいくつも含んでいるライブラリです。
これ以外にもRhinoCommon APIを使う方法があります。
https://developer.rhino3d.com/guides/rhinopython/python-rhinoscriptsyntax-introduction/
ghpythonlib
components や
treehelpers を使うときに重宝する便利なライブラリです。
RhinoCommon API
Rhino.Geometry
Grasshopper.Kernel 等の RhinoCommon APIを使えるライブラリです。
さらに、rhinoscriptsyntaxで扱えなかったRhinoのUI関連の関数等も扱うことができます。
C#、Visual Basicでの実装をよくする方はrhinoscriptsyntaxよりこちらが使いやすかったりします。
https://developer.rhino3d.com/guides/rhinopython/using-rhinocommon-from-python/
scriptcontext
これは、rhinoscriptsyntaxに付随するライブラリのようです。
scriptcontext.docを設定しないと動かないrhinoscriptsyntax関数があるようです。
Rhinoのドキュメントを触るか、Grasshopperのドキュメントを触るかを設定するときにも利用され、
他に、
Sticky を使うのにも利用します。
https://github.com/mcneel/rhinoscriptsyntax/blob/rhino-8.x/Scripts/scriptcontext.py
さいごに
今回はGrasshopper Pythonの初級・中級編を行いました。
これが一通り理解できれば、ほとんどのプログラミングはできるようになると思います。
次回は主に私が使っているテクニックをまとめた上級編をお送りできればと思います。
AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career
カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry
AMDlabのSNSアカウントです!ぜひフォローお願いします✨
■ X(旧Twitter):https://x.com/amdlabinc
■ Instagram:https://www.instagram.com/amdlabinc/
■ Facebook:https://www.facebook.com/amdlab.lnc/
COMMENTS