]> Creatis software - gdcm.git/blobdiff - src/gdcmFileHelper.cxx
Force 0018|0015 [CS] [Body Part Examined] (in any) to upper value,
[gdcm.git] / src / gdcmFileHelper.cxx
index 87c6e895b241c2ca9adc06b227d7d13e03752969..68b5316a465f53e3a6635c05ce2ac2fa42b01da1 100644 (file)
@@ -4,8 +4,8 @@
   Module:    $RCSfile: gdcmFileHelper.cxx,v $
   Language:  C++
 
-  Date:      $Date: 2007/08/31 14:11:00 $
-  Version:   $Revision: 1.126 $
+  Date:      $Date: 2007/10/17 12:14:02 $
+  Version:   $Revision: 1.134 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -600,7 +600,7 @@ size_t FileHelper::GetRawDataSize()
 }
 
 /**
- * \brief Access to the underlying \ref PixelReadConverter RGBA LUT
+ * \brief Access to the underlying PixelReadConverter RGBA LUT
  */
 uint8_t* FileHelper::GetLutRGBA()
 {
@@ -610,7 +610,7 @@ uint8_t* FileHelper::GetLutRGBA()
 }
 
 /**
- * \brief Access to the underlying \ref PixelReadConverter RGBA LUT Item Number
+ * \brief Access to the underlying PixelReadConverter RGBA LUT Item Number
  */
 int FileHelper::GetLutItemNumber()
 {
@@ -618,7 +618,7 @@ int FileHelper::GetLutItemNumber()
 }
 
 /**
- * \brief Access to the underlying \ref PixelReadConverter RGBA LUT Item Size
+ * \brief Access to the underlying PixelReadConverter RGBA LUT Item Size
  */
 int FileHelper::GetLutItemSize()
 {
@@ -727,8 +727,6 @@ bool FileHelper::Write(std::string const &fileName)
 { 
    CheckMandatoryElements(); //called once, here !
    
-   bool flag = false;
-   DocEntry *e;   
    switch(WriteType)
    {
       case ImplicitVR:
@@ -769,7 +767,7 @@ bool FileHelper::Write(std::string const &fileName)
          break;
 
       case JPEG2000:
-         /// \TODO Maybe we should consider doing the compression here !
+         /// \todo Maybe we should consider doing the compression here !
          // PixelWriteConverter->SetCompressJPEG2000UserData(inData, expectedSize, FileInternal);
 
          SetWriteFileTypeToJPEG2000();
@@ -868,7 +866,7 @@ bool FileHelper::CheckWriteIntegrity()
       switch(WriteMode)
       {
          case WMODE_RAW :
-            if ( abs(decSize-userDataSize)>1) // ignore padding zero
+            if ( abs((long)(decSize-userDataSize))>1) // ignore padding zero
             {
                gdcmWarningMacro( "Data size (Raw) is incorrect. Should be " 
                            << decSize << " / Found :" 
@@ -877,7 +875,7 @@ bool FileHelper::CheckWriteIntegrity()
             }
             break;
          case WMODE_RGB :
-            if ( abs(rgbSize-userDataSize)>1) // ignore padding zero
+            if ( abs((long)(rgbSize-userDataSize))>1) // ignore padding zero
             {
                gdcmWarningMacro( "Data size (RGB) is incorrect. Should be " 
                           << rgbSize << " / Found " 
@@ -1356,7 +1354,7 @@ If 'SOP Class UID' exists in the native image  ('true DICOM' image)
     --> 'Referenced SOP Instance UID' (0x0008, 0x1155)
          whose value is the original 'SOP Class UID'
 
-3) TODO : find a trick to allow user to pass to the writter the list of the Dicom images 
+3) TO DO : find a trick to allow user to pass to the writter the list of the Dicom images 
           or the Series, (or the Study ?) he used to created his image 
           (MIP, MPR, cartography image, ...)
            These info should be stored (?)
@@ -1506,6 +1504,17 @@ void FileHelper::CheckMandatoryElements()
 
    // --------------------- For DataSet ---------------------
 
+   // check whether 0018|0015 [CS] [Body Part Examined] value is UPPER CASE
+   //      (avoid dciodvfy to complain!)
+   DataEntry *e_0018_0015 = FileInternal->GetDataEntry(0x0018, 0x0015);  
+   if ( e_0018_0015)
+   {
+      std::string bodyPartExamined = e_0018_0015->GetString();
+      std::transform(bodyPartExamined.begin(), bodyPartExamined.end(), bodyPartExamined.begin(), 
+                    (int(*)(int)) toupper);
+      CopyMandatoryEntry(0x0018,0x0015,bodyPartExamined,"CS");       
+   }
+
    if ( ContentType != USER_OWN_IMAGE) // when it's not a user made image
    { 
    // If 'SOP Class UID' and 'SOP Instance UID' exist ('true DICOM' image)
@@ -1516,36 +1525,52 @@ void FileHelper::CheckMandatoryElements()
       DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
       if ( e_0008_0016 && e_0008_0018)
       {
-      // Create 'Source Image Sequence' SeqEntry
-      SeqEntry *sis = SeqEntry::New (0x0008, 0x2112);
-      SQItem *sqi = SQItem::New(1);
+         // Create 'Source Image Sequence' SeqEntry
+         SeqEntry *sis = SeqEntry::New (0x0008, 0x2112);
+         SQItem *sqi = SQItem::New(1);
       
-      // create 'Referenced SOP Class UID' from 'SOP Class UID'
+         // create 'Referenced SOP Class UID' from 'SOP Class UID'
 
-      DataEntry *e_0008_1150 = DataEntry::New(0x0008, 0x1150, "UI");
-      e_0008_1150->SetString( e_0008_0016->GetString());
-      sqi->AddEntry(e_0008_1150);
-      e_0008_1150->Delete();
+         DataEntry *e_0008_1150 = DataEntry::New(0x0008, 0x1150, "UI");
+         e_0008_1150->SetString( e_0008_0016->GetString());
+         sqi->AddEntry(e_0008_1150);
+         e_0008_1150->Delete();
       
-      // create 'Referenced SOP Instance UID' from 'SOP Instance UID'
-      DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
+         // create 'Referenced SOP Instance UID' from 'SOP Instance UID'
+         DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
          
-      DataEntry *e_0008_1155 = DataEntry::New(0x0008, 0x1155, "UI"); 
-      e_0008_1155->SetString( e_0008_0018->GetString());
-      sqi->AddEntry(e_0008_1155);
-      e_0008_1155->Delete();
+         DataEntry *e_0008_1155 = DataEntry::New(0x0008, 0x1155, "UI"); 
+         e_0008_1155->SetString( e_0008_0018->GetString());
+         sqi->AddEntry(e_0008_1155);
+         e_0008_1155->Delete();
       
-      sis->AddSQItem(sqi,1);
-      sqi->Delete();
-
-      // temporarily replaces any previous 'Source Image Sequence' 
-      Archive->Push(sis);
-      sis->Delete();
-      // FIXME : is 'Image Type' *really* depending on the presence of 'SOP Class UID'?
-       if ( ContentType == FILTERED_IMAGE)      
-      // the user *knows* he just modified the pixels
-      // the image is no longer an 'Original' one
-         CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY","CS");    
+         sis->AddSQItem(sqi,1);
+         sqi->Delete();
+
+         // temporarily replaces any previous 'Source Image Sequence' 
+         Archive->Push(sis);
+         sis->Delete();
+         // FIXME : is 'Image Type' *really* depending on the presence of 'SOP Class UID'?
+         
+         if ( ContentType == FILTERED_IMAGE) // the user *knows* he just modified the pixels
+         { 
+            DataEntry *e_0008_0008 = FileInternal->GetDataEntry(0x0008, 0x0008);  
+            if ( e_0008_0008)
+            {
+               std::string imageType = e_0008_0008->GetString();
+               std::string::size_type p = imageType.find("ORIGINAL");
+               if (p == 0) // image is ORIGINAL one
+               {            
+                 // the image is no longer an 'Original' one
+                 CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY","CS");
+               }
+               // if Image Type was not ORIGINAL\..., we keep it.
+             }
+             else // 0008_0008 was missing, wee add it.
+             {
+                 CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY","CS");             
+             }  
+         }    
       }
    }
       
@@ -1977,6 +2002,8 @@ void FileHelper::Initialize()
    PixelReadConverter  = new PixelReadConvert;
    PixelWriteConverter = new PixelWriteConvert;
    Archive = new DocEntryArchive( FileInternal );
+   
+   KeepOverlays = false;
 }
 
 /**
@@ -2117,7 +2144,7 @@ void FileHelper::Print(std::ostream &os, std::string const &)
 
 
 /* Probabely something to be added to use Rescale Slope/Intercept
-Have a look ,at ITK code !
+Have a look at ITK code !
 
 // Internal function to rescale pixel according to Rescale Slope/Intercept
 template<class TBuffer, class TSource>