ImagJ/Fiji 'binding' wrong number of args - help welcome

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

ImagJ/Fiji 'binding' wrong number of args - help welcome

David Pirotte
Hello,

I'm trying to provide access to an ImageJ/Fiji plugin defined here [1]. To start
with, I want to 'bind' processImage (see line 116 in [1], like this:

  (define-alias process-image
    sc.fiji.localThickness.LocalThicknessWrapper:processImage)

then:

  export CLASSPATH=.:./jars/ij.jar:./jars/local-thickness.jar
  kawa -C ij-local-thickness.scm

but when I try:

  kawa -Dplugins.dir=/usr/lpdi/projects/kawa/jars
  #|kawa:1|# (import (ij-core)
          (ij-local-thickness))
  #|.....2|# #|kawa:3|# (define iplus1 (ij-open "images/camada-mapa.png"))
  #|kawa:4|# (ij-local-thickness iplus1)
  gnu.mapping.WrongArguments: call to 'sc.fiji.localThickness.LocalThicknessWrapper.processImage(ij.ImagePlus)' has too few arguments (1; must be 2)
        at gnu.mapping.CallContext.matchError(CallContext.java:150)
        at gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:196)
        ...

What am I doing wrong?

Thanks,
David

[1] https://github.com/fiji/LocalThickness/blob/master/src/main/java/sc/fiji/localThickness/LocalThicknessWrapper.java

attachment0 (499 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: ImagJ/Fiji 'binding' wrong number of args - help welcome

Per Bothner
On 01/20/2018 04:59 PM, David Pirotte wrote:

> but when I try:
>
>    kawa -Dplugins.dir=/usr/lpdi/projects/kawa/jars
>    #|kawa:1|# (import (ij-core)
>            (ij-local-thickness))
>    #|.....2|# #|kawa:3|# (define iplus1 (ij-open "images/camada-mapa.png"))
>    #|kawa:4|# (ij-local-thickness iplus1)
>    gnu.mapping.WrongArguments: call to 'sc.fiji.localThickness.LocalThicknessWrapper.processImage(ij.ImagePlus)' has too few arguments (1; must be 2)
> at gnu.mapping.CallContext.matchError(CallContext.java:150)
> at gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:196)
>          ...
>
> What am I doing wrong?

processImage is a non-static method, so it needs two arguments:
The implicit 'this' argument, plus the inputImage argument.

--
        --Per Bothner
[hidden email]   http://per.bothner.com/
Reply | Threaded
Open this post in threaded view
|

Re: ImagJ/Fiji 'binding' wrong number of args - help welcome

David Pirotte
Hello Per,

> >    kawa -Dplugins.dir=/usr/lpdi/projects/kawa/jars
> >    #|kawa:1|# (import (ij-core)
> >            (ij-local-thickness))
> >    #|.....2|# #|kawa:3|# (define iplus1 (ij-open "images/camada-mapa.png"))
> >    #|kawa:4|# (ij-local-thickness iplus1)
> >    gnu.mapping.WrongArguments: call to
> > 'sc.fiji.localThickness.LocalThicknessWrapper.processImage(ij.ImagePlus)' has
> > too few arguments (1; must be 2) at
> > gnu.mapping.CallContext.matchError(CallContext.java:150) at
> > gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:196) ...
> >
> > What am I doing wrong?  
>
> processImage is a non-static method, so it needs two arguments:
> The implicit 'this' argument, plus the inputImage argument.
>
But what is 'this' argument, how do I 'grab it' from imagej/fiji plugin?

thanks,
David

attachment0 (499 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: ImagJ/Fiji 'binding' wrong number of args - help welcome

Per Bothner
On 01/21/2018 12:58 AM, David Pirotte wrote:

> But what is 'this' argument, how do I 'grab it' from imagej/fiji plugin?

That is not a question about Kawa.  It is a question about the imagej/fiji plugin.
How would you get the 'this' argument in a Java program? Somewhere in the
library or code that uses it there is a call 'new MaskThicknessMapWithOriginalTest'.
That result is what you need to pass to as the 'this' parameter.

If you want to write a Kawa wrapper for a Java plugin, you need to understand the
Java API - and how you would use the pluin in a Java application.  You then have the
option of designing a Kawa API that feels very different from the Java API - or
you can just use the "thin wraper" that Kawa gives you automatically.  Regardless,
you have to understand the Java API before you either use it directly or design
a Kawa library on top of it.
--
        --Per Bothner
[hidden email]   http://per.bothner.com/
Reply | Threaded
Open this post in threaded view
|

Re: ImagJ/Fiji 'binding' wrong number of args - help welcome

David Pirotte
Hello Per,

> > But what is 'this' argument, how do I 'grab it' from imagej/fiji plugin?  

> That is not a question about Kawa.  It is a question about the imagej/fiji plugin.
> How would you get the 'this' argument in a Java program?
> ...

I actually figured it out before to read your 2nd email, but of course thanks a lot
for your answers, and, yes, a java related quizz, plus how to implemented it in
kawa...

It would have been a lot more productive though, if you allow me, to answer (your
first answer) something like [*]

        ... these methods always expect, as their first _implicit_ argument, an
        instance of the class that 'holds' the methods [*]. so in this case:

        (define-alias ltw-new sc.fiji.localThickness.LocalThicknessWrapper:new)

        (process-image (ltw-ew) iplus)

Cheers,
David

[*] 'this' really didn't mean anything to me

attachment0 (499 bytes) Download Attachment