]> Creatis software - gdcm.git/commitdiff
* src/gdcmHeader.cxx gdcmHeader::gdcmHeader now calls LoadElements(),
authorfrog <frog>
Mon, 24 Mar 2003 13:11:23 +0000 (13:11 +0000)
committerfrog <frog>
Mon, 24 Mar 2003 13:11:23 +0000 (13:11 +0000)
        hence the user doesn't need this explicit call.
        - gdcmPython/testSuite.py, gdcmPython/demo/*.py changed accordingly
          i.e. LoadElements() call removed.
      * src/gdcmCommon.h now defines UINT32_MAX (see stdint.h).
        - src/Makefile.am declares the proper flag for g++.
      * src/gdcmElValSet.h added gdcmElValSet::GenerateFreeTagKeyInGroup
        for adding user defined new tags.
        - src/gdcmHeader.cxx gdcmHeader::NewManualElValToPubDict added.
        - src/gdcmHeader.cxx gdcmHeader::AddAndDefaultElements now
          cleanly adds some gdcm added tags (like gdcmXSize, gdcmYSize...)

15 files changed:
ChangeLog
Doc/Dicom2003_Part5.pdf [new file with mode: 0644]
Doc/README
Testing/.cvsignore
gdcmPython/demo/explore.py
gdcmPython/demo/test.py
gdcmPython/demo/testAll.py
gdcmPython/testSuite.py
src/Makefile.am
src/gdcmCommon.h
src/gdcmElValSet.cxx
src/gdcmElValSet.h
src/gdcmElValue.h
src/gdcmHeader.cxx
src/gdcmHeader.h

index 3f42ffe6a5c9b7343592b0159ead5152d113eb9f..0cb38ea2310f30aea1b74179057a98e77d5554d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,21 @@
+2003-03-24 Eric Boix <Eric.Boix@creatis.insa-lyon.fr>
+      * src/gdcmHeader.cxx gdcmHeader::gdcmHeader now calls LoadElements(),
+        hence the user doesn't need this explicit call.
+        - gdcmPython/testSuite.py, gdcmPython/demo/*.py changed accordingly
+          i.e. LoadElements() call removed.
+      * src/gdcmCommon.h now defines UINT32_MAX (see stdint.h).
+        - src/Makefile.am declares the proper flag for g++.
+      * src/gdcmElValSet.h added gdcmElValSet::GenerateFreeTagKeyInGroup
+        for adding user defined new tags.
+        - src/gdcmHeader.cxx gdcmHeader::NewManualElValToPubDict added.
+        - src/gdcmHeader.cxx gdcmHeader::AddAndDefaultElements now
+          cleanly adds some gdcm added tags (like gdcmXSize, gdcmYSize...)
+
 2003-03-17 Fabrice Bellet <Fabrice.Bellet@creatis.insa-lyon.fr>
       * Makefile.am, acinclude.m4, configure.in, python.m4, Dicts/Makefile.am,
-       Doc/Makefile.am, Test/Makefile.am, gdcmPython/Makefile.am, 
-       src/Makefile.am : the project should properly compile and install
-       with the autotools, included the python wrappers part. 
+   Doc/Makefile.am, Test/Makefile.am, gdcmPython/Makefile.am, 
+   src/Makefile.am : the project should properly compile and install
+   with the autotools, included the python wrappers part. 
       * gdcm.spec.in : added a spec file for RPM packaging.
 
 2003-03-14 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
diff --git a/Doc/Dicom2003_Part5.pdf b/Doc/Dicom2003_Part5.pdf
new file mode 100644 (file)
index 0000000..dd32f12
Binary files /dev/null and b/Doc/Dicom2003_Part5.pdf differ
index a6c806fcdd030b1a6fd8d14cc2ea4a87f25ef611..3ebe8c8446948f64294e5556c8e102200891fd2a 100644 (file)
@@ -1,3 +1,7 @@
+The reference for parsing dicom file is the dicom standard. A locat copy
+can be found in Dicom2003_Part5.pdf. A nice starting point for browsing
+the standard can be found at http://www.dclunie.com/dicom-status/status.html.
+
 Documentation can be build with doxygen:
 doxygen Doxyfile
 mozilla html/index.html
index bd1fe827ddeed3bdbdc04b6f94b78cf398d8c20b..48ab3de9d90d3dc35dd2ad77146cc4eab8a36eae 100644 (file)
@@ -6,6 +6,8 @@ Makefile
 test
 testWrite
 hashtest
+dcm2acr
+pourFindTaggs
 bug1
 image.dcm
 image.raw
index aa92d787053a0245cf087ae631b2db5016394649..af124bb64dcf9cf3465ebb2a6cd157e551a9282b 100644 (file)
@@ -11,7 +11,6 @@ if not os.path.isfile(FileName):
    sys.exit()
 
 toRead = gdcmHeader(FileName)
-toRead.LoadElements()
 ValDict = toRead.GetPubElVal()
 ExploreElements = ["Patient Name", "Patient ID",
                                                 "Study Date", "Study Time", "Study ID",
index 653b4b8cb4e568dc4f588a524b7c373f68d41cfc..935345c1cf4fe6ef7e034ab7b47cd545b48bb15e 100644 (file)
@@ -15,7 +15,6 @@ if not os.path.isfile(FileName):
 
 ### Build the header element list
 toRead = gdcmHeader(FileName)
-toRead.LoadElements()
 
 print "##############################################################"
 print "### Display all the elements and their respective values"
index e46fda0677af64fee587a02f840561b6cb6146b6..89c045972012ce460ea15ad240628e3219cea69d 100644 (file)
@@ -30,7 +30,6 @@ if __name__ == '__main__':
                fileName = os.path.join(GDCM_DATA_PATH, file)
                print "############## file :", fileName
                toRead = gdcmHeader(fileName)
-               toRead.LoadElements()
                ValDict = toRead.GetPubElVal()
                for key in ValDict.keys():
                        print "   [%s] = [%s]" %(key, ValDict[key])
index e053d655246ad67477951869ae67c81e4acb1c9b..28edf76699a31e246ddde627b88da399119b33f1 100644 (file)
@@ -479,7 +479,6 @@ class gdcmTestCase(unittest.TestCase):
                for entry in FileSet:
                        fileName = os.path.join(GDCM_DATA_PATH, entry[0])
                        toRead = gdcmHeader(fileName)
-                       toRead.LoadElements()
                        valDict = toRead.GetPubElVal()
                        for subEntry in entry[1]:
                                element = subEntry[0]
index d610a8d6de05a89009d1ead6de430d2b844e1372..590b3e457e3651732eb6e2135926bc68ef92562b 100644 (file)
@@ -14,7 +14,8 @@ LTVERSION = 0:1:0
 
 lib_LTLIBRARIES = libgdcm.la
 
-CXXFLAGS = @CXXFLAGS@ -DPUB_DICT_PATH=\"$(datadir)/gdcm/\"
+CXXFLAGS = @CXXFLAGS@ -DPUB_DICT_PATH=\"$(datadir)/gdcm/\" \
+           -D__STDC_LIMIT_MACROS  # Refer to stdint.h
 
 libgdcm_la_SOURCES=            \
        gdcmException.cxx       \
index a86930e25d309159e5eba701b8b633421db34ac2..a93fb998583583100ee9a05c567d29b734780c0b 100644 (file)
@@ -16,6 +16,7 @@ typedef  unsigned short guint16;
 typedef  unsigned int   guint32;
 typedef  short                 gint16;
 typedef  int                   gint32;
+#define UINT32_MAX    (4294967295U)
 #endif
 
 #ifdef _MSC_VER
index a0ebec2ea53c0afe453aa1cad663abbb2e2f7c03..094974503232cc230538aa109c08c5b4ddc2fa26 100644 (file)
@@ -10,6 +10,7 @@ TagElValueHT & gdcmElValSet::GetTagHt(void) {
 }
 
 void gdcmElValSet::Add(gdcmElValue * newElValue) {
+   cout << "#### gdcmElValSet::Add" << newElValue->GetKey() << newElValue->GetName() << endl;
        tagHt [newElValue->GetKey()]  = newElValue;
        NameHt[newElValue->GetName()] = newElValue;
 }
@@ -130,6 +131,23 @@ int gdcmElValSet::SetElValueByName(string content, string TagName) {
        return(1);              
 }
 
+/**
+ * \ingroup  gdcmElValSet
+ * \brief    Generate a free TagKey i.e. a TagKey that is not present
+ *           in the TagHt dictionary. One of the potential usage is
+ *           to add  gdcm generated additional informartion to the ElValSet
+ *           (see gdcmHeader::AddAndDefaultElements).
+ * @param group The generated tag must belong to this group.  
+ * @return   The element of tag with given group which is fee.
+ */
+guint32 gdcmElValSet::GenerateFreeTagKeyInGroup(guint32 group) {
+   for (guint32 elem = 0; elem < UINT32_MAX; elem++) {
+      TagKey key = gdcmDictEntry::TranslateToKey(group, elem);
+      if (tagHt.count(key) == 0)
+         return elem;
+   }
+   return UINT32_MAX;
+}
 
 int gdcmElValSet::SetElValueLengthByNumber(guint32 l,
                                            guint32 group, guint32 element) {
index 696e8e44df039037981e0c9378557a4764761b67..c98ac24f40a8e9cd1b9287b72fc229a285915805 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.4 2003/03/21 08:52:31 jpr Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmElValSet.h,v 1.5 2003/03/24 13:11:28 frog Exp $
 
 #ifndef GDCMELVALSET_H
 #define GDCMELVALSET_H
@@ -35,6 +35,7 @@ public:
        
        int SetElValueLengthByNumber(guint32 l, guint32 group, guint32 element);
        int SetElValueLengthByName  (guint32 l, string TagName);
+   guint32 GenerateFreeTagKeyInGroup(guint32 group);
 
 };
 
