+ if (bbGetInputIn()!=0)
+ {
+ int dim[3];
+ int ext[6];
+ bbGetOutputPlaneX()->GetResliceOutput()->GetWholeExtent(ext);
+ dim[0] = ext[1]-ext[0]+1;
+ dim[1] = ext[3]-ext[2]+1;
+ dim[2] = ext[5]-ext[4]+1;
+ _imageTransform->Identity();
+ _imageTransform->PostMultiply();
+ _imageTransform->Translate( (int)(-(dim[0]/2)) , (int)(-(dim[1]/2)) ,0);
+ _imageTransform->RotateZ(90);
+
+
+ if ( image != bbGetInputIn()){//bbGetInputStatus("In") != bbtk::UPTODATE ){
+ // Input image has changed : reinitialize planes
+ image = bbGetInputIn();
+
+ // Initial values : center of the volume (in real world, not in pixels!)
+ int xMin, xMax, yMin, yMax, zMin, zMax;
+ bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
+ double xSpacing, ySpacing, zSpacing;
+ bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing);
+
+ bbGetOutputPlaneX()->SetInput(bbGetInputIn());
+ bbGetOutputPlaneX()->SetPlaneOrientationToXAxes();
+ bbGetOutputPlaneX()->SetSlicePosition((xMax+xMin)/2.*xSpacing);
+
+ // bbGetOutputPlaneX()->SetOrigin( 58*xSpacing , 80*ySpacing , 82*zSpacing );
+ // bbGetOutputPlaneX()->SetPoint1( 0*xSpacing, 146*ySpacing, 186*zSpacing);
+ // bbGetOutputPlaneX()->SetPoint2( 126*xSpacing, 146*ySpacing, 0*zSpacing);
+
+ bbGetOutputPlaneY()->SetInput(bbGetInputIn());
+ bbGetOutputPlaneY()->SetPlaneOrientationToYAxes();
+ bbGetOutputPlaneY()->SetSlicePosition((yMax+yMin)/2.*ySpacing);
+
+ bbGetOutputPlaneZ()->SetInput(bbGetInputIn());
+ bbGetOutputPlaneZ()->SetPlaneOrientationToZAxes();
+ bbGetOutputPlaneZ()->SetSlicePosition((zMax+zMin)/2.*zSpacing);
+
+ if (bbGetInputWindowLevel()[0]!=0)
+ {
+ bbGetOutputPlaneZ()->SetWindowLevel(bbGetInputWindowLevel()[0],
+ bbGetInputWindowLevel()[1]);
+ } else {
+ double *range = image->GetScalarRange();
+ bbGetOutputPlaneZ()->SetWindowLevel(range[1]-range[0],
+ 0.5*(range[1]+range[0]));
+ } // windowlevel
+ updateInteractor();
+
+ dim[0] = xMax-xMin+1;
+ dim[1] = yMax-yMin+1;
+ dim[2] = zMax-zMin+1;
+ _imageTransform->Identity();
+ _imageTransform->PostMultiply();
+ _imageTransform->Translate( (int)(-(dim[0]/2)*(1/xSpacing)) , (int)(-(dim[2]/2)*(1/zSpacing)) ,0);
+ _imageTransform->RotateZ(90);
+
+ } // image
+
+ // UPDATE DES SORTIES
+ bbGetOutputPlaneX()->SetResliceInterpolate( bbGetInputInterpolation() );
+ bbGetOutputPlaneY()->SetResliceInterpolate( bbGetInputInterpolation() );
+ bbGetOutputPlaneZ()->SetResliceInterpolate( bbGetInputInterpolation() );
+
+
+ bbGetOutputPlaneX()->GetResliceOutput()->Update();
+ bbGetOutputPlaneY()->GetResliceOutput()->Update();
+ bbGetOutputPlaneZ()->GetResliceOutput()->Update();
+
+ std::vector<int> pointsx = bbGetInputPointsX();
+ std::vector<int> pointsy = bbGetInputPointsY();
+ std::vector<int> pointsz = bbGetInputPointsZ();
+
+ //std::cout<<pointsx.size()<<pointsy.size()<<pointsz.size()<<std::endl;
+
+ if (pointsx.size()==pointsy.size() && pointsx.size()==pointsz.size()&&pointsx.size()>=3)
+ {
+
+ //Get the corresponding three points out of the vectors
+ double origin[3];
+ origin[0] = pointsx[0];
+ origin[1] = pointsy[0];
+ origin[2] = pointsz[0];
+
+ double point1[3];
+ point1[0] = pointsx[1];
+ point1[1] = pointsy[1];
+ point1[2] = pointsz[1];
+ double point2[3];
+ point2[0]= pointsx[2];
+ point2[1]= pointsy[2];
+ point2[2]= pointsz[2];
+
+ //With the three points we create the corresponding X, Y and Z vectors all orthogonal to each other
+ double* vect1= getNormal(makeVector(origin, point1));
+ double* vect2= getNormal(makeVector(origin, point2));
+ double* crossp = getCrossProduct(vect1, vect2);
+
+ double *newx = getCrossProduct(vect2, crossp);
+
+ int ext[6],factor=0;
+ bbGetInputIn()->GetExtent(ext);
+
+ factor = ext[0]<ext[3]? ext[3] : ext[0];
+ factor = factor<ext[5]? ext[5] : factor;
+
+ //for the plane widgets
+ vtkImagePlaneWidget* plane3pts = (vtkImagePlaneWidget*)bbGetOutputPlane3Pts();
+ plane3pts->SetInput(bbGetInputIn());
+ double xSpacing, ySpacing, zSpacing;
+ bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing);
+ plane3pts->SetOrigin(pointsx[0]*xSpacing,pointsy[0]*ySpacing,pointsz[0]*zSpacing);
+ plane3pts->SetPoint1((origin[0]+newx[0]*factor)*xSpacing,
+ (origin[1]+newx[1]*factor)*ySpacing,
+ (origin[2]+newx[2]*factor)*zSpacing);
+ plane3pts->SetPoint2((origin[0]+vect2[0]*factor)*xSpacing,
+ (origin[1]+vect2[1]*factor)*ySpacing,
+ (origin[2]+vect2[2]*factor)*zSpacing);
+ plane3pts->GetResliceOutput()->Update();
+//To get the slice of image out of the selected volume
+ if (_imageReslicer==NULL){
+ _imageReslicer = vtkImageReslice::New();
+ _imageReslicer->SetOutputDimensionality(2);
+ _transform = vtkTransform::New();
+ _matrix = vtkMatrix4x4::New();
+ }
+ _imageReslicer->SetInterpolationMode( bbGetInputInterpolation() );
+ _imageReslicer->SetInput( bbGetInputIn() );
+ _imageReslicer->SetInformationInput(bbGetInputIn());
+ //fill out the information with the created vectors and using the spacing of the image
+ _imageReslicer->SetResliceAxesDirectionCosines(newx[0]*xSpacing,newx[1]*xSpacing,newx[2]*xSpacing,
+ vect2[0]*ySpacing,vect2[1]*ySpacing,vect2[2]*ySpacing,
+ crossp[0]*zSpacing,crossp[1]*zSpacing,crossp[2]*zSpacing);
+ _imageReslicer->SetResliceAxesOrigin(origin[0]*xSpacing,origin[1]*ySpacing,origin[2]*zSpacing);
+ _imageReslicer->GetOutput()->Update();
+ _imageReslicer->GetOutput()->UpdateInformation();
+
+ bbSetOutputImage3Pts(_imageReslicer->GetOutput());
+
+ _matrix->Identity();
+
+ _matrix->SetElement(0,0,newx[0]*xSpacing);
+ _matrix->SetElement(1,0,newx[1]*xSpacing);
+ _matrix->SetElement(2,0,newx[2]*xSpacing);
+ _matrix->SetElement(0,1,vect2[0]*ySpacing);
+ _matrix->SetElement(1,1,vect2[1]*ySpacing);
+ _matrix->SetElement(2,1,vect2[2]*ySpacing);
+ _matrix->SetElement(0,2,crossp[0]*zSpacing);
+ _matrix->SetElement(1,2,crossp[1]*zSpacing);
+ _matrix->SetElement(2,2,crossp[2]*zSpacing);
+ _matrix->SetElement(0,3,origin[0]*xSpacing);
+ _matrix->SetElement(1,3,origin[1]*ySpacing);
+ _matrix->SetElement(2,3,origin[2]*zSpacing);
+
+ _transform->SetMatrix(_matrix);
+
+ //set the transformation out to be used by other bbBoxes
+ bbSetOutputTransform3Pts((vtkLinearTransform*)_transform);
+ } // pointsx pointsy pointsz
+ } // bbGetInputIn
+ }
+
+ void ImagePlanes::updateInteractor(){
+
+ vtkRenderWindowInteractor* interactor = bbGetInputInteractor();
+
+ if(interactor){
+ bbGetOutputPlaneX()->SetInteractor(interactor);
+ bbGetOutputPlaneX()->EnabledOn();
+ bbGetOutputPlaneY()->SetInteractor(interactor);
+ bbGetOutputPlaneY()->EnabledOn();
+ bbGetOutputPlaneZ()->SetInteractor(interactor);
+ bbGetOutputPlaneZ()->EnabledOn();
+ bbGetOutputPlane3Pts()->SetInteractor(interactor);
+ bbGetOutputPlane3Pts()->EnabledOn();
+ }
+ }
+ //-----------------------------------------------------------------
+ void vtkImageDataPointerRelay::bbUserSetDefaultValues()
+ {
+
+ }
+
+ //-----------------------------------------------------------------
+ void vtkImageDataPointerRelay::bbUserInitializeProcessing()
+ {
+ }
+
+ //-----------------------------------------------------------------
+ void vtkImageDataPointerRelay::bbUserFinalizeProcessing()
+ {
+ }
+
+ vtkImagePlaneWidget* ImagePlanes::GetPlaneWidget(unsigned char activationkey, double r, double g, double b, vtkCellPicker* picker)
+ {
+ vtkProperty* prop1 = 0;
+ vtkImagePlaneWidget* planeWidget = 0;