Browse Source

Still faulty but functional for Get-calls

Ivo Wolf 14 years ago
parent
commit
1b57c8b34d
2 changed files with 55 additions and 2 deletions
  1. 44 2
      Libs/DICOM/Core/ctkDICOMDataset.cpp
  2. 11 0
      Libs/DICOM/Core/ctkDICOMDataset.h

+ 44 - 2
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -19,6 +19,8 @@ class ctkDICOMDatasetPrivate
     bool m_DICOMDataSetInitialized;
 
     static const QScopedPointer<const DcmDataDictionary> s_Dictionary;
+
+    DcmDataset* m_DcmDataset;
 };
 
 const QScopedPointer<const DcmDataDictionary> ctkDICOMDatasetPrivate::s_Dictionary(new DcmDataDictionary(OFTrue, OFTrue));
@@ -32,18 +34,32 @@ ctkDICOMDataset::ctkDICOMDataset()
 {
   Q_D(ctkDICOMDataset);
   d->m_DICOMDataSetInitialized = false;
+  d->m_DcmDataset = this;
 }
 
 ctkDICOMDataset::~ctkDICOMDataset() 
 {
+  Q_D(ctkDICOMDataset);
+  if(d->m_DcmDataset != this)
+  {
+    delete d->m_DcmDataset;
+  }
 }
 
 
 void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset)
 {
   Q_D(ctkDICOMDataset);
+
+  if(d->m_DcmDataset != this)
+  {
+    delete d->m_DcmDataset;
+    d->m_DcmDataset = NULL;
+  }
+
   if (dataset)
   {
+    d->m_DcmDataset=dataset;
     if (!d->m_DICOMDataSetInitialized)
     {
       d->m_DICOMDataSetInitialized = true;
@@ -79,6 +95,27 @@ void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset)
 }
 
 
+void ctkDICOMDataset::InitializeFromFile(const QString& filename,const E_TransferSyntax readXfer,
+                    const E_GrpLenEncoding groupLength,
+                    const Uint32 maxReadLength,
+                    const E_FileReadMode readMode)
+{
+  Q_D(ctkDICOMDataset);
+  DcmDataset *dataset;
+  
+  DcmFileFormat fileformat;
+  OFCondition status = fileformat.loadFile(filename.toAscii().data(), readXfer, groupLength, readMode);
+  dataset = fileformat.getAndRemoveDataset();
+
+  if (!status.good())
+  {
+    qDebug() << "Could not load " << filename << "\nDCMTK says: " << status.text();
+    delete dataset;
+    return;
+  }
+
+  InitializeFromDataset(dataset);
+}
 
 void ctkDICOMDataset::Serialize()
 {
@@ -174,17 +211,22 @@ void ctkDICOMDataset::Deserialize()
   }
 }
 
+DcmDataset& ctkDICOMDataset::GetDcmDataset() const
+{
+  const Q_D(ctkDICOMDataset);
+  return *d->m_DcmDataset;
+}
 
 OFCondition ctkDICOMDataset::findAndGetElement(const DcmTag& tag, DcmElement*& element, const OFBool searchIntoSub) const
 {
   // this one const_cast allows us to declare quite a lot of methods nicely with const
-  return ((DcmDataset&)(const_cast<ctkDICOMDataset&>(*this))).findAndGetElement(tag, element, searchIntoSub);
+  return GetDcmDataset().findAndGetElement(tag, element, searchIntoSub);
 }
 
 OFCondition ctkDICOMDataset::findAndGetOFString(const DcmTag& tag, OFString& value, const unsigned long pos, const OFBool searchIntoSub) const
 {
   // this second const_cast allows us to declare quite a lot of methods nicely with const
-  return ((DcmDataset&)(const_cast<ctkDICOMDataset&>(*this))).findAndGetOFString(tag, value, pos, searchIntoSub);
+  return GetDcmDataset().findAndGetOFString(tag, value, pos, searchIntoSub);
 }
 
 bool ctkDICOMDataset::CheckCondition(const OFCondition& condition)

+ 11 - 0
Libs/DICOM/Core/ctkDICOMDataset.h

@@ -80,6 +80,15 @@ public:
     virtual void InitializeFromDataset(DcmDataset* dataset);
 
     /**
+      \brief For initialization from file in a constructor / assignment.
+    */
+    virtual void InitializeFromFile(const QString& filename, 
+                    const E_TransferSyntax readXfer = EXS_Unknown,
+                    const E_GrpLenEncoding groupLength = EGL_noChange,
+                    const Uint32 maxReadLength = DCM_MaxReadLength,
+                    const E_FileReadMode readMode = ERM_autoDetect);
+
+    /**
      \brief Store a string representation of the object to a database field.
 
      The internal DcmDataset is serialized into a memory buffer using DcmDataset::write(..).
@@ -235,6 +244,8 @@ protected:
 
   QScopedPointer<ctkDICOMDatasetPrivate> d_ptr;
 
+  DcmDataset& GetDcmDataset() const;
+
 private:
   Q_DECLARE_PRIVATE(ctkDICOMDataset);
 };