Program: gdcm
Module: $RCSfile: gdcmElementSet.cxx,v $
Language: C++
- Date: $Date: 2005/10/24 16:00:47 $
- Version: $Revision: 1.67 $
+ Date: $Date: 2007/08/29 15:30:49 $
+ Version: $Revision: 1.78 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmSeqEntry.h"
#include "gdcmDataEntry.h"
-namespace gdcm
+namespace GDCM_NAME_SPACE
{
//-----------------------------------------------------------------------------
// Constructor / Destructor
* \brief Writes the Header Entries (Dicom Elements)
* from the H Table
* @param fp ofstream to write to
- * @param filetype filetype
+ * @param filetype ExplicitVR/ImplicitVR/ACR/ACR_LIBIDO/JPEG/JPEG2000/...
*/
-void ElementSet::WriteContent(std::ofstream *fp, FileType filetype)
+void ElementSet::WriteContent(std::ofstream *fp, FileType filetype, bool dummy, bool dummy2)
{
+ bool insideMetaElements = false;
+ bool yetOutsideMetaElements = false;
+ int countSQ =0;
+
for (TagDocEntryHT::const_iterator i = TagHT.begin();
i != TagHT.end();
++i)
{
- i->second->WriteContent(fp, filetype);
+ int group = (i->second)->GetGroup();
+
+ if (yetOutsideMetaElements==false && group == 0x0002)
+ insideMetaElements = true;
+
+ if (insideMetaElements == true && group != 0x0002)
+ {
+ yetOutsideMetaElements = true;
+ insideMetaElements = false;
+ }
+
+ // depending on the gdcm::Document type
+ // (gdcm::File; gdcm::DicomDir, (more to come ?)
+ // some groups *cannot* be present.
+ // We hereby protect gdcm for writting stupid things
+ // if they were found in the original document.
+ if ( !MayIWrite( group ) )
+ continue;
+
+ // Skip 'Group Length' element, since it may be wrong.
+ // except for Group 0x0002
+ // ( keep it as well for Group 0x0008 of ACR Files,
+ // since some ACR readers *need* it )
+
+ if ( (i->second)->GetElement() != 0x0000
+ ||
+ ( (i->second)->GetGroup() == 0x0002
+ ||( (filetype == ACR || filetype == ACR_LIBIDO ) && (i->second)->GetGroup() == 0x0008 ) )
+ )
+ {
+ // There are DocEntries, written recursively
+ // false : we are outside any Sequence
+ i->second->WriteContent(fp, filetype, insideMetaElements, false );
+ }
}
}
return NULL;
}
+/**
+ * \brief Copies all the attributes from an other DocEntrySet
+ * @param set entry to copy from
+ * @remarks The contained DocEntries a not copied, only referenced
+ */
+void ElementSet::Copy(DocEntrySet *set)
+{
+ // Remove all previous entries
+ ClearEntry();
+
+ DocEntrySet::Copy(set);
+
+ ElementSet *eltSet = dynamic_cast<ElementSet *>(set);
+ if( eltSet )
+ {
+ TagHT = eltSet->TagHT;
+ for(ItTagHT = TagHT.begin();ItTagHT != TagHT.end();++ItTagHT)
+ {
+ (ItTagHT->second)->Register();
+ }
+ }
+}
+
+/**
+ * \brief Checks whether *all* the DataEntries of the group have all
+ * the same type for VR (ImplicitVR or ExplicitVR)
+ * @param group group number to be checked
+ * @return 1:ImplicitVR 2:ExplicitVR -1:NotCoherent
+ */
+int ElementSet::IsVRCoherent( uint16_t group )
+{
+ uint16_t currentGroup;
+ int codeVR = -1;
+ int currentCodeVR;
+ for(TagDocEntryHT::iterator cc = TagHT.begin();cc != TagHT.end(); ++cc)
+ {
+ currentGroup = cc->second->GetGroup();
+
+ if ( currentGroup < group )
+ continue;
+ if ( currentGroup > group )
+ break;
+ // currentGroup == group
+ if (codeVR == -1)
+ {
+ if (cc->second->IsImplicitVR() )
+ codeVR = 1;
+ else
+ codeVR = 2;
+ continue;
+ }
+ else
+ {
+ if (cc->second->IsImplicitVR() )
+ currentCodeVR = 1; //Implicit
+ else
+ currentCodeVR = 2; // Explicit
+
+ if ( currentCodeVR == codeVR )
+ continue;
+ else
+ return -1; // -1 : not coherent
+ }
+ }
+ return codeVR;
+}
+
+
//-----------------------------------------------------------------------------
// Protected
entry->SetPrintLevel(PrintLevel);
entry->Print(os);
- if ( dynamic_cast<SeqEntry *>(entry) )
+ if ( dynamic_cast<SeqEntry*>(entry) )
{
// Avoid the newline for a sequence:
continue;