#include "clitkImageCommon.h"
#include "vvImageReader.h"
#include "vvImageWriter.h"
+#include <itkGDCMImageIO.h>
+#include <itkGDCMSeriesFileNames.h>
#include <gdcmFile.h>
#include <vtkVersion.h>
#include <vtkImageChangeInformation.h>
} 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 ...
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());
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);
std::vector<double> locs = sliceLocations[*sn];
std::vector<double> origin = theorigin[*sn];
std::vector<std::string> files = seriesFiles[*sn];
- std::vector<int> sliceIndex;
- clitk::GetSortedIndex(locs, sliceIndex);
+ std::vector<int> sliceIndex(files.size());
+ //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);
+ bool found(false);
+ while (!found && j<temp.size()) {
+ const size_t last_slash_idx2 = temp[j].rfind('/');
+ std::string tempFilename(temp[j]);
+ if (temp[j][0] == '.' && temp[j][1] == '/')
+ tempFilename = temp[j].substr(2, temp[j].size()-1);
+ if (tempFilename == files[i]) {
+ sliceIndex[j] = i;
+ found = true;
+ }
+ ++j;
+ }
+ }
+ if (sliceIndex.size() == 0) { //ie. sn is not a serie present in files
+ sn++;
+ continue;
+ }
+
if (args_info.verbose_flag) {
std::cout << locs[sliceIndex[0]] << " -> "
<< sliceIndex[0] << " / " << 0 << " => "