]> Creatis software - clitk.git/blob - vv/vvImageContour.cxx
removed headers
[clitk.git] / vv / vvImageContour.cxx
1 #include "vvImageContour.h"
2 #include <vtkImageActor.h>
3 #include <vtkCamera.h>
4 #include <vtkRenderer.h>
5 #include <vtkMarchingSquares.h>
6 #include <vtkImageClip.h>
7 #include <vtkImageData.h>
8 #include <vtkPolyDataMapper.h>
9 #include <vtkProperty.h>
10
11 //------------------------------------------------------------------------------
12 vvImageContour::vvImageContour() {
13   mTSlice = -1;
14   mSlice = 0;
15 }
16 //------------------------------------------------------------------------------
17
18
19 //------------------------------------------------------------------------------
20 vvImageContour::~vvImageContour() {
21   for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
22     mSlicer->GetRenderer()->RemoveActor(mSquaresActorList[i]);
23   }
24   mSquaresActorList.clear();
25   mSquaresList.clear();
26   mClipperList.clear();
27 }
28 //------------------------------------------------------------------------------
29
30
31 //------------------------------------------------------------------------------
32 void vvImageContour::setSlicer(vvSlicer * slicer) {
33   mSlicer = slicer;  
34
35   for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
36     vtkImageClip * mClipper = vtkImageClip::New();
37     vtkMarchingSquares * mSquares = vtkMarchingSquares::New();
38     vtkPolyDataMapper * mSquaresMapper = vtkPolyDataMapper::New();
39     vtkActor * mSquaresActor = vtkActor::New();
40
41     mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);
42     mSquares->SetInput(mClipper->GetOutput());
43     mSquaresMapper->SetInput(mSquares->GetOutput());
44     mSquaresMapper->ScalarVisibilityOff();
45     mSquaresActor->SetMapper(mSquaresMapper);
46     mSquaresActor->GetProperty()->SetColor(1.0,0,0);
47     mSquaresActor->SetPickable(0);
48     mSquaresActor->VisibilityOff();
49     mSlicer->GetRenderer()->AddActor(mSquaresActor);
50     
51     mSquaresActorList.push_back(mSquaresActor);
52     mSquaresList.push_back(mSquares);
53     mClipperList.push_back(mClipper);
54   }
55 }
56 //------------------------------------------------------------------------------
57
58
59 //------------------------------------------------------------------------------
60 void vvImageContour::setColor(double r, double g, double b) {
61   for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
62     mSquaresActorList[i]->GetProperty()->SetColor(r,g,b);
63   }
64 }
65 //------------------------------------------------------------------------------
66
67
68 //------------------------------------------------------------------------------
69 void vvImageContour::hideActors() {
70   if (!mSlicer) return;
71   mSlice = mSlicer->GetSlice();
72   for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
73     mSquaresActorList[i]->VisibilityOff();
74   }
75 }
76 //------------------------------------------------------------------------------
77
78   
79 //------------------------------------------------------------------------------
80 void vvImageContour::showActors() {
81   if (!mSlicer) return;
82   mSlice = mSlicer->GetSlice();
83   mTSlice = mSlicer->GetTSlice();
84   //  for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
85   mSquaresActorList[mTSlice]->VisibilityOn();
86   update(mValue);
87   //}
88 }
89 //------------------------------------------------------------------------------
90
91   
92 //------------------------------------------------------------------------------
93 void vvImageContour::update(double value) {
94   mValue= value;
95   if (!mSlicer) return;
96
97   // how to not update if not visible ?
98
99   mSlice = mSlicer->GetSlice();
100   // Only change actor visibility if tslice change
101   if (mTSlice != mSlicer->GetTSlice()) {
102     if (mTSlice != -1) 
103       mSquaresActorList[mTSlice]->VisibilityOff();
104     mTSlice = mSlicer->GetTSlice();
105     mSquaresActorList[mTSlice]->VisibilityOn();
106   }
107   
108   vtkMarchingSquares * mSquares = mSquaresList[mTSlice];
109   vtkImageClip * mClipper = mClipperList[mTSlice];
110   vtkActor * mSquaresActor = mSquaresActorList[mTSlice];
111
112   // Do it
113   mSquares->SetValue(0,value);
114
115   int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
116   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],
117                                  extent[3],extent[4],extent[5]);
118   int i;
119   for (i = 0; i < 6;i = i+2) {
120     if (extent[i] == extent[i+1]) {
121       break;
122     }
123   }
124   
125   switch (i)
126     {
127     case 0:
128       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > mSlice)
129         {
130           mSquaresActor->SetPosition(1,0,0);
131         }
132       else
133         {
134           mSquaresActor->SetPosition(-1,0,0);
135         }
136       break;
137     case 2:
138       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > mSlice)
139         {
140           mSquaresActor->SetPosition(0,1,0);
141         }
142       else
143         {
144           mSquaresActor->SetPosition(0,-1,0);
145         }
146       break;
147     case 4:
148       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > mSlice)
149         {
150           mSquaresActor->SetPosition(0,0,1);
151         }
152       else
153         {
154           mSquaresActor->SetPosition(0,0,-1);
155         }
156       break;
157     }
158   mSquares->Update();
159 }
160 //------------------------------------------------------------------------------
161