87 #include <vtkPlaneWidget.h>
88 #include <vtkImageReslice.h>
89 #include <vtkImageData.h>
107 vtkPlaneWidget *widget = vtkPlaneWidget::SafeDownCast(caller);
114 vtkImageData *imageData = vtkImageData::SafeDownCast( widget->GetInput() );
118 this->
Reslice->SetInput (NULL);
122 this->
Reslice->SetInput (imageData);
125 imageData->UpdateInformation();
127 imageData->GetSpacing(spacing);
130 imageData->GetOrigin(imOrigin);
132 imageData->GetWholeExtent(extent);
133 double bounds[] = { imOrigin[0] + spacing[0] * extent[0],
134 imOrigin[0] + spacing[0] * extent[1],
135 imOrigin[1] + spacing[1] * extent[2],
136 imOrigin[1] + spacing[1] * extent[3],
137 imOrigin[2] + spacing[2] * extent[4],
138 imOrigin[2] + spacing[2] * extent[5] };
142 for ( i = 0; i <= 4; i += 2 )
144 if ( bounds[i] > bounds[i + 1] )
146 double t = bounds[i + 1];
147 bounds[i + 1] = bounds[i];
152 double abs_normal[3];
153 widget->GetNormal(abs_normal);
154 double planeCenter[3];
155 widget->GetCenter(planeCenter);
158 for ( i = 0; i < 3; i++ )
160 abs_normal[i] = fabs(abs_normal[i]);
161 if ( abs_normal[i] > nmax )
163 nmax = abs_normal[i];
171 if ( planeCenter[k] > bounds[2 * k + 1] )
173 planeCenter[k] = bounds[2 * k + 1];
175 else if ( planeCenter[k] < bounds[2 * k] )
177 planeCenter[k] = bounds[2 * k];
180 widget->SetCenter(planeCenter);
183 double point1[3], point2[3], origin[4], normal[3];
184 widget->GetPoint1 (point1);
185 widget->GetPoint2 (point2);
186 widget->GetOrigin (origin);
187 widget->GetNormal (normal);
189 double axis1[3], axis2[3];
190 for ( i = 0; i < 3; i++ )
192 axis1[i] = point1[i] - origin[i];
193 axis2[i] = point2[i] - origin[i];
196 double planeSizeX = vtkMath::Normalize(axis1);
197 double planeSizeY = vtkMath::Normalize(axis2);
200 for ( i = 0; i < 3; i++ )
208 double originXYZW[4];
209 this->
ResliceAxes->MultiplyPoint(origin, originXYZW);
212 double neworiginXYZW[4];
213 double point[] = { originXYZW[0], originXYZW[1], originXYZW[2], originXYZW[3] };
214 this->
ResliceAxes->MultiplyPoint(point, neworiginXYZW);
216 this->
ResliceAxes->SetElement(0, 3, neworiginXYZW[0]);
217 this->
ResliceAxes->SetElement(1, 3, neworiginXYZW[1]);
218 this->
ResliceAxes->SetElement(2, 3, neworiginXYZW[2]);
221 this->
Reslice->SetInterpolationModeToLinear();
222 this->
Reslice->SetOutputSpacing (1.0, 1.0, 1.0);
223 this->
Reslice->SetOutputOrigin (0, 0, 0);
224 this->
Reslice->SetOutputExtent (0, static_cast< int >( planeSizeX ) - 1,
225 0, static_cast< int >( planeSizeY ) - 1,
virtual void Execute(vtkObject *caller, unsigned long, void *)
vtkImageReslice * Reslice
vtkMatrix4x4 * ResliceAxes