[Insight-users] Re: VTK ITK tcl/python connection

Miller, James V (Research) millerjv at crd . ge . com
Mon, 28 Jul 2003 10:04:35 -0400


In reference to adding an example using VTK to the ITK tree:

We had been trying to keep the ITK distribution separate from 
any external dependencies.  This is to ensure that people's first
experience with ITK (configuring and build) is as smooth as we 
can make it.  Obviously, when we throw wrapping into the mix, 
we have to "loosen" this constraint to at least include CSwig and
some interpretor (Tcl, Python). But should this constraint be 
loosened to include VTK when wrapping is enabled?  

When we had examples that included VTK, FLTK, ... it was very 
difficult for new users to build ITK.  New users have a tendency
to turn everything on and are confused about messages of 
missing "components".

Perhaps such an example is better suited for InsightApplications.





> -----Original Message-----
> From: Luis Ibanez [mailto:luis . ibanez at kitware . com]
> Sent: Monday, July 28, 2003 9:48 AM
> To: Charl P. Botha
> Cc: Bill Hoffman; Raul San Jose Estepar; ITK Users
> Subject: Re: [Insight-users] Re: VTK ITK tcl/python connection
> 
> 
> 
> Hi Charl,
> 
> That's great news,
> 
> We just created a directory "Visualization" under
> Insight/Examples
> 
> Please feel free to add the file there. I would
> suggest to use a different name, in order to match
> the naming style of the other files in the Examples
> directory.
> 
> For example:
> 
>     CannyEdgeDetectionImageFilterAndViewer.cxx
> 
> We are adding a section on ITK+VTK integration to
> the SoftwareGuide. Your example will fit well in
> this section. Other C++ examples will be in the
> same section.
> 
> 
> Thanks
> 
> 
>    Luis
> 
> 
> 
> ------------------------------
> Charl P. Botha wrote:
> > On Wed, 2003-07-23 at 17:58, Bill Hoffman wrote:
> > 
> >>I would like to introduce you to Charl Botha.  He has
> >>already implemented a python itk/vtk integration.
> >>He is looking into a more general solution based on the
> >>same information I sent you.   You may want to try
> > 
> > 
> > Okay, it's all done.  Bill, I have built and tested it on 
> Windows VC++
> > 6.0 and on g++ 2.95.4 on Debian Linux and then went and 
> committed it.  I
> > had to make more changes to CableSwig.cxx to make the CableSwig and
> > NoCable wrappings compatible: see CableSwig::TemplateName().  These
> > changes have more advantages: it means in future we will be 
> able to add
> > similar pure Swig interface files to Insight and have the generated
> > wrappings interact with and operate on CableSwig wrapped objects.
> > 
> > I have attached a Python sample illustrating a pipeline 
> that loads data
> > in using VTK, processes it with ITK and then writes it away 
> using VTK
> > again.  Where in the Insight tree could I add this?
> > 
> > I had to add some code to the top-level CMakeLists.txt to add the
> > ITK_CSWIG_CONNECTVTKITK option (if CSWIG wrapping is 
> active) and to mark
> > it as advanced.  In addition, if this option is ON, the 
> CMakeLists in
> > Wrapping/CSwig has to make use of FindVTK.cmake as well.
> > 
> > Thanks,
> > Charl
> > 
> > 
> > 
> > 
> --------------------------------------------------------------
> ----------
> > 
> > # This file demonstrates how to connect VTK and ITK 
> pipelines together
> > # in scripted languages with the new ConnectVTKITK wrapping 
> functionality.
> > # Data is loaded in with VTK, processed with ITK and 
> written back to disc
> > # with VTK. 
> > #
> > # Note that this will only work if your ITK was compiled with
> > # ITK_CSWIG_CONNECTVTKITK set to ON
> > #
> > # -- Charl P. Botha <cpbotha AT ieee.org>
> > 
> > import os
> > import InsightToolkit as itk
> > import vtk
> > 
> > reader = vtk.vtkPNGReader()
> > ITK_TOP = "/home/cpbotha/build/Insight"
> > reader.SetFileName(os.path.join(ITK_TOP, 
> "Testing/Data/Input/cthead1.png"))
> > 
> > # it has to be a single component, itk::VTKImageImport 
> doesn't support more
> > lum = vtk.vtkImageLuminance()
> > lum.SetInput(reader.GetOutput())
> > 
> > # let's cast the output to float
> > imageCast = vtk.vtkImageCast()
> > imageCast.SetOutputScalarTypeToFloat()
> > imageCast.SetInput(lum.GetOutput())
> > 
> > # the end-point of this VTK pipeline segment is a vtkImageExport
> > vtkExporter = vtk.vtkImageExport()
> > vtkExporter.SetInput(imageCast.GetOutput())
> > 
> > # it connects to the itk::VTKImageImport at the beginning of
> > # the subsequent ITK pipeline; two-dimensional float type
> > itkImporter = itk.itkVTKImageImportF2_New()
> > 
> > # call the magic function that connects the two
> > itk.ConnectVTKToITKF2(vtkExporter, itkImporter.GetPointer())
> > 
> > canny  = itk.itkCannyEdgeDetectionImageFilterF2F2_New()
> > rescaler = itk.itkRescaleIntensityImageFilterF2US2_New()
> > canny.SetInput(itkImporter.GetOutput())
> > rescaler.SetInput(canny.GetOutput())
> > rescaler.SetOutputMinimum(0)
> > rescaler.SetOutputMaximum(65535)
> > 
> > # this is to show off the new PyCommand functionality. :)
> > def progressEvent():
> >     print canny.GetProgress()
> >     
> > pc = itk.itkPyCommand_New()
> > pc.SetCommandCallable(progressEvent)
> > canny.AddObserver(itk.itkProgressEvent(), pc.GetPointer())
> > # end of show-off
> > 
> > # this will form the end-point of the ITK pipeline segment
> > itkExporter = itk.itkVTKImageExportUS2_New()
> > itkExporter.SetInput(rescaler.GetOutput())
> > 
> > # the vtkImageImport will bring our data back into VTK-land
> > vtkImporter = vtk.vtkImageImport()
> > # do the magic connection call
> > itk.ConnectITKUS2ToVTK(itkExporter.GetPointer(), vtkImporter)
> > 
> > # finally write the image to disk using VTK
> > writer = vtk.vtkPNGWriter()
> > writer.SetFileName('maatjie.png')
> > writer.SetInput(vtkImporter.GetOutput())
> > 
> > # before we call Write() on the writer, it is prudent to give
> > # our ITK pipeline an Update() call... this is not necessary
> > # for normal error-less operation, but ensures that exceptions
> > # thrown by ITK get through to us in the case of an error;
> > # This is because the VTK wrapping system does not support
> > # C++ exceptions.
> > rescaler.Update()
> > 
> > # write the file to disk...
> > writer.Write()
> 
> 
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk . org
> http://www . itk . org/mailman/listinfo/insight-users
>