Rhino+Grasshopper

プロシージャルモデリング|Hopsコンポーネントを用いたPythonスクリプトの連携方法

Grasshopperは、パラメトリックデザインやアルゴリズムデザインを簡単に視覚化できるツールとして非常に人気です。しかし、複雑なデータ解析や数学的演算を実装するには、Grasshopper自体の機能では限界があることがあります。そこで、Pythonの豊富なライブラリを活用してGrasshopperを強化できる「Hops」コンポーネントの出番です。

この記事では、GrasshopperのHopsコンポーネントを用いてPythonスクリプトを連携させる方法を詳しく解説します。Pythonを使ったGrasshopperの拡張に興味がある方は、ぜひ参考にしてみてください。

1. Hopsコンポーネントとは?

Hops は、GrasshopperとPythonをHTTP通信で接続するためのコンポーネントです。Rhino 7以降で利用でき、これによりGrasshopper内のアルゴリズムを外部のPythonサーバー上で実行することができます。特に、複雑な演算や外部ライブラリの利用を伴う処理をPython側に任せることができるため、Grasshopperの計算負荷を大幅に減らすことができます。

Hopsを使うメリット

  • Pythonの豊富なライブラリ(NumPy, SciPy, Scikit-learnなど)をGrasshopperで利用可能。
  • 外部サーバーを用いることで、複数のRhinoインスタンス間での共有や分散計算が可能。
  • Grasshopperのスクリプトエディタを使うよりも、デバッグやモジュール管理が簡単。

2. 事前準備:環境設定

Hopsを使用するためには、以下の環境が必要です:

  1. Rhino 7 以上のバージョン
  2. GrasshopperHopsプラグイン
  3. Python 3.x 環境(Anacondaまたは標準Python)

必要なライブラリのインストール

まず、コマンドプロンプトまたはターミナルで以下のコマンドを実行し、ghhops-server パッケージとFlask、Rhinoの3Dデータ操作用ライブラリrhino3dmをインストールします。

  • ghhops-server
  • Flask
  • rhino3dm
pip install ghhops-server flask rhino3dm

これで、PythonスクリプトでHopsを用いる準備が整いました。

Hopsプラグインのインストール

Rhinoのコマンドバーで PackageManager を起動し、「Hops」を検索してインストールします。インストールが完了したら、Grasshopperを開いてHopsコンポーネントが表示されていることを確認します。

3. Pythonサーバースクリプトの作成

Hopsを利用するには、Pythonサーバーを作成し、Grasshopperが呼び出せる関数(エンドポイント)を用意する必要があります。

サンプルコード

以下のコードをhops_server.py という名前で保存し、Pythonサーバーを起動します。

import ghhops_server as hs
from flask import Flask
import rhino3dm
import math

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# Hopsサーバーのインスタンスを作成し、Flaskアプリケーションと紐付ける
hops = hs.Hops(app)

# 加算する関数の定義
@hops.component(
    "/add_two_numbers", 
    name="Add Two Numbers", 
    inputs=[
        hs.HopsNumber("A", "A", "First number"),
        hs.HopsNumber("B", "B", "Second number")
    ], 
    outputs=[hs.HopsNumber("Sum", "Sum of two numbers")]
)
def add_two_numbers(a: float, b: float):
    return a + b

# 2点間の距離を計算する関数の定義
@hops.component(
    "/point_distance",
    name="Point Distance",
    inputs=[
        hs.HopsPoint("Point1", "P1", "First point"),
        hs.HopsPoint("Point2", "P2", "Second point")
    ],
    outputs=[hs.HopsNumber("Distance", "Distance between points")]
)
def point_distance(pt1, pt2):
    return math.sqrt((pt1.X - pt2.X) ** 2 + (pt1.Y - pt2.Y) ** 2 + (pt1.Z - pt2.Z) ** 2)

# サーバーを起動
if __name__ == "__main__":
    app.run()

サーバーの起動

以下のコマンドを実行し、サーバーを起動します。

python hops_server.py

サーバーが起動すると、http://127.0.0.1:5000 でリクエストを受け付ける状態になります。

4. GrasshopperでHopsを設定する

  1. Grasshopperを起動し、「Params」タブから「Hops」コンポーネントを追加します。
  2. Hopsコンポーネントの右クリックメニューから「Path」を選択し、サーバーのエンドポイント(例:http://127.0.0.1:5000/add_two_numbers)を入力します。
  3. 必要な入力を設定します。たとえば、Number Slider を2つ用意し、それぞれを「A」と「B」の入力に接続します。
  4. 出力を Panel コンポーネントに接続し、計算結果が表示されることを確認します。

5. Hopsを使ったサンプルプロジェクト

プロジェクト例:2点間の距離計算

  1. Point コンポーネントを2つ配置し、それぞれを「Point1」と「Point2」の入力に接続します。
  2. 出力を Panel に接続すると、2点間の距離が表示されます。

Path=「http://127.0.0.1:5000/point_distance」

プロジェクト例:数値の加算

  1. Number Slider を2つ用意し、Hopsの「A」「B」入力に接続します。
  2. Panel コンポーネントで「Sum」の出力結果を確認します。

Path=「http://127.0.0.1:5000/add_two_numbers

6. まとめと注意点

GrasshopperのHopsコンポーネントを用いることで、Pythonの豊富なライブラリや外部APIと簡単に連携できるようになります。特に複雑なデータ処理や外部の機械学習ライブラリを使う際に非常に有効です。

Githubからダウンロード

https://github.com/sekkeiya/15_Hops

注意点

  • Pythonサーバー が正しく起動していることを確認してください。Grasshopperから接続できない場合、サーバーのURLやポート番号が正しいかを再確認しましょう。
  • Hopsの入力と出力の設定は、データ型(NumberPointなど)を正しく定義する必要があります。対応するデータ型を正確に設定することで、エラーを防げます。

GrasshopperとPythonの連携をうまく活用し、パラメトリックデザインの可能性をさらに広げていきましょう!

-Rhino+Grasshopper
-, ,