#include <creaImageIOTreeAttributeDescriptor.h>
+#include <creaImageIOSystem.h>
#include <gdcmGlobal.h>
#include <gdcmDictSet.h>
+#include <boost/algorithm/string/replace.hpp>
+
namespace creaImageIO
{
namespace tree
{
+ //========================================================================
+ void AttributeDescriptor::CleanName(std::string& str) const
+ {
+ // quote must be doubled for SQL
+ // crea::Utils::Replace( str, "'", "''" );
+ boost::algorithm::replace_all(str,"'","''");
+ // Found strange strings which contained NULL char INSIDE string
+ int i,size=str.size();
+ for (i=0;i<size;++i)
+ {
+ if (str[i]==0)
+ {
+ str = str.substr(0,i);
+ break;
+ }
+ }
+ }
+ //========================================================================
+
+ //=====================================================================
+ // Ctor with key, name and flags
+ AttributeDescriptor::AttributeDescriptor(const std::string& key,
+ const std::string& name,
+ unsigned int flags)
+ : mKey(key), mName(name), mGroup(0), mElement(0), mFlags(flags)
+ {
+
+ CleanName(mName);
+ GimmickDebugMessage(3,"AttributeDescriptor : '"<<key
+ <<"' ["<<flags<<"]"<<std::endl);
+ GimmickDebugMessage(3,"='"<<mName<<"'"<<std::endl);
+ }
+
+ //=====================================================================
- // Ctor with name and flags
- // If the name is of the form "1056|8948" (a pipe at 5th position)
- // it is interpreted as a Dicom Tag
+ //=====================================================================
+ // Ctor with dicom group, elem and flags
+ // The key is built as 'Dgroup_elem'
// The user name is retreived from dicom dictionnary
- // and the group and elem are filled
- AttributeDescriptor::AttributeDescriptor(const std::string& key,
+ AttributeDescriptor::AttributeDescriptor(unsigned short group,
+ unsigned short element,
unsigned int flags)
- : mKey(key), mGroup(0), mElement(0), mFlags(flags)
+ : mGroup(group), mElement(element), mFlags(flags)
{
- // Is the key a Dicom tag ?
- if ((key.size()==9)&&(key[4]=='|'))
+
+ //GDCM_NAME_SPACE::TagKey tag(group,element);
+ char ctag[12];
+ sprintf(ctag,"D%04x_%04x",group,element);
+ mKey = ctag;
+
+ GimmickDebugMessage(3,"AttributeDescriptor : '"<<mKey
+ <<"' ["<<flags<<"]"<<std::endl);
+
+ // Retrieve the name from gdcm dict
+ GDCM_NAME_SPACE::DictEntry* entry =
+ GDCM_NAME_SPACE::Global::GetDicts()
+ ->GetDefaultPubDict()->GetEntry(mGroup,mElement);
+
+ if (entry)
{
- // Decode group & elem
- sscanf(key.c_str(),"%04x|%04x",&mGroup,&mElement);
- // Retrieve the name from gdcm dict
- GDCM_NAME_SPACE::DictEntry* entry =
- GDCM_NAME_SPACE::Global::GetDicts()
- ->GetDefaultPubDict()->GetEntry(mGroup,mElement);
mName = entry->GetName();
+ CleanName(mName);
+ GimmickDebugMessage(3,"='"<<mName<<"'"<<std::endl);
}
else
{
- mName = mKey;
+ GimmickMessage(1,"!! WARNING : tag '"<<mKey
+ <<"' is not in DICOM dictionnary ! "
+ <<"Considering it as a user attribute"
+ << std::endl);
+ mName = "UNKNOWN";
+ mGroup = mElement = 0;
}
+
}
+ //=====================================================================
+
+
+ //=====================================================================
+ /// Extracts group and element from a key of the form "Dgroup_elem"
+ void AttributeDescriptor::GetDicomGroupElementFromKey(const std::string& key,
+ unsigned short& group,
+ unsigned short& elem)
+ {
+ group = elem = 0;
+ if ( (key.size()==10) &&
+ (key[0] == 'D') &&
+ (key[5] == '_') )
+ {
+ std::string g = key.substr(1,4);
+ sscanf(key.c_str(),"D %04x _ %04x ",&group,&elem);
+ sscanf(g.c_str(),"%04x",&group);
+ GimmickDebugMessage(3,"GetDicomGroupElementFromKey '"<<g<<"' : "
+ <<group<<"|"<<elem<<std::endl);
+ }
+ else
+ {
+ GimmickMessage(5,"GetDicomGroupElementFromKey '"<<key<<"' : "
+ <<" not a DICOM key format"<<std::endl);
+ }
+ return;
+ }
+
+ //=====================================================================
+ /// test if the type is a date
+ bool AttributeDescriptor::isDateEntry() const
+ {
+
+ bool btest = false;
+ // Retrieve the name from gdcm dict
+ GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
+ if( entry != 0)
+ {
+ if( entry->GetVR().str() == "DA" )
+ {
+ btest = true;
+ }
+ }
+ return btest;
+ }
+
+ //=====================================================================
+ /// test if the type is a time
+ bool AttributeDescriptor::isTimeEntry() const
+ {
+
+ bool btest = false;
+ // Retrieve the name from gdcm dict
+ GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
+ if( entry != 0)
+ {
+ if( entry->GetVR().str() == "TM" )
+ {
+ btest = true;
+ }
+ }
+ return btest;
+ }
+
+ //=====================================================================
+ /// Decodes the type of the attribute
+ void AttributeDescriptor::DecodeType(unsigned int& typ) const
+ {
+
+
+ // Retrieve the name from gdcm dict
+ GDCM_NAME_SPACE::DictEntry* entry =
+ GDCM_NAME_SPACE::Global::GetDicts()
+ ->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
+ if (entry==0)
+ {
+ typ = 2;
+ return;
+ }
+ std::string type = entry->GetVR().str();
+ GimmickDebugMessage(3,"VR Value is "<<type<<"!"<<std::endl);
+ if(type=="AS" ||
+ type=="DA" ||
+ type=="FL" ||
+ type=="FD" ||
+ type=="IS" ||
+ type=="SL" ||
+ type=="SS" ||
+ type=="UI" ||
+ type=="US" ||
+ type=="SH")
+ {
+ // Numerical
+ typ = 1;
+ }
+ else
+ {
+ // String
+ typ = 2;
+ }
+
+ }
+ //=====================================================================
} // EO namespace tree