<div dir="ltr">Hi Adrian,<div><br></div><div>Glad to hear you found a working solution!</div><div><br></div><div>The short answer about ROIs is that they have not been a focus of ImageJ2 or ImgLib2 development in recent years. Support for labelings (highly related to ROIs) was rewritten this January [1], but a rewrite of the core ImgLib2 ROI library [2] is still pending. And there is a substantial pending redesign of the ImageJ Common data model planned as well -- though it is unlikely anyone will work on it this year.</div><div><br></div><div>At this juncture, the most effective balance for most plugin developers is probably to use parameterized commands and/or scripts, but with the ImageJ1 data structures (ij.ImagePlus, etc.) -- unless you need access to a new capability that ImageJ2 + ImgLib2 make possible (>5D images, very large image planes, very large numbers of image planes, dynamically generated images, images stored in places besides disk, cell-based image caching, image types beyond uint8/uint16/float32, etc.).</div><div><br></div><div>That said, your feedback is very much appreciated.</div><div><br></div><div>And some issues will be ironed out in the next couple of weeks as we revamp the tutorials for the upcoming ImageJ conference.</div><div><br></div><div><div>> The easiest way to give a plugin a (rectangular) roi is to ... just</div><div>> declare a net.imagej.overlay.RectangularOverlay as an input parameter.</div><div>> It is properly populated by the origin and extent of a rectangular</div><div>> selection drawn on the active image.</div></div><div><br></div><div>If all you care about is the bounding box of the active selection, you can just do it the same way as the ImageJ2 CropImageJ command: by calling OverlayService.getSelectionBounds [3]. Then you would avoid some of the current weirdness associated with Overlay parameters.</div><div><br></div><div><div><div>> If I launch the default UI, then the ROI will not show, but the plugin</div><div>> can launch. If on the other hand I launch the "swing" UI as in the</div><div>> tutorial, I do see the ROI</div><div><br></div><div>Yes, that tutorial was written when the ImageJ2 Swing UI was still the default. It is not tested/working with the Legacy UI (which is now the default). I will try to remedy that very soon.</div><div><br></div><div>> (not until I call Image>Adjust>Brightness/Contrast..., but that's a</div><div>> minor detail),</div><div><br></div><div>Yes, that annoying bug has been around for quite a while. Many things that refresh the display will do, such as pressing + then - to zoom in/out.</div><div>  </div><div>> but now the invocation of the plugin at the end of main() will throw a</div><div>> MethodCallException with the stackTrace pasted below. How can the</div><div>> choice of a UI make the plugin execution fail ?</div><div>...</div><div>> Caused by: java.lang.NullPointerException</div><div>>         at Goutte_pendante.initTitle(Goutte_pendante.java:94)</div><div><br></div><div>In 2014, we made a conscious decision to support the ImageJ 1.x classes _only_ from the legacy UI. You cannot use them from the Swing UI. In your case: the ActiveImagePlusPreprocessor cannot set the active ImagePlus because WindowManager.getCurrentImage() returns null [4], because no ImageJ 1.x user interface exists. So it stays null and then your initializer throws the NPE.</div><div><br></div><div>Regards,<br></div></div></div><div>Curtis</div><div><br></div><div>[1] <a href="https://github.com/imglib/imglib2-roi/tree/imglib2-roi-0.3.2/src/main/java/net/imglib2/labeling" target="_blank">https://github.com/imglib/imglib2-roi/tree/imglib2-roi-0.3.2/src/main/java/net/imglib2/labeling</a></div><div><br></div><div>[2] <a href="https://github.com/imglib/imglib2-roi" target="_blank">https://github.com/imglib/imglib2-roi</a></div><div class="gmail_extra"><br></div><div class="gmail_extra">[3] <a href="https://github.com/imagej/imagej-plugins-commands/blob/imagej-plugins-commands-0.5.1/src/main/java/net/imagej/plugins/commands/imglib/CropImage.java#L104">https://github.com/imagej/imagej-plugins-commands/blob/imagej-plugins-commands-0.5.1/src/main/java/net/imagej/plugins/commands/imglib/CropImage.java#L104</a></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div>[4] <a href="https://github.com/imagej/imagej-legacy/blob/imagej-legacy-0.17.1/src/main/java/net/imagej/legacy/plugin/ActiveImagePlusPreprocessor.java#L49-L52">https://github.com/imagej/imagej-legacy/blob/imagej-legacy-0.17.1/src/main/java/net/imagej/legacy/plugin/ActiveImagePlusPreprocessor.java#L49-L52</a></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 23, 2015 at 6:30 AM, Adrian Daerr <span dir="ltr"><<a href="mailto:adrian.daerr@univ-paris-diderot.fr" target="_blank">adrian.daerr@univ-paris-diderot.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
While I am still interested in answers concerning the status/API/roadmap for ROIs and overlays beyond what's on <a href="http://imagej.net/ROIs" rel="noreferrer" target="_blank">http://imagej.net/ROIs</a>, I have solved the problem at hand which was keeping me from making progress, so I post the (rather obvious, once I found the net.imagej.overlay package) solution here for the record and to close this thread.<br>
<br>
The easiest way to give a plugin a (rectangular) roi is to ...<br>
just declare a net.imagej.overlay.RectangularOverlay as an input<br>
parameter. It is properly populated by the origin and extent of a<br>
rectangular selection drawn on the active image.<br>
<br>
cheers,<br>
Adrian<br>
<br>
<br>
On Wed, 19 Aug 2015 17:10:06 +0200<div><div><br>
 "Adrian Daerr" <<a href="mailto:adrian.daerr@univ-paris-diderot.fr" target="_blank">adrian.daerr@univ-paris-diderot.fr</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Dear ImageJ developers,<br>
<br>
I have included code from the AddROIs tutorial into the main()<br>
method of my plugin (for the moment essentially one of Curtis'<br>
commands-with-preview example), to select a Rectangle before<br>
calling the plugin. The source is available here:<br>
<br>
<a href="https://gitlab.com/pendant-drop/pendant-drop" rel="noreferrer" target="_blank">https://gitlab.com/pendant-drop/pendant-drop</a><br>
(in Goutte_pendante.java)<br>
<br>
If I launch the default UI, then the ROI will not show, but the<br>
plugin can launch. If on the other hand I launch the "swing" UI<br>
as in the tutorial, I do see the ROI (not until I call<br>
Image>Adjust>Brightness/Contrast..., but that's a minor detail),<br>
but now the invocation of the plugin at the end of main() will<br>
throw a MethodCallException with the stackTrace pasted below. How<br>
can the choice of a UI make the plugin execution fail ?<br>
<br>
Is there any other way that main can set a ROI on a loaded image<br>
that the plugin, which still uses an ImagePlus as input<br>
parameter, will see when calling imp.getProcessor().getRoi() ?<br>
<br>
TIA<br>
Adrian<br>
<br>
<br>
$> mvn package<br>
$> fiji --class-path target/pendant_drop-2.0.0-SNAPSHOT.jar Goutte_pendante.class<br>
[INFO] Overriding About Pendant Drop; identifier: command:About_Pendant_Drop; jar: file:/home/adrian/Programmes/plugins_ImageJ_src/Traitement_Gouttes/target/pendant_drop-2.0.0-SNAPSHOT.jar<br>
[INFO] Overriding Pendant Drop; identifier: command:Goutte_pendante; jar: file:/home/adrian/Programmes/plugins_ImageJ_src/Traitement_Gouttes/target/pendant_drop-2.0.0-SNAPSHOT.jar<br>
[INFO] Populating metadata<br>
[INFO] Populating metadata<br>
[INFO] Found 10 JHotDraw adapters.<br>
org.scijava.module.MethodCallException: Error executing method: Goutte_pendante#initTitle<br>
        at org.scijava.module.MethodRef.execute(MethodRef.java:73)<br>
        at org.scijava.module.AbstractModuleItem.initialize(AbstractModuleItem.java:199)<br>
        at org.scijava.module.AbstractModule.initialize(AbstractModule.java:86)<br>
        at org.scijava.command.CommandModule.initialize(CommandModule.java:147)<br>
        at org.scijava.module.process.InitPreprocessor.process(InitPreprocessor.java:60)<br>
        at org.scijava.module.ModuleRunner.preProcess(ModuleRunner.java:104)<br>
        at org.scijava.module.ModuleRunner.run(ModuleRunner.java:156)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)<br>
        at org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)<br>
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)<br>
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)<br>
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)<br>
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)<br>
        at java.lang.Thread.run(Thread.java:662)<br>
