Rhino+Grasshopper

インテリア自動設計|【Grasshopper+Python】動的カスタムタイマーカウンターの実装方法

概要

このGrasshopper Pythonスクリプトは、ユーザーが指定した範囲内で数値をカウントするカスタムカウンターを構築します。指定したインターバル(秒数)でタイマーを使い、カウントアップを行います。ユーザーがスタートボタンを押すとカウントが開始され、ストップボタンで一時停止、リセットボタンでカウントをゼロにリセットすることができます。

コードの詳細解説

1. 初期化

if 'counter' not in sc.sticky:
    sc.sticky['counter'] = 0
if 'running' not in sc.sticky:
    sc.sticky['running'] = False

Grasshopperのコンポーネントは再実行されることが多いため、sc.stickyという辞書を使用してコンポーネントの状態を保持しています。ここでは、counter(カウンターの現在値)とrunning(カウンターが動作中かどうか)を初期化します。

2. 入力の処理

if number is None:
    number = 0
if interval is None:
    interval = 1  # デフォルトのinterval値(1秒)

ユーザーが指定した「カウントの最大値」と「インターバル」(秒数)が設定されます。もし入力が空なら、numberにはデフォルトで0が、intervalには1秒が設定されます。

3. ボタン入力の処理

if start_button:
    sc.sticky['running'] = True
if stop_button:
    sc.sticky['running'] = False
if reset_button:
    sc.sticky['counter'] = 0
    sc.sticky['running'] = False

3つのボタンの動作をそれぞれ実装しています。

  • スタートボタンを押すと、runningTrueとなり、カウントが始まります。
  • ストップボタンを押すと、カウントが一時停止します。
  • リセットボタンを押すと、カウントが0にリセットされ、カウントの動作も停止します。

4. カウントの進行

if sc.sticky['running']:
    if sc.sticky['counter'] < number:
        time.sleep(interval)  # 指定された時間だけ待機
        sc.sticky['counter'] += 1
    else:
        sc.sticky['running'] = False

runningTrueの間はカウントが進行します。counterがユーザー指定のnumberに達するまで、intervalで指定された時間だけ待機し、その後counterが1ずつ増加します。目標値に達するとrunningFalseに変更され、カウントが終了します。

5. 出力

output_number = sc.sticky['counter']

現在のカウント値(counter)を出力します。この値はカウントが進行するたびに更新され、ユーザーにリアルタイムで表示されます。

6. Grasshopper上でのタイマー更新

ghdoc = ghenv.Component.OnPingDocument()
ghdoc.ScheduleSolution(100, gh.Kernel.GH_Document.GH_ScheduleDelegate(lambda doc: ghenv.Component.ExpireSolution(True)))

Grasshopperは通常自動的にPythonスクリプトの実行を更新しません。そのため、この行で一定の間隔(100ミリ秒)ごとにコンポーネントの更新をスケジュールし、結果が反映されるようにしています。

応用例

このスクリプトは、アニメーションやリアルタイムのフィードバックを必要とするプロジェクトに非常に役立ちます。例えば、逐次的なレンダリングや段階的なパラメータの変化を表現したい場合に、このタイマーカウンターを使用することでスムーズに処理が可能です。また、ユーザーが操作するインターフェースとしても利用でき、直感的な操作が可能です。

まとめ

このカスタムタイマーカウンターは、シンプルでありながら非常に柔軟に応用できるスクリプトです。Grasshopperの標準的な機能だけでは実現できない動的なプロセスを、Pythonのスリープ機能とsc.stickyを使って実現しています。

-Rhino+Grasshopper
-,