Index: mitkCoreObjectFactory.cpp =================================================================== --- mitkCoreObjectFactory.cpp (revision 19441) +++ mitkCoreObjectFactory.cpp (working copy) @@ -122,6 +122,10 @@ return pointer; } +void mitk::CoreObjectFactory::RegisterExtraFactory(CoreObjectFactoryBase::Pointer factory) { + LOG_INFO << "Registering extra factory: " << factory->GetNameOfClass(); + m_ExtraFactories.push_back(factory); +} mitk::CoreObjectFactory::Pointer mitk::CoreObjectFactory::GetInstance() { static mitk::CoreObjectFactory::Pointer instance; @@ -185,6 +189,9 @@ mitk::PointSetMapper2D::SetDefaultProperties(node); mitk::PointSetVtkMapper3D::SetDefaultProperties(node); } + for (ExtraFactoriesList::iterator it = m_ExtraFactories.begin(); it != m_ExtraFactories.end() ; it++ ) { + (*it)->SetDefaultProperties(node); + } } mitk::CoreObjectFactory::CoreObjectFactory() @@ -214,82 +221,89 @@ mitk::Mapper::Pointer mitk::CoreObjectFactory::CreateMapper(mitk::DataTreeNode* node, MapperSlotId id) { mitk::Mapper::Pointer newMapper = NULL; - mitk::BaseData *data = node->GetData(); + for (ExtraFactoriesList::iterator it = m_ExtraFactories.begin(); it != m_ExtraFactories.end() ; it++ ) { + newMapper = (*it)->CreateMapper(node,id); + } + if (newMapper.IsNull()) { + mitk::BaseData *data = node->GetData(); - if ( id == mitk::BaseRenderer::Standard2D ) - { - if((dynamic_cast(data)!=NULL)) + if ( id == mitk::BaseRenderer::Standard2D ) { - mitk::Image::Pointer image = dynamic_cast(data); - newMapper = mitk::ImageMapper2D::New(); - newMapper->SetDataTreeNode(node); + if((dynamic_cast(data)!=NULL)) + { + mitk::Image::Pointer image = dynamic_cast(data); + newMapper = mitk::ImageMapper2D::New(); + newMapper->SetDataTreeNode(node); + } + else if((dynamic_cast(data)!=NULL)) + { + newMapper = mitk::Geometry2DDataMapper2D::New(); + newMapper->SetDataTreeNode(node); + } + else if((dynamic_cast(data)!=NULL)) + { + newMapper = mitk::SurfaceMapper2D::New(); + // cast because SetDataTreeNode is not virtual + mitk::SurfaceMapper2D *castedMapper = (mitk::SurfaceMapper2D*)newMapper.GetPointer(); + castedMapper->SetDataTreeNode(node); + } + else if((dynamic_cast(data)!=NULL)) + { + newMapper = mitk::PointSetMapper2D::New(); + newMapper->SetDataTreeNode(node); + } } - else if((dynamic_cast(data)!=NULL)) + else if ( id == mitk::BaseRenderer::Standard3D ) { - newMapper = mitk::Geometry2DDataMapper2D::New(); - newMapper->SetDataTreeNode(node); - } - else if((dynamic_cast(data)!=NULL)) - { - newMapper = mitk::SurfaceMapper2D::New(); - // cast because SetDataTreeNode is not virtual - mitk::SurfaceMapper2D *castedMapper = (mitk::SurfaceMapper2D*)newMapper.GetPointer(); - castedMapper->SetDataTreeNode(node); - } - else if((dynamic_cast(data)!=NULL)) - { - newMapper = mitk::PointSetMapper2D::New(); - newMapper->SetDataTreeNode(node); - } - } - else if ( id == mitk::BaseRenderer::Standard3D ) - { - if((dynamic_cast(data) != NULL)) - { - mitk::Image::Pointer image = dynamic_cast(data); - if (image->GetPixelType().GetNumberOfComponents() <= 1) + if((dynamic_cast(data) != NULL)) { - newMapper = mitk::VolumeDataVtkMapper3D::New(); + mitk::Image::Pointer image = dynamic_cast(data); + if (image->GetPixelType().GetNumberOfComponents() <= 1) + { + newMapper = mitk::VolumeDataVtkMapper3D::New(); + newMapper->SetDataTreeNode(node); + } + else + { + //newMapper = mitk::VectorImageVtkGlyphMapper3D::New(); + //newMapper->SetDataTreeNode(node); + } + } + else if((dynamic_cast(data)!=NULL)) + { + newMapper = mitk::Geometry2DDataVtkMapper3D::New(); newMapper->SetDataTreeNode(node); } - else + else if((dynamic_cast(data)!=NULL)) { - //newMapper = mitk::VectorImageVtkGlyphMapper3D::New(); - //newMapper->SetDataTreeNode(node); + newMapper = mitk::SurfaceVtkMapper3D::New(); + newMapper->SetDataTreeNode(node); } + else if((dynamic_cast(data)!=NULL)) + { + newMapper = mitk::PointSetVtkMapper3D::New(); + //newMapper = mitk::EnhancedPointSetVtkMapper3D::New(); // <-- use this if you want to try the new work in progres point set mapper + newMapper->SetDataTreeNode(node); + } } - else if((dynamic_cast(data)!=NULL)) - { - newMapper = mitk::Geometry2DDataVtkMapper3D::New(); - newMapper->SetDataTreeNode(node); - } - else if((dynamic_cast(data)!=NULL)) - { - newMapper = mitk::SurfaceVtkMapper3D::New(); - newMapper->SetDataTreeNode(node); - } - else if((dynamic_cast(data)!=NULL)) - { - newMapper = mitk::PointSetVtkMapper3D::New(); - //newMapper = mitk::EnhancedPointSetVtkMapper3D::New(); // <-- use this if you want to try the new work in progres point set mapper - newMapper->SetDataTreeNode(node); - } } return newMapper; } #define EXTERNAL_FILE_EXTENSIONS \ - "All known formats(*.dcm *.DCM *.dc3 *.DC3 *.gdcm *.ima *.mhd *.mps *.pic *.pic.gz *.bmp *.png *.jpg *.tiff *.pvtk *.stl *.vtk *.vtp *.vtu *.obj *.vti *.hdr);;" \ + "All known formats(*.dcm *.DCM *.dc3 *.DC3 *.gdcm *.ima *.mhd *.mps *.pic *.pic.gz *.bmp *.png *.jpg *.tiff *.pvtk *.stl *.vtk *.vtp *.vtu *.obj *.vti *.hdr *.nrrd *.nhdr *.dwi *.hdwi *.qball *.hqball);;" \ "DICOM files(*.dcm *.DCM *.dc3 *.DC3 *.gdcm);;" \ "DKFZ Pic (*.seq *.pic *.pic.gz *.seq.gz);;" \ + "NRRD Vector Images (*.nrrd *.nhdr *.dwi *.hdwi *.qball *.hqball);;" \ "Point sets (*.mps);;" \ "Sets of 2D slices (*.pic *.pic.gz *.bmp *.png *.dcm *.gdcm *.ima *.tiff);;" \ "Surface files (*.stl *.vtk *.vtp *.obj)" #define INTERNAL_FILE_EXTENSIONS \ - "all (*.seq *.mps *.pic *.pic.gz *.seq.gz *.pvtk *.stl *.vtk *.vtp *.vtu *.obj *.vti *.ves " \ + "all (*.seq *.mps *.pic *.pic.gz *.seq.gz *.pvtk *.stl *.vtk *.vtp *.vtu *.obj *.vti *.ves *.nrrd *.nhdr " \ "*.uvg *.dvg *.par *.dcm *.dc3 *.gdcm *.ima *.mhd *.hdr hpsonos.db HPSONOS.DB *.ssm *msm *.bmp *.png *.jpg *.tiff);;" \ "DKFZ Pic (*.seq *.pic *.pic.gz *.seq.gz);;" \ + "NRRD Vector Images (*.nrrd *.nhdr *.dwi *.hdwi *.qball *.hqball);;" \ "Point sets (*.mps);;" \ "surface files (*.stl *.vtk *.vtp *.obj);;" \ "stl files (*.stl);;" \ @@ -300,19 +314,35 @@ "DSR files (hpsonos.db HPSONOS.DB);;" \ "DICOM files (*.dcm *.gdcm *.dc3 *.ima)" -#define SAVE_FILE_EXTENSIONS "all (*.pic *.mhd *.vtk *.vti *.hdr *.png *.tiff *.jpg *.hdr *.bmp *.dcm *.gipl *.nii *.nrrd *.spr *.lsm)" +#define SAVE_FILE_EXTENSIONS "all (*.pic *.mhd *.vtk *.vti *.hdr *.png *.tiff *.jpg *.hdr *.bmp *.dcm *.gipl *.nii *.nrrd *.nhdr *.spr *.lsm *.dwi *.hdwi *.qball *.hqball)" const char* mitk::CoreObjectFactory::GetFileExtensions() { - return EXTERNAL_FILE_EXTENSIONS; + std::string fileExtensions(EXTERNAL_FILE_EXTENSIONS); + + for (ExtraFactoriesList::iterator it = m_ExtraFactories.begin(); it != m_ExtraFactories.end() ; it++ ) { + fileExtensions.append(";;").append((*it)->GetFileExtensions()); + } + return fileExtensions.c_str(); }; const char* mitk::CoreObjectFactory::GetSaveFileExtensions() { - return SAVE_FILE_EXTENSIONS; + std::string fileExtensions(SAVE_FILE_EXTENSIONS); + + for (ExtraFactoriesList::iterator it = m_ExtraFactories.begin(); it != m_ExtraFactories.end() ; it++ ) { + fileExtensions.append(";;").append((*it)->GetFileExtensions()); + } + return fileExtensions.c_str(); + }; mitk::CoreObjectFactory::FileWriterList mitk::CoreObjectFactory::GetFileWriters() { - return m_FileWriters; + FileWriterList allWriters = m_FileWriters; + for (ExtraFactoriesList::iterator it = m_ExtraFactories.begin(); it != m_ExtraFactories.end() ; it++ ) { + FileWriterList list2 = (*it)->GetFileWriters(); + allWriters.merge(list2); + } + return allWriters; } void mitk::CoreObjectFactory::MapEvent(const mitk::Event*, const int) { Index: mitkCoreObjectFactory.h =================================================================== --- mitkCoreObjectFactory.h (revision 19441) +++ mitkCoreObjectFactory.h (working copy) @@ -32,7 +32,6 @@ public: mitkClassMacro(CoreObjectFactory,CoreObjectFactoryBase); itkFactorylessNewMacro(CoreObjectFactory); - typedef std::list FileWriterList; virtual Mapper::Pointer CreateMapper(mitk::DataTreeNode* node, MapperSlotId slotId); virtual void SetDefaultProperties(mitk::DataTreeNode* node); virtual const char* GetFileExtensions(); @@ -40,10 +39,12 @@ virtual FileWriterList GetFileWriters(); virtual itk::Object::Pointer CreateCoreObject( const std::string& className ); virtual void MapEvent(const mitk::Event* event, const int eventID); + virtual void RegisterExtraFactory(CoreObjectFactoryBase::Pointer factory); static Pointer GetInstance(); protected: CoreObjectFactory(); - + typedef std::list ExtraFactoriesList; + ExtraFactoriesList m_ExtraFactories; static FileWriterList m_FileWriters; }; Index: mitkCoreObjectFactoryBase.h =================================================================== --- mitkCoreObjectFactoryBase.h (revision 19441) +++ mitkCoreObjectFactoryBase.h (working copy) @@ -21,6 +21,7 @@ #include "mitkMapper.h" #include #include +#include "mitkFileWriterWithInformation.h" namespace mitk { @@ -31,11 +32,13 @@ //## This interface can be implemented by factories which add new mapper classes or extend the //## data tree deserialization mechanism. -class MITK_CORE_EXPORT CoreObjectFactoryBase : public itk::ObjectFactoryBase +class CoreObjectFactoryBase : public itk::ObjectFactoryBase { public: + typedef std::list FileWriterList; mitkClassMacro(CoreObjectFactoryBase,itk::ObjectFactoryBase); virtual Mapper::Pointer CreateMapper(mitk::DataTreeNode* node, MapperSlotId slotId) = 0; + virtual void SetDefaultProperties(mitk::DataTreeNode* node) = 0; virtual itk::Object::Pointer CreateCoreObject( const std::string& className ) = 0; virtual const char* GetFileExtensions() = 0; virtual const char* GetSaveFileExtensions() = 0; @@ -47,6 +50,11 @@ { return "Core Object Factory"; } + FileWriterList GetFileWriters() { + return m_FileWriters; + } + protected: + FileWriterList m_FileWriters; }; template