読者です 読者をやめる 読者になる 読者になる

Igor Proで関数をメニューバーから呼び出す.たった3行で

はじめに

Igor Proで処理を自動化する際には①マクロを書く,②関数を書く,の二種類の方法があります. 現在では,高速に動作する,コンパイル時にエラーチェックが入る,といった理由でマクロより関数の利用が推奨されているようです*1

ただ,関数と比べたマクロの利点として,マクロを定義するとメニューバーの「マクロ」欄に名前が表示されてワンクリックで実行できるようになります.

関数も,マクロみたいにメニューバーから使えるようにならないかな? と思ったのが今回の動機です.

結論: 3行でOK

f:id:ryotako:20161123094421p:plain

調べてみたところ,思った以上に簡単に実現できることがわかりました. 以下の3行をどこか*2に書くと引数なしのユーザー定義関数がメニューバーから実行できるようになります.

Menu "Functions"
    FunctionList("*",";","KIND:2,NPARAMS:0")
End

メニューに;区切りのリストを渡すと複数のメニュー項目に展開されることを利用しています.KIND:2は(組み込み関数ではなく)自作関数の指定,NPARAMS:0は引数なしの関数の指定です. FunctionList関数の引数を工夫すると,いろいろと便利にできそうです.

// 例1: Renameで始まる名前の関数のみ表示
Menu "Rename"
    FunctionList("Rename*",";","KIND:2,NPARAMS:0")
End

// 例2: 特定のウィンドウで定義されている関数のみ表示
Menu "Experiment"
    FunctionList("*",";","KIND:2,NPARAMS:0,WIN:experiment.ipf")
End

追記 (2016/11/25)

単に関数を実行する以上のことをしたい場合は,GetLastUserMenuInfo操作関数を使うとよいようです.

// ユーザー定義関数の定義部分をメニューバーからワンクリックで表示
// (Windowsだとメニュー項目の数に制限があるようです)
Menu "Definitions"
    FunctionList("*",";","KIND:2"), DisplayDefinition()
End

Function DisplayDefinition()
    GetLastUserMenuInfo
    DisplayProcedure S_Value // 直前に選択したメニュー項目がS_Valueに格納されている
End 

*1:関数の中では直接呼び出せない操作関数(SetIgorOptionとか)もあるため,常に関数のほうがよいわけではないようです

*2:「Igor Procedures」フォルダに保存しておくと起動時に読み込まれるので便利