📄 gdcmdocentryset.cxx
字号:
return NULL;
}
}
// Set the binEntry value
SetValEntry(value, valEntry); // The std::string value
return valEntry;
}
/**
* \brief Modifies the value of a given Header Entry (Dicom Element)
* when it exists. Create it with the given value when unexistant.
* A copy of the binArea is made to be kept in the Document.
* @param binArea (binary) value to be set
* @param lgth length of the Bin Area we want to set
* @param group Group number of the Entry
* @param elem Element number of the Entry
* @param vr V(alue) R(epresentation) of the Entry -if private Entry-
* \return pointer to the modified/created Header Entry (NULL when creation
* failed).
*/
BinEntry *DocEntrySet::InsertBinEntry(uint8_t *binArea, int lgth,
uint16_t group, uint16_t elem,
TagName const &vr )
{
BinEntry *binEntry = 0;
DocEntry *currentEntry = GetDocEntry( group, elem );
// Verify the currentEntry
if (currentEntry)
{
binEntry = dynamic_cast<BinEntry *>(currentEntry);
// Verify the VR
if ( binEntry )
if ( binEntry->GetVR()!=vr )
binEntry = NULL;
// if currentEntry doesn't correspond to the requested valEntry
if ( !binEntry)
{
if ( !RemoveEntry(currentEntry) )
{
gdcmWarningMacro( "Removal of previous DocEntry failed.");
return NULL;
}
}
}
// Create a new binEntry if necessary
if ( !binEntry)
{
binEntry = NewBinEntry(group, elem, vr);
if ( !AddEntry(binEntry) )
{
gdcmWarningMacro( "AddEntry failed although this is a creation.");
delete binEntry;
return NULL;
}
}
// Set the binEntry value
uint8_t *tmpArea;
if ( lgth>0 && binArea )
{
tmpArea = new uint8_t[lgth];
memcpy(tmpArea,binArea,lgth);
}
else
{
tmpArea = 0;
}
if ( !SetBinEntry(tmpArea,lgth,binEntry) )
{
if ( tmpArea )
{
delete[] tmpArea;
}
}
return binEntry;
}
/**
* \brief Creates a new gdcm::SeqEntry and adds it to the current DocEntrySet.
* (remove any existing entry with same group,elem)
* @param group Group number of the Entry
* @param elem Element number of the Entry
* \return pointer to the created SeqEntry (NULL when creation
* failed).
*/
SeqEntry *DocEntrySet::InsertSeqEntry(uint16_t group, uint16_t elem)
{
SeqEntry *seqEntry = 0;
DocEntry *currentEntry = GetDocEntry( group, elem );
// Verify the currentEntry
if ( currentEntry )
{
seqEntry = dynamic_cast<SeqEntry *>(currentEntry);
// Verify the VR
if ( seqEntry )
seqEntry = NULL;
// if currentEntry doesn't correspond to the requested seqEntry
if ( !seqEntry )
{
if (!RemoveEntry(currentEntry))
{
gdcmWarningMacro( "Removal of previous DocEntry failed.");
return NULL;
}
}
}
// Create a new seqEntry if necessary
if ( !seqEntry )
{
seqEntry = NewSeqEntry(group, elem);
if ( !AddEntry(seqEntry) )
{
gdcmWarningMacro( "AddEntry failed although this is a creation.");
delete seqEntry;
return NULL;
}
}
// TODO : Find a trick to insert a SequenceDelimitationItem
// in the SeqEntry, at the end.
return seqEntry;
}
/**
* \brief Checks if a given Dicom Element exists within the DocEntrySet
* @param group Group number of the searched Dicom Element
* @param elem Element number of the searched Dicom Element
* @return true is found
*/
bool DocEntrySet::CheckIfEntryExist(uint16_t group, uint16_t elem )
{
return GetDocEntry(group,elem)!=NULL;
}
/**
* \brief Build a new Val Entry from all the low level arguments.
* Check for existence of dictionary entry, and build
* a default one when absent.
* @param group Group number of the new Entry
* @param elem Element number of the new Entry
* @param vr V(alue) R(epresentation) of the new Entry
*/
ValEntry *DocEntrySet::NewValEntry(uint16_t group,uint16_t elem,
TagName const &vr)
{
DictEntry *dictEntry = GetDictEntry(group, elem, vr);
gdcmAssertMacro(dictEntry);
ValEntry *newEntry = new ValEntry(dictEntry);
if (!newEntry)
{
gdcmWarningMacro( "Failed to allocate ValEntry");
return 0;
}
return newEntry;
}
/**
* \brief Build a new Bin Entry from all the low level arguments.
* Check for existence of dictionary entry, and build
* a default one when absent.
* @param group Group number of the new Entry
* @param elem Element number of the new Entry
* @param vr V(alue) R(epresentation) of the new Entry
*/
BinEntry *DocEntrySet::NewBinEntry(uint16_t group, uint16_t elem,
TagName const &vr)
{
DictEntry *dictEntry = GetDictEntry(group, elem, vr);
gdcmAssertMacro(dictEntry);
BinEntry *newEntry = new BinEntry(dictEntry);
if (!newEntry)
{
gdcmWarningMacro( "Failed to allocate BinEntry");
return 0;
}
return newEntry;
}
/**
* \brief Build a new SeqEntry from all the low level arguments.
* Check for existence of dictionary entry, and build
* a default one when absent.
* @param group Group number of the new Entry
* @param elem Element number of the new Entry
*/
SeqEntry* DocEntrySet::NewSeqEntry(uint16_t group, uint16_t elem)
{
DictEntry *dictEntry = GetDictEntry(group, elem, "SQ");
gdcmAssertMacro(dictEntry);
SeqEntry *newEntry = new SeqEntry( dictEntry );
if (!newEntry)
{
gdcmWarningMacro( "Failed to allocate SeqEntry");
return 0;
}
return newEntry;
}
/**
* \brief Request a new virtual dict entry to the dict set
* @param group Group number of the underlying DictEntry
* @param elem Element number of the underlying DictEntry
* @param vr V(alue) R(epresentation) of the underlying DictEntry
* @param vm V(alue) M(ultiplicity) of the underlying DictEntry
* @param name english name
*/
DictEntry* DocEntrySet::NewVirtualDictEntry( uint16_t group, uint16_t elem,
TagName const &vr,
TagName const &vm,
TagName const &name )
{
return Global::GetDicts()->NewVirtualDictEntry(group,elem,vr,vm,name);
}
//-----------------------------------------------------------------------------
// Protected
/**
* \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
* shadow one(s), if any.
* @param group Group number of the searched DictEntry
* @param elem Element number of the searched DictEntry
* @return Corresponding DictEntry when it exists, NULL otherwise.
*/
DictEntry *DocEntrySet::GetDictEntry(uint16_t group,uint16_t elem)
{
DictEntry *found = 0;
Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
if (!pubDict)
{
gdcmWarningMacro( "We SHOULD have a default dictionary");
}
else
{
found = pubDict->GetEntry(group, elem);
}
return found;
}
/**
* \brief Searches [both] the public [and the shadow dictionary (when they
* exist)] for the presence of the DictEntry with given
* group and element, and create a new virtual DictEntry if necessary
* @param group group number of the searched DictEntry
* @param elem element number of the searched DictEntry
* @param vr V(alue) R(epresentation) to use, if necessary
* @return Corresponding DictEntry when it exists, NULL otherwise.
* \remarks The returned DictEntry is registered
*/
DictEntry *DocEntrySet::GetDictEntry(uint16_t group, uint16_t elem,
TagName const &vr)
{
DictEntry *dictEntry = GetDictEntry(group,elem);
DictEntry *goodEntry = dictEntry;
std::string goodVR = vr;
TagName vm;
if (elem == 0x0000)
goodVR="UL";
if ( goodEntry )
{
if ( goodVR != goodEntry->GetVR()
&& goodVR != GDCM_UNKNOWN )
{
gdcmWarningMacro("For (" << std::hex << group << "|"
<< elem << "), found VR : [" << vr << "]"
<< " expected: [" << goodEntry->GetVR() << "]" ) ;
// avoid confusing further validator with "FIXME" VM
// when possible
vm = dictEntry->GetVM();
goodEntry = NULL;
}
}
else
{
vm = "FIXME";
}
// Create a new virtual DictEntry if necessary
if (!goodEntry)
{
if (dictEntry)
{
goodEntry = NewVirtualDictEntry(group, elem, goodVR, vm,
dictEntry->GetName() );
}
else
{
goodEntry = NewVirtualDictEntry(group, elem, goodVR);
}
}
return goodEntry;
}
//-----------------------------------------------------------------------------
// Private
//-----------------------------------------------------------------------------
// Print
//-----------------------------------------------------------------------------
} // end namespace gdcm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -