/*========================================================================= 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 #include #include #include medItkDilateImageProcess::medItkDilateImageProcess(QObject *parent) : medAbstractDilateImageProcess(parent) { m_filter = nullptr; } medItkDilateImageProcess::~medItkDilateImageProcess() { } QString medItkDilateImageProcess::caption() const { return "Image dilation (ITK)"; } QString medItkDilateImageProcess::description() const { return "Use ITK GrayscaleDilateImageFilter to perform a dilatation of an image."; } medAbstractJob::medJobExitStatus medItkDilateImageProcess::run() { medAbstractJob::medJobExitStatus jobExitSatus = medAbstractJob::MED_JOB_EXIT_FAILURE; if(this->input()) { QString id = this->input()->identifier(); if ( id == "itkDataImageChar3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUChar3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageShort3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUShort3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageInt3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUInt3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageLong3" ) { jobExitSatus = this->_run(); } else if ( id== "itkDataImageULong3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageFloat3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageDouble3" ) { jobExitSatus = this->_run(); } } return jobExitSatus; } template medAbstractJob::medJobExitStatus medItkDilateImageProcess::_run() { typedef itk::Image ImageType; typename ImageType::Pointer in = dynamic_cast((itk::Object*)(this->input()->data())); if(in.IsNotNull()) { typedef itk::BinaryBallStructuringElement KernelType; typedef itk::GrayscaleDilateImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); m_filter = filter; KernelType kernel; kernel.SetRadius(this->kernelRadius()->value()); kernel.CreateStructuringElement(); filter->SetKernel(kernel); filter->SetInput(in); itk::CStyleCommand::Pointer callback = itk::CStyleCommand::New(); callback->SetClientData((void*)this); callback->SetCallback(medItkDilateImageProcess::eventCallback); filter->AddObserver(itk::ProgressEvent(), callback); try { filter->Update(); } catch(itk::ProcessAborted &) { return medAbstractJob::MED_JOB_EXIT_CANCELLED; } medAbstractImageData *out= dynamic_cast(medAbstractDataFactory::instance()->create(this->input()->identifier())); out->setData(filter->GetOutput()); this->setOutput(out); return medAbstractJob::MED_JOB_EXIT_SUCCESS; } return medAbstractJob::MED_JOB_EXIT_FAILURE; } void medItkDilateImageProcess::cancel() { if(this->isRunning() && m_filter.IsNotNull()) { m_filter->AbortGenerateDataOn(); } }