Explorar o código

Merge branch 'ctkdicom-core-tests'

* ctkdicom-core-tests:
  Rename QPersonName into ctkDICOMPersonName and add test
  Add ctkDICOMDatabaseTest1 to unit test ctkDICOMDatabase
  Add ctkDICOMIndexerTest1 to unit test ctkDICOMIndexer
  Add comments to ctkDICOMImage and rename methods
Julien Finet %!s(int64=14) %!d(string=hai) anos
pai
achega
8ba4ba828c

+ 8 - 0
Libs/DICOM/Core/Testing/Cpp/CMakeLists.txt

@@ -1,8 +1,11 @@
 SET(KIT ${PROJECT_NAME})
 
 CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
+  ctkDICOMDatabaseTest1.cpp
   ctkDICOMImageTest1.cpp
+  ctkDICOMIndexerTest1.cpp
   ctkDICOMModelTest1.cpp
+  ctkDICOMPersonNameTest1.cpp
   ctkDICOMTest1.cpp
   )
 
@@ -24,10 +27,15 @@ ENDMACRO( SIMPLE_TEST  )
 #
 # Add Tests
 #
+SIMPLE_TEST(ctkDICOMDatabaseTest1)
+
 ADD_TEST( ctkDICOMImageTest1 ${KIT_TESTS}
           ctkDICOMImageTest1 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
 SET_PROPERTY(TEST ctkDICOMImageTest1 PROPERTY LABELS ${PROJECT_NAME})
 
+SIMPLE_TEST( ctkDICOMIndexerTest1 )
+SIMPLE_TEST( ctkDICOMPersonNameTest1)
+
 ADD_TEST( ctkDICOMModelTest1 ${KIT_TESTS}
           ctkDICOMModelTest1 ${CMAKE_CURRENT_BINARY_DIR}/dicom.db
                              ${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/dicom-sample.sql)

+ 82 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMDatabaseTest1.cpp

@@ -0,0 +1,82 @@
+
+// Qt includes
+#include <QApplication>
+#include <QDir>
+#include <QTimer>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+
+// STD includes
+#include <iostream>
+
+
+int ctkDICOMDatabaseTest1( int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  ctkDICOMDatabase database;
+  QDir databaseDirectory = QDir::temp();
+  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
+  database.openDatabase(databaseFile.absoluteFilePath());
+
+  if (!database.lastError().isEmpty())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << qPrintable(database.lastError()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (!database.database().isValid())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << "invalid sql database" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (database.isInMemory())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << "database should not be in memory" << std::endl;
+    return EXIT_FAILURE;    
+    }
+
+  if (database.databaseFilename() != databaseFile.absoluteFilePath())
+    {
+    std::cerr << "ctkDICOMDatabase::databaseFilename() failed: "
+              << qPrintable( database.databaseFilename()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (QDir(database.databaseDirectory()) != databaseDirectory)
+    {
+    std::cerr << "ctkDICOMDatabase::databaseDirectory() failed"
+              << qPrintable(database.databaseDirectory()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  bool res = database.initializeDatabase();
+  
+  if (!res)
+    {
+    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // check if it doesn't crash
+  database.pathForDataset(0);
+  database.insert(0, true, true);
+  database.insert(0, true, false);
+  database.insert(0, false, false);
+  database.insert(0, false, true);
+
+  database.closeDatabase();
+  database.initializeDatabase();
+
+  if (argc <= 1 || QString(argv[1]) != "-I")
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+
+  return app.exec();
+}

+ 1 - 1
Libs/DICOM/Core/Testing/Cpp/ctkDICOMImageTest1.cpp

@@ -29,7 +29,7 @@ int ctkDICOMImageTest1( int argc, char * argv [] )
   ctkDICOMImage ctkImage(&dcmtkImage);
 
   QLabel qtImage;
-  QPixmap pixmap = QPixmap::fromImage(ctkImage.getImage(0),Qt::AvoidDither);
+  QPixmap pixmap = QPixmap::fromImage(ctkImage.frame(0),Qt::AvoidDither);
   if (pixmap.isNull())
     {
     std::cerr << "Failed to convert QImage to QPixmap" ;

+ 39 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMIndexerTest1.cpp

@@ -0,0 +1,39 @@
+
+// Qt includes
+#include <QApplication>
+#include <QDebug>
+#include <QDir>
+#include <QFileInfo>
+#include <QTreeView>
+#include <QSqlQuery>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+#include "ctkDICOMIndexer.h"
+
+// STD includes
+#include <iostream>
+
+int ctkDICOMIndexerTest1( int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+  
+  ctkDICOMDatabase database;
+  ctkDICOMIndexer indexer;
+
+  // Test ctkDICOMIndexer::addDirectory()
+  // just check if it doesn't crash
+  indexer.addDirectory(database, QString());
+  // might work (if there are some DCM images in temp
+  indexer.addDirectory(database, QDir::tempPath());
+  // give an invalid destination name
+  indexer.addDirectory(database, QDir::tempPath(), QDir::tempPath() + "/@#$%^&*{}[]");
+
+  // make sure it doesn't crash
+  indexer.refreshDatabase(database, QString());
+  
+  // make sure it doesn't crash
+  indexer.refreshDatabase(database, QDir::tempPath());
+
+  return EXIT_SUCCESS;
+}

+ 124 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMPersonNameTest1.cpp

@@ -0,0 +1,124 @@
+
+// Qt includes
+#include <QApplication>
+#include <QDir>
+#include <QTimer>
+
+// ctkDICOMCore includes
+#include "ctkDICOMPersonName.h"
+
+// STD includes
+#include <iostream>
+
+
+int ctkDICOMPersonNameTest1( int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  ctkDICOMPersonName personName("lastName", "firstName", "middleName", "namePrefix", "nameSuffix");
+  if (personName.lastName() != "lastName")
+    {
+    std::cerr << "ctkDICOMPersonName::lastName() failed:"
+              << qPrintable(personName.lastName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (personName.firstName() != "firstName")
+    {
+    std::cerr << "ctkDICOMPersonName::firstName() failed:"
+              << qPrintable(personName.firstName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  if (personName.middleName() != "middleName")
+    {
+    std::cerr << "ctkDICOMPersonName::middleName() failed:"
+              << qPrintable(personName.middleName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  if (personName.namePrefix() != "namePrefix")
+    {
+    std::cerr << "ctkDICOMPersonName::namePrefix() failed:"
+              << qPrintable(personName.namePrefix()) << std::endl;
+    return EXIT_FAILURE;
+    }
+    
+  if (personName.nameSuffix() != "nameSuffix")
+    {
+    std::cerr << "ctkDICOMPersonName::nameSuffix() failed:"
+              << qPrintable(personName.nameSuffix()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (personName.formattedName() != "lastName, firstName middleName, nameSuffix")
+    {
+    std::cerr << "ctkDICOMPersonName::nameSuffix() failed:"
+              << qPrintable(personName.formattedName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // test operator QString()
+  if (QString(personName) != QString("lastName, firstName middleName, nameSuffix"))
+    {
+    std::cerr << "ctkDICOMPersonName::nameSuffix() failed:"
+              << qPrintable(QString(personName)) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // test toStdString()
+  // TODO: make it fail 
+  if (personName.toStdString() != std::string("lastName, firstName middleName, nameSuffix"))
+    {
+    std::cerr << "ctkDICOMPersonName::nameSuffix() failed:"
+              << personName.toStdString() << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  ctkDICOMPersonName samePersonName(personName);
+  
+  if (samePersonName.lastName() != personName.lastName() ||
+      samePersonName.firstName() != personName.firstName() ||
+      samePersonName.middleName() != personName.middleName() ||
+      samePersonName.namePrefix() != personName.namePrefix() ||
+      samePersonName.nameSuffix() != personName.nameSuffix() || 
+      samePersonName.formattedName() != personName.formattedName())
+    {
+    std::cerr << "ctkDICOMPersonName::ctkDICOMPersonName(ctkDICOMPersonName&) failed:"
+              << qPrintable(samePersonName.formattedName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+  ctkDICOMPersonName otherPerson("just a last name");
+  if (otherPerson.lastName() != "just a last name" ||
+      !otherPerson.firstName().isEmpty() ||
+      !otherPerson.middleName().isEmpty() ||
+      !otherPerson.namePrefix().isEmpty() ||
+      !otherPerson.nameSuffix().isEmpty() ||
+      otherPerson.formattedName() != "just a last name")
+    {
+    std::cerr << "ctkDICOMPersonName with empty fields failed:"
+              << qPrintable(otherPerson.formattedName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  otherPerson = samePersonName;
+  
+  if (otherPerson.lastName() != personName.lastName() ||
+      otherPerson.firstName() != personName.firstName() ||
+      otherPerson.middleName() != personName.middleName() ||
+      otherPerson.namePrefix() != personName.namePrefix() ||
+      otherPerson.nameSuffix() != personName.nameSuffix() || 
+      otherPerson.formattedName() != personName.formattedName())
+    {
+    std::cerr << "ctkDICOMPersonName::operator=(const ctkDICOMPersonName&) failed:"
+              << qPrintable(otherPerson.formattedName()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (argc <= 1 || QString(argv[1]) != "-I")
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+
+  return app.exec();
+}

+ 11 - 2
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -230,9 +230,14 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset ) {
 */
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool createThumbnail ) {
+void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool createThumbnail )
+{
   Q_D(ctkDICOMDatabase);
 
+  if (!dataset)
+    {
+    return;
+    }
   // Check to see if the file has already been loaded
   OFString sopInstanceUID ;
   dataset->findAndGetOFString(DCM_SOPInstanceUID, sopInstanceUID);
@@ -437,7 +442,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool create
       // TODO: reuse dataset
       DicomImage dcmtkImage(filename.toAscii());
       ctkDICOMImage ctkImage(&dcmtkImage);
-      QImage image( ctkImage.getImage(0) );
+      QImage image( ctkImage.frame(0) );
       image.scaled(128,128,Qt::KeepAspectRatio).save(thumbnailFilename,"PNG");
     }
   }
@@ -459,6 +464,10 @@ QString ctkDICOMDatabase::pathForDataset( DcmDataset *dataset)
 {
   Q_D(ctkDICOMDatabase);
 
+  if (!dataset)
+    {
+    return QString();
+    }
   OFString studyInstanceUID, seriesInstanceUID, sopInstanceUID;
   dataset->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID);
   dataset->findAndGetOFString(DCM_SeriesInstanceUID, seriesInstanceUID);

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

@@ -72,6 +72,7 @@ public:
 
 signals:
   void databaseChanged();
+
 protected:
   QScopedPointer<ctkDICOMDatabasePrivate> d_ptr;
 

+ 13 - 13
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -446,7 +446,7 @@ QStringList ctkDICOMDataset::GetElementAsStringList( const DcmTag& tag ) const
   return qsl;
 }
 
-QPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned long pos ) const
+ctkDICOMPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -454,7 +454,7 @@ QPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned
 
   DcmPersonName* name = dynamic_cast<DcmPersonName*>(element);
 
-  if (!name) return QPersonName(); // invalid
+  if (!name) return ctkDICOMPersonName(); // invalid
 
   OFString lastName;
   OFString firstName;
@@ -463,7 +463,7 @@ QPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned
   OFString nameSuffix;
   if (CheckCondition( name->getNameComponents(lastName, firstName, middleName, namePrefix, nameSuffix, pos) ) )
   {
-    return QPersonName(
+    return ctkDICOMPersonName(
       Decode(tag, lastName),
       Decode(tag, firstName),
       Decode(tag, middleName),
@@ -472,14 +472,14 @@ QPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned
   }
   else
   {
-    return QPersonName();
+    return ctkDICOMPersonName();
   }
 }
 
-QPersonNameList ctkDICOMDataset::GetElementAsPersonNameList( const DcmTag& tag ) const
+ctkDICOMPersonNameList ctkDICOMDataset::GetElementAsPersonNameList( const DcmTag& tag ) const
 {
   this->EnsureDcmDataSetIsInitialized();
-  QPersonNameList qpnl;
+  ctkDICOMPersonNameList qpnl;
 
   DcmElement* element(NULL);
   findAndGetElement(tag, element);
@@ -639,17 +639,17 @@ bool ctkDICOMDataset::SetElementAsStringList( const DcmTag& /*tag*/, QStringList
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsPersonName( const DcmTag& tag, QPersonName personName )
+bool ctkDICOMDataset::SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName )
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmPersonName* dcmPersonName = new DcmPersonName( tag ); // TODO leak?
 
   if ( CheckCondition( dcmPersonName->putNameComponents(
-    Encode( tag, personName.GetLastName() ),
-    Encode( tag, personName.GetFirstName() ),
-    Encode( tag, personName.GetMiddleName() ),
-    Encode( tag, personName.GetNamePrefix() ),
-    Encode( tag, personName.GetNameSuffix() ) ) ) )
+    Encode( tag, personName.lastName() ),
+    Encode( tag, personName.firstName() ),
+    Encode( tag, personName.middleName() ),
+    Encode( tag, personName.namePrefix() ),
+    Encode( tag, personName.nameSuffix() ) ) ) )
   {
     return CheckCondition( insert( dcmPersonName ) );
   }
@@ -657,7 +657,7 @@ bool ctkDICOMDataset::SetElementAsPersonName( const DcmTag& tag, QPersonName per
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsPersonNameList( const DcmTag& tag, QPersonNameList personNameList )
+bool ctkDICOMDataset::SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList )
 {
   this->EnsureDcmDataSetIsInitialized();
   // TODO: Find out how this can be implemented with DcmDataset methods; there is no method for

+ 4 - 4
Libs/DICOM/Core/ctkDICOMDataset.h

@@ -169,8 +169,8 @@ public:
     QString          GetAllElementValuesAsString( const DcmTag& tag ) const;
     QString                   GetElementAsString( const DcmTag& tag, unsigned long pos = 0 ) const;
     QStringList           GetElementAsStringList( const DcmTag& tag ) const;
-    QPersonName           GetElementAsPersonName( const DcmTag& tag, unsigned long pos = 0 ) const;
-    QPersonNameList   GetElementAsPersonNameList( const DcmTag& tag ) const;
+    ctkDICOMPersonName           GetElementAsPersonName( const DcmTag& tag, unsigned long pos = 0 ) const;
+    ctkDICOMPersonNameList   GetElementAsPersonNameList( const DcmTag& tag ) const;
     QDate                       GetElementAsDate( const DcmTag& tag, unsigned long pos = 0 ) const;
     QTime                       GetElementAsTime( const DcmTag& tag, unsigned long pos = 0 ) const;
     double                    GetElementAsDouble( const DcmTag& tag, unsigned long pos = 0 ) const; // type DS
@@ -189,8 +189,8 @@ public:
     */
     bool SetElementAsString( const DcmTag& tag, QString string );
     bool SetElementAsStringList( const DcmTag& tag, QStringList stringList ); //> Currently not implemented
-    bool SetElementAsPersonName( const DcmTag& tag, QPersonName personName );
-    bool SetElementAsPersonNameList( const DcmTag& tag, QPersonNameList personNameList ); //> Currently not implemented
+    bool SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName );
+    bool SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList ); //> Currently not implemented
     bool SetElementAsDate( const DcmTag& tag, QDate date );
     bool SetElementAsTime( const DcmTag& tag, QTime time );
     bool SetElementAsDateTime( const DcmTag& tag, QDateTime dateTime );

+ 15 - 9
Libs/DICOM/Core/ctkDICOMImage.cpp

@@ -62,7 +62,8 @@ ctkDICOMImagePrivate::~ctkDICOMImagePrivate()
 
 
 //------------------------------------------------------------------------------
-ctkDICOMImage::ctkDICOMImage(DicomImage* dicomImage, QObject* parentValue): d_ptr(new ctkDICOMImagePrivate(*this))
+ctkDICOMImage::ctkDICOMImage(DicomImage* dicomImage, QObject* parentValue)
+  : d_ptr(new ctkDICOMImagePrivate(*this))
 {
   Q_UNUSED(parentValue);
   Q_D(ctkDICOMImage);
@@ -76,21 +77,26 @@ ctkDICOMImage::~ctkDICOMImage()
 {
 }
 
+//------------------------------------------------------------------------------
 unsigned long ctkDICOMImage::frameCount() const
 {
   Q_D(const ctkDICOMImage);
   if (d->DicomImage)
-  {
+    {
     return d->DicomImage->getFrameCount();
-  }
+    }
   return 0;
 }
-DicomImage* ctkDICOMImage::getDicomImage() const
+
+//------------------------------------------------------------------------------
+DicomImage* ctkDICOMImage::dicomImage() const
 {
   Q_D(const ctkDICOMImage);
   return d->DicomImage;
 }
-QImage ctkDICOMImage::getImage(int frame) const
+
+//------------------------------------------------------------------------------
+QImage ctkDICOMImage::frame(int frame) const
 {
   Q_D(const ctkDICOMImage);
 
@@ -98,7 +104,7 @@ QImage ctkDICOMImage::getImage(int frame) const
   // the DCMTK forum, posted by Joerg Riesmayer, see http://forum.dcmtk.org/viewtopic.php?t=120
   QImage image;
   if ((d->DicomImage != NULL) && (d->DicomImage->getStatus() == EIS_Normal))
-  {
+    {
     /* get image extension */
     const unsigned long width = d->DicomImage->getWidth();
     const unsigned long height = d->DicomImage->getHeight();
@@ -113,13 +119,13 @@ QImage ctkDICOMImage::getImage(int frame) const
     /* copy PGM header to buffer */
 
     if (d->DicomImage->getOutputData(static_cast<void *>(buffer.data() + offset), length - offset, 8, frame))
-    {
+      {
 
       if (!image.loadFromData( buffer ))
-      {
+        {
         logger.error("QImage couldn't created");
+        }
       }
     }
-  }
   return image;
 }

+ 34 - 4
Libs/DICOM/Core/ctkDICOMImage.h

@@ -24,23 +24,53 @@
 
 // Qt includes 
 #include <QObject>
-#include <QPixmap>
+#include <QImage>
 
 #include "ctkDICOMCoreExport.h"
 
 class ctkDICOMImagePrivate;
 class DicomImage;
 
+/**
+  \brief Wrapper around a DCMTK DicomImage.
+
+  This class wraps a DicomImage object and exposes it as a Qt class.
+*/
 class CTK_DICOM_CORE_EXPORT ctkDICOMImage : public QObject
 {
   Q_OBJECT
+  Q_PROPERTY(unsigned long frameCount READ frameCount);
 public:
+  /** \brief Construct a ctkDICOMImage
+      The dicomImage pointer must remain valid during all the life of
+      the constructed ctkDICOMImage.
+  */
   explicit ctkDICOMImage(DicomImage* dicomImage, QObject* parent = 0);
   virtual ~ctkDICOMImage();
-  DicomImage* getDicomImage() const;
-  QImage getImage(int frame = 0) const;
+
+  /**
+      \brief Returns the pointer on the dicom image given in the constructor.
+      
+      This is provided as a utility function. Do not delete the returned
+      pointer.
+      TBD: Return a "const DicomImage*" instead?
+  */
+  DicomImage* dicomImage() const;
+
+  /**
+      \brief Returns a specific frame of the dicom image
+  */
+  QImage frame(int frame = 0) const;
+
+  /**
+      \brief Returns the number of frames contained in the dicom image.
+      \sa DicomImage::getFrameCount()
+
+      Please note that this function does not return the number of frames
+      stored in the DICOM file/dataset. It rather refers to the number of
+      frames processed by this class.
+  */
   unsigned long frameCount() const;
-  Q_PROPERTY(unsigned long frameCount READ frameCount);
 
 protected:
   QScopedPointer<ctkDICOMImagePrivate> d_ptr;

+ 1 - 1
Libs/DICOM/Core/ctkDICOMIndexer.cpp

@@ -402,7 +402,7 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
         QDir(thumbnailBaseDir).mkpath(studySeriesDirectory);
         DicomImage dcmtkImage(qfilename.toAscii());
         ctkDICOMImage ctkImage(&dcmtkImage);
-        QImage image( ctkImage.getImage(0) );
+        QImage image( ctkImage.frame(0) );
         image.scaled(128,128,Qt::KeepAspectRatio).save(thumbnailFilename,"PNG");
       }
     }

+ 14 - 2
Libs/DICOM/Core/ctkDICOMIndexer.h

@@ -28,13 +28,25 @@
 #include "ctkDICOMDatabase.h"
 
 class ctkDICOMIndexerPrivate;
+/**
+    \brief Indexes DICOM images located in local directory into an Sql database
+*/
 class CTK_DICOM_CORE_EXPORT ctkDICOMIndexer
 {
 public:
   explicit ctkDICOMIndexer();
   virtual ~ctkDICOMIndexer();
-  /// add directory to database and optionally copy files to destinationDirectory
-  void addDirectory(ctkDICOMDatabase& database, const QString& directoryName, const QString& destinationDirectoryName = "", bool createHierarchy = true, bool createThumbnails = true);
+  
+  /**
+      \brief Adds directory to database and optionally copies files to
+      destinationDirectory.
+      
+      Scan the directory using Dcmtk and populate the database with all the
+      DICOM images accordingly.
+  */
+  void addDirectory(ctkDICOMDatabase& database, const QString& directoryName,
+                    const QString& destinationDirectoryName = "",
+                    bool createHierarchy = true, bool createThumbnails = true);
   void refreshDatabase(ctkDICOMDatabase& database, const QString& directoryName);
 protected:
   QScopedPointer<ctkDICOMIndexerPrivate> d_ptr;

+ 43 - 33
Libs/DICOM/Core/ctkDICOMPersonName.cpp

@@ -1,27 +1,27 @@
+// Qt include
 #include <QSharedData>
 
+// CTK DICOM Core
 #include "ctkDICOMPersonName.h"
 
-
-// ------------------------------------------- QPersonName -----------------------------------------------------------
-
-class QPersonNameData : public QSharedData
+//------------------------------------------------------------------------------
+class ctkDICOMPersonNameData : public QSharedData
 {
-  public:
-
-    QString m_LastName;
-    QString m_FirstName;
-    QString m_MiddleName;
-    QString m_NamePrefix;
-    QString m_NameSuffix;
+public:
+  QString m_LastName;
+  QString m_FirstName;
+  QString m_MiddleName;
+  QString m_NamePrefix;
+  QString m_NameSuffix;
 };
 
-QPersonName::QPersonName(const QString& lastName,
-                         const QString& firstName,
-                         const QString& middleName,
-                         const QString& namePrefix,
-                         const QString& nameSuffix)
-:d(new QPersonNameData)
+//------------------------------------------------------------------------------
+ctkDICOMPersonName::ctkDICOMPersonName(const QString& lastName,
+                             const QString& firstName,
+                             const QString& middleName,
+                             const QString& namePrefix,
+                             const QString& nameSuffix)
+  : d(new ctkDICOMPersonNameData)
 {
   d->m_LastName = lastName;
   d->m_FirstName = firstName;
@@ -30,22 +30,26 @@ QPersonName::QPersonName(const QString& lastName,
   d->m_NameSuffix = nameSuffix;
 }
 
-QPersonName::QPersonName(const QPersonName& other) : d(other.d)
+//------------------------------------------------------------------------------
+ctkDICOMPersonName::ctkDICOMPersonName(const ctkDICOMPersonName& other)
+  : d(other.d)
 {
 }
 
-QPersonName& QPersonName::operator=(const QPersonName& other)
+//------------------------------------------------------------------------------
+ctkDICOMPersonName& ctkDICOMPersonName::operator=(const ctkDICOMPersonName& other)
 {
-  d=other.d;
+  d = other.d;
   return *this;
 }
 
-QPersonName::~QPersonName()
+//------------------------------------------------------------------------------
+ctkDICOMPersonName::~ctkDICOMPersonName()
 {
 }
 
-
-QString QPersonName::GetFormattedName() const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::formattedName() const
 {
   QString result("");
 
@@ -65,42 +69,48 @@ QString QPersonName::GetFormattedName() const
   return result;
 }
 
-QString QPersonName::GetLastName()  const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::lastName() const
 {
   return d->m_LastName;
 }
 
-QString QPersonName::GetFirstName()  const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::firstName() const
 {
   return d->m_FirstName;
 }
 
-QString QPersonName::GetMiddleName()  const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::middleName() const
 {
   return d->m_MiddleName;
 }
 
-QString QPersonName::GetNamePrefix()  const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::namePrefix() const
 {
   return d->m_NamePrefix;
 }
 
-QString QPersonName::GetNameSuffix()  const
+//------------------------------------------------------------------------------
+QString ctkDICOMPersonName::nameSuffix() const
 {
   return d->m_NameSuffix;
 }
 
-QPersonName::operator QString() const
+//------------------------------------------------------------------------------
+ctkDICOMPersonName::operator QString() const
 {
-  return this->GetFormattedName();
+  return this->formattedName();
 }
 
-std::string QPersonName::toStdString() const
+//------------------------------------------------------------------------------
+std::string ctkDICOMPersonName::toStdString() const
 {
   // the complicated looking .toLocal8Bit().constData() is on purpose.
   // if we'd use .toStdString(), the string would be converted to ASCII
   // instead of the local 8bit character encoding.
   // changes for correctly looking output of the strings are higher with .toLocal8Bit()
-  return this->GetFormattedName().toLocal8Bit().constData();
+  return this->formattedName().toLocal8Bit().constData();
 }
-

+ 36 - 37
Libs/DICOM/Core/ctkDICOMPersonName.h

@@ -1,5 +1,5 @@
-#ifndef CTKDICOMPERSONNAME_H
-#define CTKDICOMPERSONNAME_H
+#ifndef __ctkDICOMPersonName_h
+#define __ctkDICOMPersonName_h
 
 #include "ctkDICOMCoreExport.h"
 
@@ -9,46 +9,45 @@
 
 #include <string>
 
-class QPersonNameData;
+class ctkDICOMPersonNameData;
 /**
   \brief A person's name as modelled in DICOM.
 */
-class CTK_DICOM_CORE_EXPORT QPersonName
+class CTK_DICOM_CORE_EXPORT ctkDICOMPersonName
 {
-
-  public:
-
-    QPersonName(const QString& lastName = QString::null,
-                const QString& firstName = QString::null,
-                const QString& middleName = QString::null,
-                const QString& namePrefix = QString::null,
-                const QString& nameSuffix = QString::null);
-
-    QPersonName(const QPersonName& other);
-    QPersonName& operator=(const QPersonName& other);
-
-    virtual ~QPersonName();
-    /**
-      \brief "Lastname, FirstName MiddleName, Suffix" (useful for alphabetical sorting)
-    */
-    QString GetFormattedName() const;
-
-    QString GetLastName() const;
-    QString GetFirstName() const;
-    QString GetMiddleName() const;
-    QString GetNamePrefix() const;
-    QString GetNameSuffix() const;
-
-    /// cast operator
-    operator QString() const;
-    std::string toStdString() const;
-
-  private:
-    QSharedDataPointer<QPersonNameData> d;
+public:
+
+  ctkDICOMPersonName(const QString& lastName = QString::null,
+              const QString& firstName = QString::null,
+              const QString& middleName = QString::null,
+              const QString& namePrefix = QString::null,
+              const QString& nameSuffix = QString::null);
+
+  ctkDICOMPersonName(const ctkDICOMPersonName& other);
+  ctkDICOMPersonName& operator=(const ctkDICOMPersonName& other);
+
+  virtual ~ctkDICOMPersonName();
+  /**
+    \brief "Lastname, FirstName MiddleName, Suffix" (useful for alphabetical sorting)
+  */
+  QString formattedName() const;
+
+  QString lastName() const;
+  QString firstName() const;
+  QString middleName() const;
+  QString namePrefix() const;
+  QString nameSuffix() const;
+
+  /// cast operator
+  operator QString() const;
+  std::string toStdString() const;
+
+private:
+  QSharedDataPointer<ctkDICOMPersonNameData> d;
 };
 
-typedef QList<QPersonName> QPersonNameList;
-Q_DECLARE_METATYPE(QPersonName);
+typedef QList<ctkDICOMPersonName> ctkDICOMPersonNameList;
+Q_DECLARE_METATYPE(ctkDICOMPersonName);
 
 
-#endif // CTKDICOMPERSONNAME_H
+#endif // ctkDICOMPersonName_h

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

@@ -99,7 +99,7 @@ void ctkDICOMDatasetView::addImage( const ctkDICOMImage & image )
 {
   for( unsigned int i=0; i<image.frameCount(); ++i )
     {
-    Superclass::addImage( image.getImage( i ) );
+    Superclass::addImage( image.frame( i ) );
     }
 }