]> Creatis software - gdcm.git/commitdiff
light modif around DICOMDIR stuff
authorjpr <jpr>
Fri, 27 Aug 2004 15:48:43 +0000 (15:48 +0000)
committerjpr <jpr>
Fri, 27 Aug 2004 15:48:43 +0000 (15:48 +0000)
Dicts/DicomDir.dic
Example/makeDicomDir.cxx
src/gdcmDicomDir.cxx
src/gdcmDicomDirElement.cxx
src/gdcmDicomDirMeta.cxx
src/gdcmSQItem.cxx
src/gdcmSeqEntry.cxx
src/gdcmValEntry.cxx

index a109cf8af066e0d5b3790d29864596d6237b332b..377e0a1cb019b2980a75a1b6fc6be2a966ddaebf 100644 (file)
@@ -10,9 +10,8 @@ metaElem    0004 1130 ""                     // File-set ID
 metaElem    0004 1200 "0"                    // Offset of the first dir of root dir entity : to be computed later
 metaElem    0004 1202 "0"                    // Offset of the last  dir of root dir entity : to be computed later
 metaElem    0004 1212 "0"                    // File-set consistency flag
-metaElem    0004 1220 ""                     // Directory record sequence : *length* to be set to 0xffffffff later
 
-patientElem fffe e000 "0"                    // 'no length' item : length to be set to 0xffffffff later
+patientElem fffe e000 "255"                   // 'no length' item : length to be set to 0xffffffff later
 patientElem 0004 1400 "0"                    // Offset of next directory record : = 0x0 : fffe e00d at end !
 patientElem 0004 1410 "65535"                // Record in use flag : 65535 = 0xFFFF (see 03_10PU.PDF p 31)
 patientElem 0004 1420 "0"                    // Offset of referenced lower-level dir entity : to be computed later
@@ -24,7 +23,7 @@ patientElem 0010 0030 ""                     // Patient's Birthdate
 patientElem 0010 0040 ""                     // Patient's Sex
 patientElem fffe e00d ""                     // Item delimitation : length to be set to ZERO later
 
-studyElem   fffe e000 "0"                    // 'no length' item : length to be set to 0xffffffff later
+studyElem   fffe e000 "-1"                   // 'no length' item : length to be set to 0xffffffff later
 studyElem   0004 1400 "0"                    // Offset of next directory record : = 0x0 : fffe e00d at end !
 studyElem   0004 1410 "65535"                // Record in use flag : 65535 = 0xFFFF (see 03_10PU.PDF p 31)
 studyElem   0004 1420 "0"                    // Offset of referenced lower-level dir entity : to be computed later
@@ -38,7 +37,7 @@ studyElem   0020 000d ""                     // Study Instance UID : may be forg
 studyElem   0020 0010 ""                     // Study ID :           may be forged later
 studyElem   fffe e00d ""                     // Item delimitation : length to be set to ZERO later
 
-serieElem   fffe e000 "O"                    // 'no length' item : length to be set to 0xffffffff later
+serieElem   fffe e000 "-1"                   // 'no length' item : length to be set to 0xffffffff later
 serieElem   0004 1400 "0"                    // Offset of next directory record : = 0x0 : fffe e00d at end !
 serieElem   0004 1410 "65535"                // Record in use flag : 65535 = 0xFFFF (see 03_10PU.PDF p 31)
 serieElem   0004 1420 "0"                    // Offset of referenced lower-level dir entity : to be computed later
@@ -54,7 +53,7 @@ serieElem   0020 000e ""                     // Series Instance UID : may be for
 serieElem   0020 0011 "0"                    // Series Number :       may be forged later
 serieElem   fffe e00d ""                     // Item delimitation : length to be set to ZERO later
 
