Parcourir la source

Add methods to access dicom file headers

There should probably be a more elaborate API for this - with the
ability to get access to the whole header as a QMap, but this
didn't seem to be workable with PythonQt so I went for this
API instead.
Steve Pieper il y a 14 ans
Parent
commit
9e9b4e5da6
2 fichiers modifiés avec 56 ajouts et 0 suppressions
  1. 51 0
      Libs/DICOM/Core/ctkDICOMDatabase.cpp
  2. 5 0
      Libs/DICOM/Core/ctkDICOMDatabase.h

+ 51 - 0
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -74,6 +74,7 @@ public:
   QString      DatabaseFileName;
   QString      LastError;
   QSqlDatabase Database;
+  QMap<QString, QString> LoadedHeader;
 };
 
 //------------------------------------------------------------------------------
@@ -271,6 +272,56 @@ QStringList ctkDICOMDatabase::filesForSeries(QString seriesUID)
 }
 
 //------------------------------------------------------------------------------
+void ctkDICOMDatabase::loadHeader (QString sopInstanceUID)
+{
+  Q_D(ctkDICOMDatabase);
+  QSqlQuery query(d->Database);
+  query.prepare ( "SELECT Filename FROM Images WHERE SOPInstanceUID=?");
+  query.bindValue ( 0, sopInstanceUID );
+  query.exec();
+  d->LoadedHeader.clear();
+  if (query.next())
+    {
+    QString fileName = query.value(0).toString();
+    DcmFileFormat fileFormat;
+    OFCondition status = fileFormat.loadFile(fileName.toLatin1().data());
+    if (status.good())
+      {
+      DcmDataset *dataset = fileFormat.getDataset();
+      DcmStack stack;
+      while (dataset->nextObject(stack, true) == EC_Normal)
+        {
+        DcmObject *dO = stack.top();
+        if (dO->isaString())
+          {
+          QString tag = QString("%1,%2").arg(
+              dO->getGTag(),4,16,QLatin1Char('0')).arg(
+              dO->getETag(),4,16,QLatin1Char('0'));
+          std::ostringstream s;
+          dO->print(s);
+          d->LoadedHeader[tag] = QString(s.str().c_str());
+          }
+        }
+      }
+    }
+  return;
+}
+
+//------------------------------------------------------------------------------
+QStringList ctkDICOMDatabase::headerKeys ()
+{
+  Q_D(ctkDICOMDatabase);
+  return (d->LoadedHeader.keys());
+}
+
+//------------------------------------------------------------------------------
+QString ctkDICOMDatabase::headerValue (QString key)
+{
+  Q_D(ctkDICOMDatabase);
+  return (d->LoadedHeader[key]);
+}
+
+//------------------------------------------------------------------------------
 /*
 void ctkDICOMDatabase::insert ( DcmDataset *dataset ) {
   this->insert ( dataset, QString() );

+ 5 - 0
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -67,6 +67,11 @@ public:
   Q_INVOKABLE QStringList seriesForStudy (QString studyUID);
   Q_INVOKABLE QStringList filesForSeries (QString seriesUID);
 
+  ///
+  /// \brief load the header from a file and allow access to elements
+  Q_INVOKABLE void loadHeader (QString sopInstanceUID);
+  Q_INVOKABLE QStringList headerKeys ();
+  Q_INVOKABLE QString headerValue (QString key);
 
   /**
    * Will create an entry in the appropriate tables for this dataset.