🐥

[Grasshopper]C#で書くKeyListener

2020/09/20に公開

初めまして。qujenと申します。初投稿なので軽い記事から書こうと思います

対象

Nurbs系モデリングソフトであるRhinocerosのプラグインであるビジュアルスクリプトツールGrasshopperを扱っているかた

やること

目標成果物

こんな感じのものを作ろうと思います

何の役に立つの

Grasshopperはビジュアルスクリプティングのその特性上、コードが複雑化していくと、だんだんと横に広くなっていきます。

そんなときに、こんな感じでボタンで繋がれているものがあるとすると結構探すのがめんどくさかったりするんですね。何がどんな役割かもわからなくなってしまいます。

そういうときにキーによってTrue/Falseで出力できるようにしておけばいちいち戻る必要がなくなります。最初にPanelかなにかで【F7 Hogehoge】みたいに書いておけば共有のとき楽です。
今回はキーイベントを取ってくるだけにとどめるので、そのままでは使えませんが自由にカスタマイズしてください。

実装

まずは検出するキーをリスト化しておきます。すべてのキーに反応させちゃうともともとのGrasshopperのホットキー押すたびに反応しても使いにくいので
ここはC#コンポーネントの// <Custome additional code>以降に書いてください

  List<Keys> keysToListenFor = new List<Keys>(){
      Keys.F8,
      Keys.F7
      };

このまま、Keyが押されたときとKeyがあげられたときのEventHandlerを書いていきます。

  void KeyDownEventHandler(object sender, KeyEventArgs e){
    keyval = e.KeyCode;
    if(keysToListenFor.Contains(e.KeyCode)){
      Component.ExpireSolution(true);
    }
  }
  
  void KeyUpEventHandler(object sender, KeyEventArgs e){
    keyval = null;
    if(keysToListenFor.Contains(e.KeyCode)){
      Component.ExpireSolution(true);
    }
  }

Keys? keyval;をどこか適当な行に書いておいてください。

あとは本体を書いていきます。念のためにオンオフできるようにしておきましょう。こんな感じ

	  private void RunScript(bool active, ref object A)
  {
    Grasshopper.Instances.DocumentEditor.KeyDown -= new KeyEventHandler(KeyDownEventHandler);
    Grasshopper.Instances.DocumentEditor.KeyUp -= new KeyEventHandler(KeyUpEventHandler);
    if(active){
      Grasshopper.Instances.DocumentEditor.KeyDown += new KeyEventHandler(KeyDownEventHandler);
      Grasshopper.Instances.DocumentEditor.KeyUp += new KeyEventHandler(KeyUpEventHandler);
    }
    A = keyval;
  }

これで完成です。こんな感じで簡単にKeyListenerを実装することができます。

Discussion