]> Creatis software - gdcm.git/commitdiff
UpdateGroupLength re-written using H-Table
authorjpr <jpr>
Wed, 9 Apr 2003 14:04:52 +0000 (14:04 +0000)
committerjpr <jpr>
Wed, 9 Apr 2003 14:04:52 +0000 (14:04 +0000)
ChangeLog
Testing/TestChangeHeader.cxx
src/gdcmDictEntry.cxx
src/gdcmDictEntry.h
src/gdcmElValSet.cxx
src/gdcmElValSet.h
src/gdcmElValue.h
src/gdcmHeader.cxx
src/gdcmHeader.h

index 3690e73e514426999b7fc6842dd4a8e4ab30a34f..a7f69cca390f62c07fe91412d1e8f559b7c64644 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2003-04-9 JPR
+      * UpdateGroupLength replaced by new one
+
 2003-04-7 JPR
       * UpdateGroupLength re-written using H-Table
         (named UpdateGroupLengthNew untill checks are over)
index eb53fe342ba2d222a63d5beede80e610d24f42e6..fe435433b26177a2cfd70f47848b7f0173a70d84 100644 (file)
@@ -33,12 +33,12 @@ int main(int argc, char* argv[])
        
        // On suppose que les champs DICOM du 2ieme fichier existent *effectivement*
        
-   f1->ReplaceOrCreateByNumber(0x0028, 0x0008,
-          f2->GetPubElValByNumber(0x0028, 0x0008));// nb Frames
-       f1->ReplaceOrCreateByNumber(0x0028, 0x0010,
-          f2->GetPubElValByNumber(0x0028, 0x0010));// nbLig
-       f1->ReplaceOrCreateByNumber(0x0028, 0x0011,
-          f2->GetPubElValByNumber(0x0028, 0x0011));// nbCol
+        f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0008),
+          0x0028, 0x0008);// nb Frames
+       f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0010),
+         0x0028, 0x0010);// nbLig
+       f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0011),
+          0x0028, 0x0011);// nbCol
        
        // sans doute d'autres à mettre à jour...
        
index 8ac0d08da3a046f9580b0c2e6c18334fd4f7f44e..482a05d0141953b22c722c39afad992d2130d7d0 100644 (file)
@@ -6,8 +6,7 @@
 
 
 gdcmDictEntry::gdcmDictEntry(guint16 InGroup, guint16 InElement,
-                             string  InVr, string InFourth, string InName) 
-{
+                             string  InVr, string InFourth, string InName) {
        group           = InGroup;
        element         = InElement;
        vr              = InVr;
index ecbc0290a47a555fca5af5a7714edf8047c9c2e7..93cf8efc7c867cdab6ed138c8b8c02e5770b60dd 100644 (file)
@@ -7,13 +7,13 @@
 
 class GDCM_EXPORT gdcmDictEntry {
 private:
-       guint16 group;    // e.g. 0x0010
-       guint16 element;  // e.g. 0x0103
+       guint16 group;    // e.g. 0x0010  // FIXME : s'en sert-on qq part
+       guint16 element;  // e.g. 0x0103  // si ce n'est pour fabriquer la TagKey ?
        string  vr;       // Value Representation i.e. some clue about the nature
                          // of the data represented e.g. "FD" short for
                          // "Floating Point Double"
        // CLEANME: find the official dicom name for this field !
-       string  fourth;   // Fourth field containing some semantics.
+       string  fourth;   // Fourth field containing some semantics. (Group Name abbr.)
        string  name;     // e.g. "Patient_Name"
        TagKey  key;      // Redundant with (group, element) but we add it
                          // on efficiency purposes.
@@ -36,6 +36,7 @@ public:
                      string vr     = "Unknown",
                      string fourth = "Unknown",
                      string name   = "Unknown");
+                        
        // fabrique une 'clé' par concaténation du numGroupe et du numElement
        static TagKey TranslateToKey(guint16 group, guint16 element);
        
index fe5df93739c928d7815f837bc2d43db4d2a47c08..beb99fd364d5dc826c64b7b4c0ccfe39d9a88276 100644 (file)
@@ -118,116 +118,19 @@ int gdcmElValSet::SetElValueLengthByName(guint32 length, string TagName) {
        return 1 ;              
 }
 
-void gdcmElValSet::UpdateGroupLength(bool SkipSequence) {
-
-   // TODO : reecrire entierement : une HTable dans la quelle on stocke les groupes, puis leur lgr
-   // Voir juste apres
-
-       // 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'implicit VR little Endian 
-       // (pour moins se fairche sur processeur INTEL)
-       // On force le TRANSFERT SYNTAX UID
-   guint16 gr, el;
-   string vr;
-   guint32 lgrCalcGroupe=0;
-   gdcmElValue *elem, *elemZ, *elemZPrec;
-   guint16 grCourant = 0;
-                               
-       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();
-      vr = elem->GetVR();
-
-      if (SkipSequence && vr == "SQ")  continue;
-         // pas SEQUENCE en ACR-NEMA
-         // WARNING : pb CERTAIN
-         //           si on est descendu 'a l'interieur' des SQ 
-        
-       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;
-       // BUG :
-       // calcule lgr erronnée si ExplicitVR et VR =OB, SQ, etc
-       //      
-                       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);
-               }               
-       }
-       
-       // BUG :
-       // Ecriture incorrecte si (7FE0 0000) absent et aucun element apres groupe 7FE0 :-(
-       // A JETTER !
-       //
-}
 
