--- /dev/null
+#include "bbgdcmvtkGetXCoherentInfoGdcmReader.h"
+#include "bbgdcmvtkPackage.h"
+
+#include "gdcmFile.h"
+#include "gdcmFileHelper.h"
+#include "vtkImageData.h"
+#include "vtkGdcmReader.h"
+#include <vtkIndent.h>
+
+namespace bbgdcmvtk
+{
+
+BBTK_ADD_BLACK_BOX_TO_PACKAGE(gdcmvtk,GetXCoherentInfoGdcmReader)
+BBTK_BLACK_BOX_IMPLEMENTATION(GetXCoherentInfoGdcmReader,bbtk::AtomicBlackBox);
+void GetXCoherentInfoGdcmReader::Process()
+{
+ // Read the first image file
+ f = GDCM_NAME_SPACE::File::New();
+ f->SetFileName( bbGetInputIn()[0] );
+ bool res = f->Load();
+ if ( !res )
+ {
+ f->Delete();
+ bbSetOutputOut(0);
+ return;
+ }
+ // Get info from the first image file
+ int i;
+ std::vector<double> v_iop;
+ float iop[6];
+ f->GetImageOrientationPatient(iop);
+ for(i=0; i< 6; i++)
+ v_iop.push_back(iop[i]);
+ bbSetOutputIOP(v_iop );
+
+ std::vector<double> v_ipp;
+ float ipp[3];
+ f->GetImagePositionPatient(ipp);
+ for(i=0; i< 3; i++)
+ v_ipp.push_back(ipp[i]);
+ bbSetOutputIPP(v_ipp );
+
+ std::vector<double> v_pixelspacing;
+ v_pixelspacing.push_back(f->GetXSpacing());
+ v_pixelspacing.push_back(f->GetYSpacing());
+ if (f->GetZSize() != 1) {
+ v_pixelspacing.push_back(f->GetZSpacing());
+ }
+ bbSetOutputPixelSpacing(v_pixelspacing);
+
+// Add all the files to the SerieHelper
+ sh = GDCM_NAME_SPACE::SerieHelper::New();
+ std::vector<std::string> gii = bbGetInputIn();
+ for(std::vector<std::string>::iterator it = gii.begin();
+ it != gii.end();
+ ++it)
+ {
+ sh->AddFileName(*it);
+ }
+
+ GDCM_NAME_SPACE::FileList::const_iterator it;
+ GDCM_NAME_SPACE::FileList *l;
+
+ // ==================== Just to see ==============================
+
+ std::cout << std::endl << " ---------------------------------------- Recap"
+ << std::endl;
+ l = sh->GetFirstSingleSerieUIDFileSet();
+ while (l)
+ {
+ it = l->begin();
+ std::cout << "SerieUID [" << (*it)->GetEntryString(0x0020,0x000e) <<"] Serie Description ["
+ << (*it)->GetEntryString(0x0008,0x103e) << "] "
+ << " : " << l->size() << " files" << std::endl;
+ l = sh->GetNextSingleSerieUIDFileSet();
+ }
+ std::cout << " ----------------------------------------End Recap"
+ << std::endl << std::endl;
+
+ if(l->size() > 1)
+ std::cout << " --------------------------- More than ONE Serie UID ?!?"
+ << std::endl << std::endl;
+ // ============================================================
+
+ // Should only contain one!
+ l = sh->GetFirstSingleSerieUIDFileSet();
+
+ int nbFiles;
+ double zspacing = 0.;
+ nbFiles = l->size() ;
+ sh->OrderFileList(l);
+ zspacing = sh->GetZSpacing();
+
+ std::cout << "GetZSpacing() of sorted SingleSerieUIDFileSet "
+ << "from GDCM_NAME_SPACE::SerieHelper: " << zspacing << std::endl;
+ std::cout << " ('-1' means all the files have the same position)" << std::endl;
+
+ bbSetOutputInterSlice(zspacing);
+
+
+ reader = vtkGdcmReader::New();
+ //reader->SetFileName( bbGetInputIn().c_str() );
+ reader->SetCoherentFileList(l);
+ reader->Update();
+ reader->GetOutput();
+
+ vtkIndent indent ;
+ reader->GetOutput()->PrintSelf(std::cout, indent);
+ bbSetOutputOut( reader->GetOutput() );
+}
+
+void GetXCoherentInfoGdcmReader::bbUserConstructor()
+{
+ std::vector<std::string> init;
+ init.push_back("");
+ bbSetInputIn(init);
+}
+
+void GetXCoherentInfoGdcmReader::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
+{
+
+}
+
+void GetXCoherentInfoGdcmReader::bbUserDestructor()
+{
+ if(reader)
+ reader->Delete();
+ if(f)
+ f->Delete();
+ if(sh)
+ sh->Delete();
+}
+
+}
+// EO namespace bbgdcmvtk
+
+
--- /dev/null
+#ifdef _USE_VTK_
+
+#ifndef __bbgdcmvtkGetXCoherentInfoGdcmReader_h_INCLUDED__
+#define __bbgdcmvtkGetXCoherentInfoGdcmReader_h_INCLUDED__
+
+#include "bbgdcmvtk_EXPORT.h"
+#include "bbtkAtomicBlackBox.h"
+#include "iostream"
+
+#include "vtkGdcmReader.h"
+#include "gdcmFile.h"
+#include "gdcmSerieHelper.h"
+
+namespace bbgdcmvtk
+{
+
+class bbgdcmvtk_EXPORT GetXCoherentInfoGdcmReader
+ :
+ public bbtk::AtomicBlackBox
+{
+ BBTK_BLACK_BOX_INTERFACE(GetXCoherentInfoGdcmReader,bbtk::AtomicBlackBox);
+//==================================================================
+/// User callback called in the box contructor
+virtual void bbUserConstructor();
+/// User callback called in the box copy constructor
+virtual void bbUserCopyConstructor(bbtk::BlackBox::Pointer);
+/// User callback called in the box destructor
+virtual void bbUserDestructor();
+//==================================================================
+
+ BBTK_DECLARE_INPUT(In, std::vector<std::string>);
+ BBTK_DECLARE_OUTPUT(Out, vtkImageData *);
+ BBTK_DECLARE_OUTPUT(IPP, std::vector<double>);
+ BBTK_DECLARE_OUTPUT(IOP, std::vector<double>);
+ BBTK_DECLARE_OUTPUT(PixelSpacing, std::vector<double>);
+ BBTK_DECLARE_OUTPUT(InterSlice, double);
+
+ BBTK_PROCESS(Process);
+ void Process();
+
+ private:
+ GDCM_NAME_SPACE::File *f;
+ GDCM_NAME_SPACE::SerieHelper *sh;
+ vtkGdcmReader *reader;
+};
+
+ //=================================================================
+ // UserBlackBox description
+BBTK_BEGIN_DESCRIBE_BLACK_BOX(GetXCoherentInfoGdcmReader,bbtk::AtomicBlackBox);
+BBTK_NAME("GetXCoherentInfoGdcmReader");
+BBTK_AUTHOR("jpr, eduardo");
+BBTK_DESCRIPTION("Get Dicom info from a File Set and read (as a vtkImageData)");
+BBTK_CATEGORY("");
+
+BBTK_INPUT(GetXCoherentInfoGdcmReader,In,"Dicom image file name",std::vector<std::string>,"");
+
+BBTK_OUTPUT(GetXCoherentInfoGdcmReader,Out, "Output image", vtkImageData *,"");
+BBTK_OUTPUT(GetXCoherentInfoGdcmReader,IPP, "Image Position (Patient)", std::vector<double>,"");
+BBTK_OUTPUT(GetXCoherentInfoGdcmReader,IOP, "Image Orientation (Patient)", std::vector<double>,"");
+BBTK_OUTPUT(GetXCoherentInfoGdcmReader,PixelSpacing,"Pixel Spacing", std::vector<double>,"");
+BBTK_OUTPUT(GetXCoherentInfoGdcmReader,InterSlice, "InterSlice", double,"");
+BBTK_END_DESCRIBE_BLACK_BOX(GetXCoherentInfoGdcmReader);
+} // EO namespace bbgdcmvtk
+
+#endif // __bbgdcmvtkGetXCoherentInfoGdcmReader_h_INCLUDED__
+
+#endif //_USE_VTK_