Slicer 5.11
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkITKImageToImageFilter.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Copyright Brigham and Women's Hospital (BWH) All Rights Reserved.
4
5 See COPYRIGHT.txt
6 or http://www.slicer.org/copyright/copyright.txt for details.
7
8 Program: vtkITK
9 Module: $HeadURL$
10 Date: $Date$
11 Version: $Revision$
12
13==========================================================================*/
14
15#ifndef __vtkITKImageToImageFilter_h
16#define __vtkITKImageToImageFilter_h
17
18#include "vtkITK.h"
19
20// ITK includes
21#include <itkCommand.h>
22#include <itkProcessObject.h>
23
24// VTK includes
25#include <vtkCommand.h>
26#include <vtkImageAlgorithm.h>
27#include <vtkImageCast.h>
28#include <vtkImageData.h>
29#include <vtkImageExport.h>
30#include <vtkImageImport.h>
31#include <vtkVersion.h>
32
33// STD includes
34#include <iostream>
35
36#undef itkExceptionMacro
37#define itkExceptionMacro(x) \
38 { \
39 ::std::ostringstream message; \
40 message << "itk::ERROR: " << this->GetNameOfClass() << "(" << this << "): "; \
41 std::cout << message.str().c_str() << std::endl; \
42 }
43
44#undef itkGenericExceptionMacro
45#define itkGenericExceptionMacro(x) \
46 { \
47 ::std::ostringstream message; \
48 message << "itk::ERROR: " x; \
49 std::cout << message.str() << std::endl; \
50 }
51
55class VTK_ITK_EXPORT vtkITKImageToImageFilter : public vtkImageAlgorithm
56{
57public:
59 {
61#ifdef VTK_HAS_INITIALIZE_OBJECT_BASE
62 result->InitializeObjectBase();
63#endif
64 return result;
65 };
66
67 vtkTypeMacro(vtkITKImageToImageFilter, vtkImageAlgorithm);
68
69 void PrintSelf(ostream& os, vtkIndent indent) override
70 {
71 Superclass::PrintSelf(os, indent);
72 this->vtkExporter->PrintSelf(os, indent);
73 this->vtkImporter->PrintSelf(os, indent);
74 };
75
79 vtkMTimeType GetMTime() override
80 {
81 vtkMTimeType t1, t2;
82
83 t1 = this->Superclass::GetMTime();
84 t2 = this->vtkExporter->GetMTime();
85 if (t2 > t1)
86 {
87 t1 = t2;
88 }
89 t2 = this->vtkImporter->GetMTime();
90 if (t2 > t1)
91 {
92 t1 = t2;
93 }
94 return t1;
95 };
96
99 void Modified() override
100 {
101 this->Superclass::Modified();
102 if (this->m_Process)
103 {
104 m_Process->Modified();
105 }
106 };
107
110 void DebugOn() override { this->m_Process->DebugOn(); };
111
114 void DebugOff() override { this->m_Process->DebugOff(); };
115
118 void SetNumberOfThreads(int val) { this->m_Process->SetNumberOfWorkUnits(val); };
119
122 int GetNumberOfThreads() { return this->m_Process->GetNumberOfWorkUnits(); };
123
127 void SetOutput(vtkDataObject* d) override { this->vtkImporter->SetOutput(d); };
128 virtual vtkImageData* GetOutput() { return this->vtkImporter->GetOutput(); };
129 virtual vtkImageData* GetOutput(int idx) { return (vtkImageData*)this->vtkImporter->GetOutput(idx); };
130
133 virtual void SetInput(vtkImageData* Input) { this->vtkCast->SetInputData(Input); };
134
135 void SetInputConnection(vtkAlgorithmOutput* input) override { this->vtkCast->SetInputConnection(input); };
136
137 void SetInputConnection(int port, vtkAlgorithmOutput* input) override { this->vtkCast->SetInputConnection(port, input); };
138
141 virtual vtkDataObject* GetInput() { return (vtkDataObject::SafeDownCast(this->vtkCast->GetInput())); };
142
145 using vtkAlgorithm::Update;
146 void Update() override
147 {
148 this->vtkCast->Update();
149 this->vtkImporter->Update();
150 }
151 void Update(int port) override
152 {
153 this->vtkCast->Update();
154 this->vtkImporter->Update(port);
155 }
157 {
158 if (this->m_Process)
159 {
160 this->UpdateProgress(m_Process->GetProgress());
161 }
162 };
163 void HandleStartEvent() { this->InvokeEvent(vtkCommand::StartEvent, nullptr); };
164 void HandleEndEvent() { this->InvokeEvent(vtkCommand::EndEvent, nullptr); };
166
167protected:
170 void ExecuteData(vtkDataObject*) override { vtkWarningMacro(<< "This filter does not respond to Update(). Doing a GetOutput->Update() instead."); }
172
174 {
176 this->vtkCast = vtkImageCast::New();
177 this->vtkExporter = vtkImageExport::New();
178 this->vtkImporter = vtkImageImport::New();
179 this->vtkExporter->SetInputConnection(this->vtkCast->GetOutputPort());
180 this->m_Process = nullptr;
181 this->m_ProgressCommand = MemberCommand::New();
182 this->m_ProgressCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleProgressEvent);
183 this->m_StartEventCommand = MemberCommand::New();
184 this->m_StartEventCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleStartEvent);
185 this->m_EndEventCommand = MemberCommand::New();
186 this->m_EndEventCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleEndEvent);
187 };
189 {
190 vtkDebugMacro("Destructing vtkITKImageToImageFilter");
191 this->vtkExporter->Delete();
192 this->vtkImporter->Delete();
193 this->vtkCast->Delete();
194 };
195
197 void LinkITKProgressToVTKProgress(itk::ProcessObject* process)
198 {
199 if (process)
200 {
201 this->m_Process = process;
202 this->m_Process->AddObserver(itk::ProgressEvent(), this->m_ProgressCommand);
203 this->m_Process->AddObserver(itk::StartEvent(), this->m_StartEventCommand);
204 this->m_Process->AddObserver(itk::EndEvent(), this->m_EndEventCommand);
205 }
206 };
207
208 typedef itk::SimpleMemberCommand<vtkITKImageToImageFilter> MemberCommand;
209 typedef MemberCommand::Pointer MemberCommandPointer;
210
211 itk::ProcessObject::Pointer m_Process;
215
218 vtkImageCast* vtkCast;
219 vtkImageImport* vtkImporter;
220 vtkImageExport* vtkExporter;
221
222private:
224 void operator=(const vtkITKImageToImageFilter&) = delete;
225};
226
227#endif
void DebugOff() override
Pass DebugOff.
virtual vtkDataObject * GetInput()
Return the input to the filter.
MemberCommandPointer m_StartEventCommand
void DebugOn() override
Pass DebugOn.
void ExecuteData(vtkDataObject *) override
ETX.
void SetOutput(vtkDataObject *d) override
void Modified() override
Pass modified message to itk filter.
void LinkITKProgressToVTKProgress(itk::ProcessObject *process)
BTX.
MemberCommandPointer m_EndEventCommand
void SetInputConnection(int port, vtkAlgorithmOutput *input) override
void SetInputConnection(vtkAlgorithmOutput *input) override
void PrintSelf(ostream &os, vtkIndent indent) override
itk::ProcessObject::Pointer m_Process
int GetNumberOfThreads()
Pass SetNumberOfThreads.
MemberCommand::Pointer MemberCommandPointer
void SetNumberOfThreads(int val)
Pass SetNumberOfThreads.
virtual void SetInput(vtkImageData *Input)
Set the Input of the filter.
vtkMTimeType GetMTime() override
itk::SimpleMemberCommand< vtkITKImageToImageFilter > MemberCommand
virtual vtkImageData * GetOutput()
MemberCommandPointer m_ProgressCommand
virtual vtkImageData * GetOutput(int idx)
static vtkITKImageToImageFilter * New()