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