Переглянути джерело

ENH: Hierarchy and VR added

Alireza Mehrtash 11 роки тому
батько
коміт
d16d33d1a2
1 змінених файлів з 58 додано та 20 видалено
  1. 58 20
      Libs/DICOM/Core/ctkDICOMObjectModel.cpp

+ 58 - 20
Libs/DICOM/Core/ctkDICOMObjectModel.cpp

@@ -48,9 +48,11 @@ public:
   ctkDICOMObjectModelPrivate(ctkDICOMObjectModel&);
   virtual ~ctkDICOMObjectModelPrivate();
   void init();
-  void traverseDataElements( DcmItem *dataset, QStandardItem *parent);
+  void itemInsert( DcmItem *dataset, QStandardItem *parent);
+  void seqInsert( DcmSequenceOfItems *dataset, QStandardItem *parent);
   QString getTagValue( DcmElement *dcmElem);
-  QStandardItem* populateModelRow(const QString& tagName,const QString& tagValue, QStandardItem *parent);
+  QStandardItem* populateModelRow(const QString& tagName,const QString& tagValue,
+    const QString& VRName, QStandardItem *parent);
 
   DcmFileFormat fileFormat;
   QStandardItem *rootItem;
@@ -69,12 +71,13 @@ void ctkDICOMObjectModelPrivate::init()
 {
   Q_Q(ctkDICOMObjectModel);
   QStringList horizontalHeaderLabels;
+  horizontalHeaderLabels.append( QString("VR"));
   horizontalHeaderLabels.append( QString("Tag"));
   horizontalHeaderLabels.append( QString("Value"));
   q->setHorizontalHeaderLabels(horizontalHeaderLabels);
 }
 //------------------------------------------------------------------------------
-void ctkDICOMObjectModelPrivate::traverseDataElements( DcmItem *dataset, QStandardItem *parent)
+void ctkDICOMObjectModelPrivate::itemInsert( DcmItem *dataset, QStandardItem *parent)
 {
   DcmStack stack;
   dataset->nextObject( stack, OFTrue);
@@ -86,6 +89,9 @@ void ctkDICOMObjectModelPrivate::traverseDataElements( DcmItem *dataset, QStanda
     DcmTag tag = dO->getTag();
 	  // std::cout<<tag;
     QString tagName = tag.getTagName();
+    DcmVR VR = dO->getVR();
+    QString VRName = VR.getVRName();
+
     DcmTag tagKey = tag.getXTag();
 	  // std::cout<< tagName.toUtf8().constData()<<std::endl;
     if( tagKey == DCM_SequenceDelimitationItem
@@ -99,24 +105,53 @@ void ctkDICOMObjectModelPrivate::traverseDataElements( DcmItem *dataset, QStanda
     tagValue = getTagValue(dcmElem);
   
     // Populate QStandardModel with current DICOM element tag name and value
-    QStandardItem *tagItem = populateModelRow(tagName,tagValue,parent);
+    QStandardItem *tagItem = populateModelRow(tagName,tagValue,VRName,parent);
     
     // check if the DICOM object is a SQ Data element and extract the nested DICOM objects
     if( dcmElem && !dcmElem->isLeaf())
-      {	 
-      DcmSequenceOfItems* newNode = dynamic_cast<DcmSequenceOfItems*> (dcmElem);
-      dO = newNode->nextInContainer( NULL);
-      for( ; dO; dO = newNode->nextInContainer( dO))
-        {
-        DcmElement *dcmElem2 = dynamic_cast<DcmElement *> (dO);
-        tag = dO->getTag();
-        if( tag.getXTag() == DCM_Item)
-          {
-          traverseDataElements( dynamic_cast<DcmItem*> (dO),parent);
-          } 
-         }
-        }
-    }
+     {
+     // now dcmElem  points to a sequenceOfItems
+     ctkDICOMObjectModelPrivate::seqInsert( dynamic_cast<DcmSequenceOfItems*> (dcmElem), tagItem);   
+     }
+  }
+}
+
+
+//------------------------------------------------------------------------------
+void ctkDICOMObjectModelPrivate::seqInsert( DcmSequenceOfItems *dataset, QStandardItem *parent)
+{
+  DcmObject *dO = dataset->nextInContainer( NULL);
+
+ for( ; dO; dO = dataset->nextInContainer(dO))
+   {
+  DcmElement *dcmElem = dynamic_cast<DcmElement *> (dO);
+  QString tagValue = "";
+  DcmTag tag = dO->getTag();
+  DcmTag tagKey = tag.getXTag();
+   if( tagKey == DCM_SequenceDelimitationItem
+   || tagKey == DCM_ItemDelimitationItem)
+    {
+    return;
+     }
+ 
+ QString tagName = tag.getTagName();
+ DcmVR VR = dO->getVR();
+ QString VRName = VR.getVRName();
+ if( dcmElem)
+   {
+   tagValue = getTagValue(dcmElem);
+   }
+ QStandardItem *tagItem = populateModelRow(tagName,tagValue,VRName,parent);
+ 
+ if( dcmElem && !dcmElem->isLeaf())
+   {
+   ctkDICOMObjectModelPrivate::seqInsert( dynamic_cast<DcmSequenceOfItems*> (dcmElem), tagItem);   
+   }
+ else if( tag.getXTag() == DCM_Item)
+   {
+   itemInsert( dynamic_cast<DcmItem*> (dO), tagItem);   
+   }
+  }
 }
 
 //------------------------------------------------------------------------------
@@ -156,13 +191,16 @@ QString ctkDICOMObjectModelPrivate::getTagValue( DcmElement *dcmElem)
 }
 
 //------------------------------------------------------------------------------
- QStandardItem* ctkDICOMObjectModelPrivate::populateModelRow(const QString& tagName,const QString& tagValue, QStandardItem *parent)
+ QStandardItem* ctkDICOMObjectModelPrivate::populateModelRow(const QString& tagName,
+   const QString& tagValue,const QString& VRName, QStandardItem *parent)
  {
   // Create items
+  QStandardItem *VRItem = new QStandardItem( VRName);
   QStandardItem *tagItem = new QStandardItem( tagName);
   QStandardItem *valItem = new QStandardItem( tagValue);
   // Insert items
   QList<QStandardItem *> modelRow;
+  modelRow.append( VRItem);
   modelRow.append( tagItem);
   modelRow.append( valItem);
   parent->appendRow( modelRow);
@@ -201,5 +239,5 @@ void ctkDICOMObjectModel::setFile(const QString &fileName)
   
   DcmDataset *dataset = d->fileFormat.getDataset();
   d->rootItem = ctkDICOMObjectModel::invisibleRootItem();
-  d->traverseDataElements( dataset, d->rootItem);
+  d->itemInsert( dataset, d->rootItem);
 }