Program: gdcm
Module: $RCSfile: gdcmSQItem.cxx,v $
Language: C++
- Date: $Date: 2004/06/19 23:51:04 $
- Version: $Revision: 1.10 $
+ Date: $Date: 2004/07/17 22:47:01 $
+ Version: $Revision: 1.21 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmBinEntry.h"
#include "gdcmGlobal.h"
#include "gdcmUtil.h"
+
#include "gdcmDebug.h"
+
//-----------------------------------------------------------------------------
// Constructor / Destructor
/**
void gdcmSQItem::Print(std::ostream & os) {
std::ostringstream s;
- if (SQDepthLevel>0) {
+ if (SQDepthLevel>0)
+ {
for (int i=0;i<SQDepthLevel;i++)
s << " | " ;
}
- std::cout << s.str() << "SQItemNumber " << SQItemNumber << std::endl;
+ std::cout << s.str() << " --- SQItem number " << SQItemNumber << std::endl;
+ for (ListDocEntry::iterator i = docEntries.begin();
+ i != docEntries.end();
+ ++i)
+ {
+ gdcmDocEntry* Entry = *i;
+ bool PrintEndLine = true;
+
+ os << s.str();
+ Entry->SetPrintLevel(2);
+ Entry->Print(os);
+ if ( gdcmSeqEntry* SeqEntry = dynamic_cast<gdcmSeqEntry*>(Entry) )
+ {
+ (void)SeqEntry; //not used
+ PrintEndLine = false;
+ }
+ if (PrintEndLine)
+ os << std::endl;
+ }
+}
+
+/*
+ * \ingroup gdcmSQItem
+ * \brief canonical Writer
+ */
+void gdcmSQItem::Write(FILE *fp,FileType filetype)
+{
for (ListDocEntry::iterator i = docEntries.begin();
i != docEntries.end();
++i)
{
- os << s.str();
- //(*i)->SetPrintLevel(printLevel); //self->GetPrintLevel() ?
- (*i)->SetPrintLevel(2);
- (*i)->Print(os);
+ // Item Delimitor Item IS the last one of a 'no length' SQItem
+ // (when it exists) we don't write it right now
+ // It will be written outside, because ALL the SQItems are written
+ // as 'no length'
+ if ( (*i)->isItemDelimitor() )
+ break;
+
+ // Fix in order to make some MR PHILIPS images e-film readable
+ // see gdcmData/gdcm-MR-PHILIPS-16-Multi-Seq.dcm:
+ // we just *always* ignore spurious fffe|0000 tag !
+ if ( ((*i)->GetGroup() == 0xfffe) && ((*i)->GetElement() == 0x0000) )
+ break;
+
+ // It's up to the gdcmDocEntry Writter to write the SQItem begin element
+ // (fffe|e000) as a 'no length' one
+ (*i)->Write(fp, filetype);
}
}
* \warning we suppose, right now, the element belongs to a Public Group
* (NOT a shadow one)
* @param val string value to set
- * @param group Group of the searched tag.
- * @param element Element of the searched tag.
+ * @param group Group number of the searched tag.
+ * @param element Element number of the searched tag.
* @return true if element was found or created successfully
*/
-bool gdcmSQItem::SetEntryByNumber(std::string val,guint16 group,
- guint16 element)
+
+bool gdcmSQItem::SetEntryByNumber(std::string val,uint16_t group,
+ uint16_t element)
{
for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i)
{
if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0xe000 )
continue;
+
if ( ( group < (*i)->GetGroup() )
||( group == (*i)->GetGroup() && element < (*i)->GetElement()) )
{
// instead of ReplaceOrCreateByNumber
// that is a method of gdcmDocument :-(
gdcmValEntry* Entry = (gdcmValEntry*)0;
- TagKey key = gdcmDictEntry::TranslateToKey(group, element);
+ gdcmTagKey key = gdcmDictEntry::TranslateToKey(group, element);
+
if ( ! ptagHT->count(key))
{
// we assume a Public Dictionnary *is* loaded
Entry->SetLength(val.length());
docEntries.insert(i,Entry);
return true;
- }
+ }
if (group == (*i)->GetGroup() && element == (*i)->GetElement() )
{
if ( gdcmValEntry* Entry = dynamic_cast<gdcmValEntry*>(*i) )
return true;
}
}
+ return false;
}
//-----------------------------------------------------------------------------
// Protected
-//-----------------------------------------------------------------------------
-// Private
-
-// end-user intended : the guy *wants* to create his own SeQuence ?!?
-
-/// \brief to be written if really usefull
-gdcmDocEntry *gdcmSQItem::NewDocEntryByNumber(guint16 group,
- guint16 element) {
-/// \todo TODO
- gdcmDocEntry *a;
- std::cout << " gdcmSQItem::NewDocEntryByNumber : TODO" <<std::endl;
- return a;
-}
-
-/// \brief to be written if really usefull
-gdcmDocEntry *gdcmSQItem::NewDocEntryByName (std::string Name) {
-/// \todo TODO
- gdcmDocEntry *a;
- std::cout << " gdcmSQItem::NewDocEntryByName : TODO" <<std::endl;
- return a;
-}
-
-/**
- * \brief Gets a Dicom Element inside a SQ Item Entry, by name
- * @return
- */
- gdcmDocEntry *gdcmSQItem::GetDocEntryByName(std::string name) {
- gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict();
- gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name);
- if( dictEntry == NULL)
- return NULL;
- return GetDocEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement());
-}
/**
- * \ingroup gdcmSQItem
* \brief Gets a Dicom Element inside a SQ Item Entry, by number
* @return
*/
-gdcmDocEntry *gdcmSQItem::GetDocEntryByNumber(guint16 group, guint16 element) {
- for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i) {
+gdcmDocEntry *gdcmSQItem::GetDocEntryByNumber(uint16_t group, uint16_t element)
+{
+ for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i)
+ {
if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
+ {
return (*i);
+ }
}
- return NULL;
+ return NULL;
}
/**
- * \ingroup gdcmSQItem
* \brief Get the value of a Dicom Element inside a SQ Item Entry, by number
* @return
*/
-std::string gdcmSQItem::GetEntryByNumber(guint16 group, guint16 element) {
- for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i) {
- if ( (*i)->GetGroup()==group && (*i)->GetElement()==element) {
+std::string gdcmSQItem::GetEntryByNumber(uint16_t group, uint16_t element)
+{
+ for(ListDocEntry::iterator i=docEntries.begin();i!=docEntries.end();++i)
+ {
+ if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
+ {
return ((gdcmValEntry *)(*i))->GetValue();
}
}
return GDCM_UNFOUND;
}
+//-----------------------------------------------------------------------------
+// Private
-/**
- * \ingroup gdcmSQItem
- * \brief Get the value of a Dicom Element inside a SQ Item Entry, by name
- * @param name : name of the searched element.
- * @return
- */
-
-std::string gdcmSQItem::GetEntryByName(TagName name) {
- gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict();
- gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name);
-
- if( dictEntry == NULL)
- return GDCM_UNFOUND;
- return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement());
-}
//-----------------------------------------------------------------------------