# ChangeSequenceUltrasound.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    #include "gdcmReader.h"
    #include "gdcmWriter.h"
    #include "gdcmSmartPointer.h"
    #include "gdcmDataSetHelper.h"

    /*
     ./ChangeSequenceUltrasound gdcmData/D_CLUNIE_CT1_J2KI.dcm myoutput.dcm

     This is the exact C++ translation of the original python example: ManipulateSequence.py
     */

    int main(int argc, char* argv[] )
    {
      if( argc < 0 )
        {
        return 1;
        }
      const char *filename = argv[1];
      const char *outfilename = argv[2];

      gdcm::Reader reader;
      reader.SetFileName( filename );
      if (! reader.Read() )
        {
        return 1;
        }

      gdcm::File &file = reader.GetFile();
      gdcm::DataSet &ds = file.GetDataSet();
      gdcm::Tag tsis(0x0008,0x2112); // SourceImageSequence
      if ( ds.FindDataElement( tsis ) )
        {
        const gdcm::DataElement &sis = ds.GetDataElement( tsis );
        gdcm::SmartPointer<gdcm::SequenceOfItems> sqsis = sis.GetValueAsSQ();
        if ( sqsis && sqsis->GetNumberOfItems() )
          {
          gdcm::Item &item1 = sqsis->GetItem(1);
          gdcm::DataSet &nestedds = item1.GetNestedDataSet();
          gdcm::Tag tprcs(0x0040,0xa170); // PurposeOfReferenceCodeSequence
          if( nestedds.FindDataElement( tprcs ) )
            {
            const gdcm::DataElement &prcs = nestedds.GetDataElement( tprcs );
            gdcm::SmartPointer<gdcm::SequenceOfItems> sqprcs = prcs.GetValueAsSQ();
            if ( sqprcs && sqprcs->GetNumberOfItems() )
              {
              gdcm::Item &item2 = sqprcs->GetItem(1);
              gdcm::DataSet &nestedds2 = item2.GetNestedDataSet();
              // (0008,0104) LO [Uncompressed predecessor]               #  24, 1 CodeMeaning
              gdcm::Tag tcm(0x0008,0x0104);
              if( nestedds2.FindDataElement( tcm ) )
                {
                gdcm::DataElement cm = nestedds2.GetDataElement( tcm );
                std::string mystr = "GDCM was here";
                cm.SetByteValue( mystr.c_str(), mystr.size() );
                nestedds2.Replace( cm );
                }
              }
            }
          }
        }

      gdcm::Writer writer;
      writer.SetFile( file );
      writer.SetFileName( outfilename );
      if ( !writer.Write() )
        {
        return 1;
        }

      return 0;
    }