From: frog Date: Mon, 24 Mar 2003 13:11:23 +0000 (+0000) Subject: * src/gdcmHeader.cxx gdcmHeader::gdcmHeader now calls LoadElements(), X-Git-Tag: April2003~9 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=153db29d779f82893684c6aac08b0a565dd84334;p=gdcm.git * 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...) --- diff --git a/ChangeLog b/ChangeLog index 3f42ffe6..0cb38ea2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,21 @@ +2003-03-24 Eric Boix + * 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 * 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 diff --git a/Doc/Dicom2003_Part5.pdf b/Doc/Dicom2003_Part5.pdf new file mode 100644 index 00000000..dd32f124 Binary files /dev/null and b/Doc/Dicom2003_Part5.pdf differ diff --git a/Doc/README b/Doc/README index a6c806fc..3ebe8c84 100644 --- a/Doc/README +++ b/Doc/README @@ -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 diff --git a/Testing/.cvsignore b/Testing/.cvsignore index bd1fe827..48ab3de9 100644 --- a/Testing/.cvsignore +++ b/Testing/.cvsignore @@ -6,6 +6,8 @@ Makefile test testWrite hashtest +dcm2acr +pourFindTaggs bug1 image.dcm image.raw diff --git a/gdcmPython/demo/explore.py b/gdcmPython/demo/explore.py index aa92d787..af124bb6 100644 --- a/gdcmPython/demo/explore.py +++ b/gdcmPython/demo/explore.py @@ -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", diff --git a/gdcmPython/demo/test.py b/gdcmPython/demo/test.py index 653b4b8c..935345c1 100644 --- a/gdcmPython/demo/test.py +++ b/gdcmPython/demo/test.py @@ -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" diff --git a/gdcmPython/demo/testAll.py b/gdcmPython/demo/testAll.py index e46fda06..89c04597 100644 --- a/gdcmPython/demo/testAll.py +++ b/gdcmPython/demo/testAll.py @@ -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]) diff --git a/gdcmPython/testSuite.py b/gdcmPython/testSuite.py index e053d655..28edf766 100644 --- a/gdcmPython/testSuite.py +++ b/gdcmPython/testSuite.py @@ -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] diff --git a/src/Makefile.am b/src/Makefile.am index d610a8d6..590b3e45 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/gdcmCommon.h b/src/gdcmCommon.h index a86930e2..a93fb998 100644 --- a/src/gdcmCommon.h +++ b/src/gdcmCommon.h @@ -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 diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index a0ebec2e..09497450 100644 --- a/src/gdcmElValSet.cxx +++ b/src/gdcmElValSet.cxx @@ -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) { diff --git a/src/gdcmElValSet.h b/src/gdcmElValSet.h index 696e8e44..c98ac24f 100644 --- a/src/gdcmElValSet.h +++ b/src/gdcmElValSet.h @@ -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); }; diff --git a/src/gdcmElValue.h b/src/gdcmElValue.h index a2dd3c2c..2e895694 100644 --- a/src/gdcmElValue.h +++ b/src/gdcmElValue.h @@ -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(); }; diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 0ccd21e5..0d211121 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -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; } /** diff --git a/src/gdcmHeader.h b/src/gdcmHeader.h index 3e675c47..15b27ae8 100644 --- a/src/gdcmHeader.h +++ b/src/gdcmHeader.h @@ -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);