-imageElem   fffe e000 "0"                    // 'no length' item : length to be set to 0xffffffff later
+imageElem   fffe e000 "-1"                   // 'no length' item : length to be set to 0xffffffff later
 imageElem   0004 1400 "0"                    // Offset of next directory record : = 0x0 : fffe e00d at end !
 imageElem   0004 1410 "65535"                // Record in use flag : 65535 = 0xFFFF (see 03_10PU.PDF p 31)
 imageElem   0004 1420 "0"                    // Offset of referenced lower-level dir entity : to be computed later
@@ -69,11 +68,6 @@ imageElem   0008 0016 ""                     // SOP Class UID :    to be set/for
 imageElem   0008 0018 ""                     // SOP Instance UID : to be set/forged later
 imageElem   0008 0023 ""                     // Content Date
 imageElem   0008 0033 ""                     // Content Time
-imageElem   0008 1140 ""                     // Referenced Image Sequence
-imageElem   fffe e000 ""                     // 'no length' item : length to be set to 0xffffffff later
-imageElem   0008 1150 ""                     // Referenced SOP Class UID    : to be set/forged later
-imageElem   0008 1155 ""                     // Referenced SOP Instance UID : to be set/forged later
-imageElem   fffe e00d ""                     // Item delimitation : length to be set to ZERO later
 imageElem   0020 0013 "0"                    // Image Number
 imageElem   0020 0032 "1.0\1.0\1.0 "         // Image Position Patient
 imageElem   0020 0037 "1\0\0\0\1\0 "         // Image Orientation    Patient
index 540842c96086a3c13984e00d7924289d6e947223..e4b1b5ac15e6c3af91863b56f6480c6d60f0927a 100644 (file)
@@ -72,17 +72,10 @@ int main(int argc, char* argv[]) {
                 << std::endl;
       return 1;
    }
-
-   std::cout << "--------- dcmdir->Print() ------------" << std::endl;   
-
-   dcmdir->SetPrintLevel(-1);
-   //dcmdir->Print(); // just to see
-   std::cout << "---------end  dcmdir->Print() ------------" << std::endl;
     
    dcmdir->Write("NewDICOMDIR");
    std::cout<<std::flush;
 
    delete dcmdir;
-
    return 0;
 }
index fb5f55595e9b6c02e46af3dd2708d528e5a973ba..6ad223049f8f724052dc0e40e82d92ce34367fec 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDir.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/26 15:29:52 $
-  Version:   $Revision: 1.64 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.65 $
   
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -342,7 +342,7 @@ void gdcmDicomDir::SetEndMethodArgDelete(gdcmMethod *method)
 bool gdcmDicomDir::Write(std::string const & fileName) 
 {  
    uint16_t sq[5] = { 0x0004, 0x1220, 0x0000, 0xffff, 0xffff };
-   uint16_t sqt[3]= { 0xfffe, 0xe0dd, 0x0000 };
+   uint16_t sqt[4]= { 0xfffe, 0xe0dd, 0xffff, 0xffff };
 
    FILE * fp = fopen(fileName.c_str(), "wb");
    if( !fp ) 
@@ -356,23 +356,26 @@ bool gdcmDicomDir::Write(std::string const & fileName)
    fwrite(filePreamble,128,1,fp);
    fwrite("DICM",4,1,fp);
    delete[] filePreamble;
+   
  //  UpdateDirectoryRecordSequenceLength(); // TODO (if *really* usefull)
    gdcmDicomDirMeta *ptrMeta = GetDicomDirMeta();
    ptrMeta->Write(fp, gdcmExplicitVR);
    
    // force writing 0004|1220 [SQ ], that CANNOT exist within gdcmDicomDirMeta
    fwrite(&sq[0],4,1,fp);  // 0004 1220 
-   fwrite("SQ"  ,2,1,fp);  // SQ
-   fwrite(&sq[2],6,1,fp);  // 00 ffffffff
-      
+   //fwrite("SQ"  ,2,1,fp);  // SQ  // VR no written for 'No length' Sequences !
+   //fwrite(&sq[2],6,1,fp);  // 00 ffffffff
+   fwrite(&sq[3],4,1,fp);  // ffffffff 
+        
    for(ListDicomDirPatient::iterator cc = patients.begin();cc!=patients.end();++cc)
    {
       (*cc)->Write( fp, gdcmExplicitVR );
    }
+   
    // force writing Sequence Delimitation Item
-   fwrite(&sqt[0],4,1,fp);  // fffe e0dd 
-   fwrite("UL"   ,2,1,fp);  // UL
-   fwrite(&sqt[2],1,1,fp);  // 00 
+   fwrite(&sqt[0],8,1,fp);  // fffe e0dd ffff ffff 
+
    fclose( fp );
    return true;
 }
