【集中講座】Grasshopper: 重い処理の実行前確認

Grasshopperは、パラメータなどを変更した際に即処理が実行され、その変化を3次元的に確認できるリアルタイム性が特徴です。

しかし、重い処理が含まれていた場合はこれが逆にデメリットになります。
パラメータ1つ変えるたびに数分・数十分・内容によっては1時間以上待つという経験がある方もいるのではないでしょうか。

今回は予期できる重い処理がある場合に、実行前に確認できるようにしてみようという話です。

StreamGateによる分岐

まず、Grasshopperをある程度使ったことがあるという方が、重い処理がある場合に思いつくのがこの方法かと思います。こちらについては過去の記事でも紹介しています。

StreamGateのG端子にToggle、S端子に通したいデータを入力することで、
ToggleのTrue/Falseに応じて出力端子を分岐できるのでスイッチ代わりにできます。

主な使い方は下図のようなイメージです。
計算したいときだけTrueにします。必要ないときにFalseにしておくことで余計な待ち時間を減らせます。

DisableSolverとコンポーネントのDisable

これらも過去の同一記事で紹介済みですがおさらいです。

DisableSolverはGrasshopperの処理自体を一時的に止める機能です。
パラメータ変更やワイヤの付け替えなどを安全に行えます。
マウスホイールボタンをクリック⇒ホイールメニューの鍵マークを選択でロックでき、
解除するときも同様の操作です。

コンポーネントのDisableは、コンポーネント単位で処理を止める方法です。
対象コンポーネントの上で右クリックしてEnabledを選択、またはCtrl+Eで切替可能です。

自作スクリプトによる事前確認

ここからが本題です。

上述のStreamGateやDisableである程度は対策できるのですが、急いでいたり、ちょっと気を抜くと、ToggleオフやDisable切替を結構忘れがちです。

忘れたままだと、複数変更しようとしていたパラメータの内、最初の一個だけ変更した時点で重い処理が走って数分待つ、全然関係ない場所のワイヤをちょっと付け替えようとしただけなのに重い処理が走って数十分待つ、、
などなどちょっとした作業のつもりが大幅な時間ロスや、場合によっては強制終了せざるをえず、かつ保存もできていなくてそこまでのデータが無くなってしまうなんてことも。。

他にありがちなのが、ToggleがTrueのまま保存してファイル終了したら、次に開くときにファイルを開いた瞬間に重い計算が走り、いきなり待たされます。
(これは開く前にDisableSolverしておくことで回避できますが、一旦気づかず開いてしまうと強制終了するなど時間的・精神的なロスが多少あります)

これらを回避するために、C#スクリプトで下記のような仕様のコンポーネントを作成してみます。

<設計仕様>
・データがないときはスルー
・データを受け取ったときにメッセージボックスを出して「はい」のときだけデータを流す

以下がコードの例です。

using System.Windows.Forms;

public class Script_Instance : GH_ScriptInstance
{
    private void RunScript(string N, DataTree<object> X, ref object A)
    {
        // 入力が無ければそのまま何もしない
        if (X == null || X.DataCount == 0) {
            A = null;
            return;
        }
        DialogResult result = DialogResult.No;
        RhinoApp.InvokeOnUiThread((Action)(() => {
            result = MessageBox.Show(
            $"この後の <{N}> の計算には時間がかかります。\n本当に計算を実行しますか?",
            "Grasshopper 確認",
            MessageBoxButtons.YesNo,
            MessageBoxIcon.Warning,
            MessageBoxDefaultButton.Button2 // デフォルトは「いいえ」
            );
        }));
        if (result == DialogResult.Yes)
            A = X;
        else
            A = null;
    }
}

端子のデータアクセスはTree Access必須です。そうしないとデータ数と同じ数のメッセージボックスが出てきてしまいます。

どのコンポーネントから出たメッセージボックスかわかるように名前を入力できるようにしています。

これを重い処理が発生するコンポーネントの直前に挟みます。
実行すると確認画面が出てきて「はい」を押すと計算実行、「いいえ」を押すとそこでデータの流れをストップすることができます。

あまりたくさん置きすぎるとメッセージボックスだらけになるのでおすすめできませんが、ここぞという処理の保険にはなると思いますので、困っている方は参考にしてみてください。

こちらのボタンからサンプルデータをダウンロードいただけます。