]> Creatis software - gdcm.git/blobdiff - src/gdcmHeader.cxx
* gdcmPython/Makefile.am fixed linking against libstdc++
[gdcm.git] / src / gdcmHeader.cxx
index 0ccd21e5cdfb5fb083c5639bd46dc93b2f57b213..a16d0693841a40f35696f18e52fc917dd1c5aebd 100644 (file)
@@ -43,6 +43,7 @@ gdcmHeader::gdcmHeader(const char *InFilename, bool exception_on_error)
   else
     dbg.Error(!fp, "gdcmHeader::gdcmHeader cannot open file", InFilename);
   ParseHeader();
+  LoadElements();
   AddAndDefaultElements();
 }
 
@@ -729,16 +730,7 @@ void gdcmHeader::LoadElementValue(gdcmElValue * ElVal) {
    if( group == 0xfffe )
       SkipLoad = true;
 
-   // The group length doesn't represent data to be loaded in memory, since
-   // each element of the group shall be loaded individualy.
-   if( elem == 0 )
-      //SkipLoad = true;       // modif sauvage JPR
-                               // On charge la longueur du groupe
-                               // quand l'element 0x0000 est prĂ©sent !
-
    if ( SkipLoad ) {
-           // FIXME the following skip is not necessary
-      SkipElementValue(ElVal);
       ElVal->SetLength(0);
       ElVal->SetValue("gdcm::Skipped");
       return;
@@ -1393,19 +1385,64 @@ void gdcmHeader::ParseHeader(bool exception_on_error) throw(gdcmFormatError) {
  *            the ones of the official DICOM fields Rows, Columns and Planes.
  */
 void gdcmHeader::AddAndDefaultElements(void) {
-   gdcmElValue* NewEntry = (gdcmElValue*)0;
+   gdcmElValue* NewElVal = (gdcmElValue*)0;
+   string NewVal;
+
+   NewElVal = NewManualElValToPubDict("gdcmXSize", "US");
+   if (!NewElVal) return;
+   NewVal = GetElValByName("Rows");
+   if (NewVal != "gdcm::Unfound")
+      NewElVal->SetValue(NewVal);
+   else 
+      NewElVal->SetValue("0");
+
+
+   NewElVal = NewManualElValToPubDict("gdcmYSize", "US");
+   if (!NewElVal) return;
+   NewVal = GetElValByName("Columns");
+   if (NewVal != "gdcm::Unfound")
+      NewElVal->SetValue(NewVal);
+   else
+      NewElVal->SetValue("0");
 
-   NewEntry = NewElValueByName("gdcmXSize");
-   NewEntry->SetValue(GetElValByName("Rows"));
-   PubElVals.Add(NewEntry);
 
-   NewEntry = NewElValueByName("gdcmYSize");
-   NewEntry->SetValue(GetElValByName("Columns"));
-   PubElVals.Add(NewEntry);
+   NewElVal = NewManualElValToPubDict("gdcmZSize", "US");
+   if (!NewElVal) return;
+   NewVal = GetElValByName("Planes");
+   if (NewVal != "gdcm::Unfound")
+      NewElVal->SetValue(NewVal);
+   else
+      NewElVal->SetValue("0");
+}
 
-   NewEntry = NewElValueByName("gdcmZSize");
-   NewEntry->SetValue(GetElValByName("Planes"));
-   PubElVals.Add(NewEntry);
+/**
+ * \ingroup gdcmHeader
+ * \brief   Small utility function that creates a new manually crafted
+ *          (as opposed as read from the file) gdcmElValue with user
+ *          specified name and adds it to the public tag hash table.
+ *          Refer to gdcmHeader::AddAndDefaultElements for a typical usage.
+ * \note    A fake TagKey is generated so the PubDict can keep it's coherence.
+ * @param   NewTagName The name to be given to this new tag.
+ * @param   VR The Value Representation to be given to this new tag.
+ * @ return The newly hand crafted Element Value.
+ */
+gdcmElValue* gdcmHeader::NewManualElValToPubDict(string NewTagName, string VR) {
+   gdcmElValue* NewElVal = (gdcmElValue*)0;
+   guint32 StuffGroup = 0xffff;   // Group to be stuffed with additional info
+   guint32 FreeElem = 0;
+   gdcmDictEntry* NewEntry = (gdcmDictEntry*)0;
+
+   FreeElem = PubElVals.GenerateFreeTagKeyInGroup(StuffGroup);
+   if (FreeElem == UINT32_MAX) {
+      dbg.Verbose(1, "gdcmHeader::NewManualElValToPubDict",
+                     "Group 0xffff in Public Dict is full");
+      return (gdcmElValue*)0;
+   }
+   NewEntry = new gdcmDictEntry(StuffGroup, FreeElem,
+                                VR, "GDCM", NewTagName);
+   NewElVal = new gdcmElValue(NewEntry);
+   PubElVals.Add(NewElVal);
+   return NewElVal;
 }
 
 /**