]> Creatis software - gdcm.git/blobdiff - src/gdcmFile.cxx
methods ReplaceOrCreate renamed as Insert
[gdcm.git] / src / gdcmFile.cxx
index 4adfcd303d266e474491c21912091fd480a07701..9e6788e6dc945d4df6e31f1448831cd955cd3e1d 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/21 12:37:15 $
-  Version:   $Revision: 1.196 $
+  Date:      $Date: 2005/01/24 16:44:54 $
+  Version:   $Revision: 1.199 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -45,11 +45,11 @@ File::File( std::string const &filename ):
    // is found by indirection through the "Image Location").
    // Inside the group pointed by "Image Location" the searched element
    // is conventionally the element 0x0010 (when the norm is respected).
-   // When the "Image Location" is Missing we default to group 0x7fe0.
+   // When the "Image Location" is missing we default to group 0x7fe0.
    // Note: this IS the right place for the code
  
    // Image Location
-   const std::string &imgLocation = GetEntry(0x0028, 0x0200);
+   const std::string &imgLocation = GetEntryValue(0x0028, 0x0200);
    if ( imgLocation == GDCM_UNFOUND )
    {
       // default value
@@ -97,6 +97,8 @@ File::File( std::string const &filename ):
                              GrPixel, NumPixel,
                              PixelVR, "PXL", "Pixel Data");
  
+      // friend class hunting : should we *create* a new entry,
+      // instead of modifying its DictEntry,in order not to use 'friend' ?
       entry->SetDictEntry( newEntry );
    }
 }
@@ -123,7 +125,7 @@ File::~File ()
  *       then writes in a file all the (Dicom Elements) included the Pixels 
  * @param fileName file name to write to
  * @param filetype Type of the File to be written 
- *          (ACR-NEMA, ExplicitVR, ImplicitVR)
+ *          (ACR, ExplicitVR, ImplicitVR)
  */
 bool File::Write(std::string fileName, FileType filetype)
 {
@@ -136,9 +138,9 @@ bool File::Write(std::string fileName, FileType filetype)
    }
 
    // Bits Allocated
-   if ( GetEntry(0x0028,0x0100) ==  "12")
+   if ( GetEntryValue(0x0028,0x0100) ==  "12")
    {
-      SetEntry("16", 0x0028,0x0100);
+      SetEntryValue("16", 0x0028,0x0100);
    }
 
   /// \todo correct 'Pixel group' Length if necessary
@@ -149,7 +151,7 @@ bool File::Write(std::string fileName, FileType filetype)
       // no (GrPixel, NumPixel) element
       std::string s_lgPix = Util::Format("%d", i_lgPix+12);
       s_lgPix = Util::DicomString( s_lgPix.c_str() );
-      ReplaceOrCreate(s_lgPix,GrPixel, 0x0000);
+      Insert(s_lgPix,GrPixel, 0x0000);
    }
 
    // FIXME : should be nice if we could move it to File
@@ -157,7 +159,7 @@ bool File::Write(std::string fileName, FileType filetype)
 
    // Drop Palette Color, if necessary
    
-   if ( GetEntry(0x0028,0x0002).c_str()[0] == '3' )
+   if ( GetEntryValue(0x0028,0x0002).c_str()[0] == '3' )
    {
       // if SamplesPerPixel = 3, sure we don't need any LUT !   
       // Drop 0028|1101, 0028|1102, 0028|1103
@@ -257,7 +259,7 @@ bool File::IsReadable()
       return false;
    }
 
