//-----------------------------------------------------------------------------
/**
- * \ingroup gdcmHeaderHelper
* \brief constructor
*/
gdcmHeaderHelper::gdcmHeaderHelper() : gdcmHeader( ) {
}
/**
- * \ingroup gdcmHeaderHelper
* \brief constructor
* @param InFilename Name of the file to deal with
* @param exception_on_error
//-----------------------------------------------------------------------------
// Public
/**
- * \ingroup gdcmHeaderHelper
* \brief Returns the size (in bytes) of a single pixel of data.
* @return The size in bytes of a single pixel of data.
*
}
/**
- *\ingroup gdcmHeaderHelper
*\brief gets the info from 0008,0018 : SOP Instance UID
*\todo ? : return the ACR-NEMA element value if DICOM one is not found
* @return SOP Instance UID
// as the Z coordinate,
// 0. for all the coordinates if nothing is found
-// TODO : find a way to inform the caller nothing was found
-// TODO : How to tell the caller a wrong number of values was found?
+// \todo find a way to inform the caller nothing was found
+// \todo How to tell the caller a wrong number of values was found?
//
// ---------------------------------------------------------------
//
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* else from 0020,0030 : Image Position (RET)
* else 0.
StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images
if (StrImPos == GDCM_UNFOUND) {
dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position (RET) (0020,0030)");
- // How to tell the caller nothing was found ?
+ /// \todo How to tell the caller nothing was found ?
return 0.;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* else from 0020,0030 : Image Position (RET)
* else 0.
StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images
if (StrImPos == GDCM_UNFOUND) {
dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position (RET) (0020,0030)");
- // How to tell the caller nothing was found ?
+ /// \todo How to tell the caller nothing was found ?
return 0.;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* \ else from 0020,0030 : Image Position (RET)
* \ else from 0020,1041 : Slice Location
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0013 : Image Number
* \ else 0.
* @return image number
*/
int gdcmHeaderHelper::GetImageNumber() {
- //The function i atoi() takes the address of an area of memory as parameter and converts
- //the string stored at that location to an integer using the external decimal to internal
- //binary conversion rules. This may be preferable to sscanf() since atoi() is a much smaller,
- // simpler and faster function. sscanf() can do all possible conversions whereas atoi() can
- //only do single decimal integer conversions.
+ // The function i atoi() takes the address of an area of memory as
+ // parameter and converts the string stored at that location to an integer
+ // using the external decimal to internal binary conversion rules. This may
+ // be preferable to sscanf() since atoi() is a much smaller, simpler and
+ // faster function. sscanf() can do all possible conversions whereas
+ // atoi() can only do single decimal integer conversions.
std::string StrImNumber = GetEntryByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number
if (StrImNumber != GDCM_UNFOUND) {
return atoi( StrImNumber.c_str() );
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0008,0060 : Modality
* @return Modality Type
*/
ModalityType gdcmHeaderHelper::GetModality(void) {
- std::string StrModality = GetEntryByNumber(0x0008,0x0060); //0008 0060 CS ID Modality
+ // 0008 0060 CS ID Modality
+ std::string StrModality = GetEntryByNumber(0x0008,0x0060);
if (StrModality != GDCM_UNFOUND) {
if ( StrModality.find("AU") < StrModality.length()) return AU;
else if ( StrModality.find("AS") < StrModality.length()) return AS;
else
{
- //throw error return value ???
- // specified <> unknow in our database
+ /// \todo throw error return value ???
+ /// specified <> unknow in our database
return Unknow;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0037 : Image Orientation Patient
* @param iop adress of the (6)float aray to receive values
* @return cosines of image orientation patient
//iop is supposed to be float[6]
iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0;
- std::string StrImOriPat = GetEntryByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient)
+ // 0020 0037 DS REL Image Orientation (Patient)
+ std::string StrImOriPat = GetEntryByNumber(0x0020,0x0037);
if (StrImOriPat != GDCM_UNFOUND) {
if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f",
&iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) {
}
//For ACR-NEMA
- StrImOriPat = GetEntryByNumber(0x0020,0x0035); //0020 0035 DS REL Image Orientation (RET)
+ // 0020 0035 DS REL Image Orientation (RET)
+ StrImOriPat = GetEntryByNumber(0x0020,0x0035);
if (StrImOriPat != GDCM_UNFOUND) {
if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f",
&iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) {
-//-----------------------------------------------------------------------------
-// gdcmSerieHeaderHelper
//-----------------------------------------------------------------------------
// Constructor / Destructor
gdcmSerieHeaderHelper::~gdcmSerieHeaderHelper(){
- //! \todo
+ /// \todo
for (std::list<gdcmHeaderHelper*>::iterator it = CoherentGdcmFileList.begin();
it != CoherentGdcmFileList.end(); it++)
{
//-----------------------------------------------------------------------------
// Public
/**
- * \ingroup gdcmHeaderHelper
* \brief add a gdcmFile to the list based on file name
* @param filename Name of the file to deal with
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief add a gdcmFile to the list
* @param file gdcmHeaderHelper to add
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Sets the Directory
* @param dir Name of the directory to deal with
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Sorts the File List
* \warning This could be implemented in a 'Strategy Pattern' approach
* But as I don't know how to do it, I leave it this way
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Gets the *coherent* File List
* @return the *coherent* File List
*/
// Refer to gdcmParser::SetMaxSizeLoadEntry()
const unsigned int gdcmParser::MAX_SIZE_LOAD_ELEMENT_VALUE = 4096;
-// Refer to gdcmParser::SetMaxSizePrintEntry()
-// TODO : Right now, better see "define, in gdcmHederEntry.cxx
const unsigned int gdcmParser::MAX_SIZE_PRINT_ELEMENT_VALUE = 64;
//-----------------------------------------------------------------------------
}
/**
- * \ingroup gdcmParser
* \brief constructor
* @param exception_on_error
*/
}
/**
- * \ingroup gdcmParser
* \brief Canonical destructor.
*/
gdcmParser::~gdcmParser (void) {
//-----------------------------------------------------------------------------
// Print
/**
- * \ingroup gdcmParser
* \brief Prints the Header Entries (Dicom Elements)
* from the chained list
* @return
}
/**
- * \ingroup gdcmParser
* \brief Determines if the Transfer Syntax was already encountered
* and if it corresponds to a ExplicitVRLittleEndian one.
* @return True when ExplicitVRLittleEndian found. False in all other cases.
* \return Always true.
*/
bool gdcmParser::Write(FILE *fp, FileType type) {
-// ==============
-// TODO The stuff will have to be rewritten using the SeQuence based
-// tree-like stucture instead of the chained list .
-// (so we shall remove the GroupHT from the gdcmParser)
-// To be checked
-// =============
-
- // TODO : move the following lines (and a lot of others, to be written)
- // to a future function CheckAndCorrectHeader
+/// \todo
+/// ==============
+/// The stuff will have to be rewritten using the SeQuence based
+/// tree-like stucture instead of the chained list .
+/// (so we shall remove the GroupHT from the gdcmParser)
+/// To be checked
+/// =============
+
+ /// \todo move the following lines (and a lot of others, to be written)
+ /// to a future function CheckAndCorrectHeader
- // Question :
- // Comment pourrait-on savoir si le DcmHeader vient d'un fichier
- // DicomV3 ou non (FileType est un champ de gdcmParser ...)
- // WARNING : Si on veut ecrire du DICOM V3 a partir d'un DcmHeader ACR-NEMA
- // no way
- // a moins de se livrer a un tres complique ajout des champs manquants.
- // faire un CheckAndCorrectHeader (?)
+ /// \todo
+ /// Question :
+ /// Comment pourrait-on savoir si le DcmHeader vient d'un fichier
+ /// DicomV3 ou non (FileType est un champ de gdcmParser ...)
+ /// WARNING : Si on veut ecrire du DICOM V3 a partir d'un DcmHeader ACR-NEMA
+ /// no way
+ /// a moins de se livrer a un tres complique ajout des champs manquants.
+ /// faire un CheckAndCorrectHeader (?)
if (type == ImplicitVR)
{
std::string implicitVRTransfertSyntax = UI1_2_840_10008_1_2;
ReplaceOrCreateByNumber(implicitVRTransfertSyntax,0x0002, 0x0010);
- //FIXME Refer to standards on page 21, chapter 6.2 "Value representation":
- // values with a VR of UI shall be padded with a single trailing null
- // Dans le cas suivant on doit pader manuellement avec un 0
+ /// \todo Refer to standards on page 21, chapter 6.2
+ /// "Value representation": values with a VR of UI shall be
+ /// padded with a single trailing null
+ /// Dans le cas suivant on doit pader manuellement avec un 0
SetEntryLengthByNumber(18, 0x0002, 0x0010);
}
std::string explicitVRTransfertSyntax = UI1_2_840_10008_1_2_1;
ReplaceOrCreateByNumber(explicitVRTransfertSyntax,0x0002, 0x0010);
- //FIXME Refer to standards on page 21, chapter 6.2 "Value representation":
- // values with a VR of UI shall be padded with a single trailing null
- // Dans le cas suivant on doit pader manuellement avec un 0
+ /// \todo Refer to standards on page 21, chapter 6.2
+ /// "Value representation": values with a VR of UI shall be
+ /// padded with a single trailing null
+ /// Dans le cas suivant on doit pader manuellement avec un 0
SetEntryLengthByNumber(20, 0x0002, 0x0010);
}
-/* TODO : rewrite later, if really usefull
-
---> Warning : un-updated odd groups lengths can causes pb
---> (xmedcon breaks)
---> to be re- written with future org.
-
- if ( (type == ImplicitVR) || (type == ExplicitVR) )
- UpdateGroupLength(false,type);
- if ( type == ACR)
- UpdateGroupLength(true,ACR);
-*/
+/**
+ * \todo rewrite later, if really usefull
+ *
+ * --> Warning : un-updated odd groups lengths can causes pb
+ * --> (xmedcon breaks)
+ * --> to be re- written with future org.
+ *
+ * if ( (type == ImplicitVR) || (type == ExplicitVR) )
+ * UpdateGroupLength(false,type);
+ * if ( type == ACR)
+ * UpdateGroupLength(true,ACR);
+ */
WriteEntries(fp,type);
return(true);
}
/**
- * \ingroup gdcmParser
* \brief Searches within Header Entries (Dicom Elements) parsed with
* the public and private dictionaries
* for the element value of a given tag.
}
/**
- * \ingroup gdcmParser
* \brief Searches within Header Entries (Dicom Elements) parsed with
* the public and private dictionaries
* for the element value representation of a given tag.
/**
- * \ingroup gdcmParser
* \brief Searches within Header Entries (Dicom Elements) parsed with
* the public and private dictionaries
* for the element value representation of a given tag.
}
/**
- * \ingroup gdcmParser
* \brief Searches within Header Entries (Dicom Elements) parsed with
* the public and private dictionaries
* for the element value representation of a given tag..
}
/**
- * \ingroup gdcmParser
* \brief Searches within Header Entries (Dicom Elements) parsed with
* the public and private dictionaries
* for the value length of a given tag..
return elem->GetLength();
}
/**
- * \ingroup gdcmParser
* \brief Sets the value (string) of the Header Entry (Dicom Element)
* @param content string value of the Dicom Element
* @param tagName name of the searched Dicom Element.
}
/**
- * \ingroup gdcmParser
* \brief Accesses an existing gdcmHeaderEntry (i.e. a Dicom Element)
* through it's (group, element) and modifies it's content with
* the given value.
}
/**
- * \ingroup gdcmParser
* \brief Accesses an existing gdcmHeaderEntry (i.e. a Dicom Element)
* in the PubHeaderEntrySet of this instance
* through it's (group, element) and modifies it's length with
}
/**
- * \ingroup gdcmParser
* \brief Gets (from Header) the offset of a 'non string' element value
* (LoadElementValues has already be executed)
* @param Group group of the Entry
}
/**
- * \ingroup gdcmParser
* \brief Gets (from Header) a 'non string' element value
* (LoadElementValues has already be executed)
* @param Group group of the Entry
return NULL;
SetEntryVoidAreaByNumber(a, Group, Elem);
- // TODO check the result
+ /// \todo check the result
size_t l2 = fread(a, 1, l ,fp);
if(l != l2)
{
}
/**
- * \ingroup gdcmParser
* \brief Sets a 'non string' value to a given Dicom Element
* @param area
* @param group Group number of the searched Dicom Element
}
/**
- * \ingroup gdcmParser
* \brief Update the entries with the shadow dictionary.
* Only non even entries are analyzed
*/
}
/**
- * \ingroup gdcmParser
* \brief Searches within the Header Entries for a Dicom Element of
* a given tag.
* @param tagName name of the searched Dicom Element.
}
/**
- * \ingroup gdcmParser
* \brief retrieves a Dicom Element (the first one) using (group, element)
* \warning (group, element) IS NOT an identifier inside the Dicom Header
* if you think it's NOT UNIQUE, check the count number
}
/**
- * \ingroup gdcmParser
* \brief retrieves the Dicom Elements (all of them) using (group, element)
* @param group Group number of the searched Dicom Element.
* @param element Element number of the searched Dicom Element.
}
/**
- * \ingroup gdcmParser
* \brief Loads the element while preserving the current
* underlying file position indicator as opposed to
* to LoadHeaderEntry that modifies it.
bool gdcmParser::WriteEntries(FILE *_fp,FileType type)
{
- // TODO (?) check write failures (after *each* fwrite)
+ /// \todo (?) check write failures (after *each* fwrite)
for (ListTag::iterator tag2=listEntries.begin();
tag2 != listEntries.end();
}
/**
- * \ingroup gdcmParser
* \brief writes on disc according to the requested format
* (ACR-NEMA, ExplicitVR, ImplicitVR) the image,
* using only the last synonym of each mutimap H Table post.
}
/**
- * \ingroup gdcmParser
* \brief Swaps back the bytes of 4-byte long integer accordingly to
* processor order.
* @return The properly swaped 32 bits integer.
}
/**
- * \ingroup gdcmParser
* \brief Unswaps back the bytes of 4-byte long integer accordingly to
* processor order.
* @return The properly unswaped 32 bits integer.
}
/**
- * \ingroup gdcmParser
* \brief Swaps the bytes so they agree with the processor order
* @return The properly swaped 16 bits integer.
*/
}
/**
- * \ingroup gdcmParser
* \brief Unswaps the bytes so they agree with the processor order
* @return The properly unswaped 16 bits integer.
*/
//-----------------------------------------------------------------------------
// Private
/**
- * \ingroup gdcmParser
* \brief Parses the header of the file and load element values.
* @return false if file is not ACR-NEMA / PAPYRUS / DICOM
*/
}
/**
- * \ingroup gdcmParser
* \brief Loads the element content if its length doesn't exceed
* the value specified with gdcmParser::SetMaxSizeLoadEntry()
* @param Entry Header Entry (Dicom Element) to be dealt with
}
/**
- * \ingroup gdcmParser
* \brief add a new Dicom Element pointer to
* the H Table and at the end of the chained List
* \warning push_bash in listEntries ONLY during ParseHeader
}
/**
- * \ingroup gdcmParser
* \brief Find the value Length of the passed Header Entry
* @param Entry Header Entry whose length of the value shall be loaded.
*/
}
/**
- * \ingroup gdcmParser
* \brief Find the Value Representation of the current Dicom Element.
* @param Entry
*/
}
/**
- * \ingroup gdcmParser
* \brief Check the correspondance between the VR of the header entry
* and the taken VR. If they are different, the header entry is
* updated with the new VR.
}
/**
- * \ingroup gdcmParser
* \brief Get the transformed value of the header entry. The VR value
* is used to define the transformation to operate on the value
* \warning NOT end user intended method !
}
/**
- * \ingroup gdcmParser
* \brief Get the reverse transformed value of the header entry. The VR
* value is used to define the reverse transformation to operate on
* the value
}
/**
- * \ingroup gdcmParser
* \brief Skip a given Header Entry
* \warning NOT end user intended method !
* @param entry
}
/**
- * \ingroup gdcmParser
* \brief When the length of an element value is obviously wrong (because
* the parser went Jabberwocky) one can hope improving things by
* applying this heuristic.
}
/**
- * \ingroup gdcmParser
* \brief Apply some heuristics to predict whether the considered
* element value contains/represents an integer or not.
* @param Entry The element value on which to apply the predicate.
return false;
}
/**
- * \ingroup gdcmParser
* \brief Find the Length till the next sequence delimiter
* \warning NOT end user intended method !
* @return
}
/**
- * \ingroup gdcmParser
* \brief Reads a supposed to be 16 Bits integer
* (swaps it depending on processor endianity)
* @return read value
}
/**
- * \ingroup gdcmParser
* \brief Reads a supposed to be 32 Bits integer
* (swaps it depending on processor endianity)
* @return read value
}
/**
- * \ingroup gdcmParser
* \brief skips bytes inside the source file
* \warning NOT end user intended method !
* @return
}
/**
- * \ingroup gdcmParser
* \brief Loads all the needed Dictionaries
* \warning NOT end user intended method !
*/
}
/**
- * \ingroup gdcmParser
* \brief Discover what the swap code is (among little endian, big endian,
* bad little endian, bad big endian).
* sw is set
}
/**
- * \ingroup gdcmParser
* \brief Restore the unproperly loaded values i.e. the group, the element
* and the dictionary entry depending on them.
*/
}
/**
- * \ingroup gdcmParser
* \brief during parsing, Header Elements too long are not loaded in memory
* @param NewSize
*/
/**
- * \ingroup gdcmParser
* \brief Header Elements too long will not be printed
- * \warning
- * \todo : not yet usable
- * (see MAX_SIZE_PRINT_ELEMENT_VALUE
- * in gdcmHeaderEntry gdcmLoadEntry)
- *
+ * \todo See comments of \ref gdcmParser::MAX_SIZE_PRINT_ELEMENT_VALUE
* @param NewSize
*/
void gdcmParser::SetMaxSizePrintEntry(long NewSize)
}
/**
- * \ingroup gdcmParser
* \brief Searches both the public and the shadow dictionary (when they
* exist) for the presence of the DictEntry with given name.
* The public dictionary has precedence on the shadow one.
}
/**
- * \ingroup gdcmParser
* \brief Searches both the public and the shadow dictionary (when they
* exist) for the presence of the DictEntry with given
* group and element. The public dictionary has precedence on the
}
/**
- * \ingroup gdcmParser
* \brief Read the next tag but WITHOUT loading it's value
* @return On succes the newly created HeaderEntry, NULL on failure.
*/
}
/**
- * \ingroup gdcmParser
* \brief Build a new Element Value from all the low level arguments.
* Check for existence of dictionary entry, and build
* a default one when absent.
}
/**
- * \ingroup gdcmParser
* \brief Request a new virtual dict entry to the dict set
* @param group group of the underlying DictEntry
* @param element element of the underlying DictEntry
}
/**
- * \ingroup gdcmParser
* \brief Build a new Element Value from all the low level arguments.
* Check for existence of dictionary entry, and build
* a default one when absent.
return NewEntry;
}
-// Never used; commented out, waiting for removal.
+/// \todo Never used; commented out, waiting for removal.
/**
- * \ingroup gdcmParser
* \brief Small utility function that creates a new manually crafted
* (as opposed as read from the file) gdcmHeaderEntry with user
* specified name and adds it to the public tag hash table.
//}
/**
- * \ingroup gdcmParser
* \brief Generate a free TagKey i.e. a TagKey that is not present
* in the TagHt dictionary.
* @param group The generated tag must belong to this group.