]> Creatis software - clitk.git/commitdiff
Add 2 options to clitkImage2Dicom
authortbaudier <thomas.baudier@creatis.insa-lyon.fr>
Wed, 20 Mar 2019 09:02:24 +0000 (10:02 +0100)
committertbaudier <thomas.baudier@creatis.insa-lyon.fr>
Wed, 20 Mar 2019 09:02:24 +0000 (10:02 +0100)
volum option:
To save a volume instead of a slice serie
Need to know the output dimension before compilitaion, so the template of the function is modified

tag and key options:
To change dicom tag
Keep the model of clitkWriteDicomSeries

tools/clitkImage2Dicom.ggo
tools/clitkImage2DicomGenericFilter.h
tools/clitkImage2DicomGenericFilter.txx

index 3c3022ae0c62634b7e9e0acf38bce8e33604b3cc..bb56d5533cdd0aba92cd835d7002a7ba44e8f786 100644 (file)
@@ -11,4 +11,7 @@ option "inputDcm"   d "Input dicom filename"    string  no
 option "outputDcm"  o "Output dicom folder"     string  no
 option "nameDicom"  n "Output dicom filename"   string  no
 option "newUID"     u "Write output with new UID" flag  off
+option "volume"     - "Save a dicom volume"       flag  off
+option "key"        k "Keys of tags to modify"  string  no multiple
+option "tag"        t "Tags values"             string  no multiple
 
index 3e47a342e66aad93261389f5d09c54d28b45814c..5b56222b1916a3aa007b69f07d7d6a95af65396e 100644 (file)
@@ -129,8 +129,8 @@ namespace clitk
     //----------------------------------------  
     // Templated members
     //----------------------------------------  
-    template <unsigned int Dimension>  void UpdateWithDim(std::string PixelType);
-    template <unsigned int Dimension, class PixelType>  void UpdateWithDimAndPixelType();
+    template <unsigned int inputDimension, unsigned int outputDimension>  void UpdateWithDim(std::string PixelType);
+    template <unsigned int inputDimension, unsigned int outputDimension, class PixelType>  void UpdateWithDimAndPixelType();
     
     
      //----------------------------------------  
index 37fa8a55a3cfc45052692396cb6300fcc22281af..dc5415b81b66fd78679e863cc9bb0d9a5128932e 100644 (file)
@@ -84,8 +84,17 @@ void Image2DicomGenericFilter<args_info_type>::Update()
 
 
   // Call UpdateWithDim