Caused by: java.lang.reflect.InvocationTargetException<br>
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br>
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br>
        at java.lang.reflect.Method.invoke(Method.java:597)<br>
        at org.scijava.module.MethodRef.execute(MethodRef.java:69)<br>
        ... 14 more<br>
Caused by: java.lang.NullPointerException<br>
        at Goutte_pendante.initTitle(Goutte_pendante.java:94)<br>
        ... 19 more<br>
[ERROR] Module threw exception<br>
java.lang.NullPointerException<br>
        at Goutte_pendante.cancel(Goutte_pendante.java:87)<br>
        at org.scijava.command.CommandModule.cancel(CommandModule.java:140)<br>
        at org.scijava.module.ModuleRunner.cleanupAndBroadcastCancelation(ModuleRunner.java:189)<br>
        at org.scijava.module.ModuleRunner.run(ModuleRunner.java:161)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)<br>
        at org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)<br>
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)<br>
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)<br>
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)<br>
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)<br>
        at java.lang.Thread.run(Thread.java:662)<br>
<br>
<br>
<br>
On Sat, 15 Aug 2015 13:14:13 +0200<br>
 Adrian Daerr <<a href="mailto:adrian.daerr@univ-paris-diderot.fr" target="_blank">adrian.daerr@univ-paris-diderot.fr</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I am seizing a major rewrite of a plugin as an opportunity to switch<br>
