GrasshopperでHopsを使ってCPythonでRhino 8に線を描画する方法についても、円を描画する際と同じ流れで進めることができます。ここでは、2点間を結ぶ線を生成する簡単な例を説明します。
ステップ1: Pythonスクリプトの作成
まず、CPythonで2つの点を指定し、それらを結ぶ直線を生成するスクリプトを作成します。ghhops-serverとrhino3dmを使用してGrasshopperと連携します。
Pythonコード(例: line.py)
import ghhops_server as hs
from flask import Flask
import rhino3dm
# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)
# Hopsサーバーのインスタンスを作成し、Flaskアプリケーションと紐付ける
hops = hs.Hops(app)
# 2点間に直線を生成する関数を定義
@hops.component(
"/create_line", # Hopsでのパス
name="Create Line", # Grasshopperで表示される名前
inputs=[
hs.HopsPoint("Start", "S", "Start point of the line", hs.HopsParamAccess.ITEM),
hs.HopsPoint("End", "E", "End point of the line", hs.HopsParamAccess.ITEM)
],
outputs=[
hs.HopsCurve("Line", "L", "Generated line")
]
)
def create_line(start, end):
# 2点間に線を作成
line = rhino3dm.Line(start, end)
return line.ToNurbsCurve()
# サーバーを起動
if __name__ == "__main__":
app.run()
スクリプトのポイント
@hops.componentデコレータを使い、2つのポイント(StartとEnd)を入力として受け取り、それらを結ぶ線を出力します。inputsとして2つのPoint(開始点と終了点)を指定し、outputsとして生成された線のNurbs曲線をGrasshopperに返します。- Rhinoの3Dモデリングライブラリである
rhino3dmを使って、指定された2点を結ぶ線を生成しています。
ステップ2: Hopsサーバーの起動
- 上記のPythonスクリプトをローカルマシンに保存します(例:
line.py)。 - Pythonスクリプトを実行してローカルサーバーを立ち上げます。
python line.py
サーバーが起動し、http://127.0.0.1:5000/create_lineが使用可能になります。
ステップ3: GrasshopperでHopsコンポーネントを設定
- Grasshopperを開き、
Hopsコンポーネントを追加します。 Hopsコンポーネントのプロパティで、Pathにローカルサーバーのエンドポイントhttp://127.0.0.1:5000/create_lineを設定します。- Hopsの入力に「Start」と「End」パラメーターを追加し、各パラメーターにGrasshopper内の点を指定します。
- 実行すると、2点を結ぶ直線が描画されるはずです。
ステップ4: 結果の確
Grasshopper内で指定した開始点と終了点を結ぶ直線が描画されていることが確認できるはずです。入力点を変更することで、リアルタイムで線が再描画されます。
コードの説明
初心者にもわかりやすく、GrasshopperでHopsを使い、CPythonでRhino 8に線を描画するコードを詳しく説明します。
全体の流れ
- GrasshopperのHopsコンポーネントを使って、Pythonで書かれた関数を呼び出します。
- Pythonのコードは、FlaskというWebサーバーを立ち上げ、Hops経由でGrasshopperからリクエストを受け付け、処理結果を返します。
- Rhinoの3Dライブラリである
rhino3dmを使い、2つの点から線を生成します。
Pythonコードの解説
import ghhops_server as hs
from flask import Flask
import rhino3dm
まず、必要なライブラリをインポートします。
ghhops_server:GrasshopperとPythonをつなげるためのライブラリです。flask:Webサーバーを作るためのライブラリです。これで、PythonがHopsからのリクエストを受け取ることができます。rhino3dm:Rhinoの3Dオブジェクトを扱うためのライブラリです。これを使って線や円を作ります。
# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)
# Hopsサーバーのインスタンスを作成し、Flaskアプリケーションと紐付ける
hops = hs.Hops(app)
app = Flask(__name__):Flaskサーバーのインスタンスを作成します。このサーバーが、PythonコードをWeb経由でアクセスできるようにします。hops = hs.Hops(app):ghhops_serverを使って、FlaskサーバーにHopsを連携させます。これでGrasshopperがPythonのコードを呼び出せるようになります。
# 2点間に直線を生成する関数を定義
@hops.component(
"/create_line", # Hopsでのパス
name="Create Line", # Grasshopperで表示される名前
inputs=[
hs.HopsPoint("Start", "S", "Start point of the line", hs.HopsParamAccess.ITEM),
hs.HopsPoint("End", "E", "End point of the line", hs.HopsParamAccess.ITEM)
],
outputs=[
hs.HopsCurve("Line", "L", "Generated line")
]
)
@hops.componentは、Pythonの関数をHops(Grasshopper)で呼び出せるようにするデコレーションです。"/create_line"は、Flaskサーバー上でこの関数にアクセスするためのURLパスです。inputsに、2つの「ポイント」(始点と終点)を指定しています。HopsPointはGrasshopperから送られてくる点のデータです。"Start"は、始点を表すラベル。"End"は、終点を表すラベル。outputsには、作成された線(HopsCurve)を指定しています。
def create_line(start, end):
# 2点間に線を作成
line = rhino3dm.Line(start, end)
return line.ToNurbsCurve()
def create_line(start, end):この関数が、2点間に線を引くロジックを担当します。startは線の始点、endは線の終点です。line = rhino3dm.Line(start, end):rhino3dm.Lineを使って、指定した2つの点(startとend)を結ぶ線を生成します。return line.ToNurbsCurve():生成した線をNurbs曲線に変換して、Grasshopperに返します。GrasshopperはNurbs曲線形式で形状を処理します。
# サーバーを起動
if __name__ == "__main__":
app.run()
app.run():この行で、Flaskサーバーが起動します。このサーバーが、http://127.0.0.1:5000/create_lineというURLでGrasshopperからのリクエストを待ち受けるようになります。
Grasshopper側の設定
- GrasshopperでHopsコンポーネントを追加します。
- Pathの部分に、
http://127.0.0.1:5000/create_lineと入力します。これでGrasshopperがPythonのcreate_line関数にアクセスできます。 - Hopsの入力に「Start」と「End」パラメータを追加し、Grasshopper内で2つのポイントを指定します。
- 実行すると、指定した2点を結ぶ線が描画されます。
まとめ
- GrasshopperのHopsコンポーネントを使って、CPythonで作成した関数を簡単に呼び出せます。
- 今回は2点間の線を描画しましたが、同じ方法で他の形状も作成できます。
この方法を使うことで、Pythonで自由に形状生成のロジックを組み立て、それをGrasshopperで視覚化することができます。