Translate

2018年12月13日木曜日

誰も教えてくれないImageJの使い方(というかマクロの使い方)その2 マクロからマクロを呼ぶ

マクロから他のマクロを呼ぶ場合は二通りある。

  1. pluginsフォルダーにいれて、runコマンドで呼び出す
  2. macrosフォルダーにいれて、runMacroコマンドで呼び出す

簡単なのはマクロをmacrosフォルダーではなくpluginsフォルダーに置いて、
run(macroName, dialogParameter);

で呼ぶ。この時、呼ばれる側のマクロがDialogを開く設定にしておけば、dialogParameterに必要な引数を渡せば、呼び出される側にパラメータを渡すことができる。dialogParameterの記述方法を知るには、Recorederを使って記録しておけばよい。
例えば例として以下のようなマクロを考えてみる。
/*
 * add_Test.ijm
 */
Dialog.create("add test");
Dialog.addNumber("a", 1);
Dialog.addNumber("b", 1);
Dialog.show()
a = Dialog.getNumber();
b = Dialog.getNumber();
print("a + b = ", a + b);

このマクロをpluginsフォルダーに保存して、pluginメニューから実行すると、Recorderには以下のように記録される。
run("add Test", "a=1 b=1");

このようにDialogを開くようにしておけば、パラメータとして引数を渡すことができる。ちなみにPluginを作る際にもこのテクニックは利用できる。

しかし、この方法ではパラメータを与えることはできても受け取ることはできない (returnが使えない)。従って、例えば呼び出す側で
ret = run("add Test", "a=1 b=1");
と書いてもエラーがでる。

引数を受け取ることのできるようにするには、runではなくrunMacro(macroName, parameter)で呼び出す。ただし、上記のようにDialogのパラメータとして直接渡すことはできないし、呼び出すとDialogが開いてしまう。そこで、呼び出される側のマクロ (ここではadd_Test.ijm)を次のようにする。
/*
 * add_Test.ijm
 */

arg = getArgument();
if (arg == "") {
 Dialog.create("add test");
 Dialog.addNumber("a", 1);
 Dialog.addNumber("b", 1);
 Dialog.show()
 a = Dialog.getNumber();
 b = Dialog.getNumber();
} else {
 items = split(arg, ",");
 a = parseInt(items[0]);
 b = parseInt(items[1]);
}
return toString(a+b);
getArgument()は、このマクロが別のマクロから呼び出された場合、parameterで指定した文字列が入る。そこで、もしこの文字列が空の場合はDialogを開くように設定することで、このマクロ単体でも実行チェックを行うことができる。
argにparameterが入っていれば、そこから要素を取り出す。渡すことのできるのは一つの文字列なので、例えば","で各パラメータを区切ってやる。そこから各要素をとりだすために、
items = split(arg, ",");

を行うと、各要素をitems配列に返してくれる。あとは、各要素を取り出してやればよい(数値ならparseIntや parseFloatを使う)。
さらに、結果を
return toString(a+b);

で文字列として返してやることができる(マクロの場合のパラメータのやりとりは常に文字列のみ)。こうすれば、呼び出す側で例えば
ret = runMacro("add_Test.ijm", "1,1");

としてやれば、retに結果を文字列として返すことができる。

まとめると、お手軽なのはpluginsフォルダーに入れる方法だが、後々のことを考えると、runMacroで呼び出せるようにしておいた方がよいと思う。

0 件のコメント:

コメントを投稿