Program: gdcm
Module: $RCSfile: vtkGdcm4DSplitter.cxx,v $
Language: C++
- Date: $Date: 2011/03/29 15:45:38 $
- Version: $Revision: 1.4 $
+ Date: $Date: 2011/04/08 00:11:36 $
+ Version: $Revision: 1.8 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
- User choosen tag
void setSplitOnTag(unsigned short splitGroup, unsigned short splitElem);
void setSplitConvertToFloat(bool conv);
+ - UserDefined Function
+ void setSortOnUserFunction (FoncComp f);
+
+ for 'true' 3D image sets :
+ - if you want to get a single 3D vtkImageData, use SplitOnOrientation -i.e. no split-
+ - if you want to get a vector of 2D vtkImageData, use SplitOnPosition -i.e. one slice in each 'XCoherent filesite'-
+
+ for 'true' 4D multi-orientation image sets (i.e. a stack of axial + sagital + coronal images, at different instants ...)
+ --> this is 5D, right?
+ Nothing done, yet.
+
. Choose 'sort' criterion :
--------------------------
- ImagePositionPatient
- void setSortOnPosition();
- - User choosen tag
- void setSortOnTag(unsigned short sortGroup, unsigned short sortElem);
- void setSortConvertToFloat(bool conv)
-
-. Execute
+ void setSortOnPosition();
+ - ImageOrientationPatient
+ ==> Only in your dreams!
+ ==> or, please, write a IOP sorter ...
+ - UserDefined Function
+ void setSortOnUserFunction (FoncComp f);
+ - File name
+ void setSortOnFileName()
+
+. Execute :
-----------
bool Go();
. Get the result
----------------
- -a single vtkImageData:
- vtkImageData *GetImageData();
+// -a single vtkImageData:
+// vtkImageData *GetImageData();
- a vector of vtkImageData
std::vector<vtkImageData*> *GetImageDataVector();
SortOnPosition(false), SortOnOrientation(false), SortOnTag(false),
SortGroup(0), SortElem(0), SortConvertToFloat(false),
- Recursive(false), TypeDir(0),
- verbose(true)
+ Recursive(false), TypeDir(0),
+ verbose(false)
{
}
std::vector<vtkImageData*> * vtkGdcm4DSplitter::GetImageDataVector()
- {
- if (verbose) std::cout << "TypeDir " << TypeDir << std::endl;
+ {
+/*
+ if (verbose) std::cout << "GetImageDataVector : TypeResult " << TypeResult << std::endl;
if (TypeResult == 2)
return ImageDataVector;
else
}
else
return (std::vector<vtkImageData*>*) NULL;
+*/
+ return ImageDataVector;
}
vtkImageData *vtkGdcm4DSplitter::GetImageData()
{
+ /*
+ if (verbose) std::cout << "GetImageData : TypeResult " << TypeResult << std::endl;
if (TypeResult == 1)
return ImageData;
else
- if (TypeResult == 1)
+ if (TypeResult == 2)
{
return (*ImageDataVector)[0];
}
else
return (vtkImageData*) NULL;
- }
-
+*/
+ return (*ImageDataVector)[0];
+ }
bool vtkGdcm4DSplitter::setDirName(std::string &dirName)
{
bool vtkGdcm4DSplitter::CompareOnSortTagConvertToFloat(GDCM_NAME_SPACE::File *file1, GDCM_NAME_SPACE::File *file2)
{
- if (verbose) printf ("%04x %04x\n", this->SortGroup,this->SortElem);
- if (verbose) std :: cout << file1->GetEntryString(SortGroup,SortElem).c_str() << " : "
+ /* if (verbose) printf ("%04x %04x\n", this->SortGroup,this->SortElem);
+ if (verbose) std :: cout << file1->GetEntryString(SortGroup,SortElem).c_str() << " : "
<< atof(file1->GetEntryString(SortGroup,SortElem).c_str())
<< std::endl;
- return atof(file1->GetEntryString(SortGroup,SortElem).c_str()) < atof(file2->GetEntryString(SortGroup,SortElem).c_str());
+*/
+// return atof(file1->GetEntryString(vtkGdcm4DSplitter::SortGroup,vtkGdcm4DSplitter::SortElem).c_str()) < atof(file2->GetEntryString(vtkGdcm4DSplitter::SortGroup,vtkGdcm4DSplitter::SortElem).c_str());
+ return atof(file1->GetEntryString(SortGroup,SortElem).c_str()) < atof(file2->GetEntryString(SortGroup,SortElem).c_str());
}
bool vtkGdcm4DSplitter::CompareOnSortTag(GDCM_NAME_SPACE::File *file1, GDCM_NAME_SPACE::File *file2)
{
- return file1->GetEntryString(SortGroup,SortElem) < file2->GetEntryString(SortGroup,SortElem);
+ return file1->GetEntryString(vtkGdcm4DSplitter::SortGroup,vtkGdcm4DSplitter::SortElem) < file2->GetEntryString(vtkGdcm4DSplitter::SortGroup,vtkGdcm4DSplitter::SortElem);
}
-
+
+
bool vtkGdcm4DSplitter::Go()
{
if (!SplitOnPosition && !SplitOnOrientation && !SplitOnTag )
else if (SortOnOrientation)
{
if (verbose) std::cout << "SortOnOrientation" << std::endl;
- /// \TODO SortOnOrientation()
- // Within a 'just to see' program,
- // OrderFileList() causes trouble, since some files
- // (eg:MIP views) don't have 'Position', now considered as mandatory
- // --> Activated on user demand.
-
- // Information is in :
- // 0020,0032 : Image Position Patient
- // 0020,0030 : Image Position (RET)
+ /// \TODO SortOnOrientation()
// we still miss an algo to sort an Orientation, given by 6 cosines!
// Anything like this, in GDCM2?
{
if (verbose) std::cout << "SortOnTag" << std::endl;
printf ("--> %04x %04x\n", SortGroup,SortElem);
+ std::cout << "Sorry, troubles not solved yet; use SortOnUserFunction, right now!" << std::endl;
+
+ /* ==> WARNING : This one has troubles; do NOT use it, right now!
+ // a pointer to fonction cannot be casted as a pointer to member function!
+ // Use SortOnUserFunction, instead!
+
if ( SortConvertToFloat )
s->SetUserLessThanFunction( reinterpret_cast<bool (*)(gdcm13::File*, gdcm13::File*)>
( &vtkGdcm4DSplitter::CompareOnSortTagConvertToFloat));
// Anything like this, in GDCM2?
s->UserOrdering((*i).second);
- if (verbose) std::cout << "Out of SortOnTag" << std::endl;
+ */
+
+ //if (verbose) std::cout << "Out of SortOnTag" << std::endl;
+ std::cout << "NO ordering performed :-( " << std::endl;
+ }
+
+ else if (SortOnUserFunction)
+ {
+ if (verbose) std::cout << "SortOnUserFunction" << std::endl;
+ s->SetUserLessThanFunction( UserCompareFunction );
+ // Anything like this, in GDCM2?
+ s->UserOrdering((*i).second);
+ if (verbose) std::cout << "Out of SortOnUserFunction" << std::endl;
}
reader->SetCoherentFileList((*i).second);
reader->Update();
/// \TODO : remove the following
- //if (verbose) reader->GetOutput()->PrintSelf(std::cout, vtkIndent(2));
+ if (verbose) {
+ std::cout << "reader->GetOutput() :" << std::endl;
+ reader->GetOutput()->PrintSelf(std::cout, vtkIndent(2));
+ }
ImageDataVector->push_back(reader->GetOutput() );
-
+
+ std::vector<vtkImageData*>::iterator it;
+ if (verbose)
+ for(it=ImageDataVector->begin(); it!=ImageDataVector->end(); ++it) {
+ std::cout << "-in vtkGdcm4DSplitter--------------------------" << std::endl;
+ (*it)->PrintSelf(std::cout, vtkIndent(2));
+ }
std::cout << std::endl;
}