Rhino+Grasshopper

インテリア自動設計|【Grasshopper+Python】スライダーで動的にRhinoビューポートをキャプチャし任意のフォルダに保存する方法

はじめに

Grasshopperは、Rhinoのビジュアルプログラミング環境として、様々なデザインプロセスを自動化するために活用されています。この記事では、Grasshopper上でスライダーの値をトリガーとして、Rhinoのビューポートのスクリーンショットを動的に保存するPythonスクリプトの仕組みを紹介します。

スクリプトの概要

このスクリプトは、ユーザーがGrasshopperのスライダーで指定した値を利用して、Rhinoのビューポートをキャプチャし、指定のフォルダにPNG形式で保存します。さらに、前回のスライダー値と比較して変化があった場合にのみキャプチャを実行することで、無駄な画像生成を防ぎます。

コードの詳細な説明

ライブラリのインポート
import Rhino
import scriptcontext as sc
import System
import os

ここでは、RhinoのAPIとGrasshopperのスクリプト環境(scriptcontext)、およびシステム操作に必要な標準ライブラリのosをインポートしています。

スライダー値の保持
if 'previous_value' not in sc.sticky:
    sc.sticky['previous_value'] = None

Grasshopperは基本的に毎回スクリプトが再実行されるため、前回のスライダー値を保持する必要があります。これには、scriptcontextsticky辞書を使用します。stickyは、Grasshopperのセッション中に持続的なデータを保持するのに便利です。

画像キャプチャ関数
def capture_image(slider_value, folder_path):
    if not os.path.exists(folder_path):
        raise ValueError("指定されたフォルダーパスが存在しません。")

    filename = os.path.join(folder_path, "pattern_{}.png".format(slider_value))

    view = sc.doc.Views.ActiveView
    capture = Rhino.Display.ViewCapture()
    capture.Width = view.ActiveViewport.Size.Width
    capture.Height = view.ActiveViewport.Size.Height
    capture.ScaleScreenItems = True
    capture.DrawAxes = False
    capture.DrawGrid = False
    capture.TransparentBackground = False

    bmp = capture.CaptureToBitmap(view)
    if bmp:
        bmp.Save(filename)

capture_image 関数は、スライダーの値(slider_value)を元に画像を保存するための処理を行います。

  1. フォルダーパスの確認: os.path.exists()でフォルダーパスの有効性を確認し、存在しない場合はエラーを発生させます。
  2. ファイル名の生成: スライダーの値に基づいて画像ファイル名を生成し、フォルダー内に保存します。ファイル名にはpattern_{slider_value}.pngというフォーマットが使用されます。
  3. ビューポートのキャプチャ: Rhinoのアクティブなビューポート(ActiveView)を取得し、ViewCaptureオブジェクトで画像をキャプチャします。キャプチャの設定では、ビューポートのサイズ、グリッドや軸の非表示、背景の透明化設定などを制御できます。
  4. 画像の保存: 最終的にキャプチャしたビットマップ画像を指定のファイルパスに保存します。
Grasshopperからの入力を処理
slider_value = System.Decimal(float(number))  # AutoSliderの出力を接続
folder_path = str(Folder_Path)  # フォルダーパスの入力を取得

Grasshopperから入力されたスライダーの値(number)とフォルダーパス(Folder_Path)をPythonスクリプトで処理します。System.Decimalを使用してスライダーの値を精密に扱い、フォルダーパスは文字列として処理されます。

キャプチャ実行条件
if sc.sticky['previous_value'] != slider_value:
    capture_image(slider_value, folder_path)
    sc.sticky['previous_value'] = slider_value

スライダーの値が前回と異なる場合にのみ、capture_image関数を呼び出し、画像のキャプチャを実行します。そして、sc.stickyに新しいスライダー値を保存し、次回の比較に備えます。

応用シーン

このスクリプトは、Rhinoのビューポートの変化に応じて自動的に画像を生成するため、デザインのバリエーションを効率的に記録したり、アニメーションのフレームを作成するのに最適です。例えば、建築設計のプロセスで異なるファサードのパターンを試し、それぞれのパターンに対してスクリーンショットを自動的に生成する場面などで役立ちます。

まとめ

今回紹介したスクリプトは、RhinoとGrasshopperを組み合わせて動的にビューポートをキャプチャし、デザインのプロセスを効率化する方法を実現します。シンプルなコードですが、設定を拡張すればさまざまな場面で応用可能です。

-Rhino+Grasshopper
-, ,