1 #include "wxVtkMPR2DView.h"
3 #include "vtkInteractorStyleBaseView.h"
5 #include "vtkCellArray.h"
7 wxVtkMPR2DView::wxVtkMPR2DView( wxWindow *parent, int direction)
8 :wxVtk2DBaseView(parent)
13 _direction = direction;
22 _interactorstylemprview = NULL;
25 //-------------------------------------------------------------------
26 wxVtkMPR2DView::~wxVtkMPR2DView()
28 if (_ptsA!=NULL) { _ptsA -> Delete(); }
29 if (_lineAActor!=NULL) { _lineAActor -> Delete(); }
30 if (_lineAMapper!=NULL) { _lineAMapper -> Delete(); }
31 if (_pdA!=NULL) { _pdA -> Delete(); }
32 if (_ptsB!=NULL) { _ptsB -> Delete(); }
33 if (_lineBActor!=NULL) { _lineBActor -> Delete(); }
34 if (_lineBMapper!=NULL) { _lineBMapper -> Delete(); }
35 if (_pdB!=NULL) { _pdB -> Delete(); }
37 //-------------------------------------------------------------------
38 vtkMPRBaseData *wxVtkMPR2DView::GetVtkmprbasedata()
40 return (vtkMPRBaseData*)GetVtkBaseData();
42 //-------------------------------------------------------------------
43 void wxVtkMPR2DView::Configure(){
44 wxVtk2DBaseView::Configure();
47 int x1,x2,y1,y2,z1,z2;
48 GetVtkmprbasedata() -> GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
51 vtkImageData* img = GetVtkmprbasedata()->GetImageData();
52 if(_interactorstylemprview==NULL)
54 _interactorstylemprview = new vtkInteractorStyleMPRView();
55 ((vtkInteractorStyleBaseView*)GetInteractorStyleBaseView())->AddInteractorStyleMaracas( _interactorstylemprview );
59 double* origin = img->GetOrigin();
60 img->GetExtent(x1,x2,y1,y2,z1,z2);
68 x1 = (int)(x1*spc[0]);
69 y1 = (int)(y1*spc[1]);
70 z1 = (int)(z1*spc[2]);
72 x2 = (int)(x2*spc[0]);
73 y2 = (int)(y2*spc[1]);
74 z2 = (int)(z2*spc[2]);
83 if(_lineAActor==NULL){
84 _lineAActor = vtkActor::New();
85 _lineAActor->GetProperty()->SetDiffuseColor(1,0,0);
86 _lineAActor->GetProperty()->SetLineWidth(2);
88 _ptsA = vtkPoints::New();
89 _ptsA->SetNumberOfPoints(2);
90 _ptsA->SetPoint(0, -1000 , -1000 , -1000 );
91 _ptsA->SetPoint(1, 1000 , 1000 , 1000 );
93 _pdA = vtkPolyData::New();
95 _lineAMapper = vtkPolyDataMapper::New();
97 _lineAMapper->SetInput(_pdA);
98 _lineAMapper->ImmediateModeRenderingOn();
99 _lineAActor->SetMapper(_lineAMapper);
102 vtkCellArray *linesA = vtkCellArray::New();
103 linesA->InsertNextCell(2);
104 linesA->InsertCellPoint(0);
105 linesA->InsertCellPoint(1);
106 _pdA->SetPoints( _ptsA );
107 _pdA->SetLines( linesA );
108 linesA->Delete(); //do not delete lines ??
109 // _lineAActor->GetProperty()->BackfaceCullingOn();
113 if(_lineBActor==NULL){
114 _lineBActor = vtkActor::New();
115 _lineBActor->GetProperty()->SetDiffuseColor(1,0,0);
116 _lineBActor->GetProperty()->SetLineWidth(2);
117 _lineBMapper = vtkPolyDataMapper::New();
118 _lineBActor->SetMapper(_lineBMapper);
120 _ptsB = vtkPoints::New();
121 _ptsB->SetNumberOfPoints(2);
122 _ptsB->SetPoint(0, -1000 , -1000 , -1000 );
123 _ptsB->SetPoint(1, 1000 , 1000 , 1000 );
125 // _lineBActor->GetProperty()->BackfaceCullingOn();
128 vtkCellArray *linesB;
129 linesB = vtkCellArray::New();
130 linesB->InsertNextCell(2);
131 linesB->InsertCellPoint(0);
132 linesB->InsertCellPoint(1);
133 _pdB = vtkPolyData::New();
134 _pdB->SetPoints( _ptsB );
135 _pdB->SetLines( linesB );
136 linesB->Delete(); //do not delete lines ??
139 _lineBMapper->SetInput(_pdB);
140 _lineBMapper->ImmediateModeRenderingOn();
143 if(_imageViewer2XYZ){
144 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
145 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
146 vtkCamera *camera =_imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->GetActiveCamera();
151 camera->SetViewUp ( 0 , -1 , 0 );
152 camera->SetPosition ( -10000,(y1+y2)/2 , (z1+z2)/2 );
153 camera->SetFocalPoint ( 0 , (y1+y2)/2 , (z1+z2)/2 );
154 camera->SetParallelScale( (z2-z1)/3.0 );
158 camera->SetViewUp ( 0 , 0 , -1 );
159 camera->SetPosition ((x1+x2)/2 , 10000 , (z1+z2)/2 );
160 camera->SetFocalPoint ((x1+x2)/2 , 0 , (z1+z2)/2 );
161 camera->SetParallelScale( (x2-x1)/3.0 );
165 camera->SetViewUp ( 0 , -1 , 0 );
166 camera->SetPosition ((x1+x2)/2 , (y1+y2)/2 , -10000);
167 camera->SetFocalPoint ((x1+x2)/2 , (y1+y2)/2 , 0 );
168 camera->SetParallelScale( (x2-x1)/3.0 );
172 if (_direction==0) { // YZ
173 camera->SetViewUp ( 0 , 1 , 0 );
174 camera->SetPosition ( 10000,(y1+y2)/2 , (z1+z2)/2 );
175 camera->SetFocalPoint ( 0 , (y1+y2)/2 , (z1+z2)/2 );
176 camera->SetParallelScale( (z2-z1)/3.0 );
179 if (_direction==1) { // XZ
180 camera->SetViewUp ( 0 , 0 , -1 );
181 camera->SetPosition ((x1+x2)/2 , 10000 , (z1+z2)/2 );
182 camera->SetFocalPoint ((x1+x2)/2 , 0 , (z1+z2)/2 );
183 camera->SetParallelScale( (x2-x1)/3.0 );
186 if (_direction==2) { // XY
187 camera->SetViewUp ( 0 , 1 , 0 );
188 camera->SetPosition ((x1+x2)/2 , (y1+y2)/2 , 10000);
189 camera->SetFocalPoint ((x1+x2)/2 , (y1+y2)/2 , 0 );
190 camera->SetParallelScale( (x2-x1)/3.0 );
194 // _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow (160);
195 // _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel (800);
200 void wxVtkMPR2DView::SetVisibleAxis(bool ok)
202 if (ok!=_visibleAxis)
205 if (_visibleAxis==true)
207 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineAActor );
208 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->AddActor( _lineBActor );
210 if (_visibleAxis==false)
212 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineAActor );
213 _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer()->RemoveActor( _lineBActor );
219 //-------------------------------------------------------------------
220 void wxVtkMPR2DView::Refresh()
224 //wxVtk2DBaseView::Refresh();
227 //vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2(); // JPRx
228 //vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera(); // JPRx
231 int x1 = 0,x2 = 0,y1 = 0,y2 = 0,z1 = 0,z2 = 0;
232 int x = 0, y = 0, z = 0;
233 int xx = 0, yy = 0, zz = 0;
238 //GetVtkmprbasedata()->GetDimensionExtention(&x1,&x2,&y1,&y2,&z1,&z2);
241 vtkImageData* img = GetVtkmprbasedata()->GetImageData();
243 origin = img->GetOrigin();
244 img->GetExtent(x1,x2,y1,y2,z1,z2);
245 spc = img->GetSpacing();
252 x1 = (int)(x1*spc[0]);
253 y1 = (int)(y1*spc[1]);
254 z1 = (int)(z1*spc[2]);
256 x2 = (int)(x2*spc[0]);
257 y2 = (int)(y2*spc[1]);
258 z2 = (int)(z2*spc[2]);
260 xx = (int)(GetVtkmprbasedata()->GetX());
261 yy = (int)(GetVtkmprbasedata()->GetY());
262 zz = (int)(GetVtkmprbasedata()->GetZ());
264 x = round(xx*spc[0]);
265 y = round(yy*spc[1]);
266 z = round(zz*spc[2]);
268 if ((xx!=_backX) || (yy!=_backY) || (zz!=_backZ)) {
270 if (_direction==0) { // YZ
272 _imageViewer2XYZ->SetXSlice( (int)(GetVtkmprbasedata()->GetX()) );
273 _ptsA->SetPoint(0, x2, y1 , z );
274 _ptsA->SetPoint(1, x2, y2 , z );
275 _ptsB->SetPoint(0, x2, y , z1);
276 _ptsB->SetPoint(1, x2, y , z2);
278 if (_direction==1) { // XZ
280 _imageViewer2XYZ->SetYSlice( (int)(GetVtkmprbasedata()->GetY()) );
281 _ptsA->SetPoint(0, x1 , y2 , z );
282 _ptsA->SetPoint(1, x2 , y2 , z );
283 _ptsB->SetPoint(0, x , y2 , z1);
284 _ptsB->SetPoint(1, x , y2 , z2);
286 if (_direction==2) { // XY
288 _imageViewer2XYZ->SetZSlice( (int)(GetVtkmprbasedata()->GetZ()) );
289 // _ptsA->SetPoint(0, x1 , y , -z2 );
290 // _ptsA->SetPoint(1, x2 , y , -z2 );
291 // _ptsB->SetPoint(0, x , y1, -z2 );
292 // _ptsB->SetPoint(1, x , y2, -z2 );
294 _ptsA->SetPoint(0, x1 , y , z2 );
295 _ptsA->SetPoint(1, x2 , y , z2 );
296 _ptsB->SetPoint(0, x , y1, z2 );
297 _ptsB->SetPoint(1, x , y2, z2 );
305 _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel()->Modified();
307 wxVtkBaseView::Refresh();
310 //-------------------------------------------------------------------
311 int wxVtkMPR2DView::GetActualSlice() // virtual
316 result = (int)(GetVtkmprbasedata()->GetX());
320 result = (int)(GetVtkmprbasedata()->GetY());
324 result = (int)(GetVtkmprbasedata()->GetZ());
328 //-------------------------------------------------------------------
329 void wxVtkMPR2DView::SetActualSlice(int slice) // virtual
333 GetVtkmprbasedata()->SetX(slice);
337 GetVtkmprbasedata()->SetY(slice);
341 GetVtkmprbasedata()->SetZ(slice);
344 //-------------------------------------------------------------------
345 bool wxVtkMPR2DView::IfMouseTouchX(double x, double y, double z)
354 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
361 if (( x<GetVtkmprbasedata()->GetX()+delta ) && ( x>GetVtkmprbasedata()->GetX()-delta ))
368 //-------------------------------------------------------------------
369 bool wxVtkMPR2DView::IfMouseTouchY(double x, double y, double z)
375 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
385 if (( y<GetVtkmprbasedata()->GetY()+delta ) && ( y>GetVtkmprbasedata()->GetY()-delta ))
392 //-------------------------------------------------------------------
393 bool wxVtkMPR2DView::IfMouseTouchZ(double x, double y, double z)
399 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
406 if (( z<GetVtkmprbasedata()->GetZ()+delta ) && ( z>GetVtkmprbasedata()->GetZ()-delta ))
416 //-------------------------------------------------------------------
417 void wxVtkMPR2DView::MoveX(double x, double y, double z)
424 GetVtkmprbasedata()->SetX(x);
428 GetVtkmprbasedata()->SetX(x);
431 //-------------------------------------------------------------------
432 void wxVtkMPR2DView::MoveY(double x, double y, double z)
436 GetVtkmprbasedata()->SetY(y);
443 GetVtkmprbasedata()->SetY(y);
446 //-------------------------------------------------------------------
447 void wxVtkMPR2DView::MoveZ(double x, double y, double z)
451 GetVtkmprbasedata()->SetZ(z);
455 GetVtkmprbasedata()->SetZ(z);
461 //-------------------------------------------------------------------
462 void wxVtkMPR2DView::ChangeAxisColor(double x, double y, double z)
464 double c1r=1,c1g=1,c1b=0;
465 double c2r=1,c2g=0,c2b=0;
469 if (IfMouseTouchY(x,y,z)==true)
471 _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
473 _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
475 if (IfMouseTouchZ(x,y,z)==true)
477 _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
479 _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
485 if (IfMouseTouchX(x,y,z)==true)
487 _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
489 _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
491 if (IfMouseTouchZ(x,y,z)==true)
493 _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
495 _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
501 if (IfMouseTouchX(x,y,z)==true)
503 _lineBActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
505 _lineBActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
507 if (IfMouseTouchY(x,y,z)==true)
509 _lineAActor->GetProperty()->SetDiffuseColor(c1r,c1g,c1b);
511 _lineAActor->GetProperty()->SetDiffuseColor(c2r,c2g,c2b);
519 //void wxVtkMPR2DView::TransfromCoordViewWorld(double &X, double &Y, double &Z, int type) // virtual
520 void wxVtkMPR2DView::TransFromCoordScreenToWorld(double &X, double &Y, double &Z, bool keepNormalDirection, int type) //virtual //keepNormalDirection=false, type=2
523 wxVtkBaseView::TransFromCoordScreenToWorld(X,Y,Z,keepNormalDirection,_direction);
525 if ((_direction==0) && (keepNormalDirection==true) )
527 X = ((vtkMPRBaseData*)GetVtkBaseData())->GetX();
530 if ((_direction==1) && (keepNormalDirection==true) )
532 Y = ((vtkMPRBaseData*)GetVtkBaseData())->GetY();
535 if ((_direction==2) && (keepNormalDirection==true) )
537 Z = ((vtkMPRBaseData*)GetVtkBaseData())->GetZ();
543 //-------------------------------------------------------------------
544 //-------------------------------------------------------------------
545 //-------------------------------------------------------------------
546 //void boxVolumeObserver::Execute(vtkObject *wdg, unsigned long eventId, void* calldata) { // virtual
547 // if (eventId==vtkCommand::StartInteractionEvent){
548 // _renWin->SetDesiredUpdateRate(10);
550 // if (eventId==vtkCommand::InteractionEvent){
551 // _renWin->SetDesiredUpdateRate(0.001);
553 // if (eventId==vtkCommand::EndInteractionEvent){
554 // vtkPlanes *planes = vtkPlanes::New();
555 // vtkBoxWidget *boxwidget = reinterpret_cast<vtkBoxWidget*>(wdg);
556 // boxwidget->GetPlanes(planes);
557 // _volumeMapper->SetClippingPlanes(planes);
558 // planes -> Delete();
562 //-------------------------------------------------------------------
563 //void boxVolumeObserver::SetRenWin( vtkRenderWindow *renWin ){
566 //-------------------------------------------------------------------
567 //void boxVolumeObserver::SetVolumeMapper(vtkVolumeRayCastMapper *volumeMapper){
568 // _volumeMapper = volumeMapper;