Как передать аргументы внутри функции в макросе imageJ?
Я хочу передать foldername в функцию run() и функцию save(), но они находятся в кавычках, и я не знаю, как передать имена переменных.
Я сгенерировал функции run() и save(), используя команду записи в imageJ.
Цель данной программы - автоматизировать процесс запуска плагина "T2 analysis mouse" на нескольких папках. Любые другие твиты или помощь будут оценены.
Я нашел этот источник в Интернете https://imagej.nih.gov/ij/macros/ArgumentPassingDemo.txt но он не работает.
Я пробовал несколько способов, включая /&foldername/3 T2
&filename/3 T2
/&foldername 3 T2``/&foldername3 T2
/&filename 3 T2``/&filename3 T2
Вот код, который я написал:
function makeT2(foldername)
{
filename = foldername;
print(filename);
run("T2 Analysis mouse", "select=[/Users/Vineeth/Desktop/New stuff Feb 5/&filename 3 T2]
image=[32-bit Signed] width=256 height=128 offset=0 number=902 gap=0 little-endian");
run("Save", "save=[/Users/Vineeth/Desktop/New stuff Feb 5/&foldername3 T2/T2map.tif]");
close();
}
folders = getFileList("/Users/Vineeth/Desktop/New stuff Feb 5/");
for( i = 0; i < folders.length; i++)
{
print(folders[i]);
file = getFileList("/Users/Vineeth/Desktop/New stuff Feb 5/" + folders[i]);
for( j = 0; j < file.length; j++)
{
if(file[j] == "3 T2/")
{
print("made t2 for " + folders[i] + file[j]);
makeT2(folders[i]);
}
}
}
Различные print()
функции предназначены для тестирования кода, и код в основном работает ожидаемо для функции makeT2.
Это ошибка:
java.lang.NullPointerException
at T2_Analysis_mouse.getImage(T2_Analysis_mouse.java:183)
at T2_Analysis_mouse.run(T2_Analysis_mouse.java:56)
at ij.IJ.runUserPlugIn(IJ.java:183)
at ij.IJ.runPlugIn(IJ.java:150)
at ij.Executer.runCommand(Executer.java:124)
at ij.Executer.run(Executer.java:61)
at ij.IJ.run(IJ.java:249)
at ij.macro.Functions.doRun(Functions.java:561)
at ij.macro.Functions.doFunction(Functions.java:79)
at ij.macro.Interpreter.doStatement(Interpreter.java:203)
at ij.macro.Interpreter.doBlock(Interpreter.java:518)
at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
at ij.macro.Interpreter.doStatement(Interpreter.java:206)
at ij.macro.Interpreter.doBlock(Interpreter.java:518)
at ij.macro.Interpreter.doStatement(Interpreter.java:239)
at ij.macro.Interpreter.doIf(Interpreter.java:852)
at ij.macro.Interpreter.doStatement(Interpreter.java:215)
at ij.macro.Interpreter.doBlock(Interpreter.java:518)
at ij.macro.Interpreter.doStatement(Interpreter.java:239)
at ij.macro.Interpreter.doFor(Interpreter.java:464)
at ij.macro.Interpreter.doStatement(Interpreter.java:221)
at ij.macro.Interpreter.doBlock(Interpreter.java:518)
at ij.macro.Interpreter.doStatement(Interpreter.java:239)
at ij.macro.Interpreter.doFor(Interpreter.java:464)
at ij.macro.Interpreter.doStatement(Interpreter.java:221)
at ij.macro.Interpreter.doStatements(Interpreter.java:191)
at ij.macro.Interpreter.run(Interpreter.java:102)
at ij.macro.Interpreter.run(Interpreter.java:72)
at ij.macro.MacroRunner.run(MacroRunner.java:124)
at java.lang.Thread.run(Thread.java:695)
а это логи после запуска програна:
LeeMouseOld_30Jan18.LH1/
made t2 for LeeMouseOld_30Jan18.LH1/3 T2/
LeeMouseOld_30Jan18.LH1/
Please choose a directory where the T1 or T2 folder is the last item in the path (i.e. 5_t1 or 6_t2)
Directory return for General T folder: /Users/Vineeth/Desktop/New stuff Feb 5/&filename 3 T2/
Please adjust import settings to:
Image type: 32-bit signed
Width: 128 pixels
Height: 256 pixels
Number of images: 50 images
Check Little-endian byte order
Как вы видете &filename
остается прежним, но я хочу, чтобы данные в переменной filename
быть на своем месте.
1 ответ
Используйте конкатенацию строк:
run("T2 Analysis mouse", "select=[/Users/Vineeth/Desktop/New stuff Feb 5/" + filename + " 3 T2]
image=[32-bit Signed] width=256 height=128 offset=0 number=902 gap=0 little-endian");
run("Save", "save=[/Users/Vineeth/Desktop/New stuff Feb 5/" + foldername + "3 T2/T2map.tif]");
Смотрите документацию по функциям макросов (выделение добавлено):
run ("команда"[, "опции"])
Выполняет команду меню ImageJ. Необязательный второй аргумент содержит значения, которые автоматически вводятся в диалоговые окна (должны быть GenericDialog или OpenDialog). Используйте Command Recorder (Плагины> Макросы> Запись) для генерации вызовов функций run(). Используйте конкатенацию строк для передачи переменной в качестве аргумента. В ImageJ 1.43 и более поздних версиях переменные можно передавать без объединения строк, добавляя "&" к имени переменной. Для примера, смотрите макрос ArgumentPassingDemo.
Упомянутый синтаксис &
не работает в квадратных скобках []
в строке опции.
Ряд вопросов на форуме ImageJ также обсуждают это.