index a2dd3c2c6e594cb6c8d2e540459adcb8df21144e..2e895694b0add877d9a95a66d3da68456e42c401 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmElValue.h,v 1.2 2003/03/12 21:33:20 frog Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmElValue.h,v 1.3 2003/03/24 13:11:28 frog Exp $
 
 #ifndef GDCMELVALUE_H
 #define GDCMELVALUE_H
@@ -32,6 +32,7 @@ public:
        void SetImplicitVr(void) { ImplicitVr = true; };
        bool  IsImplicitVr(void) { return ImplicitVr; };
        
+       gdcmDictEntry * GetDictEntry(void) { return entry;    };
        guint16 GetGroup(void)   { return entry->GetGroup();  };
        guint16 GetElement(void) { return entry->GetElement();};
        string  GetKey(void)     { return entry->GetKey();    };
index 0ccd21e5cdfb5fb083c5639bd46dc93b2f57b213..0d21112109206bc53eaaf150f1639e067d87be2f 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();
 }
 
@@ -1393,19 +1394,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;
 }
 
 /**
index 3e675c47310430c39e65fb7a8684f67a6407c4bf..15b27ae8f6e7d803fdee03c7920638b39fb7df83 100644 (file)
@@ -79,6 +79,7 @@ private:
    void CheckSwap(void);
    void InitVRDict(void);
    void SwitchSwapToBigEndian(void);
+   gdcmElValue*  NewManualElValToPubDict(string NewTagName, string VR);
    void AddAndDefaultElements(void);
    void SetMaxSizeLoadElementValue(long);