Slicer 5.9
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#undef itkExceptionMacro
34#define itkExceptionMacro(x) \
35 { \
36 ::std::ostringstream message; \
37 message << "itk::ERROR: " << this->GetNameOfClass() << "(" << this << "): "; \
38 std::cout << message.str().c_str() << std::endl; \
39 }
40
41#undef itkGenericExceptionMacro
42#define itkGenericExceptionMacro(x) \
43 { \
44 ::std::ostringstream message; \
45 message << "itk::ERROR: " x; \
46 std::cout << message.str() << std::endl; \
47 }
48
52class VTK_ITK_EXPORT vtkITKImageToImageFilter : public vtkImageAlgorithm
53{
54public:
56 {
58#ifdef VTK_HAS_INITIALIZE_OBJECT_BASE
59 result->InitializeObjectBase();
60#endif
61 return result;
62 };
63
64 vtkTypeMacro(vtkITKImageToImageFilter, vtkImageAlgorithm);
65
66 void PrintSelf(ostream& os, vtkIndent indent) override
67 {
68 Superclass::PrintSelf(os, indent);
69 this->vtkExporter->PrintSelf(os, indent);
70 this->vtkImporter->PrintSelf(os, indent);
71 };
72
76 vtkMTimeType GetMTime() override
77 {
78 vtkMTimeType t1, t2;
79
80 t1 = this->Superclass::GetMTime();
81 t2 = this->vtkExporter->GetMTime();
82 if (t2 > t1)
83 {
84 t1 = t2;
85 }
86 t2 = this->vtkImporter->GetMTime();
87 if (t2 > t1)
88 {
89 t1 = t2;
90 }
91 return t1;
92 };
93
96 void Modified() override
97 {
98 this->Superclass::Modified();
99 if (this->m_Process)
100 {
101 m_Process->Modified();
102 }
103 };
104
107 void DebugOn() override { this->m_Process->DebugOn(); };
108
111 void DebugOff() override { this->m_Process->DebugOff(); };
112
115 void SetNumberOfThreads(int val) { this->m_Process->SetNumberOfWorkUnits(val); };
116
119 int GetNumberOfThreads() { return this->m_Process->GetNumberOfWorkUnits(); };
120
124 void SetOutput(vtkDataObject* d) override { this->vtkImporter->SetOutput(d); };
125 virtual vtkImageData* GetOutput() { return this->vtkImporter->GetOutput(); };
126 virtual vtkImageData* GetOutput(int idx) { return (vtkImageData*)this->vtkImporter->GetOutput(idx); };
127
130 virtual void SetInput(vtkImageData* Input) { this->vtkCast->SetInputData(Input); };
131
132 void SetInputConnection(vtkAlgorithmOutput* input) override { this->vtkCast->SetInputConnection(input); };
133
134 void SetInputConnection(int port, vtkAlgorithmOutput* input) override { this->vtkCast->SetInputConnection(port, input); };
135
138 virtual vtkDataObject* GetInput() { return (vtkDataObject::SafeDownCast(this->vtkCast->GetInput())); };
139
142 using vtkAlgorithm::Update;
143 void Update() override
144 {
145 this->vtkCast->Update();
146 this->vtkImporter->Update();
147 }
148 void Update(int port) override
149 {
150 this->vtkCast->Update();
151 this->vtkImporter->Update(port);
152 }
154 {
155 if (this->m_Process)
156 {
157 this->UpdateProgress(m_Process->GetProgress());
158 }
159 };
160 void HandleStartEvent() { this->InvokeEvent(vtkCommand::StartEvent, nullptr); };
161 void HandleEndEvent() { this->InvokeEvent(vtkCommand::EndEvent, nullptr); };
163
164protected:
167 void ExecuteData(vtkDataObject*) override { vtkWarningMacro(<< "This filter does not respond to Update(). Doing a GetOutput->Update() instead."); }
169
171 {
173 this->vtkCast = vtkImageCast::New();
174 this->vtkExporter = vtkImageExport::New();
175 this->vtkImporter = vtkImageImport::New();
176 this->vtkExporter->SetInputConnection(this->vtkCast->GetOutputPort());
177 this->m_Process = nullptr;
178 this->m_ProgressCommand = MemberCommand::New();
179 this->m_ProgressCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleProgressEvent);
180 this->m_StartEventCommand = MemberCommand::New();
181 this->m_StartEventCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleStartEvent);
182 this->m_EndEventCommand = MemberCommand::New();
183 this->m_EndEventCommand->SetCallbackFunction(this, &vtkITKImageToImageFilter::HandleEndEvent);
184 };
186 {
187 vtkDebugMacro("Destructing vtkITKImageToImageFilter");
188 this->vtkExporter->Delete();
189 this->vtkImporter->Delete();
190 this->vtkCast->Delete();
191 };
192
194 void LinkITKProgressToVTKProgress(itk::ProcessObject* process)
195 {
196 if (process)
197 {
198 this->m_Process = process;
199 this->m_Process->AddObserver(itk::ProgressEvent(), this->m_ProgressCommand);
200 this->m_Process->AddObserver(itk::StartEvent(), this->m_StartEventCommand);
201 this->m_Process->AddObserver(itk::EndEvent(), this->m_EndEventCommand);
202 }
203 };
204
205 typedef itk::SimpleMemberCommand<vtkITKImageToImageFilter> MemberCommand;
206 typedef MemberCommand::Pointer MemberCommandPointer;
207
208 itk::ProcessObject::Pointer m_Process;
212
215 vtkImageCast* vtkCast;
216 vtkImageImport* vtkImporter;
217 vtkImageExport* vtkExporter;
218
219private:
221 void operator=(const vtkITKImageToImageFilter&) = delete;
222};
223
224#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()