[Insight-developers] [ITK + Python] Wrapping classes proposal
Gaetan Lehmann
gaetan.lehmann at jouy.inra.fr
Wed Jun 15 06:48:15 EDT 2005
On Tue, 14 Jun 2005 12:34:57 +0200, Benoit Regrain
<benoit.regrain at creatis.insa-lyon.fr> wrote:
>> But if it's possible to add an attribute to the class which cleany
>> identify the type (as you say below), we don't have to worry about name
>> : we should just use the new attributes.
>> If names are not changed, we keep full compatibility with older itk
>> versions...
> Yes, you have right in theory. And I understand the will to keep this
> compatibility. But I'm not sure that's easily possible.
>
> Consider the itk::Image < itk::Vector<float,2>, 2> with an attribute to
> get the mangled add.
> So, for the itk::Vector<float,2>, the attribute will have 'VF2'
> So, when we will search the type of the image, we will search 'VF22'
> But the wrapped image classes for the want type are 'VF2' or 'V2F2'
> and never 'VF22'
>
> So, I see only one solution. Create the _ItkClassXxx while wrapping
> and generate the link between a wanted 'VF22' and a real 'V2F2' or 'VF2'
> But I don't know if it's possible with CableSwig or Swig.
>
> In other hand, is it really a problem to not keep the backward
> compatibility
> in all cases ?
> Actually, the known persons working with ITK (in the same society than
> me)
> are afraid by the use of itk in python. But after a little sounding, it
> appears that
> a change of the mangled names with a simplest use in the wrapped
> languages
> will be more attractive.
> It's why I prefer a change of the mangled name (if we don't have other
> choice)
ok
>
>
>
>>>> But there is good and less good things in c++ style, and I find quite
>>>> boring
>>>> to have to set parameters on several lines, or to have to call
>>>> a.SetInput(b.GetOutput()) for each filter, especially in interperter.
>>>> So I have given the ability to set attribute value in New method :
>>>>
>>>> reader = itk.ImageFileReader[imageType].New(FileName='image.png')
>>>>
>>>> and to make construction of the process pipeline easier, if a var is
>>>> used
>>>> as
>>>> parameter in New method, it is used as source of image :
>>>>
>>>> reader2 = itk.ImageFileReader[imageType].New(FileName='image2.png')
>>>> sub = itk.SubtractImageFilter[imageType, imageType,
>>>> imageType].New(reader,
>>>> reader2)
>>>> writer = itk.ImageFileWriter[imageType].New(sub, FileName='out.png')
>>>> writer.Update()
>>>>
>>>> All of this make code short, readable and flexible.
>>> This can be a good addict. But some processes in ITK don't have the
>>> SetInput
>>> method (reader processes for example). How does the function
>>> react in this case ? Does your solution work in all cases ?
>>
>> I use the SetInput(int, image) method, and if it fail (for
>> itkImageToVTKImageFilter for example), I try with SetImage(image). If
>> it still fail, it return a AttributeError, exactly as using SetInput if
>> it does not exists.
>> I don't see case where it can't work...
> For me, it will stay in a second (interessant) point. At this time, I
> focus on a
> best use of the itk wrapping (essentially with python).
>
I done like you when I began to write my module, but when I have seen that
this module allow me to add feature which reduce amount of code, I haven't
hesitate to add it.
I hope you will come to it soon ;-)
>
>>>> I agree that type names are not really consistent, but I'm not sure
>>>> your
>>>> solution is totally doable. How would you call wrapped
>>>> BinaryDilateImageFilter :
>>>>
>>>> ITK_WRAP_OBJECT3(BinaryDilateImageFilter, image::F2 , image::F2 ,
>>>> structuringElement::F2, itkBinaryDilateImageFilterF2F2 );
>>>
>>> The images are : IF2
>>> For the structure element, we can prefix by SE, so we have the result
>>> : SEF2
>>> Finally, we obtain : BinaryDilateUmageFilterIF2IF2SEF2
>>>
>>> But we may consider that the structure element can be different that
>>> structuringElement::F2
>>> for each 2D images process, so the resulting mangled name will be :
>>> BinaryDilateUmageFilterIF2IF2
>>
>> I thinkk your sentence is not ended :-)
> Are you sure ? :-( lol
>
So I should have miss something :-/
>
>
>
>>> I will see to have a mix between our solutions. But I think the first
>>> point
>>> to solve is to have a coherence between all mangled names.
>>
>> If you can implement class creation at wrapping time, it would be
>> really great : it's important for me to be able to use completion.
>> Also, I found usage of [type] (__getitem__) much nice than giving the
>> type in New function, and it allow to use New for other things.
>> On the other side, your typing mechanism is stronger than mine (which
>> is nothing more than refinding the string used in InsightToolkit
>> module) and allow interesting things, such as the example you have
>> given :-)
> I have finished to mix our 2 codes. The result is very good and offers a
> simple use
> But with a first parse of the itk classes :-(
> I have used my parsing and adapted it to your classes. I have added some
> usefull
> methods in classes to have facilities.
Great:-), but sadely you took an old version of my module, and lots of
things are better now, without talking of New method facilities (dict
interface for types, no names with _ prefix in itk module, better
management of __call__ to be consistent with vtk, ...)
I'm modifying it to integrate changes.
Also, I don't really understand the can_instanciate method : some classes
can be instanciated without New method, just with () (Ex: itk.Index[2]())
>
> In your solution, you have kept the _New, _Pointer, _SuperClass, etc.
> extentions
> to create corresponding methods New, Pointer, SuperClass. What is the
> interest
> to keep Pointer, Superclas, etc. ? Have the New method seems to me the
> only
> usefull method.
I don't know if other methods are useful. In doubt, I kept them. The goal
was to make everything in InsightToolkit module avaible in itk module.
>> Can we get your code somewhere ?
> Yes, I have made a CVS repository on our server :
> CVSROOT : :pserver:anonymous at cvs.creatis.insa-lyon.fr:2402/cvs/public
> No password or anonymous ... I never remember it
passwd: anonymous
> Module name : itkWrapping
>
> All is in the python directory :
> itkParser.py : the parser of the itk classes
> itk.py : creation of classes
> itkTestX.py : 3 tests presenting the use and limitations
>
--
Gaetan Lehmann <gaetan.lehmann at jouy.inra.fr>
Tel: +33 1 34 65 29 66
Biologie du Développement et de la Reproduction
INRA de Jouy-en-Josas (France)
Web: http://voxel.jouy.inra.fr
More information about the Insight-developers
mailing list