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-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>
+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
test
testWrite
hashtest
+dcm2acr
+pourFindTaggs
bug1
image.dcm
image.raw
sys.exit()
toRead = gdcmHeader(FileName)
-toRead.LoadElements()
ValDict = toRead.GetPubElVal()
ExploreElements = ["Patient Name", "Patient ID",
"Study Date", "Study Time", "Study ID",
### Build the header element list
toRead = gdcmHeader(FileName)
-toRead.LoadElements()
print "##############################################################"
print "### Display all the elements and their respective values"
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])
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]
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 \
typedef unsigned int guint32;
typedef short gint16;
typedef int gint32;
+#define UINT32_MAX (4294967295U)
#endif
#ifdef _MSC_VER
}
void gdcmElValSet::Add(gdcmElValue * newElValue) {
+ cout << "#### gdcmElValSet::Add" << newElValue->GetKey() << newElValue->GetName() << endl;
tagHt [newElValue->GetKey()] = newElValue;
NameHt[newElValue->GetName()] = newElValue;
}
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) {
-// $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
int SetElValueLengthByNumber(guint32 l, guint32 group, guint32 element);
int SetElValueLengthByName (guint32 l, string TagName);
+ guint32 GenerateFreeTagKeyInGroup(guint32 group);
};
-// $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
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(); };
else
dbg.Error(!fp, "gdcmHeader::gdcmHeader cannot open file", InFilename);
ParseHeader();
+ LoadElements();
AddAndDefaultElements();
}
* 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;
}
/**
void CheckSwap(void);
void InitVRDict(void);
void SwitchSwapToBigEndian(void);
+ gdcmElValue* NewManualElValToPubDict(string NewTagName, string VR);
void AddAndDefaultElements(void);
void SetMaxSizeLoadElementValue(long);