
-- DICOM Data Dictionary

The dcmdata library uses a loadable data dictionary.  The data dictionary
is loaded within a C++ constructor (prior to main) into the global
DcmDataDictionary class instance called dcmDataDict.  This approach has the
advantage that application programs need not be recompiled if additions or
corrections are made to the data dictionary.

By default (on a Posix system) the global data dictionary will attempt to
load the file /usr/local/share/dcmtk/dicom.dic (or an alternative default
data dictionary file specified as DCM_DICT_DEFAULT_PATH in file
config/include/dcmtk/config/cfunix.h, which is created by autoconf during
the execution of the configure script).

The default behaviour can be overridden by defining an environment
variable DCMDICTPATH to contain the file system path to an alternative
data dictionary.  Thus the Unix csh command:
	setenv DCMDICTPATH $HOME/dicom.dic
would cause all applications using the dcmdata library to load the data
dictionary dicom.dic from the users home directory.

The DCMDICTPATH environment variable can contain several data dictionaries
separated by colons (":") on Unix systems.  Thus the csh command:
	setenv DCMDICTPATH /usr/local/share/dcmtk/dicom.dic:$HOME/dicom.dic
would cause all applications using the dcmdata library to first load the
default data dictionary and subsequently load the data dictionary dicom.dic
from the users home directory.  On Windows systems, a semicolon (";") is
used as a separator.

Data dictionary entries loaded later in the load sequence override entries
loaded earlier.

Application programs should check that a data dictionary has been loaded
before using the functionality of the dcmdata library.  The absence of
a data dictionary is likely to cause unexpected behaviour (e.g. unknown
attributes will be encoded using VR=OB).

An example DICOM data dictionary can be found in dcmdata/data/dicom.dic
It should be copied to the default data dictionary location (as defined in
config/include/dcmtk/config/cfunix.h).  The format of the data dictionary
file is described in the example.

The example data dictionary is relatively complete and includes all
standard DICOM tags (see the header of the file, where the implemented
version of the standard plus all supplements and CPs are listed), obsolete
ACR/NEMA version 2 tags, obsolete SPI tags, and the tags used by Papyrus
version 3.  An early version of this data dictionary was based on a data
dictionary put together by David Clunie.

-- Tag names for use in applications

The include file dcmdata/include/dcmtk/dcmdata/dcdeftag.h can be generated
from a data dictionary by the program mkdeftag.  The include file defines
tag names for use in application programs.  The names are generated from
the names specified in the data dictionary.  Duplicate names in the data
dictionary will result in compiler warnings due to duplicate #define's
when compiling code which includes the dcdeftag.h header file.  Thus, when
adding new entries to the data dictionary, care should be taken to ensure
that attribute names are not duplicated for distinct tags.
The dcmdata library makefile (dcmdata/libsrc/Makefile.in) includes a target
(gendeftag) which generates the dcmdata/include/dcmtk/dcmdata/dcdeftag.h
header file.  The header file should be regenerated whenever additions or
name modifications are made to the data dictionary.  Care should be taken
before modifying any tag names since existing application programs may
already use the old name and might subsequently fail to compile.

-- Using a built-in data dictionary

By default the data dictionary is loaded from a text file as described
above.  However, it is possible to use a built-in data dictionary and
avoid loading the text file at each application start.  You can even have
the best of both worlds and have the main data dictionary built-in with
additions loaded from text files (via the DCMDICTPATH environment variable).

The default built-in data dictionary code (dcmdata/libsrc/dcdictbi.cc)
currently does nothing.  The code for a useful built-in data dictionary can
be regenerated at any time by the mkdictbi program (dcmdata/libsrc/mkdictbi)
and the dcmdata library makefile (dcmdata/libsrc/Makefile.in) includes a
target (builtindict) for this purpose.  The makefile also includes a target
(nobuiltindict) to reset back to an empty built-in data dictionary.  By
making the built-in data dictionary, rebuilding the libdcmdata.a library
and relinking all your applications will ensure that the built-in data
dictionary is used.

Also included in the sources is a pre-created built-in data dictionary
which can be used instead (dcmdata/libsrc/dcdictzz.cc).  For example, the
project files for the Windows platform use this file instead of the default
(empty) built-in data dictionary.  Under Unix environments it should also
be possible to selectively use a built-in data dictionary for specific
applications by including dcdictzz.o earlier in the link path than
libdcmdata.a (if your linker allows this).

NOTE: Using a built-in data dictionary together with a default data
dictionary installed (e.g. in /usr/local/share/dcmtk/dicom.dic) will actually
make your programs start up slower.  The data dictionary will be loaded
twice.  Once from the built-in version and again from file.  The same is
true of the DCMDICTPATH environment variable.  However, this can be a
useful technique if you want to override built-in data dictionary values.

------------

OFFIS e.V., Oldenburg, Germany

Last revised: 2010-10-14 (Riesmeier).
