概要
この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つのボタンの動作をそれぞれ実装しています。
- スタートボタンを押すと、
runningがTrueとなり、カウントが始まります。 - ストップボタンを押すと、カウントが一時停止します。
- リセットボタンを押すと、カウントが0にリセットされ、カウントの動作も停止します。
4. カウントの進行
if sc.sticky['running']:
if sc.sticky['counter'] < number:
time.sleep(interval) # 指定された時間だけ待機
sc.sticky['counter'] += 1
else:
sc.sticky['running'] = False
runningがTrueの間はカウントが進行します。counterがユーザー指定のnumberに達するまで、intervalで指定された時間だけ待機し、その後counterが1ずつ増加します。目標値に達するとrunningがFalseに変更され、カウントが終了します。
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を使って実現しています。