Apps WebApp

002-Rhino-Compute-TwistLine|Rhino ComputeとGrasshopperを使用して3Dモデルを生成

このアプリは、Rhino ComputeGrasshopper を使用して、3Dモデルを生成し、.3dm ファイルとして保存するプロセスを示しています。

具体的には、以下の手順で処理が行われます:

  1. 3D空間の定義: 原点(0, 0, 0)に半径5の円を作成し、回転角度を設定します。
  2. データの準備: 作成した円をNURBS曲線に変換し、回転角度とともにJSON形式でエンコードします。
  3. Grasshopperの評価: 作成したデータをGrasshopperの定義ファイル (twisty.gh) に入力し、評価結果を取得します。
  4. 結果のデコード: Grasshopperから返された出力データをデコードし、3Dラインデータを取得します。
  5. 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

-Apps, WebApp
-,