<div dir="ltr">Hi Adrian,<div><br></div><div><div>> Some parameters do not affect the preview, but preview() is called</div><div>> nevertheless. Can we avoid calculating a new preview in this case ? Of</div><div>> course we can check inside the preview() body, before performing the</div><div>> actual calculation, whether any of the relevant parameters have</div><div>> changed.</div></div><div><br></div><div>Checking inside preview() is the approach I favor in general, because your constraints on what triggers a preview recomputation could be based on anything.</div><div><br></div><div>That said, perhaps it would make sense to make the really common case easy: add a flag "boolean preview" to the @Parameter annotation (and corresponding ModuleItem#isPreviewed() method). I filed an issue:</div><div><br></div><div><a href="https://github.com/scijava/scijava-common/issues/184">https://github.com/scijava/scijava-common/issues/184</a><br></div><div><br></div><div>> If I want a parameter to be strictly positive (so I can divide by it<br></div><div><div>> without checking for zero), it appears that I need to specify a small</div><div>> non-negative number explicitely in the min="" annotation:</div><div><br></div><div>More generally, it would be nice if you could annotate min and/or max as an exclusive bound rather than an inclusive one. This would solve your non-zero problem. Issue filed:</div><div><br></div><div><a href="https://github.com/scijava/scijava-common/issues/183">https://github.com/scijava/scijava-common/issues/183</a><br></div></div><div><br></div><div>Regards,</div><div>Curtis</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 27, 2015 at 10:35 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">Hi Curtis,<br>
<br>
Thanks for the explanations on how parameters are resolved.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
We could add a way to mark parameters which are not desired to be<br>
shown in the dialog box. What is your use case for a parameter you<br>
want to have in the script, but never shown to the user in cases<br>
where it is still null?<br>
</blockquote>
<br></span>
Upon reflection I don't see when this would be needed. I<br>
misinterpreted the behaviour of the UI harvester in the case of a<br>
net.imagej.overlay.RectangleOverlay, which was being properly<br>
populated but which caused a strangely useless selector to appear in<br>
the dialog (the selector seemed empty or possibly contained one empty<br>
String). Of course the selector is really only usefull if there were<br>
several RectangleOverlays to chose from, and they had meaningful<br>
labels. In the case only one selection is defined one could just drop<br>
the selector from the dialog. But I thought (should have checked) that<br>
the UI would try to ask for a RectangleOverlay if none were found.<br>
This is not the case: when there is no RectangleOverlay at all the<br>
plugin fails just as in the absence of an image, which is what I want<br>
(the user can then define a selection as usual and call the plugin<br>
again). No need for any new annotation here.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2) A net.imagej.overlay.RectangleOverlay parameter, although properly<br>
populated, provoques an Exception after the execution of the command.<br>
(more details and stacktraces below)<br>
</blockquote>
<br>
As I mentioned in the other thread: try with Overlay instead? We<br>
could certainly make it autofill parameters with specific Overlay<br>
subclasses too—just need to confirm first that that is indeed your<br>
problem.<br>
</blockquote>
<br></span>
No need, the OverlayService.getSelectionBounds() you mention in the<br>
other thread behaves just fine.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
3) When a new preview is triggered, and that preview modifies numeric<br>
parameters, then the numeric values visible in the gui dialog are<br>
updated except for the NumericField on which input has triggered the<br>
call to preview().<br>
</blockquote>
<br>
It is a programming error for the preview() function to modify<br>
parameter values. Use callbacks instead, which occur before<br>
preview() is called [1].<br>
</blockquote>
<br></span>
Ok, makes sense.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
4) It would be nice if a parameter could have a label even if<br>
ItemVisibility is MESSAGE<br>
</blockquote>
<br>
Fixed [2].<br>
</blockquote>
<br></span>
Great, thanks a lot!<br>
<br>
I have two new small comments (not sure they qualify as feature requests as I'm not sure they're necessarily good ideas):<br>
<br>
5) Some parameters do not affect the preview, but preview() is called<br>
nevertheless. Can we avoid calculating a new preview in this case ? Of<br>
course we can check inside the preview() body, before performing the<br>
actual calculation, whether any of the relevant parameters have<br>
changed. A second possibility would be to introduce a new @Parameter<br>
annotation to disable the preview() callback. A third way would be<br>
to modify the framework to skip the preview() call on parameters which<br>
register their own callback. It would be this callback's<br>
responsibility to invoque preview() if desired. One could then easily<br>
register an empty callback function on parameters for which preview()<br>
should not be invoqued. The only drawback I see is that plugin authors<br>
may not expect the fact that registering an explicit callback by<br>
annotation unregisters/disables the preview callback. On the other<br>
hand widgets such as Buttons which rely on their callback seem already<br>
excluded from preview() invocation. One advantage is that the<br>
programmer decides at which point in the callback, if at all,<br>
preview() gets called, as opposed to the current situation where the<br>
order is fixed: the specific callback is invoqued before preview().<br>
<br>
6) Really a minor detail: If I want a parameter to be strictly<br>
positive (so I can divide by it without checking for zero), it appears<br>
that I need to specify a small non-negative number explicitely in the<br>
min="" annotation:<br>
<br>
@Parameter(min = "1e-300") private double capillary_length;<br>
<br>
I cannot specify Double.MIN_VALUE because the 'min' attribute requires<br>
a String, nor Double.toString(Double.MIN_VALUE) as it is not a<br>
constant to the compiler. If the constraint of positivity is<br>
sufficiently common to warrant a small hack, one could allow e.g.<br>
"epsilon" or "positive" as special value for the annotation 'min' that<br>
would be translated to <T>.MIN_VALUE<br>
<br>
cheers,<br>
Adrian<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
On Mon, 24 Aug 2015 15:31:07 -0500<br>
 Curtis Rueden <<a href="mailto:ctrueden@wisc.edu" target="_blank">ctrueden@wisc.edu</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Adrian,<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
