はじめに
Grasshopperは、Rhinoの強力なビジュアルプログラミングツールであり、デザインの自動化や最適化に役立つさまざまなコンポーネントを作成することができます。本記事では、「CurveFilter」と名付けたGrasshopper Pythonコンポーネントのコードを解説し、重なりのない曲線をフィルタリングする方法について詳しく見ていきます。
コードの全体像
import Rhino.Geometry as rg
import scriptcontext as sc
# GUIDをRhinoのCurveオブジェクトに変換する関数
def guid_to_curve(guid):
obj = sc.doc.Objects.Find(guid)
if obj and isinstance(obj.Geometry, rg.Curve):
return obj.Geometry
return None
# 入力 (Crv1, Crv2,)はすべてリストで提供されると仮定
# Crv1: List of curves (as GUIDs) to be filtered
# Tolerance: 衝突判定の許容誤差
def curves_overlap(crv, crvs, tolerance):
# GUIDからCurveに変換
crv_geom = guid_to_curve(crv)
if crv_geom is None:
return False
# 曲線間の交差をチェック
for other_crv in crvs:
other_crv_geom = guid_to_curve(other_crv)
if other_crv_geom is None:
continue
# 曲線間の交差イベントを取得
intersections = rg.Intersect.Intersection.CurveCurve(crv_geom, other_crv_geom, tolerance, tolerance)
if intersections.Count > 0:
return True
return False
# 許容誤差 (交差の判定に使用)
tolerance = 0.001
# 結果を保持するリスト
filtered_curves = []
# Crv1から重ならない曲線をフィルタリング
for crv in Crv1:
if not curves_overlap(crv, Crv2, tolerance):
filtered_curves.append(crv)
# 出力
Crv = filtered_curves
コードの説明
- ライブラリのインポート
import Rhino.Geometry as rg
import scriptcontext as sc
Rhino.GeometryはRhinoのジオメトリクラスを操作するためのライブラリで、曲線の計算や処理に使用します。scriptcontextは、Rhinoのスクリプトコンテキストを扱うためのモジュールです。
- GUIDを曲線オブジェクトに変換する関数
def guid_to_curve(guid):
obj = sc.doc.Objects.Find(guid)
if obj and isinstance(obj.Geometry, rg.Curve):
return obj.Geometry
return None
- GUID(Globally Unique Identifier)からRhinoのCurveオブジェクトを取得します。Curve以外のジオメトリの場合はNoneを返します。
- 曲線の重なりをチェックする関数
def curves_overlap(crv, crvs, tolerance):
...
- 引数
crvはチェック対象の曲線、crvsは比較対象の曲線リスト、toleranceは交差判定に使用する許容誤差です。 - 曲線間の交差をチェックし、交差があれば
Trueを返します。
- 許容誤差の設定
tolerance = 0.001
- 曲線間の交差判定に使用する許容誤差を定義します。
- フィルタリングの実行
filtered_curves = []
for crv in Crv1:
if not curves_overlap(crv, Crv2, tolerance):
filtered_curves.append(crv)
Crv1リストに含まれる各曲線が、Crv2リストのいずれの曲線とも重ならない場合、filtered_curvesリストに追加されます。
- 出力
Crv = filtered_curves
- 最終的に、重ならない曲線のリスト
Crvが出力されます。
まとめ
「CurveFilter」コンポーネントを使用することで、Rhino内の曲線データを効果的にフィルタリングできます。このコンポーネントは、重なりのないデザインを求める際に非常に有用です。RhinoとGrasshopperの組み合わせを活用することで、複雑なジオメトリの管理や設計の効率を大幅に向上させることができます。