X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fgdcmvtk%2Fsrc%2FbbgdcmvtkGetXCoherentInfoGdcmReader.cxx;h=25700ecdd80ce3d34c415c07e44265ced2a230d2;hb=8ba18df584ba0a409fb042663be9fa76ccb0e0b0;hp=e638f0ffa55f62b4d3b0e950319668ce83602f4e;hpb=b4f2f6f7aaea4344223882054b61faca214a1d99;p=bbtk.git diff --git a/packages/gdcmvtk/src/bbgdcmvtkGetXCoherentInfoGdcmReader.cxx b/packages/gdcmvtk/src/bbgdcmvtkGetXCoherentInfoGdcmReader.cxx index e638f0f..25700ec 100644 --- a/packages/gdcmvtk/src/bbgdcmvtkGetXCoherentInfoGdcmReader.cxx +++ b/packages/gdcmvtk/src/bbgdcmvtkGetXCoherentInfoGdcmReader.cxx @@ -1,117 +1,402 @@ +/* +# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la SantÈ) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# This software is governed by the CeCILL-B license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-B +# license as circulated by CEA, CNRS and INRIA at the following URL +# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +# or in the file LICENSE.txt. +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-B license and that you accept its terms. +# ------------------------------------------------------------------------ */ + #include "bbgdcmvtkGetXCoherentInfoGdcmReader.h" #include "bbgdcmvtkPackage.h" #include "gdcmFile.h" -#include "gdcmFileHelper.h" #include "vtkImageData.h" -#include "vtkGdcmReader.h" #include +#if defined USE_GDCM + #include "gdcmFileHelper.h" +#endif + +#if defined USE_GDCM2 + #include + #include + #include + #include + #include "vtkStringArray.h" +#endif + namespace bbgdcmvtk { BBTK_ADD_BLACK_BOX_TO_PACKAGE(gdcmvtk,GetXCoherentInfoGdcmReader) BBTK_BLACK_BOX_IMPLEMENTATION(GetXCoherentInfoGdcmReader,bbtk::AtomicBlackBox); + + +vtkImageData* GetXCoherentInfoGdcmReader::CreateDefaultImage() +{ + int i; + int sizeX, sizeY, sizeZ; + sizeX = 200; + sizeY = sizeX; + sizeZ = 1; + vtkImageData *newImage = vtkImageData::New(); + newImage->Initialize(); + newImage->SetSpacing( 1,1,1 ); + newImage->SetDimensions( sizeX,sizeY,sizeZ ); + newImage->SetExtent(0, sizeX-1,0,sizeY-1,0,sizeZ-1 ); + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + newImage->SetWholeExtent(0, sizeX-1,0,sizeY-1,0,sizeZ-1 ); + newImage->SetScalarTypeToUnsignedChar(); + newImage->SetNumberOfScalarComponents(1); + newImage->AllocateScalars(); + newImage->Update(); +#else + newImage->AllocateScalars(VTK_UNSIGNED_CHAR,1); +#endif + + memset ( (void*)newImage->GetScalarPointer(), 0, sizeX*sizeY*1 ); + for (i=0; iSetScalarComponentFromDouble(i,i,0, 0, 255 ); + newImage->SetScalarComponentFromDouble(i,sizeY-1-i,0, 0, 255 ); + } // for i + return newImage; +} + + +#if defined USE_GDCM + +void GetXCoherentInfoGdcmReader::Process2() +{ + printf("EED GetXCoherentInfoGdcmReader::Process >>>>>> \n" ); + GDCM_NAME_SPACE::FileList lstFiles; + int i,size=bbGetInputIn().size(); + for (i=0;iSetFileName( bbGetInputIn()[i] ); + bool res = f->Load(); + if ( res==true ) + { + lstFiles.push_back(f); + } + } // for + sh = GDCM_NAME_SPACE::SerieHelper::New(); + sh->ImagePositionPatientOrdering( &lstFiles ); + size=lstFiles.size(); + for (i=0;iGetFileName().c_str() ); + } // for +} + + void GetXCoherentInfoGdcmReader::Process() { // Read the *first* image file (a SET of file names is given as input) f = GDCM_NAME_SPACE::File::New(); - f->SetFileName( bbGetInputIn()[0] ); + + if ( bbGetInputIn().size()!=0 ) + { + f->SetFileName( bbGetInputIn()[0] ); + } else { + f->SetFileName( "" ); + } // if + bool res = f->Load(); if ( !res ) { - f->Delete(); - bbSetOutputOut(0); - return; - } + printf("EED GetXCoherentInfoGdcmReader::Process resultImage NULL\n"); + f->Delete(); + bbSetOutputOut( CreateDefaultImage() ); + return; + } // if res + // Get info from the first image file int i; std::vector v_iop; float iop[6]; f->GetImageOrientationPatient(iop); + for(i=0; i< 6; i++) + { v_iop.push_back(iop[i]); + } // for i bbSetOutputIOP(v_iop ); - - std::vector v_ipp; - float ipp[3]; - f->GetImagePositionPatient(ipp); - for(i=0; i< 3; i++) - v_ipp.push_back(ipp[i]); - bbSetOutputIPP(v_ipp ); + +// EED 2022-12-15 +// std::vector v_ipp; +// float ipp[3]; +// f->GetImagePositionPatient(ipp); +// for(i=0; i< 3; i++) +// { +// v_ipp.push_back(ipp[i]); +// } // for i +// bbSetOutputIPP(v_ipp ); + +// EED 2023-01-13 + GDCM_NAME_SPACE::FileList lstFiles; + GDCM_NAME_SPACE::FileList *l; + + if (bbGetInputRespectSerieUID()==false) + { + int i,size=bbGetInputIn().size(); + for (i=0;iSetFileName( bbGetInputIn()[i] ); + bool res = f->Load(); + if ( res==true ) + { + lstFiles.push_back(f); + } + } // for i + sh = GDCM_NAME_SPACE::SerieHelper::New(); + l = &lstFiles; + sh->ImagePositionPatientOrdering( l ); + } else{ + // Add *all the files* to the SerieHelper + sh = GDCM_NAME_SPACE::SerieHelper::New(); + std::vector gii = bbGetInputIn(); + for(std::vector::iterator it = gii.begin(); + it != gii.end(); + ++it) + { + sh->AddFileName(*it); + } //for vector + GDCM_NAME_SPACE::FileList::const_iterator it; + // Should only contain one! + l = sh->GetFirstSingleSerieUIDFileSet(); + if (l==NULL) + { + return; + } + } // if bbGetInputForceRead + + double zspacing = 0.; + sh->OrderFileList(l); // this one should compute the *actual* Z Spacing! + zspacing = sh->GetZSpacing(); + std::vector v_pixelspacing; + v_pixelspacing.push_back( f->GetXSpacing() ); + v_pixelspacing.push_back( f->GetYSpacing() ); + v_pixelspacing.push_back( zspacing ); +// if (f->GetZSize() != 1) { +// v_pixelspacing.push_back(f->GetZSpacing()); +// } + bbSetOutputPixelSpacing(v_pixelspacing); + + VectorMapInfoDicom vectormapinfodicom; + uint16_t group; + uint16_t elem; + std::string key; + std::string strTagValue; // read on disc + int iTag,sizeDicomTagsVector=bbGetInputDicomTags().size(); + GDCM_NAME_SPACE::FileList::const_iterator iitt = l->begin(); + float px,py,pz; + + std::vector lstFileNames; + + for ( ; iitt != l->end(); ++iitt) + { + lstFileNames.push_back( (*iitt)->GetFileName() ); + // EED 2022-12-15 + if ( iitt == l->begin() ) // The first ordered element IPP + { + group = 0; + elem = 0; + strTagValue = std::string("void"); + sscanf("D0020_0032","D%04hx_%04hx",&group,&elem); + strTagValue = (*iitt)->GetEntryString(group,elem); + sscanf(strTagValue.c_str(),"%f\\%f\\%f\\%f", &px , &py , &pz); + std::vector v_ipp; + v_ipp.push_back( (double)px ); + v_ipp.push_back( (double)py ); + v_ipp.push_back( (double)pz ); + bbSetOutputIPP(v_ipp ); + } // if first elemetn get IPP + + MapInfoDicom mapinfodicom; + for (iTag=0; iTagGetEntryString(group,elem); + mapinfodicom.insert ( std::pair(key,strTagValue) ); + } // for iTag + vectormapinfodicom.push_back( mapinfodicom ); + } // for iitt + bbSetOutputDicomInfo( vectormapinfodicom ); + bbSetOutputOutFileNames( lstFileNames ); + + if (bbGetInputReadRaw()==true) + { + if (reader!=NULL) + { + reader->Delete(); + reader = NULL; + } + reader = vtkGdcmReader::New(); + //EED 21 mars 2012 FLIP probleme ..PLOP.. + reader->SetFlipY(false); + //reader->SetFileName( bbGetInputIn().c_str() ); + reader->SetCoherentFileList(l); + reader->Update(); + reader->GetOutput(); + bbSetOutputOut( reader->GetOutput() ); + } // if bGetInputReadRaw +} +#endif +// endif USE_GDCM -// Add *all the files* to the SerieHelper - sh = GDCM_NAME_SPACE::SerieHelper::New(); - std::vector gii = bbGetInputIn(); - for(std::vector::iterator it = gii.begin(); - it != gii.end(); - ++it) +#if defined USE_GDCM2 +void GetXCoherentInfoGdcmReader::Process() +{ +// printf("GetXCoherentInfoGdcmReader %d files.\n", bbGetInputIn().size() ); + // Read the *first* image file (a SET of file names is given as input) + gdcm::Reader *read = new gdcm::Reader(); + reader->SetFileName( bbGetInputIn()[0].c_str() ); + bool res = read->Read(); + if ( !res ) + { + delete read; + bbSetOutputOut(NULL); + return; + } + + // Get info from the first image file + const gdcm::File &f = read->GetFile(); + int i; + std::vector v_iop; + const gdcm::DataElement &deIop = f.GetDataSet().GetDataElement(gdcm::Tag(0x0020, 0x0037)); + std::stringstream ss; + deIop.GetValue().Print(ss); + gdcm::Element iop; + iop.Read( ss ); + for(i=0; i< 6; i++) { - sh->AddFileName(*it); + v_iop.push_back((float)(iop[i])); } + bbSetOutputIOP(v_iop ); + + std::vector v_ipp; + const gdcm::DataElement &deIpp = f.GetDataSet().GetDataElement(gdcm::Tag((0x0020,0x0032))); + deIpp.GetValue().Print(ss); + gdcm::Element ipp; + ipp.Read( ss ); + for(i=0; i< 3; i++) + { + v_ipp.push_back((float)(ipp[i])); + } // for 3 + bbSetOutputIPP(v_ipp ); - GDCM_NAME_SPACE::FileList::const_iterator it; - GDCM_NAME_SPACE::FileList *l; - - // Should only contain one! - l = sh->GetFirstSingleSerieUIDFileSet(); +// Add *all the files* to the IPPsorter + gdcm::IPPSorter s; + s.SetComputeZSpacing( true ); + s.SetZSpacingTolerance( 1e-3 ); + std::vector gii = bbGetInputIn(); + s.Sort(gii); - int nbFiles; - double zspacing = 0.; - nbFiles = l->size() ; - sh->OrderFileList(l); - zspacing = sh->GetZSpacing(); + //l = sh->GetFirstSingleSerieUIDFileSet(); + // no Test if we have multiple series + //s.GetFilenames(); + //int nbFiles; - std::vector v_pixelspacing; - v_pixelspacing.push_back( f->GetXSpacing() ); - v_pixelspacing.push_back( f->GetYSpacing() ); + double zspacing = 0.; + zspacing = s.GetZSpacing(); + std::vector v_pixelspacing = gdcm::ImageHelper::GetSpacingValue(f); + v_pixelspacing.push_back( v_pixelspacing[0] ); + v_pixelspacing.push_back( v_pixelspacing[1] ); v_pixelspacing.push_back( zspacing ); -// if (f->GetZSize() != 1) { -// v_pixelspacing.push_back(f->GetZSpacing()); -// } bbSetOutputPixelSpacing(v_pixelspacing); - - - if (reader!=NULL) - { - reader->Delete(); - reader=NULL; - } - reader = vtkGdcmReader::New(); - //reader->SetFileName( bbGetInputIn().c_str() ); - reader->SetCoherentFileList(l); + if (reader!=NULL) + { + reader->Delete(); + reader=NULL; + } + reader = vtkGDCMImageReader::New(); + vtkStringArray *files = vtkStringArray::New(); + std::vector< std::string >::const_iterator it = s.GetFilenames().begin(); + for( ; it != s.GetFilenames().end(); ++it) + { + const std::string &f = *it; + files->InsertNextValue( f.c_str() ); + } + reader->SetFileNames(files); reader->Update(); - reader->GetOutput(); - bbSetOutputOut( reader->GetOutput() ); } +#endif +// endif USE_GDCM2 void GetXCoherentInfoGdcmReader::bbUserSetDefaultValues() { - std::vector init; - init.push_back(""); - bbSetInputIn(init); - reader=NULL; + reader=NULL; + std::vector init; + init.push_back(""); + bbSetInputIn(init); + bbSetInputReadRaw(true); + bbSetInputRespectSerieUID(true); + //reader=NULL; /// \TODO fixme JPR } void GetXCoherentInfoGdcmReader::bbUserInitializeProcessing() { - } +#if defined USE_GDCM void GetXCoherentInfoGdcmReader::bbUserFinalizeProcessing() { if(reader) + { reader->Delete(); + } // if reader if(f) + { f->Delete(); + } // if f if(sh) + { sh->Delete(); + } // if sh +} +#endif + +#if defined USE_GDCM2 +void GetXCoherentInfoGdcmReader::bbUserFinalizeProcessing() +{ + if(reader) + { + reader->Delete(); + } } +#endif } // EO namespace bbgdcmvtk - -