From 1d320d3ca18e67801baf74d1f56f251a8f51a520 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 3 Jul 2009 18:58:01 +0000 Subject: [PATCH] To the ITK code path added support for handling a whole directory of dicom files. --- src/osgPlugins/dicom/ReaderWriterDICOM.cpp | 164 ++++++++++++++++++--- 1 file changed, 140 insertions(+), 24 deletions(-) diff --git a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp index 0ea905969..16c24ec15 100644 --- a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp +++ b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp @@ -101,6 +101,29 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter virtual const char* className() const { return "DICOM Image Reader/Writer"; } + typedef std::vector Files; + bool getDicomFilesInDirectory(const std::string& path, Files& files) const + { + osgDB::DirectoryContents contents = osgDB::getDirectoryContents(path); + + std::sort(contents.begin(), contents.end()); + + for(osgDB::DirectoryContents::iterator itr = contents.begin(); + itr != contents.end(); + ++itr) + { + std::string localFile = path + "/" + *itr; + info()<<"contents = "< > Images; + Images images; + for(Files::iterator itr = files.begin(); + itr != files.end(); + ++itr) + { + ReadResult result = readSingleITKImage(*itr, options); + if (result.success()) images.push_back(result.getImage()); + else return result; + } + + if (images.empty()) return ReadResult::ERROR_IN_READING_FILE; + + if (images.size()==1) return images[0].get(); + + + typedef std::map > DistanceImageMap; + typedef std::map OrientationDistanceImageMap; + OrientationDistanceImageMap orientationDistanceImageMap; + for(Images::iterator itr = images.begin(); + itr != images.end(); + ++itr) + { + osg::Image* image = itr->get(); + osg::RefMatrix* matrix = dynamic_cast(image->getUserData()); + if (matrix) + { + osg::Vec3 p0 = osg::Vec3(0.0, 0.0, 0.0) * (*matrix); + osg::Vec3 p1 = osg::Vec3(0.0, 0.0, 1.0) * (*matrix); + osg::Vec3 direction = p1-p0; + direction.normalize(); + float distance = p0 * direction; + info()<<" direction="<