/*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.fr/ - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the copyright notices for more information. It is distributed under dual licence - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================**/ #ifndef clitkChangeDicomTagGenericFilter_txx #define clitkChangeDicomTagGenericFilter_txx /* ================================================= * @file clitkChangeDicomTagGenericFilter.txx * @author * @date * * @brief * ===================================================*/ // clitk #include "clitkResampleImageWithOptionsFilter.h" #if GDCM_MAJOR_VERSION >= 2 #include "gdcmUIDGenerator.h" #include #include #include #include #include #include #else #include "gdcmFile.h" #include "gdcmUtil.h" #endif namespace clitk { //----------------------------------------------------------- // Constructor //----------------------------------------------------------- template ChangeDicomTagGenericFilter::ChangeDicomTagGenericFilter() { m_Verbose=false; } //----------------------------------------------------------- // Update //----------------------------------------------------------- template void ChangeDicomTagGenericFilter::Update() { UpdateWithDimAndPixelType(); } //------------------------------------------------------------------- // Update with the number of dimensions and the pixeltype read from // the dicom files. The MHD files may be resampled to match the // dicom spacing (and number of slices). Rounding errors in resampling // are handled by removing files when generating the output dicom // series. //------------------------------------------------------------------- template void ChangeDicomTagGenericFilter::UpdateWithDimAndPixelType() { //Read the dicom file gdcm::Reader reader; reader.SetFileName( m_ArgsInfo.input_arg ); reader.Read(); gdcm::File &fileOutput = reader.GetFile(); gdcm::DataSet &dsOutput = fileOutput.GetDataSet(); const unsigned int ptr_len = 42; char *ptr = new char[ptr_len]; memset(ptr,0,ptr_len); unsigned int numberOfKeysGiven=m_ArgsInfo.key_given; // For all input tag for (unsigned int i = 0; i < numberOfKeysGiven; i++) { // Split the tag element separated with '|' in 2 parts char* copy = (char*)m_ArgsInfo.key_arg[i]; std::vector v; char* chars_array = strtok(copy, "|"); while(chars_array) { v.push_back(chars_array); chars_array = strtok(NULL, "|"); } std::stringstream str0(v[0]), str1(v[1]); int first, second; str0 >> first; str1 >> second; //Change the tag element by the corresponding value gdcm::DataElement tagDE( gdcm::Tag(first, second) ); std::string value( m_ArgsInfo.tag_arg[i] ); tagDE.SetByteValue(value.c_str(), (uint32_t)strlen(value.c_str())); dsOutput.Insert(tagDE); } //Write the output dicom file gdcm::Writer w; w.SetFile( fileOutput ); w.SetFileName( m_ArgsInfo.output_arg ); w.Write(); } }//end clitk #endif //#define clitkChangeDicomTagGenericFilter_txx