У меня есть плагин Java для более крупного приложения, которое выполняет анализ изображений с использованием библиотеки ImageJ. Один клиент, который переключился на наше программное обеспечение, использовал Groovy сценарии для определения определенных c правил и параметров, когда они выполняют анализ в ImageJ. Они хотели бы, чтобы наше программное обеспечение могло принимать сценарии Groovy, так как они будут работать в рамках нашего GUI, а также ImageJ.
Они предоставят письменный сценарий. groovy к плагину, но я не всегда буду точно знать, какие параметры, методы и классы присутствуют и какие изменения в logi c находятся в файле. groovy.
Я изучал документацию GroovyClassLoader
, и после ссылки Groovy в действии, 2-е издание у меня есть лучшее представление о том, как создавать и отправлять привязки и еще много чего, но Я не могу понять, с чего начать писать logi c для интерпретации содержимого файла stati c Groovy. Идеальным решением было бы использование пользователем одного сценария, который работает в обеих программах, и мой плагин определяет, что имеет значение.
Есть ли способ проанализировать отдельные части файла Groovy, чтобы я мог отобразить их к нашим параметрам и соответственно изменить поведение плагина Java?
Редактировать: Контекст
Наше программное обеспечение выполняет анализ изображений в реальном времени на окрашенных тканевых слайдах. Некоторые из наших пользователей также используют «Программу X» в пределах GUI для анализа уже снятых изображений. Плагин Java получает доступ к логи c из другой программы, что позволяет нашим пользователям использовать функции, с которыми они знакомы, в режиме реального времени. Скрипт Groovy 1016 *, который пользователь передает программе X, имеет некоторые функции, которые подают данные в те части пользовательского интерфейса программного обеспечения, которые нам не нужны. Я хотел бы только проанализировать наши соответствующие части сценария.
Редактировать: пример файла и то, что я хотел бы проанализировать:
. groovy файл начинается с некоторых параметров, которые мне не нужны, а также некоторых методов определения фона изображения, также бесполезных, так как моя программа делает это автоматически, где «Программа X» не делает:
/* imports */
//PARAMETER AREA//
//PARAMETERS FOR IMAGES WITH UM//
double requested_pixel_size = 0.5
double background_radius = 8
double median_filter_radius = 0
double sigma = 1.5
double minimum_area = 10
double maximum_area = 400
double threshold = 0.1
//PARAMETER AREA ENDS//
def openingReconstruction(final ImageProcessor ip, final ImageProcessor ipBackground, final double radius, final double maxBackground) {
final RankFilters rf = new RankFilters()
ipBackground.setRoi(ip.getRoi())
rf.rank(ipBackground, radius, RankFilters.MIN)
ByteProcessor bpMask = null
if (!Double.isNaN(maxBackground) && maxBackground > 0) {
int w = ip.getWidth()
int h = ip.getHeight()
for (int i = 0; i < w * h; i++) {
if (ipBackground.getf(i) > maxBackground) {
if (bpMask == null)
bpMask = new ByteProcessor(w, h)
bpMask.setf(i, 1f)
}
}
if (bpMask != null) {
rf.rank(bpMask, radius * 2, RankFilters.MAX)
for (int i = 0; i < w * h; i++) {
if (bpMask.getf(i) != 0f) {
ipBackground.setf(i, Float.NEGATIVE_INFINITY)
}
}
}
}
Тогда есть некоторая область, которая фактически улучшает нашу программу, и мне нужно иметь возможность реализовать:
def detect(double key_value, PathObject parentObject, int Choose_detection_image, ParameterList params) {
def viewer = QPEx.getCurrentViewer()
ImageData<BufferedImage> imageData = viewer.getImageData()
println("Program starts.....")
Приведенный выше фрагмент кода в конечном итоге вызовет измененную версию класса обнаружения, которая мне нужна:
detect(key_value, parentObject, Choose_detection_image, params)
class WatershedCellDetection2 {
protected ObjectDetector<BufferedImage> createDetector(ImageData<BufferedImage> imageData, ParameterList params, double key_value) {
ObjectDetector<BufferedImage> detector = new NewCellDetector(key_value)
//insert the key_value in original detector.
return new DetectorWrapper<>(detector)
}
Есть несколько перегруженных методов и других версий WatershedCellDetection
, которые используются в зависимости от того, какие параметры присутствуют, но пока я знаю, как разобрать один, я могу определить, какой из них лучше каждый сценарий.
В функции встроено много кода, который обновляет текст справки в GUI "Программы X", не относящейся к пользовательскому интерфейсу моей программы, так как все взаимодействует с плагином Java программы C#.