From: dsarrut Date: Fri, 29 Jan 2010 08:48:42 +0000 (+0000) Subject: - new GF system X-Git-Tag: v1.2.0~856 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=8186ce7844751ffa0bd43e8a6ed53d1cc050b843;p=clitk.git - new GF system --- diff --git a/common/clitkCommonGenericFilter.h b/common/clitkCommonGenericFilter.h new file mode 100644 index 0000000..751a726 --- /dev/null +++ b/common/clitkCommonGenericFilter.h @@ -0,0 +1,90 @@ +/*========================================================================= + + Program: clitk + Module: $RCSfile: clitkCommonGenericFilter.h,v $ + Language: C++ + Date: $Date: 2010/01/29 08:48:42 $ + Version: $Revision: 1.1 $ + Author : Joel Schaerer + David Sarrut + + Copyright (C) 2008 + Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + CREATIS-LRMN http://www.creatis.insa-lyon.fr + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, version 3 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + =========================================================================*/ + +#ifndef CLITKCOMMONGENERICFILTER_H +#define CLITKCOMMONGENERICFILTER_H + +// clitk include +#include "clitkCommon.h" + +/*-------------------------------------------------------------------- + DISCLAIMER : I obviously know how to make this mess much clearer and + shorter, but I fear its being too long to put in this margin ... + D.S. + -------------------------------------------------------------------- */ + +namespace clitk { + + //-------------------------------------------------------------------- + template + class GenericFilterFunctorBase { + public: + GenericFilterFunctorBase(FilterType * f) { mFilter = f; } + virtual void DoIt()= 0; + FilterType * mFilter; + }; + + //-------------------------------------------------------------------- + template + class GenericFilterFunctorWithDimAndPixelType: public GenericFilterFunctorBase { + public: + GenericFilterFunctorWithDimAndPixelType(FilterType * f): GenericFilterFunctorBase(f) {} + virtual void DoIt() { + //GenericFilterFunctorBase::mFilter->template UpdateWithDimAndPixelType(); + typedef itk::Image InputImageType; + GenericFilterFunctorBase::mFilter->template UpdateWithInputImageType(); + } + }; + + //-------------------------------------------------------------------- + template + class ImageTypesManager { + public: + typedef std::map*> MapOfPixelTypeToFunctionType; + std::map mMapOfImageTypeToFunction; + + ImageTypesManager(FilterType * f) { mFilter = f; } + virtual void DoIt(int dim, std::string pixelname) { + // std::cout << "ImageTypesManager DoIt " << dim << " " << pixelname << std::endl; + if (mMapOfImageTypeToFunction[dim][pixelname]) + mMapOfImageTypeToFunction[dim][pixelname]->DoIt(); + } + template + void AddNewDimensionAndPixelType() { + // std::cout << "Adding Dim=" << Dim << " and PT = " << GetTypeAsString() << std::endl; + mFilter->AddImageType(Dim, GetTypeAsString()); + mMapOfImageTypeToFunction[Dim][ GetTypeAsString() ] = + new GenericFilterFunctorWithDimAndPixelType(mFilter); + } + FilterType * mFilter; + }; + //-------------------------------------------------------------------- + +} // end namespace + +#endif // end CLITKCOMMONGENERICFILTER_H diff --git a/common/clitkImageToImageGenericFilter.txx b/common/clitkImageToImageGenericFilter.txx new file mode 100644 index 0000000..6343c8b --- /dev/null +++ b/common/clitkImageToImageGenericFilter.txx @@ -0,0 +1,85 @@ +/*========================================================================= + + Program: vv + Module: $RCSfile: clitkImageToImageGenericFilter.txx,v $ + Language: C++ + Date: $Date: 2010/01/29 08:48:42 $ + Version: $Revision: 1.1 $ + Author : Joel Schaerer + David Sarrut + + Copyright (C) 2008 + Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + CREATIS-LRMN http://www.creatis.insa-lyon.fr + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, version 3 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + =========================================================================*/ + +//-------------------------------------------------------------------- +template +void clitk::ImageToImageGenericFilterBase::SetNextOutput(typename ImageType::Pointer output) { + if (mOutputFilenames.size()) + { + clitk::writeImage(output, mOutputFilenames.front(), mIOVerbose); + mOutputFilenames.pop_front(); + } + if (mInputVVImages.size()) //We assume that if a vv image is set as input, we want one as the output + mOutputVVImages.push_back(vvImageFromITK(output)); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +typename ImageType::Pointer clitk::ImageToImageGenericFilterBase::GetInput(unsigned int n) { + if (mInputFilenames.size() > n) { + return clitk::readImage(mInputFilenames[n], mIOVerbose); + } + else if (mInputVVImages.size() > n) + return typename ImageType::Pointer(const_cast(vvImageToITK(mInputVVImages[n]).GetPointer())); + else + assert(false); //No input, this shouldn't happen +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +clitk::ImageToImageGenericFilter::ImageToImageGenericFilter(std::string filterName) + :ImageToImageGenericFilterBase(filterName){ + // Create main function manager + this->mImageTypesManager = new + ImageTypesManager(static_cast(this)); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +bool clitk::ImageToImageGenericFilter::Update() { + GetInputImageDimensionAndPixelType(mDim,mPixelTypeName,mNbOfComponents); + + // Check ImageType + if (!CheckImageType()) { + if (mFailOnImageTypeError) ImageTypeError(); + else SetImageTypeError(); + return false; + } + + // Go ! Call the right templatized function + mImageTypesManager->DoIt(mDim, mPixelTypeName); + return true; +} +//-------------------------------------------------------------------- +