Rhino PythonからGrasshopperを制御する

最終更新日

突然ですがGrasshopperを使用しますか? SyntegrateとViccでは使う機会がたくさんあります。

Grasshopperは説明するまでもなく、ビジュアルプログラミングによって、複雑な形状を表現できるRhinocerosのプラグインツールです。

新規でジオメトリを作成することもありますが、既存のサーフェスモデルにGrasshopperを適用することもあります。既存のサーフェスモデルにGrasshopperを適用するには、以下の手順で行われていくと思います。

  1. Rhinocerosを立ち上げて既存モデルの3dmファイルを開く。
  2. Grasshopperを立ち上げてから、ghファイルか.ghxファイルを開き、パラメータを設定をして、実行とベイクを行う。
  3. 保存して閉じる。

今回は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のテストデータの自動入力やシミュレーションの自動化などに使えそうです。

それでは、ここまでお読みいただきありがとうございました。

jyun-ichi

シンテグレートのプログラミング担当。入社2年目。業務はPythonやUnity(C#)の開発。運動と車と読書の田舎暮らし。

シェアする