From c2d2ccbc4bac635e5d0b802d9830efd94b060dab Mon Sep 17 00:00:00 2001 From: Daniel Gonzalez Date: Wed, 29 May 2013 15:45:36 +0200 Subject: [PATCH] By Leonardo Florez MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 12 ++++++ kernel/cmake/BBTKConfigurePackage_src.cmake | 2 +- .../itk/src/bbitkDICOMSeriesFileNames.xml | 19 +++++++- .../src/bbitkvtkitkImage2vtkImageData.cxx | 43 ++++++++++++++++++- ...tkvtkitkImageVector2vtkImageDataVector.cxx | 43 ++++++++++++++++++- 5 files changed, 115 insertions(+), 4 deletions(-) diff --git a/kernel/appli/bbfy/bbfy.cpp b/kernel/appli/bbfy/bbfy.cpp index 43f8902..412e66e 100644 --- a/kernel/appli/bbfy/bbfy.cpp +++ b/kernel/appli/bbfy/bbfy.cpp @@ -103,6 +103,7 @@ private: std::string mTemplateImplementation; std::vector mInclude; + std::string mVerbosePreprocessor; std::vector mTypedef; std::string mUserSetDefaultValues; @@ -293,6 +294,14 @@ void bbfy::ParseXML() mAuthor += val; } + // Verbose preprocessor + for (i=0,j=0; i::iterator i; diff --git a/kernel/cmake/BBTKConfigurePackage_src.cmake b/kernel/cmake/BBTKConfigurePackage_src.cmake index 55036d4..b00969b 100644 --- a/kernel/cmake/BBTKConfigurePackage_src.cmake +++ b/kernel/cmake/BBTKConfigurePackage_src.cmake @@ -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} ) diff --git a/packages/itk/src/bbitkDICOMSeriesFileNames.xml b/packages/itk/src/bbitkDICOMSeriesFileNames.xml index 2941999..d88e86b 100644 --- a/packages/itk/src/bbitkDICOMSeriesFileNames.xml +++ b/packages/itk/src/bbitkDICOMSeriesFileNames.xml @@ -42,8 +42,16 @@ #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 --> -
itkDICOMSeriesFileNames.h
+ +
+#include 
+#if ITK_VERSION_MAJOR < 4
+#  include 
+#else
+#  include 
+#endif
+  
@@ -58,10 +66,19 @@
+#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
   
diff --git a/packages/itkvtk/src/bbitkvtkitkImage2vtkImageData.cxx b/packages/itkvtk/src/bbitkvtkitkImage2vtkImageData.cxx index 6e192c2..77240ac 100644 --- a/packages/itkvtk/src/bbitkvtkitkImage2vtkImageData.cxx +++ b/packages/itkvtk/src/bbitkvtkitkImage2vtkImageData.cxx @@ -45,6 +45,12 @@ #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 diff --git a/packages/itkvtk/src/bbitkvtkitkImageVector2vtkImageDataVector.cxx b/packages/itkvtk/src/bbitkvtkitkImageVector2vtkImageDataVector.cxx index db9b147..c26717a 100644 --- a/packages/itkvtk/src/bbitkvtkitkImageVector2vtkImageDataVector.cxx +++ b/packages/itkvtk/src/bbitkvtkitkImageVector2vtkImageDataVector.cxx @@ -46,6 +46,12 @@ #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 -- 2.47.1