]> Creatis software - clitk.git/blob - vv/vvMeshActor.cxx
Merge branch 'master' of /home/romulo/creatis/clitk3-git-shared/clitk3
[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://www.centreleonberard.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(0), 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   case 0:
80     mMarching->SetImageRange(mask_slice,mask_slice,0,dims[1],0,dims[2]);
81     break;
82   case 1:
83     mMarching->SetImageRange(0,dims[0],mask_slice,mask_slice,0,dims[2]);
84     break;
85   case 2:
86     mMarching->SetImageRange(0,dims[0],0,dims[1],mask_slice,mask_slice);
87     break;
88   default:
89     assert(false);
90   }
91   mMarching->Update();
92 }
93
94 void vvMeshActor::SetTimeSlice(int time)
95 {
96   mTimeSlice=time;
97   if (static_cast<unsigned int>(time)<mMesh->GetNumberOfMasks())
98     mMarching->SetInput(mMesh->GetMask(time));
99   else
100     mMarching->SetInput(mMesh->GetMask(0));
101   SetCutSlice(mCutSlice); //We need to find the new mask cut slice,
102   //since masks do not all have the same origin
103 }
104
105 void vvMeshActor::SetSlicingOrientation(unsigned int d)
106 {
107   mCutDimension=d;
108 }
109
110 void vvMeshActor::ToggleSuperposition()
111 {
112   DD("Warning: superposition not implemented");
113   // std::cout << "vvMeshActor::ToggleSuperposition size = " << mMeshes.size() << std::endl;
114   if (! mSuperpostionMode && mMesh->GetNumberOfMeshes() > 1) {
115     mSuperpostionMode=true;
116   } else {
117     mSuperpostionMode=false;
118   }
119 }