]> Creatis software - clitk.git/blobdiff - tools/clitkDicom2Image.cxx
Do not use Series Details
[clitk.git] / tools / clitkDicom2Image.cxx
index b3bcc902de0699f224e2047f9922f4f0f057bc29..d32fbae019e1ca525c30044f7363fbe0d1924adc 100644 (file)
@@ -23,6 +23,8 @@
 #include "clitkImageCommon.h"
 #include "vvImageReader.h"
 #include "vvImageWriter.h"
+#include <itkGDCMImageIO.h>
+#include <itkGDCMSeriesFileNames.h>
 #include <gdcmFile.h>
 #include <vtkVersion.h>
 #include <vtkImageChangeInformation.h>
@@ -55,6 +57,15 @@ int main(int argc, char * argv[])
   } else for (unsigned int i=0; i<args_info.inputs_num; i++)
       input_files.push_back(args_info.inputs[i]);
 
+  //Get GDCMSeriesFileNames order to sort filenames
+  typedef itk::GDCMSeriesFileNames NamesGeneratorType;
+  NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
+  nameGenerator->SetUseSeriesDetails(false);
+  std::string folderName=".";
+  const size_t last_slash_idx = input_files[0].rfind('/');
+  if (std::string::npos != last_slash_idx)
+    folderName = input_files[0].substr(0, last_slash_idx);
+  nameGenerator->SetInputDirectory(folderName);
 
   //===========================================
   /// Get slices locations ...
@@ -82,11 +93,9 @@ int main(int argc, char * argv[])
     hreader.Read();
     gdcm::DataSet& ds = hreader.GetFile().GetDataSet();
 
-    if (args_info.extract_series_flag) {
-      gdcm::Attribute<0x20,0x000e> series_UID_att;
-      series_UID_att.SetFromDataSet(ds);
-      series_UID = series_UID_att.GetValue();
-    }
+    gdcm::Attribute<0x20,0x000e> series_UID_att;
+    series_UID_att.SetFromDataSet(ds);
+    series_UID = series_UID_att.GetValue().c_str();
 
     series_UIDs.insert(series_UID);
     theorigin[series_UID] = gdcm::ImageHelper::GetOriginValue(hreader.GetFile());
@@ -121,9 +130,7 @@ int main(int argc, char * argv[])
   header->SetMaxSizeLoadEntry(16384); // required ?
   header->Load();
 
-  if (args_info.extract_series_flag) {
-    series_UID = header->GetEntryValue(0x20,0x000e).c_str();
-  }
+  series_UID = header->GetEntryValue(0x20,0x000e).c_str();
 
   series_UIDs.insert(series_UID);
   theorigin[series_UID].resize(3);
@@ -149,7 +156,22 @@ int main(int argc, char * argv[])
     std::vector<double> origin = theorigin[*sn];
     std::vector<std::string> files = seriesFiles[*sn];
     std::vector<int> sliceIndex;
-    clitk::GetSortedIndex(locs, sliceIndex);
+    //clitk::GetSortedIndex(locs, sliceIndex);
+    //Look for files into GDCMSeriesFileNames, because it sorts files correctly and take the order
+    const std::vector<std::string> & temp = nameGenerator->GetFileNames(*sn);
+    for(unsigned int i=0; i<files.size(); i++) {
+      int j(0);
+      while (sliceIndex.size()==i && j<temp.size()) {
+        const size_t last_slash_idx2 = temp[j].rfind('/');
+        std::string tempFilename(temp[j]);
+        if (temp[j][0] == '.' && std::string::npos != last_slash_idx2)
+          tempFilename = temp[j].substr(last_slash_idx2+1, temp[j].size()-1);
+        if (tempFilename == files[i])
+          sliceIndex.push_back(j);
+        ++j;
+      }
+    }
+
     if (args_info.verbose_flag) {
       std::cout << locs[sliceIndex[0]] << " -> "
                 << sliceIndex[0] << " / " << 0 << " => "