/*========================================================================= medInria Copyright (c) INRIA 2013 - 2018. All rights reserved. See LICENSE.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =========================================================================*/ #include #include #include #include #include #include // ///////////////////////////////////////////////////////////////// // ITKProcessExamplePrivate // ///////////////////////////////////////////////////////////////// class ITKProcessExamplePrivate { public: dtkAbstractData *input; dtkAbstractData *output; double sigma; template int update(); }; template int ITKProcessExamplePrivate::update() { qDebug() << "entering method d->update<" << typeid(PixelType).name() << ">"; typedef itk::Image< PixelType, 3 > ImageType; // typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType > FilterType; typedef itk::SmoothingRecursiveGaussianImageFilter< ImageType, ImageType > FilterType; typename FilterType::Pointer gaussianFilter = FilterType::New(); gaussianFilter->SetInput(dynamic_cast((itk::Object*)(input->data()))); // gaussianFilter->SetVariance(variance); gaussianFilter->SetSigma(sigma); gaussianFilter->Update(); output->setData(gaussianFilter->GetOutput()); return EXIT_SUCCESS; } // ///////////////////////////////////////////////////////////////// // ITKProcessExample // ///////////////////////////////////////////////////////////////// ITKProcessExample::ITKProcessExample() : dtkAbstractProcess(), d(new ITKProcessExamplePrivate) { d->output = NULL; d->sigma = 4.0; } ITKProcessExample::~ITKProcessExample() { delete d; d = NULL; } bool ITKProcessExample::registered() { return dtkAbstractProcessFactory::instance()->registerProcessType("ITKProcessExampleGaussianBlur", createITKProcessExample); } QString ITKProcessExample::description() const { return "ITKProcessExampleGaussianBlur"; } void ITKProcessExample::setInput(dtkAbstractData *data) { if (!data) return; const QString& identifier = data->identifier(); d->output = dtkAbstractDataFactory::instance()->create (identifier); d->input = data; qDebug() << "in method setInput, d->input =" << d->input; } void ITKProcessExample::setParameter(double data, int channel) { switch (channel){ case (0): d->sigma = data; break; default : return; } } int ITKProcessExample::update() { qDebug() << "entering method update"; if (!d->input) { qDebug() << "in update method : d->input == NULL"; return -1; } const QString& id = d->input->identifier(); if (id == "itkDataImageChar3") { d->update(); } else if (id == "itkDataImageUChar3") { d->update(); } else if (id == "itkDataImageShort3") { d->update(); } else if (id == "itkDataImageUShort3") { d->update(); } else if (id == "itkDataImageInt3") { d->update(); } else if (id == "itkDataImageUInt3") { d->update(); } else if (id == "itkDataImageLong3") { d->update(); } else if (id== "itkDataImageULong3") { d->update(); } else if (id == "itkDataImageFloat3") { d->update(); } else if (id == "itkDataImageDouble3") { d->update(); } else { qDebug() << "Error : pixel type not yet implemented (" << id << ")"; return -1; } return EXIT_SUCCESS; } dtkAbstractData * ITKProcessExample::output() { return (d->output); } // ///////////////////////////////////////////////////////////////// // Type instanciation // ///////////////////////////////////////////////////////////////// dtkAbstractProcess * createITKProcessExample() { return new ITKProcessExample; }