1 #include "MacheteFilter.h"
3 #include <cpPlugins/Interface/DataObject.h>
4 #include <cpPlugins/Interface/Image.h>
5 #include <cpPlugins/Interface/Mesh.h>
7 #include <cpExtensions/Interaction/ImageInteractorStyle.h>
9 #include <itkPlaneSpatialObject.h>
11 #include <itkSpatialObjectToImageFilter.h>
12 #include <itkVector.h>
14 #include <vtkInteractorStyleSwitch.h>
15 #include <vtkPlaneWidget.h>
16 #include <vtkRenderWindowInteractor.h>
18 // -------------------------------------------------------------------------
19 cpPlugins::BasicFilters::MacheteFilter::
20 DialogResult cpPlugins::BasicFilters::MacheteFilter::
21 ExecConfigurationDialog( QWidget* parent )
23 typedef cpExtensions::Interaction::ImageInteractorStyle _TImageStyle;
25 // Choose a valid 3D interactor
26 vtkRenderWindowInteractor* iren = NULL;
27 auto iIt = this->m_Interactors.begin( );
28 for( ; iIt != this->m_Interactors.end( ) && iren == NULL; ++iIt )
30 _TImageStyle* istyle =
31 dynamic_cast< _TImageStyle* >(
32 ( *iIt )->GetInteractorStyle( )
39 return( Self::DialogResult_Cancel );
43 cpPlugins::Interface::Image* image =
44 this->GetInput< cpPlugins::Interface::Image >( "Input" );
45 bool input_found = false;
48 image->GetVTK< vtkImageData >( )->GetBounds( bbox );
52 cpPlugins::Interface::Mesh* mesh =
53 this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
56 mesh->GetVTK< vtkPolyData >( )->GetBounds( bbox );
61 return( Self::DialogResult_Cancel );
63 // Create plane widget
64 if( this->m_PlaneWidget != NULL )
65 this->m_PlaneWidget->Delete( );
66 this->m_PlaneWidget = vtkPlaneWidget::New( );
67 this->m_PlaneWidget->NormalToXAxisOn( );
68 this->m_PlaneWidget->SetCenter(
69 ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
70 ( bbox[ 3 ] + bbox[ 2 ] ) * double( 0.5 ),
71 ( bbox[ 5 ] + bbox[ 4 ] ) * double( 0.5 )
73 this->m_PlaneWidget->SetOrigin(
74 ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
78 this->m_PlaneWidget->SetPoint1(
79 ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
83 this->m_PlaneWidget->SetPoint2(
84 ( bbox[ 1 ] + bbox[ 0 ] ) * double( 0.5 ),
88 this->m_PlaneWidget->SetResolution( 15 );
89 this->m_PlaneWidget->SetRepresentationToWireframe( );
90 this->m_PlaneWidget->SetInteractor( iren );
91 this->m_PlaneWidget->PlaceWidget( );
92 this->m_PlaneWidget->On( );
94 return( Self::DialogResult_Modal );
97 // -------------------------------------------------------------------------
98 cpPlugins::BasicFilters::MacheteFilter::
101 m_PlaneWidget( NULL )
103 this->_AddInput( "Input" );
104 this->_MakeOutput< cpPlugins::Interface::DataObject >( "Output" );
106 itk::Point< double, 3 > center;
107 itk::Vector< double, 3 > normal;
109 center.Fill( double( 0 ) );
110 normal.Fill( double( 0 ) );
111 normal[ 0 ] = double( 1 );
113 this->m_Parameters->ConfigureAsPoint( "PlaneCenter", 3, center );
114 this->m_Parameters->ConfigureAsVector( "PlaneNormal", 3, normal );
117 // -------------------------------------------------------------------------
118 cpPlugins::BasicFilters::MacheteFilter::
121 if( this->m_PlaneWidget != NULL )
122 this->m_PlaneWidget->Delete( );
125 // -------------------------------------------------------------------------
126 std::string cpPlugins::BasicFilters::MacheteFilter::
129 cpPlugins::Interface::Image* image =
130 this->GetInput< cpPlugins::Interface::Image >( "Input" );
132 return( this->_FromImage( image ) );
133 cpPlugins::Interface::Mesh* mesh =
134 this->GetInput< cpPlugins::Interface::Mesh >( "Input" );
136 return( this->_FromMesh( mesh ) );
137 return( "MacheteFilter: No valid input." );
140 // -------------------------------------------------------------------------
141 std::string cpPlugins::BasicFilters::MacheteFilter::
142 _FromImage( cpPlugins::Interface::Image* image )
144 itk::DataObject* itk_image = NULL;
146 cpPlugins_Image_Demangle_AllScalarTypes( 2, image, itk_image, r, _RealImage );
147 else cpPlugins_Image_Demangle_AllScalarTypes( 3, image, itk_image, r, _RealImage );
148 else r = "MacheteFilter: Input image type not supported.";
152 // -------------------------------------------------------------------------
153 std::string cpPlugins::BasicFilters::MacheteFilter::
154 _FromMesh( cpPlugins::Interface::Mesh* mesh )
159 #include <itkImageFileWriter.h>
161 // -------------------------------------------------------------------------
163 std::string cpPlugins::BasicFilters::MacheteFilter::
164 _RealImage( itk::DataObject* dobj )
166 typedef typename I::PixelType _TPixel;
167 typedef itk::PlaneSpatialObject< I::ImageDimension > _TPlane;
168 typedef itk::SpatialObjectToImageFilter< _TPlane, I > _TMaskFilter;
170 I* image = dynamic_cast< I* >( dobj );
172 typename _TMaskFilter::Pointer mask = _TMaskFilter::New( );
173 mask->SetDirection( image->GetDirection( ) );
174 mask->SetOrigin( image->GetOrigin( ) );
175 mask->SetSize( image->GetRequestedRegion( ).GetSize( ) );
176 mask->SetSpacing( image->GetSpacing( ) );
177 mask->SetInsideValue( _TPixel( 1 ) );
178 mask->SetOutsideValue( _TPixel( 0 ) );
180 typename itk::ImageFileWriter< I >::Pointer w =
181 itk::ImageFileWriter< I >::New( );
182 w->SetInput( mask->GetOutput( ) );
183 w->SetFileName( "mask.mhd" );