]> Creatis software - clitk.git/blob - vv/vvMeshActor.cxx
added the new headers
[clitk.git] / vv / vvMeshActor.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
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
8
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.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include "vvMeshActor.h"
19 #include "clitkCommon.h"
20 #include <vtkPolyDataMapper.h>
21 #include <vtkMarchingSquares.h>
22 #include <vtkImageData.h>
23 #include <vtkPlane.h>
24 #include <vtkProperty.h>
25 #include <vtkActor.h>
26 #include <cassert>
27
28 vvMeshActor::vvMeshActor() :
29     mCutDimension(NULL), mMesh(NULL),
30     mMarching(NULL), mMapper(NULL),
31     mActor(NULL),
32     mSuperpostionMode(false), mTimeSlice(0)
33 {}
34
35 vvMeshActor::~vvMeshActor()
36 {
37     mMarching->Delete();
38     mMapper->Delete();
39     mActor->Delete();
40 }
41
42 void vvMeshActor::Init(vvMesh::Pointer mesh,int time_slice,vvImage::Pointer vf)
43 {
44     mMesh=mesh;
45
46     mMarching=vtkMarchingSquares::New();
47     mTimeSlice=time_slice;
48     if (static_cast<unsigned int>(time_slice)<mMesh->GetNumberOfMeshes())
49         mMarching->SetInput(mMesh->GetMask(time_slice));
50     else
51         mMarching->SetInput(mMesh->GetMask(0));
52     mMarching->SetValue(0,0.5);
53     //mMarching->Update();
54
55     mMapper=vtkPolyDataMapper::New();
56     mMapper->SetInput(mMarching->GetOutput());
57     //The following line allows to display the contour over the image 
58     //(http://www.nabble.com/What-happens-when-two-actors-are-at-the-same-depth--td23175458.html)
59     vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
60     mActor=vtkActor::New();
61     mActor->SetMapper(mMapper);
62     mActor->SetPickable(false);
63     mActor->GetProperty()->EdgeVisibilityOn();
64     mActor->GetProperty()->SetEdgeColor(mMesh->r,mMesh->g,mMesh->b);
65     mActor->GetProperty()->SetLineWidth(2.);
66 }
67
68 void vvMeshActor::SetCutSlice(double slice)
69 {
70     mCutSlice=slice;
71     vtkImageData* mask;
72     if (static_cast<unsigned int>(mTimeSlice)<mMesh->GetNumberOfMasks())
73         mask=mMesh->GetMask(mTimeSlice);
74     else
75         mask=mMesh->GetMask(0);
76     int* dims=mask->GetDimensions(); 
77     int mask_slice=(slice-mask->GetOrigin()[mCutDimension])/mask->GetSpacing()[mCutDimension];
78     switch (mCutDimension)
79     {
80         case 0:
81             mMarching->SetImageRange(mask_slice,mask_slice,0,dims[1],0,dims[2]);
82             break;
83         case 1:
84             mMarching->SetImageRange(0,dims[0],mask_slice,mask_slice,0,dims[2]);
85             break;
86         case 2:
87             mMarching->SetImageRange(0,dims[0],0,dims[1],mask_slice,mask_slice);
88             break;
89         default:
90             assert(false);
91     }
92     mMarching->Update();
93 }
94
95 void vvMeshActor::SetTimeSlice(int time)
96 {
97     mTimeSlice=time;
98     if (static_cast<unsigned int>(time)<mMesh->GetNumberOfMasks())
99         mMarching->SetInput(mMesh->GetMask(time));
100     else
101         mMarching->SetInput(mMesh->GetMask(0));
102     SetCutSlice(mCutSlice); //We need to find the new mask cut slice,
103     //since masks do not all have the same origin
104 }
105
106 void vvMeshActor::SetSlicingOrientation(unsigned int d)
107 {
108     mCutDimension=d;
109 }
110
111 void vvMeshActor::ToggleSuperposition()
112 {
113     DD("Warning: superposition not implemented");
114   // std::cout << "vvMeshActor::ToggleSuperposition size = " << mMeshes.size() << std::endl;
115     if (! mSuperpostionMode && mMesh->GetNumberOfMeshes() > 1)
116     {
117         mSuperpostionMode=true;
118     }
119     else
120     {
121         mSuperpostionMode=false;
122     }
123 }