]> Creatis software - gdcm.git/commitdiff
Update for writting DCM files
authorjpr <jpr>
Tue, 1 Apr 2003 14:07:40 +0000 (14:07 +0000)
committerjpr <jpr>
Tue, 1 Apr 2003 14:07:40 +0000 (14:07 +0000)
src/gdcmElValSet.cxx
src/gdcmElValSet.h
src/gdcmFile.cxx
src/gdcmFile.h
src/gdcmHeader.cxx
src/gdcmHeader.h

index d20f5eb2049b1bb7bd8d7665d2b8928f72efc4e2..8a6470395a3932ecc7bcc0ee03aa5d4d4ffc8d01 100644 (file)
@@ -4,6 +4,8 @@
 #include "gdcmUtil.h"
 #include "gdcmElValSet.h"
 
+#define DEBUG 0
+
 
 TagElValueHT & gdcmElValSet::GetTagHt(void) {
        return tagHt;
@@ -14,26 +16,6 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) {
        NameHt[newElValue->GetName()] = newElValue;
 }
 
-// TODO : faire un gdcmElValSet::ReplaceOrCreate qui remplace si ça existe, qui cree sinon
-
-void gdcmElValSet::ReplaceOrCreate(gdcmElValue * newElValue) {
-
-       TagKey key = newElValue->GetKey();
-
-       if (tagHt.count(key) > 1)
-               dbg.Verbose(0, "gdcmElValSet::GetElValueByNumber",
-                           "multiple entries for this key (FIXME) !");
-                           
-       if (tagHt.count(key)) {
-               tagHt.erase(key);
-               tagHt.erase(newElValue->GetName());
-       }
-
-       tagHt [key]                   = newElValue;
-       NameHt[newElValue->GetName()] = newElValue;
-}
-
-
 void gdcmElValSet::Print(ostream & os) {
        for (TagElValueHT::iterator tag = tagHt.begin();
                  tag != tagHt.end();
@@ -43,7 +25,7 @@ void gdcmElValSet::Print(ostream & os) {
                os << "[" << tag->second->GetName()  << "]";
                os << "[" << tag->second->GetVR()    << "]"; 
                os << " lgr : " << tag->second->GetLength();
-                                               os << endl;
+               os << endl;
        }
 } 
 
@@ -96,8 +78,12 @@ string gdcmElValSet::GetElValueByName(string TagName) {
        return NameHt.find(TagName)->second->GetValue();
 }
 
+
 int gdcmElValSet::SetElValueByNumber(string content,
                                      guint32 group, guint32 element) {
+                                     
+// TODO : comprendre pourquoi ils sont déclares comme des guint32, alors que c'est des guint16
+
        TagKey key = gdcmDictEntry::TranslateToKey(group, element);
        if ( ! tagHt.count(key))
                return 0;
@@ -105,7 +91,8 @@ int gdcmElValSet::SetElValueByNumber(string content,
                dbg.Verbose(0, "gdcmElValSet::SetElValueByNumber",
                            "multiple entries for this key (FIXME) !");
                return (0); 
-       }                                      
+       }
+                                              
        tagHt[key]->SetValue(content);
 
        // Question : m à j LgrElem ?
@@ -166,31 +153,23 @@ int gdcmElValSet::SetElValueLengthByName(guint32 l, string TagName) {
 }
 
 // Sorry for the DEBUG's, but tomorow is gonna be hoter than today
-#define DEBUG 0
 
 int gdcmElValSet::Write(FILE * _fp) {
 
-// ATTENTION : fonction non terminée (commitée a titre de precaution)
-
        guint16 gr, el;
        guint32 lgr;
        const char * val;
        string vr;
        guint32 val_uint32;
-       gint32  val_int32;
        guint16 val_uint16;
-       gint16  val_int16;;
        
        vector<string> tokens;
        
        void *ptr;
-       char str_lgrCalcGroupe[10];
-
        
        string implicitVRTransfertSyntax = "1.2.840.10008.1.2";
        
        // Utilisées pour le calcul Group Length
-       int deja = 0, prem=0;
        guint32 lgrCalcGroupe=0;
        gdcmElValue *elem, *elemZ, *elemZPrec;
        guint16 grCourant = 0;
@@ -205,9 +184,7 @@ int gdcmElValSet::Write(FILE * _fp) {
        // dans l'image native
        //
        // cf : code IdDcmWriteFile dans libido/src/dcmwrite.c
-               
-if (1) {  // Risque de pb dans le calcul des lgr de chaque groupe. On le saute pour le moment!
-               
+                               
        // On fait de l'implicit VR little Endian 
        // (pour moins se fairche sur processeur INTEL)
        // On force le TRANSFERT SYNTAX UID
@@ -254,14 +231,14 @@ if (1) {  // Risque de pb dans le calcul des lgr de chaque groupe. On le saute p
                                if(DEBUG)printf("ajout elem OOOO pour gr %04x\n",gr);
                        } else { 
                                elemZ=elem;
-                               if(DEBUG)printf("maj elmeZ\n");
+                               if(DEBUG)printf("maj elemZ\n");
                        }
                        
-                       ostringstream fock;
-                       fock << lgrCalcGroupe; 
+                       ostringstream f;
+                       f << lgrCalcGroupe; 
                        //sprintf(str_lgrCalcGroupe,"%d",lgrCalcGroupe);
-                       elemZPrec->SetValue(fock.str());
-                       if(DEBUG)printf("ecriture lgr (%d, %s) pour gr %04x\n",lgrCalcGroupe, fock.str().c_str(), grCourant);
+                       elemZPrec->SetValue(f.str());
+                       if(DEBUG)printf("ecriture lgr (%d, %s) pour gr %04x\n",lgrCalcGroupe, f.str().c_str(), grCourant);
                        if(DEBUG)printf ("%04x %04x [%s]\n",elemZPrec->GetGroup(), elemZPrec->GetElement(),elemZPrec->GetValue().c_str());
                        if(DEBUG)cout << "Addresse elemZPrec " << elemZPrec<< endl;
                        elemZPrec=elemZ;
@@ -274,9 +251,6 @@ if (1) {  // Risque de pb dans le calcul des lgr de chaque groupe. On le saute p
                }               
        }
        
-} // fin if (1)
-
-       
        // restent à tester les echecs en écriture (apres chaque fwrite)
        
        for (TagElValueHT::iterator tag2 = tagHt.begin();
@@ -331,50 +305,36 @@ if (1) {  // Risque de pb dans le calcul des lgr de chaque groupe. On le saute p
 }
 
 
-
-
 int gdcmElValSet::WriteAcr(FILE * _fp) {
-
-
-// ATTENTION : fonction non terminée (commitée a titre de precaution)
-// ATTENTION : fusioner le code avec celui de lValSet::Write
-
+//
+// ATTENTION : fusioner le code avec celui de gdcmElValSet::Write
+//
 
        guint16 gr, el;
        guint32 lgr;
        const char * val;
        string vr;
        guint32 val_uint32;
-       gint32  val_int32;
        guint16 val_uint16;
-       gint16  val_int16;
        
        vector<string> tokens;
        
        void *ptr;
-       char str_lgrCalcGroupe[10];
        
        //string implicitVRTransfertSyntax = "1.2.840.10008.1.2"; // supprime par rapport à Write
        
        // Utilisées pour le calcul Group Length
-       int deja = 0;
+
        guint32 lgrCalcGroupe=0;
        gdcmElValue *elem, *elemZ, *elemZPrec;
        guint16 grCourant = 0;
        
-       // Question :
-       // Comment pourrait-on tester si on est TrueDicom ou non ,
-       // (FileType est un champ de gdcmHeader ...)
-       //
-
        // On parcourt la table pour recalculer la longueur des 'elements 0x0000'
        // au cas ou un tag ai été ajouté par rapport à ce qui a été lu
        // dans l'image native
        //
        // cf : code IdDcmWriteFile dans libido/src/dcmwrite.c
-               
-
-                       
+                                       
        TagElValueHT::iterator tag = tagHt.begin();
        
        elem = tag->second;
@@ -402,6 +362,11 @@ int gdcmElValSet::WriteAcr(FILE * _fp) {
                elem = tag->second;
                gr = elem->GetGroup();
                el = elem->GetElement();
+               vr = elem->GetVR();
+               
+               if (vr == "SQ") continue;       // pas SEQUENCE en ACR-NEMA
+                                               // WARNING : risque de pb 
+                                               // si on est descendu 'a l'interieur' des SQ    
 
                if ( (gr != grCourant) /*&&     // On arrive sur un nv Groupe     
                     (el != 0xfffe) */  ) {
@@ -417,11 +382,10 @@ int gdcmElValSet::WriteAcr(FILE * _fp) {
                                if(DEBUG)printf("maj elmeZ\n");
                        }
                        
-                       ostringstream fock;
-                       fock << lgrCalcGroupe; 
-                       //sprintf(str_lgrCalcGroupe,"%d",lgrCalcGroupe);
-                       elemZPrec->SetValue(fock.str());
-                       if(DEBUG)printf("ecriture lgr (%d, %s) pour gr %04x\n",lgrCalcGroupe, fock.str().c_str(), grCourant);
+                       ostringstream f;
+                       f << lgrCalcGroupe; 
+                       elemZPrec->SetValue(f.str());
+                       if(DEBUG)printf("ecriture lgr (%d, %s) pour gr %04x\n",lgrCalcGroupe, f.str().c_str(), grCourant);
                        if(DEBUG)printf ("%04x %04x [%s]\n",elemZPrec->GetGroup(), elemZPrec->GetElement(),elemZPrec->GetValue().c_str());
                        if(DEBUG)cout << "Addresse elemZPrec " << elemZPrec<< endl;
                        elemZPrec=elemZ;
@@ -497,3 +461,171 @@ int gdcmElValSet::WriteAcr(FILE * _fp) {
                
        return(1);
 }
+
+// Sorry for the DEBUG's, but tomorow is gonna be hoter than today
+
+int gdcmElValSet::WriteExplVR(FILE * _fp) {
+
+//
+// ATTENTION : fusioner le code avec celui de gdcmElValSet::Write
+//
+
+       guint16 gr, el;
+       guint32 lgr;
+       const char * val;
+       string vr;
+       guint32 val_uint32;
+       guint16 val_uint16;
+       guint16 z=0, shortLgr;
+       
+       vector<string> tokens;
+       
+       void *ptr;
+
+       string explicitVRTransfertSyntax = "1.2.840.10008.1.2.1";
+       
+       // Utilisées pour le calcul Group Length
+       guint32 lgrCalcGroupe=0;
+       gdcmElValue *elem, *elemZ, *elemZPrec;
+       guint16 grCourant = 0;
+       
+       // Question :
+       // Comment pourrait-on tester si on est TrueDicom ou non ,
+       // (FileType est un champ de gdcmHeader ...)
+       //
+
+       // On parcourt la table pour recalculer la longueur des 'elements 0x0000'
+       // au cas ou un tag ai été ajouté par rapport à ce qui a été lu
+       // dans l'image native
+       //
+       // cf : code IdDcmWriteFile dans libido/src/dcmwrite.c
+               
+               
+       // On fait de l'Explicit VR little Endian 
+       
+                               
+       SetElValueByNumber(explicitVRTransfertSyntax, 0x0002, 0x0010);  
+       SetElValueLengthByNumber(20, 0x0002, 0x0010);  // Le 0 de fin de chaine doit etre stocké, dans ce cas  // ???   
+                       
+       TagElValueHT::iterator tag = tagHt.begin();
+       
+       elem = tag->second;
+       gr   = elem->GetGroup();
+       el   = elem->GetElement();
+                       
+       if (el != 0x0000) {
+               if(DEBUG)printf("ajout elem OOOO premiere fois\n");
+               gdcmDictEntry * tagZ = new gdcmDictEntry(gr, 0x0000, "UL");
+               elemZPrec = new gdcmElValue(tagZ);      // on le cree
+               elemZPrec->SetLength(4);
+               Add(elemZPrec);                         // On l'accroche à sa place
+       } else {
+               elemZPrec = elem;
+               if(DEBUG)printf("Pas d'ajout elem OOOO premiere fois\n");
+       }
+       lgrCalcGroupe = 0;
+       if(DEBUG)printf("init-1 lgr (%d) pour gr %04x\n",lgrCalcGroupe, gr);
+       grCourant = gr;
+       
+       for (tag = ++tagHt.begin();
+                 tag != tagHt.end();
+                 ++tag){
+                 
+               elem = tag->second;
+               gr = elem->GetGroup();
+               el = elem->GetElement();
+
+               if ( (gr != grCourant) /*&&     // On arrive sur un nv Groupe     
+                    (el != 0xfffe) */  ) {
+                           
+                       if (el != 0x0000) {
+                               gdcmDictEntry * tagZ = new gdcmDictEntry(gr, 0x0000, "UL");
+                               elemZ = new gdcmElValue(tagZ); // on le cree
+                               elemZ->SetLength(4);
+                               Add(elemZ);                     // On l'accroche à sa place 
+                               if(DEBUG)printf("ajout elem OOOO pour gr %04x\n",gr);
+                       } else { 
+                               elemZ=elem;
+                               if(DEBUG)printf("maj elemZ\n");
+                       }
+                       
+                       ostringstream f;
+                       f << lgrCalcGroupe; 
+                       //sprintf(str_lgrCalcGroupe,"%d",lgrCalcGroupe);
+                       elemZPrec->SetValue(f.str());
+                       if(DEBUG)printf("ecriture lgr (%d, %s) pour gr %04x\n",lgrCalcGroupe, f.str().c_str(), grCourant);
+                       if(DEBUG)printf ("%04x %04x [%s]\n",elemZPrec->GetGroup(), elemZPrec->GetElement(),elemZPrec->GetValue().c_str());
+                       if(DEBUG)cout << "Addresse elemZPrec " << elemZPrec<< endl;
+                       elemZPrec=elemZ;
+                       lgrCalcGroupe = 0;
+                       grCourant     = gr;     
+                       if(DEBUG)printf("init-2 lgr (%d) pour gr %04x\n",lgrCalcGroupe, gr);                    
+               } else {                        // On n'EST PAS sur un nv Groupe
+                       lgrCalcGroupe += 2 + 2 + 4 + elem->GetLength();  // Gr + Num + Lgr + LgrElem
+                       if(DEBUG)printf("increment (%d) el %04x-->lgr (%d) pour gr %04x\n",elem->GetLength(), el, lgrCalcGroupe, gr);
+               }               
+       }
+               
+       // restent à tester les echecs en écriture (apres chaque fwrite)
+       
+       for (TagElValueHT::iterator tag2 = tagHt.begin();
+                 tag2 != tagHt.end();
+                 ++tag2){
+               
+               gr =  tag2->second->GetGroup();
+               el =  tag2->second->GetElement();
+               lgr = tag2->second->GetLength();
+               val = tag2->second->GetValue().c_str();
+               vr =  tag2->second->GetVR();
+               if(DEBUG)printf ("%04x %04x [%s] : [%s]\n",gr, el, vr.c_str(), val);
+                       
+               fwrite ( &gr,(size_t)2 ,(size_t)1 ,_fp);        //group
+               fwrite ( &el,(size_t)2 ,(size_t)1 ,_fp);        //element
+                               
+               // On est en EXPLICIT VR
+               if (gr == 0x0002) {
+                       fwrite (vr.c_str(),(size_t)2 ,(size_t)1 ,_fp);
+               
+                       if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") ) {
+                               fwrite ( &z,  (size_t)2 ,(size_t)1 ,_fp);
+                               fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp);
+
+                       } else {
+                               shortLgr=lgr;
+                               fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,_fp);
+                       }
+               } else {
+                       fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp);
+               }
+               
+               tokens.erase(tokens.begin(),tokens.end());
+               Tokenize (tag2->second->GetValue(), tokens, "\\");
+                               
+               if (vr == "US" || vr == "SS") {
+                       for (unsigned int i=0; i<tokens.size();i++) {
+                               val_uint16 = atoi(tokens[i].c_str());           
+                               ptr = &val_uint16;
+                               fwrite ( ptr,(size_t)2 ,(size_t)1 ,_fp);
+                       }
+                       continue;       
+               }
+               if (vr == "UL" || vr == "SL") { 
+                       for (unsigned int i=0; i<tokens.size();i++) {
+                               val_uint32 = atoi(tokens[i].c_str());           
+                               ptr = &val_uint32;
+                               fwrite ( ptr,(size_t)4 ,(size_t)1 ,_fp);
+                       }
+                       continue;       
+               }       
+               
+               // Les pixels ne sont pas chargés dans l'element !
+               if ((gr == 0x7fe0) && (el == 0x0010) ) break;
+
+               fwrite ( val,(size_t)lgr ,(size_t)1 ,_fp); //valeur Elem
+       }
+               
+       return(1);
+}
+
+
+
index c98ac24f40a8e9cd1b9287b72fc229a285915805..b2ff14c6c616e470da9105f1dfd1663aad093183 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.5 2003/03/24 13:11:28 frog Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.6 2003/04/01 14:07:40 jpr Exp $
 
 #ifndef GDCMELVALSET_H
 #define GDCMELVALSET_H
@@ -18,11 +18,14 @@ class GDCM_EXPORT gdcmElValSet {
        TagElValueNameHT NameHt;        // the DictEntry.Name are required.
 public:        
        void Add(gdcmElValue*); 
-       void ReplaceOrCreate(gdcmElValue*);             
+       // TODO
+       //void ReplaceOrCreate(gdcmElValue*);           
        void Print(ostream &);
        void PrintByName(ostream &);
        int  Write(FILE *fp);
        int  WriteAcr(FILE *fp);
+       int  WriteExplVR(FILE *fp);
+
        gdcmElValue* GetElementByNumber(guint32 group, guint32 element);
        gdcmElValue* GetElementByName  (string);
        string   GetElValueByNumber(guint32 group, guint32 element);
@@ -35,6 +38,7 @@ public:
        
        int SetElValueLengthByNumber(guint32 l, guint32 group, guint32 element);
        int SetElValueLengthByName  (guint32 l, string TagName);
+       
    guint32 GenerateFreeTagKeyInGroup(guint32 group);
 
 };
index d542ebe7234c43208601d490a97b454537a77317..5ae6e8b769fd95e82ad9530a98fe814c63f72b67 100644 (file)
@@ -314,6 +314,8 @@ void gdcmFile::SetImageDataSize(size_t ImageDataSize) {
        string content2;
        char car[20];
        
+       // suppose que le ElValue (0x7fe0, 0x0010) existe ...
+       
        sprintf(car,"%d",ImageDataSize);
        content2=car;
        SetPubElValByNumber(content2, 0x7fe0, 0x0010);
@@ -388,7 +390,47 @@ int gdcmFile::WriteDcm (string nomFichier) {
        // pourtant le gdcmElValSet contenu dans le gdcmHeader 
        // ne devrait pas être visible par l'utilisateur final (?)
        
-       GetPubElVals().Write(fp1);
+       GetPubElValSet().Write(fp1);
+               
+       fwrite(Pixels, lgrTotale, 1, fp1);
+
+       fclose (fp1);
+       return(1);
+}
+       
+       
+/////////////////////////////////////////////////////////////////
+/**
+ * \ingroup   gdcmFile
+ * \ TODO
+ *
+ * @param 
+ *
+ * @return     
+ */
+
+int gdcmFile::WriteDcmExplVR (string nomFichier) {
+
+// ATTENTION : fonction non terminée (commitée a titre de precaution)
+
+       FILE * fp1;
+       char* filePreamble;
+       fp1 = fopen(nomFichier.c_str(),"wb");
+       if (fp1 == NULL) {
+               printf("Echec ouverture (ecriture) Fichier [%s] \n",nomFichier.c_str());
+               return (0);
+       } 
+       
+       //      Ecriture Dicom File Preamble
+       filePreamble=(char*)calloc(128,1);
+       fwrite(filePreamble,128,1,fp1);
+       fwrite("DICM",4,1,fp1);
+
+       // un accesseur de + est obligatoire ???
+       // pourtant le gdcmElValSet contenu dans le gdcmHeader 
+       // ne devrait pas être visible par l'utilisateur final (?)
+       
+       GetPubElValSet().WriteExplVR(fp1);
                
        fwrite(Pixels, lgrTotale, 1, fp1);
 
@@ -428,7 +470,7 @@ int gdcmFile::WriteAcr (string nomFichier) {
        // pourtant le gdcmElValSet contenu dans le gdcmHeader 
        // ne devrait pas être visible par l'utilisateur final (?)
        
-       GetPubElVals().WriteAcr(fp1);
+       GetPubElValSet().WriteAcr(fp1);
                
        fwrite(Pixels, lgrTotale, 1, fp1);
 
index bb3074ce224cb4967978c27fa93f29246bc2465e..fa41817c8be4bbbd7d9d9ef315f40da266c0e109 100644 (file)
@@ -88,9 +88,10 @@ public:
        // Aucun test n'est fait sur l'"Endiannerie" du processeur.
        // Ca sera à l'utilisateur d'appeler son Reader correctement
                
-       int WriteRawData (string nomFichier);
-       int WriteDcm     (string nomFichier);
-       int WriteAcr     (string nomFichier);
+       int WriteRawData        (string nomFichier);
+       int WriteDcm            (string nomFichier);
+       int WriteDcmExplVR      (string nomFichier);
+       int WriteAcr            (string nomFichier);
 };
 
 #endif
index 67e23959ebfc482433b75ad681a85aba91d30743..8ea7eca7dbc5972e63c3ab6b6c81097587c1ecaf 100644 (file)
@@ -344,7 +344,7 @@ void gdcmHeader::FindVR( gdcmElValue *ElVal) {
  * @return  True when ImplicitVRLittleEndian found. False in all other cases.
  */
 bool gdcmHeader::IsImplicitVRLittleEndianTransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -362,7 +362,7 @@ bool gdcmHeader::IsImplicitVRLittleEndianTransferSyntax(void) {
  * @return  True when ExplicitVRLittleEndian found. False in all other cases.
  */
 bool gdcmHeader::IsExplicitVRLittleEndianTransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -380,7 +380,7 @@ bool gdcmHeader::IsExplicitVRLittleEndianTransferSyntax(void) {
  * @return  True when DeflatedExplicitVRLittleEndian found. False in all other cases.
  */
 bool gdcmHeader::IsDeflatedExplicitVRLittleEndianTransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -398,7 +398,7 @@ bool gdcmHeader::IsDeflatedExplicitVRLittleEndianTransferSyntax(void) {
  * @return  True when big endian found. False in all other cases.
  */
 bool gdcmHeader::IsExplicitVRBigEndianTransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -416,7 +416,7 @@ bool gdcmHeader::IsExplicitVRBigEndianTransferSyntax(void) {
  * @return  True when JPEGBaseLineProcess1found. False in all other cases.
  */
 bool gdcmHeader::IsJPEGBaseLineProcess1TransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -429,7 +429,7 @@ bool gdcmHeader::IsJPEGBaseLineProcess1TransferSyntax(void) {
 // faire qq chose d'intelligent a la place de ça
 
 bool gdcmHeader::IsJPEGLossless(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -448,7 +448,7 @@ bool gdcmHeader::IsJPEGLossless(void) {
  * @return  True when JPEGExtendedProcess2-4 found. False in all other cases.
  */
 bool gdcmHeader::IsJPEGExtendedProcess2_4TransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -466,7 +466,7 @@ bool gdcmHeader::IsJPEGExtendedProcess2_4TransferSyntax(void) {
  * @return  True when JPEGExtendedProcess3-5 found. False in all other cases.
  */
 bool gdcmHeader::IsJPEGExtendedProcess3_5TransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -485,7 +485,7 @@ bool gdcmHeader::IsJPEGExtendedProcess3_5TransferSyntax(void) {
  *          other cases.
  */
 bool gdcmHeader::IsJPEGSpectralSelectionProcess6_8TransferSyntax(void) {
-   gdcmElValue* Element = PubElVals.GetElementByNumber(0x0002, 0x0010);
+   gdcmElValue* Element = PubElValSet.GetElementByNumber(0x0002, 0x0010);
    if ( !Element )
       return false;
    LoadElementValueSafe(Element);
@@ -880,6 +880,20 @@ gdcmElValue* gdcmHeader::NewElValueByKey(guint16 Group, guint16 Elem) {
    return NewElVal;
 }
 
+/**
+ * \ingroup gdcmHeader
+ * \brief   TODO
+ * @param   
+ */
+int gdcmHeader::ReplaceOrCreateByNumber(guint16 Group, guint16 Elem, string Value) {
+
+       gdcmElValue* nvElValue=NewElValueByKey(Group, Elem);
+       PubElValSet.Add(nvElValue);     
+       PubElValSet.SetElValueByNumber(Value, Group, Elem);
+       return(1);
+}   
+
+
 /**
  * \ingroup gdcmHeader
  * \brief   Build a new Element Value from all the low level arguments. 
@@ -908,8 +922,8 @@ gdcmElValue* gdcmHeader::NewElValueByName(string Name) {
  * @return  On succes the newly created ElValue, NULL on failure.      
  */
 gdcmElValue * gdcmHeader::ReadNextElement(void) {
-   guint16 g;
-   guint16 n;
+  
+   guint16 g,n;
    gdcmElValue * NewElVal;
    
    g = ReadInt16();
@@ -1019,7 +1033,7 @@ size_t gdcmHeader::GetPixelOffset(void) {
       numPixel = 0x1010;
    else
       numPixel = 0x0010;
-   gdcmElValue* PixelElement = PubElVals.GetElementByNumber(grPixel, numPixel);
+   gdcmElValue* PixelElement = PubElValSet.GetElementByNumber(grPixel, numPixel);
    if (PixelElement)
       return PixelElement->GetOffset();
    else
@@ -1092,7 +1106,7 @@ gdcmDictEntry * gdcmHeader::GetDictEntryByName(string Name) {
  *          "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetPubElValByNumber(guint16 group, guint16 element) {
-   return PubElVals.GetElValueByNumber(group, element);
+   return PubElValSet.GetElValueByNumber(group, element);
 }
 
 /**
@@ -1110,7 +1124,7 @@ string gdcmHeader::GetPubElValByNumber(guint16 group, guint16 element) {
  *          and the string "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetPubElValRepByNumber(guint16 group, guint16 element) {
-   gdcmElValue* elem =  PubElVals.GetElementByNumber(group, element);
+   gdcmElValue* elem =  PubElValSet.GetElementByNumber(group, element);
    if ( !elem )
       return "gdcm::Unfound";
    return elem->GetVR();
@@ -1125,7 +1139,7 @@ string gdcmHeader::GetPubElValRepByNumber(guint16 group, guint16 element) {
  *          "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetPubElValByName(string TagName) {
-   return PubElVals.GetElValueByName(TagName);
+   return PubElValSet.GetElValueByName(TagName);
 }
 
 /**
@@ -1142,7 +1156,7 @@ string gdcmHeader::GetPubElValByName(string TagName) {
  *          and the string "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetPubElValRepByName(string TagName) {
-   gdcmElValue* elem =  PubElVals.GetElementByName(TagName);
+   gdcmElValue* elem =  PubElValSet.GetElementByName(TagName);
    if ( !elem )
       return "gdcm::Unfound";
    return elem->GetVR();
@@ -1158,7 +1172,7 @@ string gdcmHeader::GetPubElValRepByName(string TagName) {
  *          and the string "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetShaElValByNumber(guint16 group, guint16 element) {
-   return ShaElVals.GetElValueByNumber(group, element);
+   return ShaElValSet.GetElValueByNumber(group, element);
 }
 
 /**
@@ -1176,7 +1190,7 @@ string gdcmHeader::GetShaElValByNumber(guint16 group, guint16 element) {
  *          and the string "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetShaElValRepByNumber(guint16 group, guint16 element) {
-   gdcmElValue* elem =  ShaElVals.GetElementByNumber(group, element);
+   gdcmElValue* elem =  ShaElValSet.GetElementByNumber(group, element);
    if ( !elem )
       return "gdcm::Unfound";
    return elem->GetVR();
@@ -1191,7 +1205,7 @@ string gdcmHeader::GetShaElValRepByNumber(guint16 group, guint16 element) {
  *          "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetShaElValByName(string TagName) {
-   return ShaElVals.GetElValueByName(TagName);
+   return ShaElValSet.GetElValueByName(TagName);
 }
 
 /**
@@ -1208,7 +1222,7 @@ string gdcmHeader::GetShaElValByName(string TagName) {
  *          and the string "gdcm::Unfound" otherwise.
  */
 string gdcmHeader::GetShaElValRepByName(string TagName) {
-   gdcmElValue* elem =  ShaElVals.GetElementByName(TagName);
+   gdcmElValue* elem =  ShaElValSet.GetElementByName(TagName);
    if ( !elem )
       return "gdcm::Unfound";
    return elem->GetVR();
@@ -1292,7 +1306,7 @@ string gdcmHeader::GetElValRepByName(string TagName) {
 
 /**
  * \ingroup gdcmHeader
- * \brief   Accesses an existing gdcmElValue in the PubElVals of this instance
+ * \brief   Accesses an existing gdcmElValue in the PubElValSet of this instance
  *          through it's (group, element) and modifies it's content with
  *          the given value.
  * @param   content new value to substitute with
@@ -1302,23 +1316,23 @@ string gdcmHeader::GetElValRepByName(string TagName) {
 int gdcmHeader::SetPubElValByNumber(string content, guint16 group,
                                     guint16 element)
 {
-   return (  PubElVals.SetElValueByNumber (content, group, element) );
+   return (  PubElValSet.SetElValueByNumber (content, group, element) );
 }
 
 /**
  * \ingroup gdcmHeader
- * \brief   Accesses an existing gdcmElValue in the PubElVals of this instance
+ * \brief   Accesses an existing gdcmElValue in the PubElValSet of this instance
  *          through tag name and modifies it's content with the given value.
  * @param   content new value to substitute with
  * @param   TagName name of the tag to be modified
  */
 int gdcmHeader::SetPubElValByName(string content, string TagName) {
-   return (  PubElVals.SetElValueByName (content, TagName) );
+   return (  PubElValSet.SetElValueByName (content, TagName) );
 }
 
 /**
  * \ingroup gdcmHeader
- * \brief   Accesses an existing gdcmElValue in the PubElVals of this instance
+ * \brief   Accesses an existing gdcmElValue in the PubElValSet of this instance
  *          through it's (group, element) and modifies it's length with
  *          the given value.
  * \warning Use with extreme caution.
@@ -1327,15 +1341,15 @@ int gdcmHeader::SetPubElValByName(string content, string TagName) {
  * @param   element element of the ElVal to modify
  * @return  1 on success, 0 otherwise.
  */
+
 int gdcmHeader::SetPubElValLengthByNumber(guint32 length, guint16 group,
-                                    guint16 element)
-{
-       return (  PubElVals.SetElValueLengthByNumber (length, group, element) );
+                                    guint16 element) {
+       return (  PubElValSet.SetElValueLengthByNumber (length, group, element) );
 }
 
 /**
  * \ingroup gdcmHeader
- * \brief   Accesses an existing gdcmElValue in the ShaElVals of this instance
+ * \brief   Accesses an existing gdcmElValue in the ShaElValSet of this instance
  *          through it's (group, element) and modifies it's content with
  *          the given value.
  * @param   content new value to substitute with
@@ -1344,20 +1358,19 @@ int gdcmHeader::SetPubElValLengthByNumber(guint32 length, guint16 group,
  * @return  1 on success, 0 otherwise.
  */
 int gdcmHeader::SetShaElValByNumber(string content,
-                                    guint16 group, guint16 element)
-{
-   return (  ShaElVals.SetElValueByNumber (content, group, element) );
+                                    guint16 group, guint16 element) {
+   return (  ShaElValSet.SetElValueByNumber (content, group, element) );
 }
 
 /**
  * \ingroup gdcmHeader
- * \brief   Accesses an existing gdcmElValue in the ShaElVals of this instance
+ * \brief   Accesses an existing gdcmElValue in the ShaElValSet of this instance
  *          through tag name and modifies it's content with the given value.
  * @param   content new value to substitute with
  * @param   TagName name of the tag to be modified
  */
 int gdcmHeader::SetShaElValByName(string content, string TagName) {
-   return (  ShaElVals.SetElValueByName (content, TagName) );
+   return (  ShaElValSet.SetElValueByName (content, TagName) );
 }
 
 /**
@@ -1371,7 +1384,7 @@ void gdcmHeader::ParseHeader(bool exception_on_error) throw(gdcmFormatError) {
    CheckSwap();
    while ( (newElValue = ReadNextElement()) ) {
       SkipElementValue(newElValue);
-      PubElVals.Add(newElValue);
+      PubElValSet.Add(newElValue);
    }
 }
 
@@ -1399,7 +1412,6 @@ void gdcmHeader::AddAndDefaultElements(void) {
    else 
       NewElVal->SetValue("0");
 
-
    NewElVal = NewManualElValToPubDict("gdcmYSize", "US");
    if (!NewElVal) return;
    NewVal = GetElValByName("Columns");
@@ -1461,7 +1473,7 @@ gdcmElValue* gdcmHeader::NewManualElValToPubDict(string NewTagName, string VR) {
    guint32 FreeElem = 0;
    gdcmDictEntry* NewEntry = (gdcmDictEntry*)0;
 
-   FreeElem = PubElVals.GenerateFreeTagKeyInGroup(StuffGroup);
+   FreeElem = PubElValSet.GenerateFreeTagKeyInGroup(StuffGroup);
    if (FreeElem == UINT32_MAX) {
       dbg.Verbose(1, "gdcmHeader::NewManualElValToPubDict",
                      "Group 0xffff in Public Dict is full");
@@ -1470,8 +1482,9 @@ gdcmElValue* gdcmHeader::NewManualElValToPubDict(string NewTagName, string VR) {
    NewEntry = new gdcmDictEntry(StuffGroup, FreeElem,
                                 VR, "GDCM", NewTagName);
    NewElVal = new gdcmElValue(NewEntry);
-   PubElVals.Add(NewElVal);
+   PubElValSet.Add(NewElVal);
    return NewElVal;
+
 }
 
 /**
@@ -1481,14 +1494,14 @@ gdcmElValue* gdcmHeader::NewManualElValToPubDict(string NewTagName, string VR) {
  */
 void gdcmHeader::LoadElements(void) {
    rewind(fp);   
-   TagElValueHT ht = PubElVals.GetTagHt();
+   TagElValueHT ht = PubElValSet.GetTagHt();
    for (TagElValueHT::iterator tag = ht.begin(); tag != ht.end(); ++tag) {
       LoadElementValue(tag->second);
       }
 }
 
 void gdcmHeader::PrintPubElVal(ostream & os) {
-   PubElVals.Print(os);
+   PubElValSet.Print(os);
 }
 
 void gdcmHeader::PrintPubDict(ostream & os) {
index a7d2241f24910756636b3add714a71f59833a615..91b92549255f7137735515769cb708e3ccb133a5 100644 (file)
@@ -47,9 +47,9 @@ private:
    gdcmDict* RefShaDict;
 
    /// ELement VALueS parsed with the PUBlic dictionary.
-   gdcmElValSet PubElVals;
+   gdcmElValSet PubElValSet;
    /// ELement VALueS parsed with the SHAdow dictionary.
-   gdcmElValSet ShaElVals;
+   gdcmElValSet ShaElValSet;
    /// Refering underlying filename.
    string filename; 
    FILE * fp;
@@ -144,9 +144,9 @@ public:
    string GetPubElValRepByName(string TagName);
    string GetPubElValRepByNumber(guint16 group, guint16 element);
 
-   TagElValueHT & GetPubElVal(void) { return PubElVals.GetTagHt(); };
+   TagElValueHT & GetPubElVal(void) { return PubElValSet.GetTagHt(); };
    void   PrintPubElVal(ostream & os = cout);
-   void   PrintPubDict(ostream & os = cout);
+   void   PrintPubDict (ostream & os = cout);
      
    // TODO Swig string* GetShaTagNames(); 
    string GetShaElValByName(string TagName);
@@ -164,9 +164,10 @@ public:
    int SetShaElValByName(string content, string ShadowTagName);
    int SetShaElValByNumber(string content, guint16 group, guint16 element);
    
-   int SetPubElValLengthByNumber(guint32 lgr, guint16 group, guint16 element);
+   int SetPubElValLengthByNumber(guint32 lgr, guint16 group, guint16 element);                                   
+   int ReplaceOrCreateByNumber(guint16 Group, guint16 Elem, string Value);                                
 
-   gdcmElValSet GetPubElVals() { return(PubElVals); }
+   gdcmElValSet GetPubElValSet() { return(PubElValSet); }
 };
 
 #endif