@@ -666,7 +669,10 @@ void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,
       }
 
       if ( type == GDCM_DICOMDIR_META ) // fusible : should never print !
+      {
          std::cout << " special Treatment for GDCM_DICOMDIR_META" << std::endl;
+         entry->Print(); // just to see 
+      }
       si->AddEntry(entry);
    }
    switch( type )
index 22530e7d80dce3cc6480309a04efdba0ffdfa225..b7517e8d577762114bfd6c9a9b7ca62bc73d1ded 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDirElement.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/01 02:39:09 $
-  Version:   $Revision: 1.14 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.15 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -37,7 +37,8 @@ gdcmDicomDirElement::gdcmDicomDirElement()
 {
    std::string filename = gdcmDictSet::BuildDictPath() + std::string(DICT_ELEM);
    std::ifstream from(filename.c_str());
-   dbg.Error(!from, "gdcmDicomDirElement::gdcmDicomDirElement: can't open dictionary",filename.c_str());
+   dbg.Error(!from, "gdcmDicomDirElement::gdcmDicomDirElement: can't open dictionary",
+              filename.c_str());
 
    char buff[1024];
    std::string type;
index 15bfa8d048644136dccc9aaeb993a0e3e452c7b7..42997e8c5e833265c32f538f1583508053f2ea2e 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDicomDirMeta.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/26 15:29:52 $
-  Version:   $Revision: 1.6 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.7 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -49,7 +49,11 @@ gdcmDicomDirMeta::~gdcmDicomDirMeta()
 void gdcmDicomDirMeta::Print(std::ostream &os)
 {
    os << "META" << std::endl;
-   gdcmObject::Print(os);
+   //gdcmObject::Print(os);
+   for (ListDocEntry::iterator i = docEntries.begin();  
+        i != docEntries.end();
+        ++i)
+      (*i)->Print();    
 }
 
 
@@ -58,12 +62,15 @@ void gdcmDicomDirMeta::Print(std::ostream &os)
 
 
 /**
- * \brief   Writes the Object
+ * \brief   Writes the Meta Elements
  * @return
  */ 
 void gdcmDicomDirMeta::Write(FILE *fp, FileType t)
-{
-   gdcmObject::Write(fp, t);
+{   
+   for (ListDocEntry::iterator i = docEntries.begin();  
+        i != docEntries.end();
+        ++i)
+      (*i)->Write(fp, t);   
 }
 
 //-----------------------------------------------------------------------------
index 7d61d3cce28c878c633614ee0561903aa5fcc2ff..2299b946bc6af54bf7f2047e82c715c85f34ee51 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSQItem.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/26 15:29:53 $
-  Version:   $Revision: 1.24 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.25 $
   
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -97,17 +97,22 @@ gdcmSQItem::~gdcmSQItem()
  */
 void gdcmSQItem::Write(FILE *fp,FileType filetype)
 {
+   uint16_t item[4] = { 0xfffe, 0xe000, 0xffff, 0xffff };
+   uint16_t itemt[4]= { 0xfffe, 0xe00d, 0xffff, 0xffff };
+
+    //we force the writting of an 'Item' Start Element
+    // because we want to write the Item as a 'no Length' item
+   fwrite(&item[0],8,1,fp);  // fffe e000 ffff ffff 
+     
    for (ListDocEntry::iterator i = docEntries.begin();  
         i != docEntries.end();
         ++i)
-   {
-      // Item Delimitor Item IS the last one of a 'no length' SQItem
-      // (when it exists) we don't write it right now
-      // It will be written outside, because ALL the SQItems are written
-      // as 'no length'
-      if ( (*i)->IsItemDelimitor() )
+   {   
+      // we skip delimitors (start and end one) because 
+      // we force them as 'no length'
+      if ( (*i)->GetGroup() == 0xfffe )
       {
-         break;
+         continue;
       }
 
       // Fix in order to make some MR PHILIPS images e-film readable
@@ -115,13 +120,16 @@ void gdcmSQItem::Write(FILE *fp,FileType filetype)
       // we just *always* ignore spurious fffe|0000 tag ! 
       if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0x0000 )
       {
-         break;
+         break; // FIXME : continue; ?!?
       }
 
-      // It's up to the gdcmDocEntry Writter to write the SQItem begin element
-      // (fffe|e000) as a 'no length' one
       (*i)->Write(fp, filetype);
-   } 
+   }
+      
+    //we force the writting of an 'Item Delimitation' item
+    // because we wrote the Item as a 'no Length' item
+   fwrite(&itemt[0],8,1,fp);  // fffe e000 ffff ffff 
+
 }
 
 //-----------------------------------------------------------------------------
index 5ee43c7754ac1272155b85ad50b53278fc31a865..f418ccd26afa3e83d9783cc3180be7a8008d24c1 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSeqEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/26 15:29:53 $
-  Version:   $Revision: 1.23 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.24 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -51,7 +51,7 @@ gdcmSeqEntry::gdcmSeqEntry(gdcmDocEntry* e, int depth) : gdcmDocEntry(e->GetDict
    this->ImplicitVR   = e->IsImplicitVR();
    this->Offset       = e->GetOffset();
    //this->printLevel   = e->GetPrintLevel(); // no longer exists ?!?
-   this->SQDepthLevel = e->GetDepthLevel();
+   this->SQDepthLevel = depth;
 }
 /**
  * \brief   Canonical destructor.
@@ -105,23 +105,17 @@ void gdcmSeqEntry::Write(FILE *fp, FileType filetype)
 {
    uint16_t seq_term_gr = 0xfffe;
    uint16_t seq_term_el = 0xe0dd;
-   uint32_t seq_term_lg = 0x00000000;
+   uint32_t seq_term_lg = 0xffffffff;
 
    uint16_t item_term_gr = 0xfffe;
    uint16_t item_term_el = 0xe00d;
-
+   
    gdcmDocEntry::Write(fp, filetype);
    for(ListSQItem::iterator cc  = GetSQItems().begin();
                             cc != GetSQItems().end();
                           ++cc)
-   {
+   {        
       (*cc)->Write(fp, filetype);
-      
-    //we force the writting of an Item Delimitation item
-    // because we wrote the Item as a 'no Length' item
-      fwrite ( &item_term_gr,(size_t)2 ,(size_t)1 ,fp);
-      fwrite ( &item_term_el,(size_t)2 ,(size_t)1 ,fp);   
-      fwrite ( &seq_term_lg, (size_t)4 ,(size_t)1 ,fp); // Heu .....
    }
    
     //we force the writting of a Sequence Delimitation item
index 08d791e0952963edf3b80693baf736f574294ea8..8b14f72f1e7d34f4e0f1ae0eada41234b434a826 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmValEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/08/16 16:30:32 $
-  Version:   $Revision: 1.21 $
+  Date:      $Date: 2004/08/27 15:48:44 $
+  Version:   $Revision: 1.22 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -181,6 +181,12 @@ void gdcmValEntry::Print(std::ostream & os)
 void gdcmValEntry::Write(FILE *fp, FileType filetype)
 {
    gdcmDocEntry::Write(fp, filetype);
+      
+   if ( GetGroup() == 0xfffe ) 
+   {
+      return; //delimitors have NO value
+   }
+      
    std::string vr = GetVR();
    int lgr = GetReadLength();
    if (vr == "US" || vr == "SS")