1) How does one prevent a @Parameter from showing up in the harvesting<br>
GUI dialog, in the manner of a '@Parameter LogService log'? (more<br>
below)<br>
</blockquote>
<br>
Parameters which are resolved before the input harvester dialog pops up<br>
will not show up.<br>
<br>
They get resolved by the various preprocessors in the preprocessing chain,<br>
which is applied before the module is actually run. The InputHarvester --<br>
which is what pops the dialog box -- is (IIRC) the final preprocessing step<br>
before run happens.<br>
<br>
We could add a way to mark parameters which are not desired to be shown in<br>
the dialog box. What is your use case for a parameter you want to have in<br>
the script, but never shown to the user in cases where it is still null?<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2) A net.imagej.overlay.RectangleOverlay parameter, although properly<br>
populated, provoques an Exception after the execution of the command.<br>
(more details and stacktraces below)<br>
</blockquote>
<br>
As I mentioned in the other thread: try with Overlay instead? We could<br>
certainly make it autofill parameters with specific Overlay subclasses<br>
too—just need to confirm first that that is indeed your problem.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
3) When a new preview is triggered, and that preview modifies numeric<br>
parameters, then the numeric values visible in the gui dialog are<br>
updated except for the NumericField on which input has triggered the<br>
call to preview().<br>
</blockquote>
<br>
It is a programming error for the preview() function to modify parameter<br>
values. Use callbacks instead, which occur before preview() is called [1].<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
4) It would be nice if a parameter could have a label even if<br>
ItemVisibility is MESSAGE<br>
</blockquote>
<br>
Fixed [2].<br>
<br>
Regards,<br>
Curtis<br>
<br>
[1]<br>
<a href="https://github.com/scijava/scijava-common/blob/scijava-common-2.44.2/src/main/java/org/scijava/widget/DefaultWidgetModel.java#L167-L169" rel="noreferrer" target="_blank">https://github.com/scijava/scijava-common/blob/scijava-common-2.44.2/src/main/java/org/scijava/widget/DefaultWidgetModel.java#L167-L169</a><br>
<br>
[2]<br>
<a href="https://github.com/scijava/scijava-ui-swing/commit/84c30c045bf3327a424f499f1f2fe867b0d9375e" rel="noreferrer" target="_blank">https://github.com/scijava/scijava-ui-swing/commit/84c30c045bf3327a424f499f1f2fe867b0d9375e</a><br>
<br>
<br>
On Sun, Aug 23, 2015 at 6:44 AM, Adrian Daerr <<br>
<a href="mailto:adrian.daerr@univ-paris-diderot.fr" target="_blank">adrian.daerr@univ-paris-diderot.fr</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear ImageJ developers,<br>
<br>
As I slowly learn more about IJ2 @Plugins, I have one question and three<br>
minor comments that I would like to submit to you.<br>
<br>
1) How does one prevent a @Parameter from showing up in the harvesting<br>
GUI dialog, in the manner of a '@Parameter LogService log'? (more below)<br>
<br>
2) A net.imagej.overlay.RectangleOverlay parameter, although properly<br>
populated, provoques an Exception after the execution of the command.<br>
(more details and stacktraces below)<br>
<br>
3) When a new preview is triggered, and that preview modifies numeric<br>
parameters, then the numeric values visible in the gui dialog are<br>
updated except for the NumericField on which input has triggered the<br>
call to preview().<br>
<br>
4) It would be nice if a parameter could have a label even if<br>
ItemVisibility is MESSAGE:<br>
  @Parameter(persist = false,<br>
             visibility = org.scijava.ItemVisibility.MESSAGE,<br>
             label = "Current foo value")<br>
    private double foo = 0;<br>
