void setVTKFilter(medAbstractData* d,typename itk::SphericalHarmonicITKToVTKFilter<SH_IMAGE>::Pointer& filter) { SH_IMAGE* dataset = static_cast<SH_IMAGE*>(d->data()); if (filter) filter->Delete(); filter = itk::SphericalHarmonicITKToVTKFilter<SH_IMAGE>::New(); filter->SetInput(dataset); filter->UpdateOutputInformation(); // This line generates the vtkSHs, otherwise is not generated, even if the next filter // in the pipeline is connected and Update() is called filter->Update(); itk::ImageBase<3>::DirectionType directions = dataset->GetDirection(); itk::ImageBase<3>::PointType origin = dataset->GetOrigin(); orientationMatrix = vtkMatrix4x4::New(); orientationMatrix->Identity(); for (int i=0; i<3; i++) for (int j=0; j<3; j++) orientationMatrix->SetElement (i, j, directions (i,j)); double v_origin[4], v_origin2[4]; for (int i=0; i<3; i++) v_origin[i] = origin[i]; v_origin[3] = 1.0; orientationMatrix->MultiplyPoint (v_origin, v_origin2); for (int i=0; i<3; i++) orientationMatrix->SetElement (i, 3, v_origin[i]-v_origin2[i]); double v_spacing[3]; for (int i=0; i<3; i++) v_spacing[i] = dataset->GetSpacing()[i]; // We need to call this function because GetOutput() just returns the input manager->SetInput(filter->GetVTKSphericalHarmonic()); manager->SetDirectionMatrix(filter->GetDirectionMatrix()); manager->ResetPosition(); const int number = dataset->GetNumberOfComponentsPerPixel(); const int Order = -1.5+std::sqrt((float)(0.25+2*number)); manager->SetOrder(Order); manager->Update(); data = d; if (view) { int dim[3]; manager->GetSphericalHarmonicDimensions(dim); view2d->SetInput(manager->GetSHVisuManagerAxial()->GetActor(), view->layer(data), orientationMatrix, dim, v_spacing, v_origin); view2d->SetInput(manager->GetSHVisuManagerSagittal()->GetActor(), view->layer(data), orientationMatrix, dim, v_spacing, v_origin); view2d->SetInput(manager->GetSHVisuManagerCoronal()->GetActor(), view->layer(data), orientationMatrix, dim, v_spacing, v_origin); } }
void setVTKFilter(medAbstractData* d,typename itk::SphericalHarmonicITKToVTKFilter<SH_IMAGE>::Pointer& filter) { SH_IMAGE* dataset = static_cast<SH_IMAGE*>(d->data()); if (filter) filter->Delete(); filter = itk::SphericalHarmonicITKToVTKFilter<SH_IMAGE>::New(); filter->SetInput(dataset); // This line generates the vtkSHs, otherwise is not generated, even if the next filter // in the pipeline is connected and Update() is called filter->Update(); // We need to call this function because GetOutput() just returns the input manager->SetInput(filter->GetVTKSphericalHarmonic()); manager->SetMatrixT(filter->GetDirectionMatrix()); //TODO:JGG This has to be changed the order has to be a property saved inside the image const int number = dataset->GetNumberOfComponentsPerPixel(); const int Order = -1.5+std::sqrt((float)(0.25+2*number)); manager->SetOrder(Order); manager->Update(); data = d; }