Rhino PythonからGrasshopperを制御する
突然ですがGrasshopperを使用しますか? SyntegrateとViccでは使う機会がたくさんあります。
Grasshopperは説明するまでもなく、ビジュアルプログラミングによって、複雑な形状を表現できるRhinocerosのプラグインツールです。
新規でジオメトリを作成することもありますが、既存のサーフェスモデルにGrasshopperを適用することもあります。既存のサーフェスモデルにGrasshopperを適用するには、以下の手順で行われていくと思います。
- Rhinocerosを立ち上げて既存モデルの3dmファイルを開く。
- Grasshopperを立ち上げてから、ghファイルか.ghxファイルを開き、パラメータを設定をして、実行とベイクを行う。
- 保存して閉じる。
今回はGrasshopperの構築が終わったとして、既存のサーフェスモデルにGrasshopperを適用することをRhino Pythonで自動化していきます。まず練習として、ghファイルを開いてコンポーネントに値やオブジェクトをセットします。それから実践として、上述の工程をプログラムに落とし込んで使ってみます。
Rhino Pythonからghファイルを開いてGrasshopperに値をセットする
Grasshopperを立ち上げてNumberコンポーネントに値をセット
# -*- coding: utf-8 -*-
### Copyright (c) 2021 Syntegrate
###
### This software is released under the MIT License.
### https://opensource.org/licenses/MIT
import Rhino
#GHファイルへのパス
path_gh = "test01.gh"
#GH_RhinoScriptInterfaceの取得
gh = Rhino.RhinoApp.GetPlugInObject("Grasshopper")
#grasshopperを開いて表示
gh.LoadEditor()
gh.CloseAllDocuments()
gh.ShowEditor()
#ghファイルの読み込み
gh.OpenDocument(path_gh)
#"Num"という名前のNumberコンポーネントに値をセット
gh.AssignDataToParameter("Num", 12)
#実行
gh.RunSolver(True)
Grasshopperを立ち上げてBrepコンポーネントにオブジェクトをセット
# -*- coding: utf-8 -*-
### Copyright (c) 2021 Syntegrate
###
### This software is released under the MIT License.
### https://opensource.org/licenses/MIT
import Rhino
import rhinoscriptsyntax as rs
#GHファイルへのパス
path_gh = "test02.gh"
#GH_RhinoScriptInterface を取得
gh = Rhino.RhinoApp.GetPlugInObject("Grasshopper")
#grasshopperを開いて表示
gh.LoadEditor()
gh.CloseAllDocuments()
gh.ShowEditor()
#ghファイルの読み込み
gh.OpenDocument(path_gh)
#Brepオブジェクトを作成しておく
if len(rs.AllObjects()) > 0:
#先頭のオブジェクトを取得
obj = rs.AllObjects()[0]
#コンポーネントにセット
gh.AssignDataToParameter("Brep", obj)
#実行
gh.RunSolver(True)
Grasshopperを立ち上げてSliderコンポーネントに値をセット
まず、以下のPythonコンポーネントを作成して、SliderコンポーネントのGUIDを取得します。
そして、取得したSliderコンポーネントのGUIDをもとに、その値を変更するRhinoPythonを実行します。
#SliderコンポーネントのGUIDを取得するPythonコンポーネントのコード
for input_comp in ghenv.Component.Params.Input:
for source in input_comp.Sources:
a = str(source.InstanceGuid)
# -*- coding: utf-8 -*-
### Copyright (c) 2021 Syntegrate
###
### This software is released under the MIT License.
### https://opensource.org/licenses/MIT
import Rhino
#GHファイルへのパス
path_gh = "test03.gh"
#GH_RhinoScriptInterface を取得
gh = Rhino.RhinoApp.GetPlugInObject("Grasshopper")
#Grasshopperを開いて表示
gh.LoadEditor()
gh.CloseAllDocuments()
gh.ShowEditor()
#ghファイルの読み込み
gh.OpenDocument(path_gh)
#Sliderコンポーネントにセット
gh.SetSliderValue("e4350e25-2816-483e-b3d9-9e0700e1c3b0", 0.753)
#実行
gh.RunSolver(True)
Sliderコンポーネントの値が変わりました。
Rhino PythonからGrasshopperの実行およびベイクをして保存する
それでは実践です。3つの3dmファイルをそれぞれ読み込み、各サーフェスをGrasshopperに適用して、ベイクしたオブジェクトを3dmにそれぞれ出力するプログラムを作成します。各スライダの値もランダムに与えていきます。
# -*- coding: utf-8 -*-
### Copyright (c) 2021 Syntegrate
###
### This software is released under the MIT License.
### https://opensource.org/licenses/MIT
import Rhino
import rhinoscriptsyntax as rs
import random
#ghファイルのパス
path_gh = "panelize.gh"
#3dmの入出力ディレクトリ
dir_srf = "C:\\Users\\○○○\\□□□\\×××\\"
for idx in range(1,4):
#パスを指定して各サーフェスの3dmファイルを開く
path_srf = dir_srf + "srf{}.3dm".format(idx)
rs.Command('_-Open ' + path_srf)
#GH_RhinoScriptInterface を取得
gh = Rhino.RhinoApp.GetPlugInObject("Grasshopper")
#描画許可
rs.EnableRedraw(True)
#Grasshopperを開いて表示
gh.LoadEditor()
gh.CloseAllDocuments()
gh.ShowEditor()
#ghファイルの読み込み
gh.OpenDocument(path_gh)
#Surfコンポーネントにセット
obj = rs.AllObjects()[0]
gh.AssignDataToParameter("Srf", obj)
#UcountとVcountのスライダコンポーネントにランダムな値をセット
gh.SetSliderValue("5a0d9b70-356f-43c5-80a8-be5468661985", random.randint(5,15))
gh.SetSliderValue("2e961c8a-bc81-4cb7-a561-31ccc1610a39", random.randint(5,15))
#ブール値のコンポーネントにセット
gh.AssignDataToParameter("Bool", True)
#実行
gh.RunSolver(True)
#元のサーフェスを削除して、GHでベイクしたオブジェクトのみを残す
rs.DeleteObject(obj)
#別名保存
rs.Command('-_SaveAs "{}"'.format(dir_srf+"panel{}.3dm".format(idx)))
最後に
以上になります。このようにRhino PythonによってGrasshopperを制御することによって、従来は手作業で行っていた3dmファイルを開いたり、コンポーネントの値を指定するといった工程を自動化することができます。Rhino PythonはExcelファイルを読み込めるので、各コンポーネントに入れる値を一覧表にして、Grasshopperのテストデータの自動入力やシミュレーションの自動化などに使えそうです。
それでは、ここまでお読みいただきありがとうございました。