]> Creatis software - bbtk.git/commitdiff
By Leonardo Florez
authorDaniel Gonzalez <daniel.gonzalez@creatis.insa-lyon.fr>
Wed, 29 May 2013 13:45:36 +0000 (15:45 +0200)
committerDaniel Gonzalez <daniel.gonzalez@creatis.insa-lyon.fr>
Wed, 29 May 2013 13:45:36 +0000 (15:45 +0200)
Bonjour à tous,

Aujourd'hui je me suis plongé dans la compilation des creaTools avec ITK 4.3 et VTK 5.10. La chose marque plutôt pas mal, mais il m'a fallu introduire des changements dans le code. J'ai fait ces ajouts avec du code "différentiel" (en utilisant le preprocesseur de C++ pour détecter la version d'ITK et donc laisser le code utilisable depuis itk 3 ou itk 4). Je vous joins un "patch" avec les changements (je n'ai pas accès git pour faire un "commit" depuis ici...). Pour appliquer le patch, il faut aller au repertoire avec les sources de creatools (là où il y a un repertoire par projet), copier ici le patch ci-joint et executer la commande: "patch -p1 < patch_creatools". L'explication des changements est:

- Il faut compiler ITK 4 avec l'option "ITK_USE_CONCEPT_CHECKING" en "OFF". La cause c'est le système de "demangling" des pointeurs vers des objets "itk::Image" utilisé dans bbitk, qui est peu trop générique. J'ai une idée pour le faire marcher d'une façon plus propre, mais il me faudrait quelques jours de plus.
- bbtk, bbfy: j'ai rajouté un "tag" xml: verbosePreprocessor. Cela pour permettre au programmeur de jouer avec le preprocesseur (#if et cie.) de C++ et avoir du code "différentiel" (par exemple, pour utiliser des filtres itk 3 qui n'existent plus dans itk 4).
- bbtk, BBTKConfigurePackage_src.cmake: la variable d'environnement LD_LIBRARY_PATH était effacée au moment d'invoquer bbfy, donc bbfy ne marchait plus.
- bbtk, bbitkDICOMSeriesFileNames.xml: le nouveau "tag" xml est utilisé ici (itkDICOMSeriesFileNames n'existe plus dans itk 3, dans itk 4 s'appelle itkGDCMSeriesFileNames).
- crea: CDMUtilities.*: un template n'était pas bien utilisé (une instantiation explicite était nécessaire).
- crea: modelCDMProjectsTreeNode.h: une méthode manquait.
- creaBruker/testBruker2Dicom: les librairies de BOOST doivent être enchaînées en dernier... Magique!
- creaImageIO/TestWxGimmickReaderDialog/CMakeLists.txt: il y manquait l'enchaînement vers les librairies ITK.
- creaImageIO/src/creaImageIOWxAnySimpleDlg.cpp: des classes itk 3 qui n'existent plus dans itk 4.

Voilà! J'espère que ça peut vous être utile.

Amicalement,

Leo

kernel/appli/bbfy/bbfy.cpp
kernel/cmake/BBTKConfigurePackage_src.cmake
packages/itk/src/bbitkDICOMSeriesFileNames.xml
packages/itkvtk/src/bbitkvtkitkImage2vtkImageData.cxx
packages/itkvtk/src/bbitkvtkitkImageVector2vtkImageDataVector.cxx

index 43f89023c53ed59c3d9f223eed78d26fe0347a03..412e66e665a570320d5e63c109dac34cc5eb7fab 100644 (file)
@@ -103,6 +103,7 @@ private:
   std::string mTemplateImplementation;
 
   std::vector<std::string> mInclude;
+  std::string mVerbosePreprocessor;
   std::vector<std::string> mTypedef;
 
   std::string mUserSetDefaultValues;
@@ -293,6 +294,14 @@ void bbfy::ParseXML()
       mAuthor += val;
     }
 