(currently, at least on my box, the label is not shown in this case)<br>
Obviously a workaround is to build a String with label+foo instead.<br>
<br>
cheers,<br>
Adrian<br>
<br>
<br>
<br>
ad 1)<br>
How to prevent a @Parameter from showing up in the harvesting GUI<br>
dialog? Some seem to be masked by default (ImagePlus, LogService), but<br>
I did not find the appropriate annotation to make the parameter roi in<br>
the following not show up, although it is already properly populated<br>
by the rectangular selection of the active image ? There is no<br>
meaningful thing I can do with the associated selector in the dialog.<br>
<br>
    @Parameter private ImagePlus imp;<br>
    @Parameter private RectangleOverlay roi;<br>
    @Parameter private double a;<br>
<br>
<br>
ad 2)<br>
A net.imagej.overlay.RectangleOverlay parameter<br>
<br>
  @Parameter private RectangleOverlay roi;<br>
<br>
is properly populated when the Command is invoqued on an active image<br>
containing a rectangular selection. However it provoques an Exception<br>
after the execution of the command, when either the<br>
DefaultPrefService, or the Recorder if a persist=false attribute is<br>
added, apparently tries to record a 'null' value for an option. The<br>
two stacktraces are<br>
<br>
  [ERROR] Module threw exception<br>
  java.lang.NullPointerException<br>
        at<br>
java.util.prefs.AbstractPreferences.put(AbstractPreferences.java:224)<br>
        at<br>
org.scijava.prefs.DefaultPrefService.put(DefaultPrefService.java:183)<br>
        at<br>
org.scijava.module.DefaultModuleService.save(DefaultModuleService.java:278)<br>
        at<br>
org.scijava.module.process.SaveInputsPreprocessor.saveValue(SaveInputsPreprocessor.java:74)<br>
        at<br>
org.scijava.module.process.SaveInputsPreprocessor.process(SaveInputsPreprocessor.java:65)<br>
        at<br>
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<br>
org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)<br>
        at<br>
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)<br>
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)<br>
        at<br>
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)<br>
        at<br>
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)<br>
        at java.lang.Thread.run(Thread.java:662)<br>
<br>
  [ERROR] Module threw exception<br>
  java.lang.NullPointerException<br>
        at ij.plugin.frame.Recorder.addQuotes(Recorder.java:612)<br>
        at ij.plugin.frame.Recorder.recordOption(Recorder.java:362)<br>
        at net.imagej.legacy.IJ1Helper.recordOption(IJ1Helper.java:467)<br>
        at<br>
net.imagej.legacy.plugin.MacroRecorderPostprocessor.process(MacroRecorderPostprocessor.java:70)<br>
        at<br>
org.scijava.module.ModuleRunner.postProcess(ModuleRunner.java:116)<br>
        at org.scijava.module.ModuleRunner.run(ModuleRunner.java:176)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)<br>
        at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)<br>
        at<br>
org.scijava.thread.DefaultThreadService$2.call(DefaultThreadService.java:191)<br>
        at<br>
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)<br>
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)<br>
        at<br>
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)<br>
        at<br>
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)<br>
        at java.lang.Thread.run(Thread.java:662)<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>
<br>
</blockquote></blockquote>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <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>
</font></span></blockquote></div><br></div>