Rhino+Grasshopper

インテリア自動設計|【Grasshopper+Python】CurveOverlapFilter_2:2つの曲線の重なりを検出するコンポーネント

はじめに

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

コードの説明

  1. ライブラリのインポート
   import Rhino.Geometry as rg
   import scriptcontext as sc
  • Rhino.Geometry はRhinoのジオメトリクラスを操作するためのライブラリで、曲線の計算や処理に使用します。
  • scriptcontext は、Rhinoのスクリプトコンテキストを扱うためのモジュールです。
  1. 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を返します。
  1. 曲線の重なりをチェックする関数
   def curves_overlap(crv, crvs, tolerance):
       ...
  • 引数crvはチェック対象の曲線、crvsは比較対象の曲線リスト、toleranceは交差判定に使用する許容誤差です。
  • 曲線間の交差をチェックし、交差があればTrueを返します。
  1. 許容誤差の設定
   tolerance = 0.001
  • 曲線間の交差判定に使用する許容誤差を定義します。
  1. フィルタリングの実行
   filtered_curves = []
   for crv in Crv1:
       if not curves_overlap(crv, Crv2, tolerance):
           filtered_curves.append(crv)
  • Crv1リストに含まれる各曲線が、Crv2リストのいずれの曲線とも重ならない場合、filtered_curvesリストに追加されます。
  1. 出力
   Crv = filtered_curves
  • 最終的に、重ならない曲線のリストCrvが出力されます。

まとめ

「CurveFilter」コンポーネントを使用することで、Rhino内の曲線データを効果的にフィルタリングできます。このコンポーネントは、重なりのないデザインを求める際に非常に有用です。RhinoとGrasshopperの組み合わせを活用することで、複雑なジオメトリの管理や設計の効率を大幅に向上させることができます。

-Rhino+Grasshopper
-,