1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include "vvImageContour.h"
19 #include <vtkImageActor.h>
20 #include <vtkCamera.h>
21 #include <vtkRenderer.h>
22 #include <vtkMarchingSquares.h>
23 #include <vtkImageClip.h>
24 #include <vtkImageData.h>
25 #include <vtkPolyDataMapper.h>
26 #include <vtkProperty.h>
28 //------------------------------------------------------------------------------
29 vvImageContour::vvImageContour() {
33 //------------------------------------------------------------------------------
36 //------------------------------------------------------------------------------
37 vvImageContour::~vvImageContour() {
38 for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
39 mSlicer->GetRenderer()->RemoveActor(mSquaresActorList[i]);
41 mSquaresActorList.clear();
45 //------------------------------------------------------------------------------
48 //------------------------------------------------------------------------------
49 void vvImageContour::setSlicer(vvSlicer * slicer) {
52 for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
53 vtkImageClip * mClipper = vtkImageClip::New();
54 vtkMarchingSquares * mSquares = vtkMarchingSquares::New();
55 vtkPolyDataMapper * mSquaresMapper = vtkPolyDataMapper::New();
56 vtkActor * mSquaresActor = vtkActor::New();
58 mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);
59 mSquares->SetInput(mClipper->GetOutput());
60 mSquaresMapper->SetInput(mSquares->GetOutput());
61 mSquaresMapper->ScalarVisibilityOff();
62 mSquaresActor->SetMapper(mSquaresMapper);
63 mSquaresActor->GetProperty()->SetColor(1.0,0,0);
64 mSquaresActor->SetPickable(0);
65 mSquaresActor->VisibilityOff();
66 mSlicer->GetRenderer()->AddActor(mSquaresActor);
68 mSquaresActorList.push_back(mSquaresActor);
69 mSquaresList.push_back(mSquares);
70 mClipperList.push_back(mClipper);
73 //------------------------------------------------------------------------------
76 //------------------------------------------------------------------------------
77 void vvImageContour::setColor(double r, double g, double b) {
78 for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
79 mSquaresActorList[i]->GetProperty()->SetColor(r,g,b);
82 //------------------------------------------------------------------------------
85 //------------------------------------------------------------------------------
86 void vvImageContour::hideActors() {
88 mSlice = mSlicer->GetSlice();
89 for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
90 mSquaresActorList[i]->VisibilityOff();
93 //------------------------------------------------------------------------------
96 //------------------------------------------------------------------------------
97 void vvImageContour::showActors() {
99 mSlice = mSlicer->GetSlice();
100 mTSlice = mSlicer->GetTSlice();
101 // for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
102 mSquaresActorList[mTSlice]->VisibilityOn();
106 //------------------------------------------------------------------------------
109 //------------------------------------------------------------------------------
110 void vvImageContour::update(double value) {
112 if (!mSlicer) return;
114 // how to not update if not visible ?
116 mSlice = mSlicer->GetSlice();
117 // Only change actor visibility if tslice change
118 if (mTSlice != mSlicer->GetTSlice()) {
120 mSquaresActorList[mTSlice]->VisibilityOff();
121 mTSlice = mSlicer->GetTSlice();
122 mSquaresActorList[mTSlice]->VisibilityOn();
125 vtkMarchingSquares * mSquares = mSquaresList[mTSlice];
126 vtkImageClip * mClipper = mClipperList[mTSlice];
127 vtkActor * mSquaresActor = mSquaresActorList[mTSlice];
130 mSquares->SetValue(0,value);
132 int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
133 mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],
134 extent[3],extent[4],extent[5]);
136 for (i = 0; i < 6;i = i+2) {
137 if (extent[i] == extent[i+1]) {
145 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > mSlice)
147 mSquaresActor->SetPosition(1,0,0);
151 mSquaresActor->SetPosition(-1,0,0);
155 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > mSlice)
157 mSquaresActor->SetPosition(0,1,0);
161 mSquaresActor->SetPosition(0,-1,0);
165 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > mSlice)
167 mSquaresActor->SetPosition(0,0,1);
171 mSquaresActor->SetPosition(0,0,-1);
177 //------------------------------------------------------------------------------