#include "gdcmUtil.h"
#include <string>
+#include <algorithm>
#include <sys/types.h>
#include <errno.h>
// Constructor / Destructor
/*
* \ingroup gdcmDicomDir
- * \brief
+ * \brief Constructor
* @param Filename
* @param exception_on_error
*/
*/
gdcmDicomDir::~gdcmDicomDir()
{
+ delete metaelems;
+
for(ListPatient::iterator cc=patients.begin();cc!=patients.end();++cc)
{
delete *cc;
//-----------------------------------------------------------------------------
// Print
+/*
+ * \ingroup gdcmDicomDir
+ * \brief Canonical Printer
+ */
void gdcmDicomDir::Print(std::ostream &os)
{
+ (*metaelems).SetPrintLevel(printLevel);
+ (*metaelems).Print(os);
+
for(ListPatient::iterator cc=patients.begin();cc!=patients.end();++cc)
{
(*cc)->SetPrintLevel(printLevel);
* \ingroup gdcmDicomDir
* \brief writes on disc a DICOMDIR
* \ warning does NOT add the missing elements in the header :
- * \ it's up to the user doing it !
+ * it's up to the user doing it !
* @param fileName file to be written to
- * @return
+ * @return false only when fail to open
*/
bool gdcmDicomDir::Write(std::string fileName)
{
return true;
}
+/*
+ * \ingroup gdcmDicomDir
+ * \brief fills whole the structure
+ */
void gdcmDicomDir::ParseDirectory(void)
{
NewDicomDir(GetPath());
// Protected
/*
* \ingroup gdcmDicomDir
- * \brief
- * @param
+ * \brief create a gdcmDicomDir from a root Directory
+ * @param path entry point of the stree-like structure
*/
void gdcmDicomDir::NewDicomDir(std::string path)
{
for(gdcmDirList::iterator it=fileList.begin();
it!=fileList.end(); ++it)
{
-// std::cout<<*it<<std::endl;
header=new gdcmHeader(it->c_str());
if(header->IsReadable())
list.push_back(header);
delete header;
}
- SetElements(path,list);
+ std::sort(list.begin(),list.end(),gdcmDicomDir::HeaderLessThan);
+
+ std::string tmp=fileList.GetDirName();
+ SetElements(tmp,list);
}
/*
* \ingroup gdcmDicomDir
- * \brief Get the dicom dir path
+ * \brief Get the DicomDir path
* @param
*/
std::string gdcmDicomDir::GetPath(void)
// Private
/*
* \ingroup gdcmDicomDir
- * \brief
- * @param
+ * \brief create a 'gdcmDicomDir' from a DICOMDIR gdcmHeader
*/
void gdcmDicomDir::CreateDicomDir()
{
gdcmDicomDirType type=gdcmDicomDir::GDCM_NONE;
ListTag::iterator begin;
ListTag::iterator end;
+ ListTag::iterator k;
begin=listEntries.begin();
end=begin;
- for(ListTag::iterator i=listEntries.begin();i !=listEntries.end();++i)
+
+ for(ListTag::iterator j=begin;j !=listEntries.end();++j)
+ {
+ if((*j)->GetValue()=="PATIENT ") {
+ k = j;
+ break;
+ }
+ }
+ AddObjectToEnd(gdcmDicomDir::GDCM_META,begin,k);
+
+ for(ListTag::iterator i=k;i !=listEntries.end();++i)
{
- // std::cout << std::hex <<(*i)->GetGroup() <<
- // " " <<(*i)->GetElement() << endl;
-
std::string v=(*i)->GetValue();
if(v=="PATIENT ")
{
- // std::cout<<"PATIENT"<<std::endl;
end=i;
AddObjectToEnd(type,begin,end);
if(v=="STUDY ")
{
- // std::cout<<"STUDY"<<std::endl;
end=i;
AddObjectToEnd(type,begin,end);
if(v=="SERIES")
{
- // std::cout<<"SERIES"<<std::endl;
end=i;
AddObjectToEnd(type,begin,end);
if(v=="IMAGE ")
{
- // std::cout<<"IMAGE"<<std::endl;
end=i;
AddObjectToEnd(type,begin,end);
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
+ * @param type
+ * @param begin
+ * @param end
*/
void gdcmDicomDir::AddObjectToEnd(gdcmDicomDirType type,ListTag::iterator begin,ListTag::iterator end)
{
switch(type)
{
+ case gdcmDicomDir::GDCM_META:
+ AddMetaToEnd(begin,end);
+ break;
case gdcmDicomDir::GDCM_PATIENT:
AddPatientToEnd(begin,end);
break;
}
}
+
+/*
+ * \ingroup gdcmDicomDir
+ * \brief Well ... Not realy to end, there is only one occurence
+ * @param begin
+ * @param end
+*/
+void gdcmDicomDir::AddMetaToEnd(ListTag::iterator begin,ListTag::iterator end)
+{
+ metaelems = new gdcmMeta(begin,end);
+}
+
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
- */
+ * @param begin
+ * @param end
+*/
void gdcmDicomDir::AddPatientToEnd(ListTag::iterator begin,ListTag::iterator end)
{
patients.push_back(new gdcmPatient(begin,end));
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
+ * @param begin
+ * @param end
*/
void gdcmDicomDir::AddStudyToEnd(ListTag::iterator begin,ListTag::iterator end)
{
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
+ * @param begin
+ * @param end
*/
void gdcmDicomDir::AddSerieToEnd(ListTag::iterator begin,ListTag::iterator end)
{
/*
* \ingroup gdcmDicomDir
- * \brief
+ * @param begin
+ * @param end
* @param
*/
void gdcmDicomDir::AddImageToEnd(ListTag::iterator begin,ListTag::iterator end)
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
+ * @param path
+ * @param list
*/
void gdcmDicomDir::SetElements(std::string &path,ListHeader &list)
{
ListTag::iterator debPat=listEntries.begin();
for(ListHeader::iterator it=list.begin();it!=list.end();++it)
{
- // get the current file characteristics
+ // get the current file characteristics
patCurName=(*it)->GetEntryByNumber(0x0010,0x0010);
patCurID=(*it)->GetEntryByNumber(0x0010,0x0011);
studCurInstanceUID=(*it)->GetEntryByNumber(0x0020,0x000d);
// if new Serie Deal with 'SERIE' Elements
if(serCurInstanceUID!=serPrevInstanceUID || serCurID!=serPrevID)
- {
SetElement(path,GDCM_SERIE,*it);
- }
// Always Deal with 'IMAGE' Elements
SetElement(path,GDCM_IMAGE,*it);
/*
* \ingroup gdcmDicomDir
* \brief
- * @param
+ * @param path
+ * @param type
+ * @param header
*/
void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,gdcmHeader *header)
{
}
}
+bool gdcmDicomDir::HeaderLessThan(gdcmHeader *header1,gdcmHeader *header2)
+{
+ return(*header1<*header2);
+}
+
//-----------------------------------------------------------------------------