-   const std::string &res = GetEntry(0x0028, 0x0005);
+   const std::string &res = GetEntryValue(0x0028, 0x0005);
    if ( res != GDCM_UNFOUND && atoi(res.c_str()) > 4 )
    {
       return false; // Image Dimensions
@@ -289,7 +291,7 @@ bool File::IsReadable()
  */
 int File::GetXSize()
 {
-   const std::string &strSize = GetEntry(0x0028,0x0011);
+   const std::string &strSize = GetEntryValue(0x0028,0x0011);
    if ( strSize == GDCM_UNFOUND )
    {
       return 0;
@@ -306,7 +308,7 @@ int File::GetXSize()
  */
 int File::GetYSize()
 {
-   const std::string &strSize = GetEntry(0x0028,0x0010);
+   const std::string &strSize = GetEntryValue(0x0028,0x0010);
    if ( strSize != GDCM_UNFOUND )
    {
       return atoi( strSize.c_str() );
@@ -333,14 +335,14 @@ int File::GetZSize()
 {
    // Both  DicomV3 and ACR/Nema consider the "Number of Frames"
    // as the third dimension.
-   const std::string &strSize = GetEntry(0x0028,0x0008);
+   const std::string &strSize = GetEntryValue(0x0028,0x0008);
    if ( strSize != GDCM_UNFOUND )
    {
       return atoi( strSize.c_str() );
    }
 
    // We then consider the "Planes" entry as the third dimension 
-   const std::string &strSize2 = GetEntry(0x0028,0x0012);
+   const std::string &strSize2 = GetEntryValue(0x0028,0x0012);
    if ( strSize2 != GDCM_UNFOUND )
    {
       return atoi( strSize2.c_str() );
@@ -357,7 +359,7 @@ int File::GetZSize()
 float File::GetXSpacing()
 {
    float xspacing, yspacing;
-   const std::string &strSpacing = GetEntry(0x0028,0x0030);
+   const std::string &strSpacing = GetEntryValue(0x0028,0x0030);
 
    if ( strSpacing == GDCM_UNFOUND )
    {
@@ -405,7 +407,7 @@ float File::GetXSpacing()
 float File::GetYSpacing()
 {
    float yspacing = 1.;
-   std::string strSpacing = GetEntry(0x0028,0x0030);
+   std::string strSpacing = GetEntryValue(0x0028,0x0030);
   
    if ( strSpacing == GDCM_UNFOUND )
    {
@@ -440,12 +442,12 @@ float File::GetZSpacing()
    //   Si le Spacing Between Slices est Missing, 
    //   on suppose que les coupes sont jointives
    
-   const std::string &strSpacingBSlices = GetEntry(0x0018,0x0088);
+   const std::string &strSpacingBSlices = GetEntryValue(0x0018,0x0088);
 
    if ( strSpacingBSlices == GDCM_UNFOUND )
    {
       gdcmVerboseMacro("Unfound Spacing Between Slices (0018,0088)");
-      const std::string &strSliceThickness = GetEntry(0x0018,0x0050);       
+      const std::string &strSliceThickness = GetEntryValue(0x0018,0x0050);       
       if ( strSliceThickness == GDCM_UNFOUND )
       {
          gdcmVerboseMacro("Unfound Slice Thickness (0018,0050)");
@@ -472,7 +474,7 @@ float File::GetRescaleIntercept()
 {
    float resInter = 0.;
    /// 0028 1052 DS IMG Rescale Intercept
-   const std::string &strRescInter = GetEntry(0x0028,0x1052);
+   const std::string &strRescInter = GetEntryValue(0x0028,0x1052);
    if ( strRescInter != GDCM_UNFOUND )
    {
       if( sscanf( strRescInter.c_str(), "%f", &resInter) != 1 )
@@ -493,7 +495,7 @@ float File::GetRescaleSlope()
 {
    float resSlope = 1.;
    //0028 1053 DS IMG Rescale Slope
-   std::string strRescSlope = GetEntry(0x0028,0x1053);
+   std::string strRescSlope = GetEntryValue(0x0028,0x1053);
    if ( strRescSlope != GDCM_UNFOUND )
    {
       if( sscanf( strRescSlope.c_str(), "%f", &resSlope) != 1)
@@ -522,12 +524,12 @@ int File::GetNumberOfScalarComponents()
       
    // 0028 0100 US IMG Bits Allocated
    // (in order no to be messed up by old RGB images)
-   if ( GetEntry(0x0028,0x0100) == "24" )
+   if ( GetEntryValue(0x0028,0x0100) == "24" )
    {
       return 3;
    }
        
-   std::string strPhotometricInterpretation = GetEntry(0x0028,0x0004);
+   std::string strPhotometricInterpretation = GetEntryValue(0x0028,0x0004);
 
    if ( ( strPhotometricInterpretation == "PALETTE COLOR ") )
    {
@@ -567,7 +569,7 @@ int File::GetNumberOfScalarComponentsRaw()
 {
    // 0028 0100 US IMG Bits Allocated
    // (in order no to be messed up by old RGB images)
-   if ( File::GetEntry(0x0028,0x0100) == "24" )
+   if ( File::GetEntryValue(0x0028,0x0100) == "24" )
    {
       return 3;
    }
@@ -601,12 +603,12 @@ int File::GetNumberOfScalarComponentsRaw()
 float File::GetXOrigin()
 {
    float xImPos, yImPos, zImPos;  
-   std::string strImPos = GetEntry(0x0020,0x0032);
+   std::string strImPos = GetEntryValue(0x0020,0x0032);
 
    if ( strImPos == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "Unfound Image Position Patient (0020,0032)");
-      strImPos = GetEntry(0x0020,0x0030); // For ACR-NEMA images
+      strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
       if ( strImPos == GDCM_UNFOUND )
       {
          gdcmVerboseMacro( "Unfound Image Position (RET) (0020,0030)");
@@ -632,12 +634,12 @@ float File::GetXOrigin()
 float File::GetYOrigin()
 {
    float xImPos, yImPos, zImPos;
-   std::string strImPos = GetEntry(0x0020,0x0032);
+   std::string strImPos = GetEntryValue(0x0020,0x0032);
 
    if ( strImPos == GDCM_UNFOUND)
    {
       gdcmVerboseMacro( "Unfound Image Position Patient (0020,0032)");
-      strImPos = GetEntry(0x0020,0x0030); // For ACR-NEMA images
+      strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
       if ( strImPos == GDCM_UNFOUND )
       {
          gdcmVerboseMacro( "Unfound Image Position (RET) (0020,0030)");
@@ -665,7 +667,7 @@ float File::GetYOrigin()
 float File::GetZOrigin()
 {
    float xImPos, yImPos, zImPos; 
-   std::string strImPos = GetEntry(0x0020,0x0032);
+   std::string strImPos = GetEntryValue(0x0020,0x0032);
 
    if ( strImPos != GDCM_UNFOUND )
    {
@@ -680,7 +682,7 @@ float File::GetZOrigin()
       }
    }
 
-   strImPos = GetEntry(0x0020,0x0030); // For ACR-NEMA images
+   strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
    if ( strImPos != GDCM_UNFOUND )
    {
       if( sscanf( strImPos.c_str(), 
@@ -695,7 +697,7 @@ float File::GetZOrigin()
       }
    }
 
-   std::string strSliceLocation = GetEntry(0x0020,0x1041); // for *very* old ACR-NEMA images
+   std::string strSliceLocation = GetEntryValue(0x0020,0x1041); // for *very* old ACR-NEMA images
    if ( strSliceLocation != GDCM_UNFOUND )
    {
       if( sscanf( strSliceLocation.c_str(), "%f", &zImPos) != 1)
@@ -710,7 +712,7 @@ float File::GetZOrigin()
    }
    gdcmVerboseMacro( "Unfound Slice Location (0020,1041)");
 
-   std::string strLocation = GetEntry(0x0020,0x0050);
+   std::string strLocation = GetEntryValue(0x0020,0x0050);
    if ( strLocation != GDCM_UNFOUND )
    {
       if( sscanf( strLocation.c_str(), "%f", &zImPos) != 1)
@@ -741,7 +743,7 @@ int File::GetImageNumber()
    // faster function. sscanf() can do all possible conversions whereas
    // atoi() can only do single decimal integer conversions.
    //0020 0013 IS REL Image Number
-   std::string strImNumber = GetEntry(0x0020,0x0013);
+   std::string strImNumber = GetEntryValue(0x0020,0x0013);
    if ( strImNumber != GDCM_UNFOUND )
    {
       return atoi( strImNumber.c_str() );
@@ -756,7 +758,7 @@ int File::GetImageNumber()
 ModalityType File::GetModality()
 {
    // 0008 0060 CS ID Modality
-   std::string strModality = GetEntry(0x0008,0x0060);
+   std::string strModality = GetEntryValue(0x0008,0x0060);
    if ( strModality != GDCM_UNFOUND )
    {
            if ( strModality.find("AU") < strModality.length()) return AU;
@@ -819,7 +821,7 @@ ModalityType File::GetModality()
  */
 int File::GetBitsStored()
 {
-   std::string strSize = GetEntry( 0x0028, 0x0101 );
+   std::string strSize = GetEntryValue( 0x0028, 0x0101 );
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro("(0028,0101) is supposed to be mandatory");
@@ -837,7 +839,7 @@ int File::GetBitsStored()
  */
 int File::GetHighBitPosition()
 {
-   std::string strSize = GetEntry( 0x0028, 0x0102 );
+   std::string strSize = GetEntryValue( 0x0028, 0x0102 );
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "(0028,0102) is supposed to be mandatory");
@@ -854,7 +856,7 @@ int File::GetHighBitPosition()
  */
 bool File::IsSignedPixelData()
 {
-   std::string strSize = GetEntry( 0x0028, 0x0103 );
+   std::string strSize = GetEntryValue( 0x0028, 0x0103 );
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "(0028,0103) is supposed to be mandatory");
@@ -876,7 +878,7 @@ bool File::IsSignedPixelData()
  */
 int File::GetBitsAllocated()
 {
-   std::string strSize = GetEntry(0x0028,0x0100);
+   std::string strSize = GetEntryValue(0x0028,0x0100);
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "(0028,0100) is supposed to be mandatory");
@@ -894,7 +896,7 @@ int File::GetBitsAllocated()
  */
 int File::GetSamplesPerPixel()
 {
-   const std::string& strSize = GetEntry(0x0028,0x0002);
+   const std::string& strSize = GetEntryValue(0x0028,0x0002);
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "(0028,0002) is supposed to be mandatory");
@@ -911,7 +913,7 @@ int File::GetSamplesPerPixel()
  */
 bool File::IsMonochrome()
 {
-   const std::string& PhotometricInterp = GetEntry( 0x0028, 0x0004 );
+   const std::string& PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
    if (  Util::DicomStringEqual(PhotometricInterp, "MONOCHROME1")
       || Util::DicomStringEqual(PhotometricInterp, "MONOCHROME2") )
    {
@@ -931,7 +933,7 @@ bool File::IsMonochrome()
  */
 bool File::IsPaletteColor()
 {
-   std::string PhotometricInterp = GetEntry( 0x0028, 0x0004 );
+   std::string PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
    if (   PhotometricInterp == "PALETTE COLOR " )
    {
       return true;
@@ -950,7 +952,7 @@ bool File::IsPaletteColor()
  */
 bool File::IsYBRFull()
 {
-   std::string PhotometricInterp = GetEntry( 0x0028, 0x0004 );
+   std::string PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
    if (   PhotometricInterp == "YBR_FULL" )
    {
       return true;
@@ -969,7 +971,7 @@ bool File::IsYBRFull()
  */
 int File::GetPlanarConfiguration()
 {
-   std::string strSize = GetEntry(0x0028,0x0006);
+   std::string strSize = GetEntryValue(0x0028,0x0006);
    if ( strSize == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "Not found : Planar Configuration (0028,0006)");
@@ -987,7 +989,7 @@ int File::GetPixelSize()
 {
    // 0028 0100 US IMG Bits Allocated
    // (in order no to be messed up by old RGB images)
-   //   if (File::GetEntry(0x0028,0x0100) == "24")
+   //   if (File::GetEntryValue(0x0028,0x0100) == "24")
    //      return 3;
 
    std::string pixelType = GetPixelType();
@@ -1027,7 +1029,7 @@ int File::GetPixelSize()
  */
 std::string File::GetPixelType()
 {
-   std::string bitsAlloc = GetEntry(0x0028, 0x0100); // Bits Allocated
+   std::string bitsAlloc = GetEntryValue(0x0028, 0x0100); // Bits Allocated
    if ( bitsAlloc == GDCM_UNFOUND )
    {
       gdcmVerboseMacro( "Missing  Bits Allocated (0028,0100)");
@@ -1049,7 +1051,7 @@ std::string File::GetPixelType()
       bitsAlloc = "8";  // by old RGB images)
    }
 
-   std::string sign = GetEntry(0x0028, 0x0103);//"Pixel Representation"
+   std::string sign = GetEntryValue(0x0028, 0x0103);//"Pixel Representation"
 
    if (sign == GDCM_UNFOUND )
    {
@@ -1179,7 +1181,7 @@ int File::GetLUTNbits()
    //Just hope Lookup Table Desc-Red = Lookup Table Desc-Red
    //                                = Lookup Table Desc-Blue
    // Consistency already checked in GetLUTLength
-   std::string lutDescription = GetEntry(0x0028,0x1101);
+   std::string lutDescription = GetEntryValue(0x0028,0x1101);
    if ( lutDescription == GDCM_UNFOUND )
    {
       return 0;
@@ -1207,22 +1209,22 @@ int File::GetLUTNbits()
 bool File::AnonymizeFile()
 {
    // If exist, replace by spaces
-   SetEntry ("  ",0x0010, 0x2154); // Telephone   
-   SetEntry ("  ",0x0010, 0x1040); // Adress
-   SetEntry ("  ",0x0010, 0x0020); // Patient ID
+   SetEntryValue ("  ",0x0010, 0x2154); // Telephone   
+   SetEntryValue ("  ",0x0010, 0x1040); // Adress
+   SetEntryValue ("  ",0x0010, 0x0020); // Patient ID
 
    DocEntry* patientNameHE = GetDocEntry (0x0010, 0x0010);
   
    if ( patientNameHE ) // we replace it by Study Instance UID (why not)
    {
-      std::string studyInstanceUID =  GetEntry (0x0020, 0x000d);
+      std::string studyInstanceUID =  GetEntryValue (0x0020, 0x000d);
       if ( studyInstanceUID != GDCM_UNFOUND )
       {
-         ReplaceOrCreate(studyInstanceUID, 0x0010, 0x0010);
+         Insert(studyInstanceUID, 0x0010, 0x0010);
       }
       else
       {
-         ReplaceOrCreate("anonymised", 0x0010, 0x0010);
+         Insert("anonymised", 0x0010, 0x0010);
       }
    }
 
@@ -1283,6 +1285,7 @@ bool File::AnonymizeFile()
 
 /**
   * \brief gets the info from 0020,0037 : Image Orientation Patient
+  * (needed to organize DICOM files based on their x,y,z position)
   * @param iop adress of the (6)float aray to receive values
   * @return cosines of image orientation patient
   */
@@ -1293,7 +1296,7 @@ void File::GetImageOrientationPatient( float iop[6] )
    iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0.;
 
    // 0020 0037 DS REL Image Orientation (Patient)
-   if ( (strImOriPat = GetEntry(0x0020,0x0037)) != GDCM_UNFOUND )
+   if ( (strImOriPat = GetEntryValue(0x0020,0x0037)) != GDCM_UNFOUND )
    {
       if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
@@ -1303,7 +1306,7 @@ void File::GetImageOrientationPatient( float iop[6] )
    }
    //For ACR-NEMA
    // 0020 0035 DS REL Image Orientation (RET)
-   else if ( (strImOriPat = GetEntry(0x0020,0x0035)) != GDCM_UNFOUND )
+   else if ( (strImOriPat = GetEntryValue(0x0020,0x0035)) != GDCM_UNFOUND )
    {
       if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
@@ -1377,14 +1380,14 @@ void File::InitializeDefaultFile()
    // Special case this is the image (not a string)
    GrPixel = 0x7fe0;
    NumPixel = 0x0010;
-   ReplaceOrCreate(0, 0, GrPixel, NumPixel);
+   Insert(0, 0, GrPixel, NumPixel);
 
    // All remaining strings:
    unsigned int i = 0;
    DICOM_DEFAULT_VALUE current = defaultvalue[i];
    while( current.value )
    {
-      ReplaceOrCreate(current.value, current.group, current.elem);
+      Insert(current.value, current.group, current.elem);
       current = defaultvalue[++i];
    }
 }