-//
-// Remplacera UpdateGroupLength
-// Commite par precaution.
-// Ne pas utiliser
-//
 
-void gdcmElValSet::UpdateGroupLengthNew(bool SkipSequence, FileType type) {
+void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) {
    guint16 gr, el;
    string vr;
    
    gdcmElValue *elem;
    char trash[10];
+   string str_trash;
    GroupKey key;
    GroupHT groupHt;
+   TagKey tk;
+   gdcmElValue *elemZ;
    
    for (TagElValueHT::iterator tag2 = tagHt.begin();
         tag2 != tagHt.end();
@@ -237,10 +140,10 @@ void gdcmElValSet::UpdateGroupLengthNew(bool SkipSequence, FileType type) {
       gr = elem->GetGroup();
       el = elem->GetElement();
       vr = elem->GetVR(); 
-           
+                 
       sprintf(trash, "%04x", gr);
       key = trash;
-      
+            
       if (SkipSequence && vr == "SQ") continue;
          // pas SEQUENCE en ACR-NEMA
          // WARNING : pb CERTAIN
@@ -250,7 +153,11 @@ void gdcmElValSet::UpdateGroupLengthNew(bool SkipSequence, FileType type) {
          // devra etre faite avec une liste chainee, pas avec une HTable...
              
       if ( groupHt.count(key) == 0) { 
-         groupHt[key] = 2 + 2 + 4 + 4; // creation automatique, par affectation ???
+         if (el ==0x0000) {
+            groupHt[key] = 0;
+         } else {
+            groupHt[key] =2 + 2 + 4 + elem->GetLength();
+         } 
       } else {       
          if (type = ExplicitVR) {
             if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") ) {
@@ -258,14 +165,34 @@ void gdcmElValSet::UpdateGroupLengthNew(bool SkipSequence, FileType type) {
             }
          }
          groupHt[key] += 2 + 2 + 4 + elem->GetLength(); 
-      }   
+      } 
    }
+  
+   unsigned short int gr_bid;
+  
+   for (GroupHT::iterator g = groupHt.begin();
+        g != groupHt.end();
+        ++g){ 
+  
+      tk = g->first + "|0000";
+      sscanf(g->first.c_str(),"%x",&gr_bid);
+               
+      if ( tagHt.count(tk) == 0) { 
+         gdcmDictEntry * tagZ = new gdcmDictEntry(gr_bid, 0x0000, "UL");       
+         elemZ = new gdcmElValue(tagZ);
+         elemZ->SetLength(4);
+         Add(elemZ);
+      } else {
+         elemZ=GetElementByNumber(gr_bid, 0x0000);
+      }
+      str_trash=trash;
+      elemZ->SetValue(str_trash);
+   }   
    
    // Liberer groupHt !
+   
 }
 
-
-
 void gdcmElValSet::WriteElements(FileType type, FILE * _fp) {
    guint16 gr, el;
    guint32 lgr;
@@ -372,9 +299,9 @@ int gdcmElValSet::Write(FILE * _fp, FileType type) {
    }
 
    if ( (type == ImplicitVR) || (type == ExplicitVR) )
-      UpdateGroupLength();
+      UpdateGroupLength(false,type);
    if ( type == ACR)
-      UpdateGroupLength(true);
+      UpdateGroupLength(true,ACR);
 
    WriteElements(type, _fp);
 
index 7fc07ce3779ace1d8f30134b8fa4f920f16c5bac..c5b59ed53cb990f1363aaa560ff832910450ac12 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.9 2003/04/08 17:10:58 jpr Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.10 2003/04/09 14:04:53 jpr Exp $
 
 #ifndef GDCMELVALSET_H
 #define GDCMELVALSET_H
@@ -43,11 +43,8 @@ public:
    guint32 GenerateFreeTagKeyInGroup(guint16 group);
        
 private:
-   void UpdateGroupLength(bool SkipSequence = false);
+   void UpdateGroupLength(bool SkipSequence = false, FileType type = ImplicitVR);
    void WriteElements(FileType type, FILE *);
-   
-   void UpdateGroupLengthNew(bool SkipSequence = false, FileType type = ImplicitVR);
-
 };
 
 #endif
index 2e895694b0add877d9a95a66d3da68456e42c401..1365d8bc9b2c879194a0166e63b058dac69e77c1 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmElValue.h,v 1.3 2003/03/24 13:11:28 frog Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmElValue.h,v 1.4 2003/04/09 14:04:53 jpr Exp $
 
 #ifndef GDCMELVALUE_H
 #define GDCMELVALUE_H
@@ -6,6 +6,7 @@
 #include "gdcmDictEntry.h"
 class gdcmHeader;
 
+#include <stdio.h>
 
 ///////////////////////////////////////////////////////////////////////////
 // The dicom header of a Dicom file contains a set of such ELement VALUES
index 20ae34ed6d92c373fead8bbf592f35f1c313c103..4f2d2affb872a154c12ec4bd148249eb939ec6dd 100644 (file)
@@ -864,6 +864,16 @@ guint32 gdcmHeader::ReadInt32(void) {
    return g;
 }
 
+
+
+
+//
+// TODO : JPR Pour des raisons d'homogeneité de noms, 
+// remplacer les quelques GetxxxByKey 
+// par des GetxxxByNumber, lorsqu'on passe gr, el en param.
+// il peut etre interessant de rajouter des GetxxxByKey, auxquels on passe *vraiment* une TagKey
+//
+
 /**
  * \ingroup gdcmHeader
  * \brief   Build a new Element Value from all the low level arguments. 
@@ -892,7 +902,7 @@ gdcmElValue* gdcmHeader::NewElValueByKey(guint16 Group, guint16 Elem) {
  * \brief   TODO
  * @param   
  */
-int gdcmHeader::ReplaceOrCreateByNumber(guint16 Group, guint16 Elem, string Value) {
+int gdcmHeader::ReplaceOrCreateByNumber(string Value, guint16 Group, guint16 Elem ) {
 
        gdcmElValue* nvElValue=NewElValueByKey(Group, Elem);
        PubElValSet.Add(nvElValue);     
@@ -969,9 +979,12 @@ bool gdcmHeader::IsAnInteger(gdcmElValue * ElVal) {
    if ( element == 0 )  {  // This is the group length of the group
       if (length == 4)
          return true;
-      else
+      else {
+         printf("Erroneous Group Length element length %d\n",length);
+                    
          dbg.Error("gdcmHeader::IsAnInteger",
-                   "Erroneous Group Length element length.");
+                   "Erroneous Group Length element length.");     
+      }
    }
  
    if ( (vr == "UL") || (vr == "US") || (vr == "SL") || (vr == "SS") )
index f3062f4614b1b745b98364a3bc48bde4193690cc..5e43f564460f3fec9966d1ef1766e0a9ccad7f7a 100644 (file)
@@ -158,7 +158,7 @@ public:
    int SetShaElValByNumber(string content, guint16 group, guint16 element);
    
    int SetPubElValLengthByNumber(guint32 lgr, guint16 group, guint16 element);                                   
-   int ReplaceOrCreateByNumber(guint16 Group, guint16 Elem, string Value);                                
+   int ReplaceOrCreateByNumber(string Value, guint16 Group, guint16 Elem);                                
    int GetXSize(void);  
    int GetYSize(void);
    int GetZSize(void);