-  if(Dimension==2) UpdateWithDim<2>(PixelType);
-  else if(Dimension==3) UpdateWithDim<3>(PixelType);
+  if(Dimension==2) {
+    if (m_ArgsInfo.volume_flag)
+      UpdateWithDim<2,2>(PixelType);
+    else
+      UpdateWithDim<2,1>(PixelType);
+  } else if(Dimension==3) {
+    if (m_ArgsInfo.volume_flag)
+      UpdateWithDim<3,3>(PixelType);
+    else
+      UpdateWithDim<3,2>(PixelType);
+  }
   // else if (Dimension==4)UpdateWithDim<4>(PixelType);
   else {
     std::cout<<"Error, Only for 2 or 3  Dimensions!!!"<<std::endl ;
@@ -97,37 +106,37 @@ void Image2DicomGenericFilter<args_info_type>::Update()
 // Update with the number of dimensions
 //-------------------------------------------------------------------
 template<class args_info_type>
-template<unsigned int Dimension>
+template<unsigned int inputDimension, unsigned int outputDimension>
 void
 Image2DicomGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
 {
-  if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
+  if (m_Verbose) std::cout << "Image was detected to be "<<inputDimension<<"D and "<< PixelType<<"..."<<std::endl;
 
   if(PixelType == "short") {
-    if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
-    UpdateWithDimAndPixelType<Dimension, signed short>();
+    if (m_Verbose) std::cout << "Launching filter in "<< inputDimension <<"D and signed short..." << std::endl;
+    UpdateWithDimAndPixelType<inputDimension, outputDimension, signed short>();
   }
   else if(PixelType == "unsigned_short"){
-    if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
-    UpdateWithDimAndPixelType<Dimension, unsigned short>();
+    if (m_Verbose) std::cout  << "Launching filter in "<< inputDimension <<"D and unsigned_short..." << std::endl;
+    UpdateWithDimAndPixelType<inputDimension, outputDimension, unsigned short>();
   }
 
   else if (PixelType == "unsigned_char") {
-    if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
-    UpdateWithDimAndPixelType<Dimension, unsigned char>();
+    if (m_Verbose) std::cout  << "Launching filter in "<< inputDimension <<"D and unsigned_char..." << std::endl;
+    UpdateWithDimAndPixelType<inputDimension, outputDimension, unsigned char>();
   }
 
   //     else if (PixelType == "char"){
-  //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
-  //       UpdateWithDimAndPixelType<Dimension, signed char>();
+  //       if (m_Verbose) std::cout  << "Launching filter in "<< inputDimension <<"D and signed_char..." << std::endl;
+  //       UpdateWithDimAndPixelType<inputDimension, outputDimension, signed char>();
   //     }
   else if (PixelType == "double") {
-    if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and double..." << std::endl;
-    UpdateWithDimAndPixelType<Dimension, double>();
+    if (m_Verbose) std::cout  << "Launching filter in "<< inputDimension <<"D and double..." << std::endl;
+    UpdateWithDimAndPixelType<inputDimension, outputDimension, double>();
   }
   else {
-    if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
-    UpdateWithDimAndPixelType<Dimension, float>();
+    if (m_Verbose) std::cout  << "Launching filter in "<< inputDimension <<"D and float..." << std::endl;
+    UpdateWithDimAndPixelType<inputDimension, outputDimension, float>();
   }
 }
 
@@ -139,14 +148,14 @@ Image2DicomGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
 // series.
 //-------------------------------------------------------------------
 template<class args_info_type>
-template <unsigned int Dimension, class  PixelType>
+template <unsigned int inputDimension, unsigned int outputDimension, class  PixelType>
 void
 Image2DicomGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
 {
   // Validate input parameters
 
-  const unsigned int InputDimension = Dimension;
-  const unsigned int OutputDimension = Dimension-1;
+  const unsigned int InputDimension = inputDimension;
+  const unsigned int OutputDimension = outputDimension;
 
   typedef itk::Image< PixelType, InputDimension > InputImageType;
   typedef itk::Image< PixelType, OutputDimension > OutputImageType;
@@ -237,7 +246,12 @@ Image2DicomGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
   itk::ExposeMetaData<std::string>(*inputDict, "0020|000d", studyUID);
   itk::ExposeMetaData<std::string>(*inputDict, "0008|0016", sopClassUID);
   gdcmIO->KeepOriginalUIDOn();
-  for (unsigned int f = 0; f < outputSize[2]; f++)
+  unsigned int numberOfKeysGiven=m_ArgsInfo.key_given;
+  unsigned int fLimit = outputSize[2];
+  if (m_ArgsInfo.volume_flag)
+    fLimit = 1;
+
+  for (unsigned int f = 0; f < fLimit; f++)
   {
     // Create a new dictionary for this slice
     typename ReaderType::DictionaryRawPointer dict = new typename ReaderType::DictionaryType;
@@ -348,6 +362,15 @@ Image2DicomGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
     itk::EncapsulateMetaData<std::string>(*dict,"0018|0050", value.str());
     // Spacing Between Slices
     itk::EncapsulateMetaData<std::string>(*dict,"0018|0088", value.str());
+
+    //Add ggo key
+    for (unsigned int i = 0; i < numberOfKeysGiven; i++) {
+      std::string entryId(m_ArgsInfo.key_arg[i]  );
+      std::string value( m_ArgsInfo.tag_arg[i] );
+
+      itk::EncapsulateMetaData<std::string>(*dict, entryId, value);
+    }
+
     // Save the dictionary
     outputArray.push_back(dict);
   }
@@ -388,7 +411,11 @@ Image2DicomGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
   seriesFormat = seriesFormat + "IM%d.dcm";
   outputNames->SetSeriesFormat(seriesFormat.c_str());
   outputNames->SetStartIndex(1);
-  outputNames->SetEndIndex(outputSize[2]);
+  if (m_ArgsInfo.volume_flag) {
+    outputNames->SetEndIndex(1);
+  } else {
+    outputNames->SetEndIndex(outputSize[2]);
+  }
 
   typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
 #if ( ( ITK_VERSION_MAJOR == 4 ) && ( ITK_VERSION_MINOR < 6 ) )