2 #include "vtkClipping3DDataViewer.h"
3 #include "vtkDataSetReader.h"
4 #include "vtkProperty.h"
6 vtkClipping3DDataViewer::vtkClipping3DDataViewer()
9 for (i=0; i<VTKMPRDATA_MAXTISSUE; i++){
10 _visibleTissue[i] = false;
11 _representationType[i] = true;
19 _volumerendererdata = VolumeRendererData::New();
20 _volumeMapper = vtkVolumeRayCastMapper::New();
21 _newvol = vtkVolume::New();
22 _volumeProperty = vtkVolumeProperty::New();
23 _compositeFunction = vtkVolumeRayCastCompositeFunction::New();
24 _compositeFunctionMIP = vtkVolumeRayCastMIPFunction::New();
27 //-------------------------------------------------------------------
28 vtkClipping3DDataViewer::~vtkClipping3DDataViewer()
31 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
33 _tissueStripper[i]->Delete();
34 _tissueMapper[i]->Delete();
35 _tissuePlanes[i]->Delete();
36 _tissueClipper[i]->Delete();
38 _outlineData->Delete();
39 _mapOutline->Delete();
44 _compositeFunction->Delete();
45 _volumeMapper->Delete();
46 _volumeProperty->Delete();
48 _volumePlanes->Delete();
50 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
51 _tissue[i]-> Delete();
52 _observerS[i]-> Delete();
54 _observerV-> Delete();
56 //-------------------------------------------------------------------
57 vtkActor* vtkClipping3DDataViewer::GetOutlineActor()
61 //-------------------------------------------------------------------
62 vtkClipPolyData* vtkClipping3DDataViewer::GetTissueClipper(int id)
64 return this->_tissueClipper[id];
66 //-------------------------------------------------------------------
67 vtkPolyDataMapper* vtkClipping3DDataViewer::GetTissueMapper(int id)
69 return _tissueMapper[id];
71 //-------------------------------------------------------------------
72 vtkPlanes* vtkClipping3DDataViewer::GetTissuePlanes(int id)
74 return _tissuePlanes[id];
76 //-------------------------------------------------------------------
77 vtkStripper* vtkClipping3DDataViewer::GetTissueStripper(int id)
79 return _tissueStripper[id];
81 //-------------------------------------------------------------------
82 void vtkClipping3DDataViewer::Refresh()
84 // _volumeMapper->SetClippingPlanes(_volumePlanes);
86 // this->_volumeMapper->Update();
87 // this->_newvol->Update();
89 // _newvol->VisibilityOn();
92 // _volumeMapper = vtkVolumeRayCastMapper::New();
93 // _volumeMapper->SetInput( this->GetVtkMPRBaseData()->GetImageData() );
94 // _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
95 // _volumeMapper->SetClippingPlanes( _volumePlanes );
96 // _newvol->SetMapper(_volumeMapper );
100 //-------------------------------------------------------------------
101 void vtkClipping3DDataViewer::RefreshSurface()
104 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
106 SetIsovalue(i, (int) (GetIsovalue(i)+1) );
107 // this->GetMCubes(i)->Update();
110 //-------------------------------------------------------------------
111 void vtkClipping3DDataViewer::SetVtkMPRBaseData(vtkMPRBaseData *vtkmprbasedata)
113 _vtkmprbasedata=vtkmprbasedata;
115 //-------------------------------------------------------------------
116 vtkMPRBaseData* vtkClipping3DDataViewer::GetVtkMPRBaseData()
118 return _vtkmprbasedata;
122 //-------------------------------------------------------------------
123 void vtkClipping3DDataViewer::SetVisibleTissue(int idTissue, bool visible)
125 _visibleTissue[idTissue]=visible;
127 //-------------------------------------------------------------------
128 bool vtkClipping3DDataViewer::GetVisibleTissue(int idTissue){
129 return _visibleTissue[idTissue];
131 //-------------------------------------------------------------------
132 void vtkClipping3DDataViewer::SetRepresentationType(int idTissue, bool representationType)
134 _representationType[idTissue]=representationType;
136 //-------------------------------------------------------------------
137 bool vtkClipping3DDataViewer::GetRepresentationType(int idTissue)
139 return _representationType[idTissue];
142 //-------------------------------------------------------------------
143 vtkActor* vtkClipping3DDataViewer::GetTissueActor(int id){
147 //-------------------------------------------------------------------
148 boxSurfaceObserver *vtkClipping3DDataViewer::GetObserverS(int idObserverS)
150 return _observerS[idObserverS];
152 //-------------------------------------------------------------------
153 boxSurfaceObserver *vtkClipping3DDataViewer::GetObserverV()
158 //-------------------------------------------------------------------
159 bool vtkClipping3DDataViewer::GetVisibleVolume()
161 return _visibleVolume;
163 //-------------------------------------------------------------------
164 void vtkClipping3DDataViewer::SetVisibleVolume(bool visiblevolume)
166 _visibleVolume = visiblevolume;
169 bool vtkClipping3DDataViewer::GetVisibleVolumeBox()
171 return _visibleVolumeBox;
173 //-------------------------------------------------------------------
174 void vtkClipping3DDataViewer::SetVisibleVolumeBox(bool visibleBox)
176 _visibleVolumeBox = visibleBox;
179 //-------------------------------------------------------------------
180 void vtkClipping3DDataViewer::Configure_Tissue()
185 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
186 // Visualisation - original volume
187 vtkImageData *imagedata=_vtkmprbasedata->GetImageData();
188 imagedata->GetScalarRange( range );
189 _mCubes[i] = vtkMarchingCubes::New( );
190 _mCubes[i]->SetInput( imagedata );
192 _mCubes[i]->SetValue( 0, range[1]*(4+i) / 8 );
193 // _mCubes[i]->SetValue( 0, 1500 );
195 _tissueStripper[i] = vtkStripper::New();
196 _tissueStripper[i]->SetInput( _mCubes[i]->GetOutput( ) );
200 _tissuePlanes[i] = vtkPlanes::New();
202 int x1,x2,y1,y2,z1,z2;
203 imagedata->GetExtent(x1,x2,y1,y2,z1,z2);
204 _tissuePlanes[i]->SetBounds (x1,x2,y1,y2,z1,z2);
206 _tissueClipper[i] = vtkClipPolyData::New();
207 _tissueClipper[i]->SetInput( _tissueStripper[i]->GetOutput() );
208 _tissueClipper[i]->SetClipFunction( _tissuePlanes[i] );
209 _tissueClipper[i]->InsideOutOn( );
211 _tissueMapper[i] = vtkPolyDataMapper::New( );
212 _tissueMapper[i]->SetInput( _tissueClipper[i]->GetOutput() );
213 _tissueMapper[i]->ScalarVisibilityOff( );
214 // _tissueMapper[i]->Update();
221 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++){
223 _tissue[i] = vtkActor::New();
224 _tissue[i]->SetMapper( GetTissueMapper(i) );
225 float cr=1,cg=0.5,cb=0.5;
226 _tissue[i]->GetProperty()->SetDiffuseColor(cr/255, cg/255 , cb/255 );
227 _tissue[i]->GetProperty()->SetSpecular(.3);
228 _tissue[i]->GetProperty()->SetSpecularPower(20);
229 _tissue[i]->GetProperty()->SetOpacity(0.5);
230 if (i==0) _tissue[i]->GetProperty()->SetColor(0.85, 0.85 , 0.85 );
231 if (i==1) _tissue[i]->GetProperty()->SetColor(0, 0 , 1 );
232 if (i==2) _tissue[i]->GetProperty()->SetColor(0.85, 0.20 , 0.20 );
233 if (i==3) _tissue[i]->GetProperty()->SetColor(0, 1 , 0 );
236 for (i=0; i< VTKMPRDATA_MAXTISSUE ; i++)
238 _observerS[i] = boxSurfaceObserver::New();
239 _observerS[i]->SetPlanes( GetTissuePlanes(i) );
240 _observerS[i]->SetActor( _tissue[i] );
245 //-----------------------------------------------------------------------------
247 void vtkClipping3DDataViewer::Configure_Volume()
253 /** if(_newvol != NULL)
256 _volumeMapper->Delete();
257 _volumeProperty->Delete();
262 _tfun = vtkPiecewiseFunction::New();
263 _ctfun = vtkColorTransferFunction::New();
266 this->_vtkmprbasedata->GetImageData()->GetScalarRange(range);
267 double max = range[1];
269 printf("EED::vtkClipping3DDataViewer::Configure_Volume max=%f \n",max);
272 adding the poinst of the transference function
275 greyValuesTransferenceFVector.push_back(max * 0/2); // JPR ?? 0/2
276 greyValuesTransferenceFVector.push_back(max * 1/2); // JPR ?? division entiere?
277 greyValuesTransferenceFVector.push_back(max * 2/2);
279 intensityValuesTransferenceFVector.push_back(0.0);
280 intensityValuesTransferenceFVector.push_back(1.0);
281 intensityValuesTransferenceFVector.push_back(1.0);
283 _tfun->AddPoint(max * 0/2 , 0.0);
284 _tfun->AddPoint(max * 1/2 , 1.0);
285 _tfun->AddPoint(max * 2/2 , 1.0);
288 Adding the colors to the vectors
291 redColorsOfColorTransferenceFVector.push_back(0.0);
292 redColorsOfColorTransferenceFVector.push_back(1.0);
293 redColorsOfColorTransferenceFVector.push_back(0.0);
294 redColorsOfColorTransferenceFVector.push_back(0.0);
295 redColorsOfColorTransferenceFVector.push_back(0.0);
298 greenColorsOfColorTransferenceFVector.push_back(0.0);
299 greenColorsOfColorTransferenceFVector.push_back(0.0);
300 greenColorsOfColorTransferenceFVector.push_back(0.0);
301 greenColorsOfColorTransferenceFVector.push_back(1.0);
302 greenColorsOfColorTransferenceFVector.push_back(0.2);
305 blueColorsOfColorTransferenceFVector.push_back(0.0);
306 blueColorsOfColorTransferenceFVector.push_back(0.0);
307 blueColorsOfColorTransferenceFVector.push_back(1.0);
308 blueColorsOfColorTransferenceFVector.push_back(0.0);
309 blueColorsOfColorTransferenceFVector.push_back(0.0);
311 greyValueColorsOfColorTransferenceFVector.push_back(max*0/4);
312 greyValueColorsOfColorTransferenceFVector.push_back(max*1/4);
313 greyValueColorsOfColorTransferenceFVector.push_back(max*2/4);
314 greyValueColorsOfColorTransferenceFVector.push_back(max*3/4);
315 greyValueColorsOfColorTransferenceFVector.push_back(max*4/4);
317 _ctfun->AddRGBPoint( max*0/4 , 0.0, 0.0, 0.0);
318 _ctfun->AddRGBPoint( max*1/4 , 1.0, 0.0, 0.0);
319 _ctfun->AddRGBPoint( max*2/4 , 0.0, 0.0, 1.0);
320 _ctfun->AddRGBPoint( max*3/4 , 0.0, 1.0, 0.0);
321 _ctfun->AddRGBPoint( max*4/4 , 0.0, 0.2, 0.0);
323 _volumePlanes = vtkPlanes::New();
324 // int x1,x2,y1,y2,z1,z2;
325 // vtkImageData *imagedata=_vtkmprbasedata->GetImageData();
326 // imagedata->GetExtent(x1,x2,y1,y2,z1,z2);
327 // _volumePlanes->SetBounds(x1,x2,y1,y2,z1,z2);
333 // _volumeMapper = vtkVolumeRayCastMapper::New();
334 _volumeMapper->SetInput( this->GetVtkMPRBaseData()->GetImageData() );
338 _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
341 // _volumeMapper->SetVolumeRayCastFunction(_compositeFunctionMIP);
345 _volumeMapper->SetClippingPlanes( _volumePlanes );
346 _volumeMapper->AutoAdjustSampleDistancesOn();
348 _volumeProperty->SetInterpolationTypeToNearest();
349 //_volumeProperty = vtkVolumeProperty::New();
350 _volumeProperty->SetColor(_ctfun);
351 _volumeProperty->SetScalarOpacity( _tfun );
355 _volumeProperty->DisableGradientOpacityOn();
365 // _volumeProperty->SetInterpolationTypeToNearest();
366 // _volumeProperty->ShadeOff();
367 // _volumeProperty->SetAmbient(0.3);
368 // _volumeProperty->SetDiffuse(0.1);
369 // _volumeProperty->SetSpecular(0.8);
370 // _volumeProperty->DisableGradientOpacityOn();
372 // _newvol = vtkVolume::New();
373 _newvol->SetMapper(_volumeMapper );
374 _newvol->SetProperty(_volumeProperty );
376 _observerV = boxSurfaceObserver::New();
377 _observerV->SetPlanes( _volumePlanes );
378 _observerV->SetActor( _newvol );
379 _observerV->SetvtkVolumeRayCastMapper( _volumeMapper );
383 void vtkClipping3DDataViewer::Configure_VolumeBox()
385 cout<<"EED::JPRG::vtkClipping3DDataViewer::Configure_VolumeBox() start"<<endl;
387 _volumerendererdata->SetImageData(_vtkmprbasedata->GetImageData());
390 vector<double> *gv = this->GetGreyValuesTransferenceFVector();
391 vector<double> *op = this->GetIntensityValuesTransferenceFVector();
393 printf("EED::vtkClipping3DDataViewer::Configure_VolumeBox _ctfun=%p \n",_ctfun);
396 _volumerendererdata->SetLookUpTable((vtkLookupTable*)(_ctfun));
397 _volumerendererdata->OpacityChanged(*gv, *op);
399 //_wxvtkclipping3Dview->VisibleVolumeActor( false );
400 //_volumerendererdata->ShowVolume(event.IsChecked() );
401 //_volumerendererdata->BoundingBoxChanged(event.IsChecked() );
403 cout<<"EED::JPRG::vtkClipping3DDataViewer::Configure_VolumeBox() end"<<endl;
406 void vtkClipping3DDataViewer::SetRenderer(vtkRenderer* renderer)
408 _volumerendererdata->SetRenderer(renderer);
412 void vtkClipping3DDataViewer::SetInteractor(vtkRenderWindowInteractor* interactor)
415 _volumerendererdata->SetInteractor(interactor);
419 void vtkClipping3DDataViewer::BoxActorChanged(bool changed)
421 vector<double> *gv = this->GetGreyValuesTransferenceFVector();
422 vector<double> *op = this->GetIntensityValuesTransferenceFVector();
424 _volumerendererdata->ShowVolume(changed);
425 _volumerendererdata->OpacityChanged(*gv, *op);
426 _volumerendererdata->BoundingBoxChanged(changed);
430 void vtkClipping3DDataViewer::UpdateVolumeBox(vector<double> gf, vector<double> vf, vtkColorTransferFunction* ctfun)
432 _volumerendererdata->SetLookUpTable((vtkLookupTable*)(ctfun));
433 _volumerendererdata->OpacityChanged(gf, vf);
437 void vtkClipping3DDataViewer::updateVolume()
442 _volumeMapper->SetVolumeRayCastFunction(_compositeFunction);
443 _volumerendererdata->changeCompositeMIPFunction(0);
447 _volumeMapper->SetVolumeRayCastFunction(_compositeFunctionMIP);
448 _volumerendererdata->changeCompositeMIPFunction(1);
453 _volumeProperty->SetInterpolationTypeToLinear();
457 _volumeProperty->SetInterpolationTypeToNearest();
462 _volumeProperty->ShadeOn();
466 _volumeProperty->ShadeOff();
471 //-------------------------------------------------------------------
472 void vtkClipping3DDataViewer::Configure()
476 Configure_VolumeBox();
477 // An outline provides context around the data.
479 _outlineData = vtkOutlineFilter::New();
480 _outlineData->SetInput((vtkDataSet *) _vtkmprbasedata->GetImageData() );
481 _mapOutline = vtkPolyDataMapper::New();
482 _mapOutline->SetInput(_outlineData->GetOutput());
483 _outline = vtkActor::New();
484 _outline->SetMapper(_mapOutline);
485 _outline->GetProperty()->SetColor(0,0,0);
489 //-------------------------------------------------------------------
490 void vtkClipping3DDataViewer::SetIsovalue(int idTissue, int isoValue)
492 _mCubes[idTissue]->SetValue(0, isoValue);
494 //-------------------------------------------------------------------
495 double vtkClipping3DDataViewer::GetIsovalue(int idTissue)
497 return _mCubes[idTissue]->GetValue(0);
499 //-------------------------------------------------------------------
500 vtkVolume* vtkClipping3DDataViewer::GetVolumeActor()
504 //-------------------------------------------------------------------
505 vtkVolumeRayCastMapper* vtkClipping3DDataViewer::GetVolumeMapper(){
506 return _volumeMapper;
508 //-------------------------------------------------------------------
509 vtkPlanes* vtkClipping3DDataViewer::GetVolumePlanes()
511 return _volumePlanes;
514 //-------------------------------------------------------------------
515 vtkMarchingCubes *vtkClipping3DDataViewer::GetMCubes(int idTissue)
517 return _mCubes[idTissue];
519 //--------------------------------------------------------------------
520 //-------------------
522 //-------------------
524 std::vector<double>* vtkClipping3DDataViewer::GetGreyValuesTransferenceFVector()
526 return &greyValuesTransferenceFVector;
528 //--------------------------------------------------------------------
529 std::vector<double>* vtkClipping3DDataViewer::GetIntensityValuesTransferenceFVector()
531 return &intensityValuesTransferenceFVector;
533 //--------------------------------------------------------------------
534 std::vector<double>* vtkClipping3DDataViewer::GetRedColorsOfColorTransferenceFVector()
536 return &redColorsOfColorTransferenceFVector;
538 //--------------------------------------------------------------------
539 std::vector<double>* vtkClipping3DDataViewer::GetGreenColorsOfColorTransferenceFVector()
541 return &greenColorsOfColorTransferenceFVector;
543 //--------------------------------------------------------------------
544 std::vector<double>* vtkClipping3DDataViewer::GetBlueColorsOfColorTransferenceFVector()
546 return &blueColorsOfColorTransferenceFVector;
548 //--------------------------------------------------------------------
549 std::vector<double>* vtkClipping3DDataViewer::GetGreyValueColorsOfColorTransferenceFVector()
551 return &greyValueColorsOfColorTransferenceFVector;
553 //--------------------------------------------------------------------
554 //--------------------------------------
555 //Getters transference function
556 //and color of the transference function
557 //---------------------------------------
558 vtkPiecewiseFunction* vtkClipping3DDataViewer::GetTransferencefunction()
562 //--------------------------------------------------------------------
563 vtkColorTransferFunction* vtkClipping3DDataViewer::GetColorTransferenceFunction()
568 //-------------------------------------------------------------------
570 void vtkClipping3DDataViewer::ReadVolumeFunctions()
573 int i=0,xi,yi,r,g,b,gValue;
574 vtkImageData *imagedata = this->_vtkmprbasedata->GetImageData();
576 HistogramDialog* hDlg=new HistogramDialog(NULL,_T("Histogram Dialog"),imagedata);
580 int tfSize=this->greyValuesTransferenceFVector.size();
584 hDlg->erasePointsTransferenceFunction();
587 double g=greyValuesTransferenceFVector[i];
588 double in=intensityValuesTransferenceFVector[i];
589 hDlg->addPointToTransferenceFunction(g,in*100);
595 int ctfSize=this->redColorsOfColorTransferenceFVector.size();
601 double gr=greyValueColorsOfColorTransferenceFVector[i];
602 double r=redColorsOfColorTransferenceFVector[i];
603 double g=greenColorsOfColorTransferenceFVector[i];
604 double b=blueColorsOfColorTransferenceFVector[i];
605 hDlg->addColorPoint(gr,r*255,g*255,b*255);
609 //If it is smooth activate next line
610 //hDlg->updatePlotter();
611 //setting variables if the user wants to do refresh
612 hDlg->setCTF(_ctfun);
616 // when the user had changed the transference Function
618 if(hDlg->ShowModal()== wxID_OK )
620 // -- vtkPiecewiseFunction --
621 this->_tfun->RemoveAllPoints();
622 greyValuesTransferenceFVector.clear();
623 intensityValuesTransferenceFVector.clear();
625 int nTFPoints=hDlg->getSizeTransferenceFunction();
629 hDlg->getTransferenceFunctionPoint(i,xi,yi);
630 this->_tfun->AddPoint( xi , yi/100.0 );
631 greyValuesTransferenceFVector.push_back(xi);
632 intensityValuesTransferenceFVector.push_back(yi/100.0);
635 // -- vtkColorTransferFunction --
636 this->_ctfun->RemoveAllPoints ();
638 redColorsOfColorTransferenceFVector.clear();
639 greenColorsOfColorTransferenceFVector.clear();
640 blueColorsOfColorTransferenceFVector.clear();
641 greyValueColorsOfColorTransferenceFVector.clear();
643 int nCTFpoints=hDlg->getSizeBarColor();
647 hDlg->getDataBarColorPoint(i,xi,r,g,b);
648 this->_ctfun->AddRGBPoint(xi,r/255.0,g/255.0,b/255.0 );
649 redColorsOfColorTransferenceFVector.push_back(r/255.0);
650 greenColorsOfColorTransferenceFVector.push_back(g/255.0);
651 blueColorsOfColorTransferenceFVector.push_back(b/255.0);
652 greyValueColorsOfColorTransferenceFVector.push_back(xi);
656 this->_volumeMapper->Update();
657 this->_newvol->Update();
663 if(hDlg->getRefreshed())
666 //--Transference Function----
667 this->_tfun->RemoveAllPoints();
669 size=greyValuesTransferenceFVector.size();
672 double grey1=greyValuesTransferenceFVector[i];
673 double in2=intensityValuesTransferenceFVector[i];
674 this->_tfun->AddPoint( grey1 , in2 );
677 // -- vtkColorTransferFunction --
678 _ctfun->RemoveAllPoints ();
681 size=greyValueColorsOfColorTransferenceFVector.size();
684 double grey2=(greyValueColorsOfColorTransferenceFVector)[i];
685 double red =(redColorsOfColorTransferenceFVector)[i];
686 double green =(greenColorsOfColorTransferenceFVector)[i];
687 double blue = (blueColorsOfColorTransferenceFVector)[i];
688 _ctfun->AddRGBPoint(grey2,red,green,blue);
690 this->_volumeMapper->Update();
691 this->_newvol->Update();
699 void vtkClipping3DDataViewer::ReadVolumeFunctions(char *namefile)
706 FILE *ff = fopen ( namefile ,"r");
710 if (strcmp(tmp,"MAX")==0)
712 vtkImageData *vtkimagedata = this->_vtkmprbasedata->GetImageData();
713 vtkimagedata->GetScalarRange(range);
714 max = (int) (range[1]);
719 fscanf(ff,"%s",tmp); // --
721 // -- vtkPiecewiseFunction --
722 this->_tfun->RemoveAllPoints();
724 while ( strcmp(tmp,"--")!=0 )
729 this->_tfun->AddPoint( x*max , val );
733 this->_ctfun->RemoveAllPoints ();
734 // -- vtkColorTransferFunction --
745 this->_ctfun->AddRGBPoint( x*max , r,g,b );
749 this->_volumeMapper->Update();
750 this->_newvol->Update();
757 //-------------------------------------------------------------------
759 void vtkClipping3DDataViewer::ReadMeshVTK(char *namefile)
761 vtkDataSetReader *reader = vtkDataSetReader::New();
762 reader->SetFileName(namefile);
764 _tissueStripper[3]->SetInput( reader->GetPolyDataOutput() );
767 void vtkClipping3DDataViewer::setColorTransferFunction(vtkColorTransferFunction* colortable){
769 _volumeProperty->SetColor(colortable);
774 void vtkClipping3DDataViewer::SetRayCasting(bool active)
776 _isRayCasting = active;
780 void vtkClipping3DDataViewer::SetMIPActive(bool active)
785 void vtkClipping3DDataViewer::SetInterpolation(bool active)
787 _interpolation = active;
790 void vtkClipping3DDataViewer::SetShade(bool active)