from ImageJ1 to ImageJ2, also to avoid concurrency issues[*], and now<br>
lots of questions come up. Some concern the way ROIs are handled. What<br>
has happened in this regard since<br>
  <a href="http://imagej.net/ROIs" rel="noreferrer" target="_blank">http://imagej.net/ROIs</a><br>
was last updated ?<br>
<br>
[*] cf discussion on the ImageJ list archived at<br>
<a href="http://imagej.1557.x6.nabble.com/ExtendedPlugInFilter-GenericDialog-and-synchronization-td5013333.html" rel="noreferrer" target="_blank">http://imagej.1557.x6.nabble.com/ExtendedPlugInFilter-GenericDialog-and-synchronization-td5013333.html</a><br>
<br>
Here are two concrete questions:<br>
<br>
1) My plugin relies on a rectangular ROI being drawn on the image to<br>
know which area to include in the computation. How do I draw this ROI<br>
once I have loaded the image as a dataset in the main() method that is<br>
used for testing purposes ?<br>
<br>
public static void main(final String... args) throws Exception {<br>
    final String testImagePath = "testImage.jpg";<br>
<br>
    // Launch ImageJ as usual.<br>
    final ImageJ ij = net.imagej.Main.launch(args);<br>
<br>
    // Open test image.<br>
    final Dataset dataset = ij.dataset().open(testImagePath);<br>
<br>
    // display the dataset<br>
    ij.ui().show(dataset);<br>
<br>
    // create rectangular ROI<br>
    //imp.setRoi(120,60,340,420);// How to do this on a dataset ?<br>
<br>
    // Launch the "Foo_Bar" command.<br>
    ij.command().run(Foo_Bar.class, true);<br>
}<br>
<br>
(alternatively, how would I generate a new dataset, or I guess something like a "View" in ImageJ2 terminology, of the ROI sub-image of the original dataset ? I could then substitute the original dataset with this sub-image and have the plugin operate on the whole image by default)<br>
<br>
2) The plugin preview generates overlays using java.awt.geom.Path2D,<br>
java.awt.geom.Area and java.awt.Shape, which are then converted via<br>
ij.gui.ShapeRoi() and ij.gui.Overlay(), assembled with overlay.add(),<br>
and drawn using imp.setOverlay(). Is there a new IJ2-way to do this<br>
(especially since the cited web page (rightly) insists on separation<br>
of selection and visualisation shapes) ?<br>
<br>
TIA,<br>
Adrian<br>
<br>
_______________________________________________<br>
ImageJ-devel mailing list<br>
<a href="mailto:ImageJ-devel@imagej.net" target="_blank">ImageJ-devel@imagej.net</a><br>
<a href="http://imagej.net/mailman/listinfo/imagej-devel" rel="noreferrer" target="_blank">http://imagej.net/mailman/listinfo/imagej-devel</a><br>
</blockquote>
<br>
-- <br>
<a href="http://www.msc.univ-paris-diderot.fr/~daerr/" rel="noreferrer" target="_blank">http://www.msc.univ-paris-diderot.fr/~daerr/</a><br>
<br>
_______________________________________________<br>
ImageJ-devel mailing list<br>
<a href="mailto:ImageJ-devel@imagej.net" target="_blank">ImageJ-devel@imagej.net</a><br>
<a href="http://imagej.net/mailman/listinfo/imagej-devel" rel="noreferrer" target="_blank">http://imagej.net/mailman/listinfo/imagej-devel</a><br>
</blockquote>
<br>
-- <br>
<a href="http://www.msc.univ-paris-diderot.fr/~daerr/" rel="noreferrer" target="_blank">http://www.msc.univ-paris-diderot.fr/~daerr/</a><br>
<br>
_______________________________________________<br>
ImageJ-devel mailing list<br>
<a href="mailto:ImageJ-devel@imagej.net" target="_blank">ImageJ-devel@imagej.net</a><br>
<a href="http://imagej.net/mailman/listinfo/imagej-devel" rel="noreferrer" target="_blank">http://imagej.net/mailman/listinfo/imagej-devel</a><br>
</div></div></blockquote></div><br></div></div>