このアプリは、Rhino Compute と Grasshopper を使用して、3Dモデルを生成し、.3dm ファイルとして保存するプロセスを示しています。
具体的には、以下の手順で処理が行われます:
- 3D空間の定義: 原点(0, 0, 0)に半径5の円を作成し、回転角度を設定します。
- データの準備: 作成した円をNURBS曲線に変換し、回転角度とともにJSON形式でエンコードします。
- Grasshopperの評価: 作成したデータをGrasshopperの定義ファイル (
twisty.gh) に入力し、評価結果を取得します。 - 結果のデコード: Grasshopperから返された出力データをデコードし、3Dラインデータを取得します。
- 3Dモデルの保存: 得られたラインをRhino3D形式のオブジェクトとしてファイルに追加し、twisty.3dm という名前で保存します。
このコードは、Rhino3Dの機能を活用し、PythonからGrasshopperの定義を動的に処理する方法を示しており、特に3Dモデリングとデータのインタラクションに役立ちます。
生成されたRhinoファイル:twisty.3dm

RhinoComputeで読み込むGHファイル:twisty.gh


Pythonコード解説
# -*- coding: utf-8 -*-
# この行はファイルのエンコーディングを指定しています。UTF-8形式でソースコードを保存します。
import compute_rhino3d.Util # Rhino Computeのユーティリティモジュールをインポート
import compute_rhino3d.Grasshopper as gh # Grasshopperの機能を利用するためのモジュールをインポート
import rhino3dm # Rhino3Dのデータ操作用のライブラリをインポート
import json # JSONデータのエンコード/デコードを行うための標準ライブラリ
# Rhino ComputeのURLを設定
compute_rhino3d.Util.url = "http://localhost:6500/"
# APIキーが必要な場合は、ここで設定することができます
# compute_rhino3d.Util.apiKey = ""
# 3D空間内のポイントを定義 (原点)
pt1 = rhino3dm.Point3d(0, 0, 0)
# 半径5の円を作成
circle = rhino3dm.Circle(pt1, 5)
# 回転角度を設定 (度数法)
angle = 110
# 円をNURBS曲線に変換し、JSON形式にエンコード
curve = json.dumps(circle.ToNurbsCurve().Encode())
# Grasshopperの入力データをツリー構造で作成
curve_tree = gh.DataTree("curve") # 曲線のデータツリーを作成
curve_tree.Append([0], [curve]) # 曲線データをツリーに追加
rotate_tree = gh.DataTree("rotate") # 回転角度のデータツリーを作成
rotate_tree.Append([0], [angle]) # 回転角度データをツリーに追加
# 作成した入力ツリーをリストにまとめる
trees = [curve_tree, rotate_tree]
# Grasshopperの定義ファイル 'twisty.gh' を評価
output = gh.EvaluateDefinition('twisty.gh', trees)
print(output) # 評価結果を出力
# 結果をデコード
branch = output['values'][0]['InnerTree']['{0;0}'] # 出力データから必要な部分を抽出
# デコードされたデータをLineCurveオブジェクトに変換
lines = [rhino3dm.CommonObject.Decode(json.loads(item['data'])) for item in branch]
# 出力するファイル名を設定
filename = 'twisty.3dm'
# 生成されたライン数とファイル名を出力
print('Writing {} lines to {}'.format(len(lines), filename))
# 3dmファイルを作成
model = rhino3dm.File3dm()
for l in lines:
model.Objects.AddCurve(l) # LineCurvesを3Dモデルに追加
# 3dmファイルとして保存
model.Write(filename)
このコードは、Rhino ComputeとGrasshopperを使って3Dモデルを生成し、それをtwisty.3dmという名前で保存するプロセスを示しています。具体的には、Rhino3Dのライブラリを使用して円を生成し、回転させ、Grasshopperで処理を実行し、その結果を3Dモデルとしてファイルに保存します。以下にコードの各部分について解説します。
1. エンコーディング指定
# -*- coding: utf-8 -*-
# この行はファイルのエンコーディングを指定しています。UTF-8形式でソースコードを保存します。
- Pythonファイルの文字エンコーディングをUTF-8に指定しています。これにより、日本語などの非ASCII文字を正しく扱うことができます。
2. 必要なライブラリのインポート
import compute_rhino3d.Util # Rhino Computeのユーティリティモジュールをインポート
import compute_rhino3d.Grasshopper as gh # Grasshopperの機能を利用するためのモジュールをインポート
import rhino3dm # Rhino3Dのデータ操作用のライブラリをインポート
import json # JSONデータのエンコード/デコードを行うための標準ライブラリ
compute_rhino3d.Util: Rhino Computeを利用するためのユーティリティ関数を提供します。compute_rhino3d.Grasshopper: Grasshopperの定義をPythonから操作するためのモジュールです。rhino3dm: Rhinoの3Dオブジェクト(点、曲線、メッシュなど)を操作するためのライブラリです。json: JSONデータのエンコードおよびデコードを行う標準ライブラリです。
3. Rhino Computeの設定
# Rhino ComputeのURLを設定
compute_rhino3d.Util.url = "http://localhost:6500/"
# APIキーが必要な場合は、ここで設定することができます
# compute_rhino3d.Util.apiKey = ""
compute_rhino3d.Util.urlでRhino ComputeサーバのURLを設定します。localhost:6500はローカルで実行中のサーバを指します。もしAPIキーが必要であれば、コメントアウトされた行で設定できます。
4. 3D空間の設定と円の生成
# 3D空間内のポイントを定義 (原点)
pt1 = rhino3dm.Point3d(0, 0, 0)
# 半径5の円を作成
circle = rhino3dm.Circle(pt1, 5)
rhino3dm.Point3d(0, 0, 0)で原点(0,0,0)の3Dポイントを作成します。rhino3dm.Circle(pt1, 5)で半径5の円を原点に作成します。
5. 回転角度の設定
# 回転角度を設定 (度数法)
angle = 110
- ここでは円を回転させる角度を110度に設定しています。
6. 円をNURBS曲線に変換し、JSON形式でエンコード
# 円をNURBS曲線に変換し、JSON形式にエンコード
curve = json.dumps(circle.ToNurbsCurve().Encode())
circle.ToNurbsCurve()で円をNURBS曲線に変換し、その後Encode()で内部表現を取得します。json.dumps()でこのデータをJSON形式にエンコードしています。この形式はGrasshopperでの処理に適した形です。
7. Grasshopperの入力データツリー作成
# Grasshopperの入力データをツリー構造で作成
curve_tree = gh.DataTree("curve") # 曲線のデータツリーを作成
curve_tree.Append([0], [curve]) # 曲線データをツリーに追加
rotate_tree = gh.DataTree("rotate") # 回転角度のデータツリーを作成
rotate_tree.Append([0], [angle]) # 回転角度データをツリーに追加
gh.DataTree("curve")とgh.DataTree("rotate")でGrasshopper用の入力データツリーを作成します。curve_tree.Append([0], [curve])で円の曲線データを、rotate_tree.Append([0], [angle])で回転角度をそれぞれ追加します。
8. Grasshopperの定義ファイルを評価
# 作成した入力ツリーをリストにまとめる
trees = [curve_tree, rotate_tree]
# Grasshopperの定義ファイル 'twisty.gh' を評価
output = gh.EvaluateDefinition('twisty.gh', trees)
print(output) # 評価結果を出力
- 作成したデータツリーを
treesリストにまとめ、gh.EvaluateDefinitionでGrasshopperの定義ファイル(twisty.gh)を評価します。このファイルには、回転を適用した円の変形を定義していると考えられます。
9. 出力結果のデコード
# 結果をデコード
branch = output['values'][0]['InnerTree']['{0;0}'] # 出力データから必要な部分を抽出
# デコードされたデータをLineCurveオブジェクトに変換
lines = [rhino3dm.CommonObject.Decode(json.loads(item['data'])) for item in branch]
- Grasshopperの出力結果から必要なデータを抽出し、そのデータを
json.loadsでデコードして、Rhino3Dで扱えるLineCurveオブジェクトに変換しています。
10. 3Dモデルの保存
# 出力するファイル名を設定
filename = 'twisty.3dm'
# 生成されたライン数とファイル名を出力
print('Writing {} lines to {}'.format(len(lines), filename))
# 3dmファイルを作成
model = rhino3dm.File3dm()
for l in lines:
model.Objects.AddCurve(l) # LineCurvesを3Dモデルに追加
# 3dmファイルとして保存
model.Write(filename)
filenameで保存するファイル名を設定します。rhino3dm.File3dm()で新しい3Dモデルを作成し、linesに含まれるラインを3Dモデルに追加します。- 最後に、
model.Write(filename)で3Dモデルをtwisty.3dmというファイル名で保存します。
まとめ
このコードは、Rhino ComputeとGrasshopperを使って3Dモデルを生成し、JSONデータを通じてRhino3Dのオブジェクトを操作する方法を示しています。まず円を定義し、それをGrasshopperの定義ファイルで回転させ、得られたラインをRhino3D形式で保存する流れです。
参考
https://github.com/mcneel/rhino-developer-samples/tree/8/compute/py/SampleTkinter