+  // Verbose preprocessor
+  for (i=0,j=0; i<BB.nChildNode("verbosePreprocessor"); i++) 
+  {
+    std::string val;
+    bbtk::GetTextOrClear(BB.getChildNode("verbosePreprocessor",&j),val);
+    mVerbosePreprocessor += val + "\n";
+  }
+
   // Description
   for (i=0,j=0; i<BB.nChildNode("description"); i++) 
     {
@@ -555,6 +564,9 @@ void bbfy::CreateHeader()
   mFile << "#ifndef " << included <<"\n";
   mFile << "#define " << included <<"\n";
 
+  // Verbose preprocessor
+  mFile << mVerbosePreprocessor << "\n";
+
   // Includes 
   mFile << "#include \"bb" << mPackage << "_EXPORT.h\"\n";
   std::vector<std::string>::iterator i;
index 55036d4de135ecadb966151584538846be4b2ad6..b00969be3d8df53fdd6b52c450a77c06beb550cc 100644 (file)
@@ -121,7 +121,7 @@ FOREACH(xmlfile ${${BBTK_PACKAGE_NAME}_XML_SOURCES})
     ADD_CUSTOM_COMMAND(
       OUTPUT ${BBFY_CXX_OUT}
       COMMAND
-      export LD_LIBRARY_PATH=${LD_LIBRARY_PATH} && ${BBTK_BBFY} ${xmlfile} ${BBTK_PACKAGE_NAME} ${CMAKE_CURRENT_BINARY_DIR}/ -q
+      ${BBTK_BBFY} ${xmlfile} ${BBTK_PACKAGE_NAME} ${CMAKE_CURRENT_BINARY_DIR}/ -q
       DEPENDS ${xmlfile}
       ${BBTK_BBFY_DEPENDENCY} 
       )
index 2941999804b5bbbbc616dcd6ba926e66eb2b8ed7..d88e86b5194e9e0330b9819c4a8749572319bd2b 100644 (file)
     #include directives to be put in the .h generated
     There must be one tag per file to include
     Here we include the standard header iostream.h -->
-  <include><PRE>itkDICOMSeriesFileNames.h</PRE></include>
+  <!-- <include><PRE>itkDICOMSeriesFileNames.h</PRE></include>-->
   <!--=====================================================================-->
+  <verbosePreprocessor><PRE>
+#include <itkConfigure.h>
+#if ITK_VERSION_MAJOR < 4
+#  include <itkDICOMSeriesFileNames.h>
+#else
+#  include <itkGDCMSeriesFileNames.h>
+#endif
+  </PRE></verbosePreprocessor>
 
   <!--========================================================================
     INPUTS/OUTPUTS DECLARATION --> 
   <!--========================================================================
     THE PROCESSING METHOD BODY -->
   <process><PRE>
+#if ITK_VERSION_MAJOR < 4
     itk::DICOMSeriesFileNames::Pointer names = 
      itk::DICOMSeriesFileNames::New();
     names->SetDirectory(bbGetInputIn()); 
     bbSetOutputOut( names->GetFileNames() );
+#else
+    itk::GDCMSeriesFileNames::Pointer names = 
+     itk::GDCMSeriesFileNames::New();
+    names->SetDirectory(bbGetInputIn()); 
+    bbSetOutputOut(
+      names->GetFileNames( names->GetSeriesUIDs().begin()->c_str() )
+    );
+#endif
   </PRE></process>
   <!--=====================================================================-->
 
index 6e192c2b19a88252befa4731f6f6aa3fbab4bba4..77240acb1fd5dd9dd3406472827166c7fb2f1adc 100644 (file)
 #include "bbitkvtkPackage.h"
 #include "itkImageToVTKImageFilter.h"
 
+// -------------------------------------------------------------------------
+// LFV: avoid itk::Concept check on 4d or superior images
+#define BBITKVTK_itkImage2vtkImageData_Template( t, ty, di )            \
+  if( t == typeid( itk::Image< ty, di > ) )                             \
+    this->Convert< itk::Image< ty, di > >( )
+// -------------------------------------------------------------------------
 
 namespace bbitkvtk 
 {
@@ -55,7 +61,42 @@ namespace bbitkvtk
   void itkImage2vtkImageData::Convert()
   {
     bbtk::TypeInfo t = bbGetInputIn().type();
-    BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t,Convert);
+
+    // Only supports images in 1, 2 or 3 dimensions
+    BBITKVTK_itkImage2vtkImageData_Template( t, char, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, short, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, int, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, long, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, float, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, double, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned char, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned short, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned int, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned long, 1 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, char, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, short, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, int, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, long, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, float, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, double, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned char, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned short, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned int, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned long, 2 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, char, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, short, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, int, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, long, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, float, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, double, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned char, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned short, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned int, 3 );
+    else BBITKVTK_itkImage2vtkImageData_Template( t, unsigned long, 3 );
+
+    /* Deprecated
+       BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t,Convert);
+    */
   }
 
    template<class T>
index db9b1477f0a6b590ad4cc494673baaaac13d4b83..c26717aeee183ff5e7b992cd8c26ec8543f347b3 100644 (file)
 #include "bbitkvtkPackage.h"
 #include "itkImageToVTKImageFilter.h"
 
+// -------------------------------------------------------------------------
+// LFV: avoid itk::Concept check on 4d or superior images
+#define BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, ty, di ) \
+  if( t == typeid( itk::Image< ty, di > ) )                             \
+    this->Convert< itk::Image< ty, di > >( )
+// -------------------------------------------------------------------------
 
 namespace bbitkvtk 
 {
@@ -57,7 +63,42 @@ namespace bbitkvtk
   {
   // suppose *all* the images have the same type // JPR
     bbtk::TypeInfo t = bbGetInputIn()[0].type();
-    BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t,Convert);
+
+    // Only supports images in 1, 2 or 3 dimensions
+    BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, char, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, short, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, int, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, long, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, float, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, double, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned char, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned short, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned int, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned long, 1 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, char, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, short, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, int, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, long, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, float, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, double, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned char, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned short, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned int, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned long, 2 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, char, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, short, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, int, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, long, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, float, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, double, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned char, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned short, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned int, 3 );
+    else BBITKVTK_itkImageVector2vtkImageDataVector_Template( t, unsigned long, 3 );
+
+    /* Deprecated
+       BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t,Convert);
+    */
   }
 
    template<class T>