# GetSequenceUltrasound.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 "gdcmAttribute.h"

    bool Region ( char* nomefile, unsigned int* X_min, unsigned int* Y_min, unsigned int* X_max, unsigned int* Y_max );

    int main(int argc, char* argv[] )
    {
      // Controllo del numero di argomenti introdotti da riga di comando
      if( argc < 2 )
        {
        std::cerr << "Usage: " << std::endl;
        std::cerr << argv[0] << " inputImageFile  " << std::endl;
        return EXIT_FAILURE;
        }

      unsigned int x_min = 1;
      unsigned int y_min = 1;
      unsigned int x_max = 1;
      unsigned int y_max = 1;

      if( Region ( argv[1], &x_min, &y_min, &x_max, &y_max ) )
        {
        std::cout << "x_min = " << x_min << std::endl;
        std::cout << "y_min = " << y_min << std::endl;
        std::cout << "x_max = " << x_max << std::endl;
        std::cout << "y_max = " << y_max << std::endl;
        }

      else
        {
        std::cout << "no\n";
        }

    }

    bool Region ( char* nomefile, unsigned int* X_min, unsigned int* Y_min, unsigned int* X_max, unsigned int* Y_max )
    {
      gdcm::Reader reader;
      reader.SetFileName( nomefile );
      if( !reader.Read() )
        {
        std::cerr << "Could not read: " << nomefile << std::endl;
        return false;
        }

      gdcm::File &file = reader.GetFile();
      gdcm::DataSet &ds = file.GetDataSet();

      gdcm::Tag tsqur(0x0018,0x6011);
      if( !ds.FindDataElement( tsqur ) )
        {
        return false;
        }

      const gdcm::DataElement &squr= ds.GetDataElement( tsqur );
      //std::cout << squr << std::endl;
      const gdcm::SequenceOfItems *sqi = squr.GetValueAsSQ();
      if( !sqi || !sqi->GetNumberOfItems() )
        {
        return false;
        }
      //std::cout << sqi << std::endl;

      const gdcm::Item & item = sqi->GetItem(1);
      //std::cout << item << std::endl;
      const gdcm::DataSet& nestedds = item.GetNestedDataSet();
      //std::cout << nestedds << std::endl;

      gdcm::Tag tX0(0x0018,0x6018);
      gdcm::Tag tY0(0x0018,0x601a);
      gdcm::Tag tX1(0x0018,0x601c);
      gdcm::Tag tY1(0x0018,0x601e);

      if( (!nestedds.FindDataElement( tX0 ))||(!nestedds.FindDataElement( tY0 ))||(!nestedds.FindDataElement( tX1 ))||(!nestedds.FindDataElement( tY1 )) )
        {
        return false;
        }

      const gdcm::DataElement& deX0 = nestedds.GetDataElement( tX0 );
      const gdcm::DataElement& deY0 = nestedds.GetDataElement( tY0 );
      const gdcm::DataElement& deX1 = nestedds.GetDataElement( tX1 );
      const gdcm::DataElement& deY1 = nestedds.GetDataElement( tY1 );
      //std::cout << deX0 << std::endl << deY0 << std::endl << deX1 << std::endl << deY1 << std::endl;

      //const gdcm::ByteValue *bvX0 = deX0.GetByteValue();
      //const gdcm::ByteValue *bvY0 = deY0.GetByteValue();
      //const gdcm::ByteValue *bvX1 = deX1.GetByteValue();
      //const gdcm::ByteValue *bvY1 = deY1.GetByteValue();
      //std::cout << bvX0 << std::endl << bvY0 << std::endl << bvX1 << std::endl << bvY1 << std::endl;

      gdcm::Attribute<0x0018,0x6018> atX0;
      gdcm::Attribute<0x0018,0x601a> atY0;
      gdcm::Attribute<0x0018,0x601c> atX1;
      gdcm::Attribute<0x0018,0x601e> atY1;
      atX0.SetFromDataElement( deX0 );
      atY0.SetFromDataElement( deY0 );
      atX1.SetFromDataElement( deX1 );
      atY1.SetFromDataElement( deY1 );
      const uint32_t* X0 = atX0.GetValues();
      const uint32_t* Y0 = atY0.GetValues();
      const uint32_t* X1 = atX1.GetValues();
      const uint32_t* Y1 = atY1.GetValues();
      std::cout << X0 << std::endl << Y0 << std::endl << X1 << std::endl << Y1 << std::endl;

      *X_min = static_cast<unsigned int>(X0[0]);
      *Y_min = static_cast<unsigned int>(Y0[0]);
      *X_max = static_cast<unsigned int>(X1[0]);
      *Y_max = static_cast<unsigned int>(Y1[0]);

      //std::cout << "X_min = " << *X_min << std::endl;
      //std::cout << "Y_min = " << *Y_min << std::endl;
      //std::cout << "X_max = " << *X_max << std::endl;
      //std::cout << "Y_max = " << *Y_max << std::endl;

      return true;
    }