X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FInterface_ManagerContour_NDimensions%2FwxContourMainFrame.cxx;h=80caa583baf24919e62ffee61709d9b9a1f01d11;hb=e12b7f2166c9aeae510907210c450d7044a6a352;hp=c126f7c3e2f21771a4445aacd571f4efdcd85f22;hpb=5940ba0f3739ac136ec5ffbdb1e24518915a4664;p=creaContours.git diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx index c126f7c..80caa58 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx @@ -13,12 +13,6 @@ #include "NameWrapper.h" #include "wx/artprov.h" #include "ConceptDataWrap.h" - -#include -//#include "ImageSourceThing.h" -//#include "wxContour_ActionCommandsID.h" -//#include "OutlineModelBuilder.h" -//#include "wxContourEventHandler.h" #include //---------------------------------------------------------------------------------------------------------------- @@ -58,6 +52,11 @@ char wxContourMainFrame::COPY = 'C'; _refLineControl = NULL; _refLineModel = NULL; _refLineView = NULL; + _imageReslicer = NULL; + _thresholdTable = NULL; + _thresholdMapper = NULL; + _thresholdActor = NULL; + _actorPresent = false; // set up default notebook style // m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER; @@ -77,6 +76,11 @@ char wxContourMainFrame::COPY = 'C'; _refLineControl = NULL; _refLineModel = NULL; _refLineView = NULL; + _imageReslicer = NULL; + _thresholdTable = NULL; + _thresholdMapper = NULL; + _thresholdActor = NULL; + _actorPresent = false; // set up default notebook style m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER; @@ -157,8 +161,7 @@ void wxContourMainFrame::setVectImages( std::vector images ){ void wxContourMainFrame :: resetInstance() { - delete instance; - instance = NULL; + instance->Destroy(); } wxContourMainFrame :: ~wxContourMainFrame() @@ -166,6 +169,8 @@ void wxContourMainFrame::setVectImages( std::vector images ){ _pannew->Close(); interfMainPanel::resetInstance(); + delete kernelManager; + instance = NULL; //_pannew->Destroy(); //delete _pannew; @@ -589,14 +594,15 @@ void wxContourMainFrame::changeInstant() kernelManager->setInstant(instantVect); //_modelManager->setInstant( _actualInstant ); + onThresholdChange(); updateInstantOutlines(); updateInstantImageData(); updateInstantAxes(); - - } -void wxContourMainFrame :: updateInstantOutlines(){ - + + +void wxContourMainFrame :: updateInstantOutlines() +{ _theViewPanel->removeSceneContours(); _theViewPanel->addNameWrapperToScene(); @@ -613,7 +619,8 @@ std::string wxContourMainFrame::getNameWrapping(int i){ return kernelManager->getNameWrapping(i); } -void wxContourMainFrame::updateInstantImageData(){ +void wxContourMainFrame::updateInstantImageData() +{ std::vector inst; _instantPanel->getInstant(inst); @@ -627,9 +634,11 @@ void wxContourMainFrame::updateInstantImageData(){ } } -void wxContourMainFrame::updateInstantAxes(){ +void wxContourMainFrame::updateInstantAxes() +{ } + void wxContourMainFrame::onChangeDeep(int val){ _instantPanel->setConceptValue( "Axe Depth", (int)val ); changeInstant(); @@ -794,7 +803,8 @@ void wxContourMainFrame::onSave(){ saveFileWithContours( fileNameContourROI ); } } -void wxContourMainFrame::saveFileWithContours( std::string filename ){ +void wxContourMainFrame::saveFileWithContours( std::string filename ) +{ FILE *pFile=fopen(filename.c_str(),"w+"); std::vector< std::string > lstNameThings; @@ -923,177 +933,176 @@ void wxContourMainFrame::onSegmentationOneSliceITK(wxString distance, wxString s void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString distanc, wxString sigm, wxString alf, wxString bet, wxString prop, wxString iter, wxString inflation) { - int typeofcontour = 1; //Image Data vtkImageData *imagedata = getImageData(); //Tipo de pixeles a utilizar internamente en ITK - typedef float InternalPixelType; - const unsigned int Dimension = 2; - typedef itk::Image< InternalPixelType, Dimension > InternalImageType; + typedef float InternalPixelType; + const unsigned int Dimension = 2; + typedef itk::Image< InternalPixelType, Dimension > InternalImageType; - //Tipo de pixeles de salida 1 - typedef unsigned char OutputPixelType; - typedef itk::Image< OutputPixelType, Dimension > OutputImageType; + //Tipo de pixeles de salida 1 + typedef unsigned char OutputPixelType; + typedef itk::Image< OutputPixelType, Dimension > OutputImageType; - //Tipo de pixeles de salida 2 - typedef unsigned short OutputPixelType2; - typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2; + //Tipo de pixeles de salida 2 + typedef unsigned short OutputPixelType2; + typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2; - //Definición del thresholder - typedef itk::BinaryThresholdImageFilter< - InternalImageType, - OutputImageType > ThresholdingFilterType; - - //Definición del primer filtro de conversión de pixeles - typedef itk::CastImageFilter< - OutputImageType, OutputImageType2 > CastFilterType; + //DefiniciÛn del thresholder + typedef itk::BinaryThresholdImageFilter< + InternalImageType, + OutputImageType > ThresholdingFilterType; + + //DefiniciÛn del primer filtro de conversiÛn de pixeles + typedef itk::CastImageFilter< + OutputImageType, OutputImageType2 > CastFilterType; - //Definición del segundo tipo de conversión de pixeles - typedef itk::CastImageFilter< - OutputImageType2, InternalImageType > CastFilterType2; + //DefiniciÛn del segundo tipo de conversiÛn de pixeles + typedef itk::CastImageFilter< + OutputImageType2, InternalImageType > CastFilterType2; - //Tercer tipo de conversión - typedef itk::RescaleIntensityImageFilter< - InternalImageType, - OutputImageType > CastFilterType3; + //Tercer tipo de conversiÛn + typedef itk::RescaleIntensityImageFilter< + InternalImageType, + OutputImageType > CastFilterType3; - //Cuarto tipo de conversión - typedef itk::RescaleIntensityImageFilter< - OutputImageType, - OutputImageType > CastFilterType4; + //Cuarto tipo de conversiÛn + typedef itk::RescaleIntensityImageFilter< + OutputImageType, + OutputImageType > CastFilterType4; - ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New(); - - thresholder->SetLowerThreshold( 0.0 ); - thresholder->SetUpperThreshold( 128 ); + ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New(); + + thresholder->SetLowerThreshold( 0.0 ); + thresholder->SetUpperThreshold( 128 ); - thresholder->SetOutsideValue( 255 ); - thresholder->SetInsideValue( 0 ); + thresholder->SetOutsideValue( 255 ); + thresholder->SetInsideValue( 0 ); - //Definción de conexiónes entre VTK e ITK y el writer - typedef itk::VTKImageToImageFilter ConnectorType; - typedef itk::ImageToVTKImageFilter ConnectorType2; - typedef itk::ImageFileWriter< OutputImageType > WriterType; + //DefinciÛn de conexiÛnes entre VTK e ITK y el writer + typedef itk::VTKImageToImageFilter ConnectorType; + typedef itk::ImageToVTKImageFilter ConnectorType2; + typedef itk::ImageFileWriter< OutputImageType > WriterType; - ConnectorType::Pointer connector= ConnectorType::New(); - ConnectorType2::Pointer connector2= ConnectorType2::New(); - + ConnectorType::Pointer connector= ConnectorType::New(); + ConnectorType2::Pointer connector2= ConnectorType2::New(); + - CastFilterType::Pointer filter=CastFilterType::New(); - CastFilterType2::Pointer filter2=CastFilterType2::New(); + CastFilterType::Pointer filter=CastFilterType::New(); + CastFilterType2::Pointer filter2=CastFilterType2::New(); - connector->SetInput( imagedata ); - filter2->SetInput(connector->GetOutput()); + connector->SetInput( imagedata ); + filter2->SetInput(connector->GetOutput()); - typedef itk::CurvatureAnisotropicDiffusionImageFilter< - InternalImageType, - InternalImageType > SmoothingFilterType; + typedef itk::CurvatureAnisotropicDiffusionImageFilter< + InternalImageType, + InternalImageType > SmoothingFilterType; - SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New(); + SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New(); - typedef itk::GradientMagnitudeRecursiveGaussianImageFilter< - InternalImageType, - InternalImageType > GradientFilterType; + typedef itk::GradientMagnitudeRecursiveGaussianImageFilter< + InternalImageType, + InternalImageType > GradientFilterType; - typedef itk::SigmoidImageFilter< - InternalImageType, - InternalImageType > SigmoidFilterType; + typedef itk::SigmoidImageFilter< + InternalImageType, + InternalImageType > SigmoidFilterType; - GradientFilterType::Pointer gradientMagnitude = GradientFilterType::New(); + GradientFilterType::Pointer gradientMagnitude = GradientFilterType::New(); - SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New(); + SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New(); - sigmoid->SetOutputMinimum( 0.0 ); - sigmoid->SetOutputMaximum( 255.0 ); + sigmoid->SetOutputMinimum( 0.0 ); + sigmoid->SetOutputMaximum( 255.0 ); - typedef itk::FastMarchingImageFilter< - InternalImageType, - InternalImageType > FastMarchingFilterType; + typedef itk::FastMarchingImageFilter< + InternalImageType, + InternalImageType > FastMarchingFilterType; - FastMarchingFilterType::Pointer fastMarching = FastMarchingFilterType::New(); + FastMarchingFilterType::Pointer fastMarching = FastMarchingFilterType::New(); - typedef itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, - InternalImageType > GeodesicActiveContourFilterType; - GeodesicActiveContourFilterType::Pointer geodesicActiveContour = - GeodesicActiveContourFilterType::New(); + typedef itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, + InternalImageType > GeodesicActiveContourFilterType; + GeodesicActiveContourFilterType::Pointer geodesicActiveContour = + GeodesicActiveContourFilterType::New(); - typedef itk::ZeroCrossingImageFilter< - InternalImageType, - InternalImageType > ZeroCrossingFilterType; -ZeroCrossingFilterType::Pointer zeroCrossing = - ZeroCrossingFilterType::New(); + typedef itk::ZeroCrossingImageFilter< + InternalImageType, + InternalImageType > ZeroCrossingFilterType; + ZeroCrossingFilterType::Pointer zeroCrossing = + ZeroCrossingFilterType::New(); -const double propagationScaling = atof( prop ); + const double propagationScaling = atof( crea::wx2std(prop).c_str() ); - geodesicActiveContour->SetPropagationScaling( propagationScaling ); - geodesicActiveContour->SetCurvatureScaling( 1.0 ); - geodesicActiveContour->SetAdvectionScaling( 1.0 ); + geodesicActiveContour->SetPropagationScaling( propagationScaling ); + geodesicActiveContour->SetCurvatureScaling( 1.0 ); + geodesicActiveContour->SetAdvectionScaling( 1.0 ); - geodesicActiveContour->SetMaximumRMSError( 0.02 ); - int it=atoi( iter ); - geodesicActiveContour->SetNumberOfIterations( it ); + geodesicActiveContour->SetMaximumRMSError( 0.02 ); + int it=atoi( crea::wx2std(iter).c_str() ); + geodesicActiveContour->SetNumberOfIterations( it ); - smoothing->SetInput( filter2->GetOutput() ); - gradientMagnitude->SetInput( smoothing->GetOutput() ); - sigmoid->SetInput( gradientMagnitude->GetOutput() ); - fastMarching->SetInput( sigmoid->GetOutput() ); - geodesicActiveContour->SetInput( fastMarching->GetOutput() ); - geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() ); - - zeroCrossing->SetInput( geodesicActiveContour->GetOutput() ); - //thresholder->SetInput( zeroCrossing->GetOutput() ); - thresholder->SetInput( geodesicActiveContour->GetOutput() ); - connector2->SetInput( thresholder->GetOutput() ); - + smoothing->SetInput( filter2->GetOutput() ); + gradientMagnitude->SetInput( smoothing->GetOutput() ); + sigmoid->SetInput( gradientMagnitude->GetOutput() ); + fastMarching->SetInput( sigmoid->GetOutput() ); + geodesicActiveContour->SetInput( fastMarching->GetOutput() ); + geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() ); + + zeroCrossing->SetInput( geodesicActiveContour->GetOutput() ); + //thresholder->SetInput( zeroCrossing->GetOutput() ); + thresholder->SetInput( geodesicActiveContour->GetOutput() ); + connector2->SetInput( thresholder->GetOutput() ); + - smoothing->SetTimeStep( 0.125 ); - smoothing->SetNumberOfIterations( 5 ); - smoothing->SetConductanceParameter( 9.0 ); + smoothing->SetTimeStep( 0.125 ); + smoothing->SetNumberOfIterations( 5 ); + smoothing->SetConductanceParameter( 9.0 ); - const double sigma = atof( sigm ); - gradientMagnitude->SetSigma( sigma ); + const double sigma = atof( crea::wx2std(sigm).c_str() ); + gradientMagnitude->SetSigma( sigma ); - const double alpha = atof( alf ); - const double beta = atof( bet ); + const double alpha = atof( crea::wx2std(alf).c_str() ); + const double beta = atof( crea::wx2std(bet).c_str() ); - sigmoid->SetAlpha( alpha ); - sigmoid->SetBeta( beta ); - - typedef FastMarchingFilterType::NodeContainer NodeContainer; - typedef FastMarchingFilterType::NodeType NodeType; + sigmoid->SetAlpha( alpha ); + sigmoid->SetBeta( beta ); + + typedef FastMarchingFilterType::NodeContainer NodeContainer; + typedef FastMarchingFilterType::NodeType NodeType; - NodeContainer::Pointer seeds = NodeContainer::New(); + NodeContainer::Pointer seeds = NodeContainer::New(); - InternalImageType::IndexType seedPosition; - seedPosition[0] = x; - seedPosition[1] = y; + InternalImageType::IndexType seedPosition; + seedPosition[0] = x; + seedPosition[1] = y; - const double initialDistance = atof( distanc ); + const double initialDistance = atof( crea::wx2std(distanc).c_str() ); - NodeType node; + NodeType node; - const double seedValue = - initialDistance; + const double seedValue = - initialDistance; - node.SetValue( seedValue ); - node.SetIndex( seedPosition ); - - seeds->Initialize(); - seeds->InsertElement( 0, node ); - - fastMarching->SetTrialPoints( seeds ); - - fastMarching->SetSpeedConstant( 1.0 ); - - fastMarching->SetOutputSize( - connector->GetOutput()->GetBufferedRegion().GetSize() ); - - fastMarching->SetStoppingValue( 800 ); - try + node.SetValue( seedValue ); + node.SetIndex( seedPosition ); + + seeds->Initialize(); + seeds->InsertElement( 0, node ); + + fastMarching->SetTrialPoints( seeds ); + + fastMarching->SetSpeedConstant( 1.0 ); + + fastMarching->SetOutputSize( + connector->GetOutput()->GetBufferedRegion().GetSize() ); + + fastMarching->SetStoppingValue( 800 ); + try { connector2->Update(); @@ -1126,26 +1135,26 @@ const double propagationScaling = atof( prop ); vtkPolyData* polyDataResult = cntVTK->GetOutput(); - std::cout<<"Points "<GetNumberOfPoints()<GetNumberOfPoints()<Update( ); polyDataResult->UpdateInformation(); -//EED - /* -ofstream myfile; -myfile.open ("C:/Creatis/example.txt"); -myfile << "\n"; -polyDataResult->Print(myfile); -myfile << "-------------------------------------\n"; -polyDataResult->GetLines()->Print(myfile); -myfile.close();*/ + //EED + /* + ofstream myfile; + myfile.open ("C:/Creatis/example.txt"); + myfile << "\n"; + polyDataResult->Print(myfile); + myfile << "-------------------------------------\n"; + polyDataResult->GetLines()->Print(myfile); + myfile.close();*/ cntVTK -> Delete(); cpd -> Delete(); conn -> Delete(); -//--Calculating control points + //--Calculating control points std::vector vecX; std::vector vecY; @@ -1164,8 +1173,8 @@ myfile.close();*/ double xAct=0; double yAct=0; int ii,size=polyDataResult->GetNumberOfPoints(); -ofstream myfile; -myfile.open ("C:/Creatis/example2.txt"); + ofstream myfile; + myfile.open ("C:/Creatis/example2.txt"); size=polyDataResult->GetNumberOfPoints(); for (ii=0;iiSetContour( &vecX , &vecY , &vecZ ); -int method=2; + int method=2; if (method==0){ extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ ); } @@ -1479,7 +1488,7 @@ myfile.close(); // double y=p[1]; vecX.push_back( p[0] ); vecY.push_back( p[1] ); - vecZ.push_back( -900 ); + vecZ.push_back( 900 ); // vecZ.push_back( p[2] ); } @@ -1576,49 +1585,53 @@ void wxContourMainFrame::onSegmentationAllSlice(int minZ,int maxZ,int isovalue,i //Creates a reference line to be used as the axis of the mirroring void wxContourMainFrame::referenceLine() { - wxBusyCursor wait; - double spc[3]; + if (_refLineControl==NULL) + { + wxBusyCursor wait; + double spc[3]; - vtkImageData *vtkimagedata = _theViewPanel->getImageData(); - vtkimagedata->GetSpacing(spc); + vtkImageData *vtkimagedata = _theViewPanel->getImageData(); + vtkimagedata->GetSpacing(spc); - wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView(); + wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView(); - _refLineControl = new manualLineControler(); - _refLineModel = new manualContourModelLine(); - _refLineView = new manualViewLine(); - _refLineView->SetModel( _refLineModel ); - _refLineView->SetWxVtkBaseView( viewer2D ); - _refLineView->SetRange( 2 ); - _refLineView->SetZ( 1200 ); + _refLineControl = new manualLineControler(); + _refLineModel = new manualContourModelLine(); + _refLineView = new manualViewLine(); + _refLineView->SetModel( _refLineModel ); + _refLineView->SetWxVtkBaseView( viewer2D ); + _refLineView->SetRange( 2 ); + _refLineView->SetZ( 1200 ); - _refLineView->SetSpacing(spc); + _refLineView->SetSpacing(spc); - _refLineView->SetColorNormalContour(0, 0, 1); - _refLineView->SetColorEditContour(0, 0.5, 0.5); - _refLineView->SetWidthLine(4); + _refLineView->SetColorNormalContour(0, 0, 1); + _refLineView->SetColorEditContour(0, 0.5, 0.5); + _refLineView->SetWidthLine(4); - _refLineControl->SetModelView( _refLineModel , _refLineView ); - viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl ); - _refLineModel->SetCloseContour(false); - _refLineControl->CreateNewManualContour(); + _refLineControl->SetModelView( _refLineModel , _refLineView ); + vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView(); + style->AddInteractorStyleMaracas( _refLineControl ); + _refLineModel->SetCloseContour(false); + _refLineControl->CreateNewManualContour(); - double z = _refLineControl->GetZ(); -/* - _refLineControl->AddPoint(50,100,z); - _refLineControl->AddPoint(80,40,z); - _refLineControl->SetCompleteCreation(true); +//EED?? double z = _refLineControl->GetZ(); + /* + _refLineControl->AddPoint(50,100,z); + _refLineControl->AddPoint(80,40,z); + _refLineControl->SetCompleteCreation(true); - _refLineModel->AddPoint(50,100,z); - _refLineModel->AddPoint(80,40,z); - _refLineModel->UpdateSpline(); + _refLineModel->AddPoint(50,100,z); + _refLineModel->AddPoint(80,40,z); + _refLineModel->UpdateSpline(); - _refLineView->UpdateViewPoint(0); - _refLineView->UpdateViewPoint(1); -*/ + _refLineView->UpdateViewPoint(0); + _refLineView->UpdateViewPoint(1); + */ - _refLineControl->SetActive(true); - _refLineView->RefreshContour(); + _refLineControl->SetActive(true); + _refLineView->RefreshContour(); + } } //Hides the referenceLine @@ -1626,9 +1639,14 @@ void wxContourMainFrame::refLineHide() { if (_refLineControl!=NULL) { - _refLineView->RemoveCompleteContourActor(); - _refLineControl->SetEditable(false); - _refLineControl->SetActive(false); + if (_refLineControl->GetActive()) + { + _refLineView->RemoveCompleteContourActor(); + _refLineControl->SetEditable(false); + _refLineControl->SetActive(false); + + RefreshInterface(); + } } } @@ -1637,18 +1655,24 @@ void wxContourMainFrame::refLineShow() { if (_refLineControl!=NULL) { - wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView(); + if (_refLineControl->GetActive()==false) + { + wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView(); - _refLineView->SetModel( _refLineModel ); - _refLineView->SetWxVtkBaseView( viewer2D ); - _refLineView->SetRange( 2 ); - _refLineView->SetZ( 1200 ); + _refLineView->SetModel( _refLineModel ); + _refLineView->SetWxVtkBaseView( viewer2D ); + _refLineView->SetRange( 2 ); + _refLineView->SetZ( 1200 ); - _refLineControl->SetModelView( _refLineModel , _refLineView ); - viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl ); - _refLineControl->CreateNewManualContour(); - _refLineControl->SetActive(true); - _refLineView->RefreshContour(); + _refLineControl->SetModelView( _refLineModel , _refLineView ); + vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView(); + style->AddInteractorStyleMaracas( _refLineControl ); + _refLineControl->CreateNewManualContour(); + _refLineControl->SetActive(true); + _refLineView->RefreshContour(); + + RefreshInterface(); + } } } @@ -1695,66 +1719,193 @@ void wxContourMainFrame::onMirror() //_refName = ""; } -void wxContourMainFrame::onThreshold(int minVal, int maxVal) +void wxContourMainFrame::onThreshold() { - - vtkImageData * img = _theViewPanel->getImageData(); - + int z = _theViewPanel->GetZ(); double range[2]; + + vtkImageData * img = getImageData(); img->GetScalarRange(range); - //vtkImageData * fakeImage = new vtkImageData(); + int minTot = floor (range[0]); + int maxTot = ceil (range[1]); + + double minMax[2]; + _pannew->onThresholdInstantChange(minMax); + int minVal = floor (minMax[0]); + int maxVal = floor (minMax[1]); + + if (!_actorPresent) + { + if (_imageReslicer==NULL) + { + _imageReslicer = vtkImageReslice::New(); + _imageReslicer->SetInput( img ); + _imageReslicer->SetInformationInput(img); + _imageReslicer->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1); + _imageReslicer->SetOutputDimensionality(2); + _imageReslicer->SetInterpolationModeToLinear(); + } - //Lookup Table - vtkLookupTable *lookup = vtkLookupTable::New(); - lookup->SetNumberOfTableValues(range[1]+1); - lookup->SetTableRange(range); - lookup->SetAlphaRange(0, 1); - lookup->SetValueRange(0, 1); - lookup->SetSaturationRange(0, 0); - lookup->SetRampToLinear( ); + _imageReslicer->SetResliceAxesOrigin(0,0,z); + img = _imageReslicer->GetOutput(); + img->Update(); + img->UpdateInformation(); + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); - //Assign a fake color for the upper image, and set the white as transparent - for(int i = range[0]; i < range[1]; i++) - { - if( i >= minVal && i <= maxVal ) + if (_thresholdTable==NULL) { - lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1); + //Lookup Table + _thresholdTable = vtkLookupTable::New(); + _thresholdTable->SetNumberOfTableValues(maxTot+1); + _thresholdTable->SetTableRange(range); + _thresholdTable->SetAlphaRange(0, 1); + _thresholdTable->SetValueRange(0, 1); + _thresholdTable->SetSaturationRange(0, 0); + _thresholdTable->SetRampToLinear( ); } - else if( i >= range[0] && i < minVal ) + + //Assign a fake color for the upper image, and set the white as transparent + int i; + for(i = minTot; i <= maxTot; i++) { - lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent + if( i >= minVal && i <= maxVal ) + { + _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1); + } + else if( i >= minTot && i < minVal ) + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else if( i > maxVal && i < maxTot ) + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } } - else if( i > maxVal && i < range[1] ) + _thresholdTable->Build( ); + + if (_thresholdMapper==NULL) { - lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent + _thresholdMapper = vtkImageMapToColors::New( ); } - } - lookup->Build( ); + _thresholdMapper->SetLookupTable( _thresholdTable ); + _thresholdMapper->SetInput( img ); - vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( ); - mapperImage->SetLookupTable( lookup ); - mapperImage->SetInput( img ); - //mapperImage->SetOutputFormatToRGBA( ); + if (_thresholdActor==NULL) + { + _thresholdActor = vtkImageActor::New( ); + _thresholdActor->SetOpacity( 0.6 ); + _thresholdActor->InterpolateOn( ); + _thresholdActor->SetPosition( 0,0, 900-1 ); + } + + _thresholdActor->SetInput( _thresholdMapper->GetOutput() ); - vtkImageActor * upperImageActor = vtkImageActor::New( ); - upperImageActor->SetInput( mapperImage->GetOutput() ); - upperImageActor->SetOpacity( 1 ); + baseView->GetRenderer()->AddActor( _thresholdActor ); + _actorPresent = true; + } - vtkImageViewer2* viewer = vtkImageViewer2::New(); - viewer->SetInput( upperImageActor->GetInput() ); - viewer->SetColorLevel((range[1]-range[0])/2); - viewer->SetColorWindow(range[1]); - viewer->GetRenderer()->AddActor( upperImageActor ); - viewer->Render(); + else + { + _imageReslicer->SetResliceAxesOrigin(0,0,z); + img = _imageReslicer->GetOutput(); + img->Update(); + img->UpdateInformation(); + + //Assign a fake color for the upper image, and set the white as transparent + int i; + for(i = minTot; i <= maxTot; i++) + { + if( i >= minVal && i <= maxVal ) + { + _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1); + } + else if( i >= minTot && i < minVal ) + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else if( i > maxVal && i < maxTot ) + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else + { + _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + } - RefreshInterface(); + _thresholdTable->Build( ); + _thresholdMapper->SetLookupTable( _thresholdTable ); + _thresholdMapper->SetInput( img ); + _thresholdActor->SetInput( _thresholdMapper->GetOutput() ); + } + /* + vtkImageViewer2* viewer = vtkImageViewer2::New(); + viewer->SetInput( upperImageActor->GetInput() ); + viewer->SetColorLevel((range[1]-range[0])/2); + viewer->SetColorWindow(range[1]); + viewer->GetRenderer()->AddActor( upperImageActor ); + viewer->Render(); + */ + _theViewPanel->RefreshInterface(); } +void wxContourMainFrame::onThresholdChange() +{ + if (_actorPresent) + { + onThreshold(); + } +} + +void wxContourMainFrame::onThresholdInterpolation(bool interpolate) +{ + if (_thresholdActor!=NULL) + { + if (interpolate) + { + _thresholdActor->InterpolateOn( ); + } + + else + { + _thresholdActor->InterpolateOff( ); + } + + _theViewPanel->RefreshInterface(); + } +} + +void wxContourMainFrame::onThresholdChangeOpacity (int opacity) +{ + if (_actorPresent) + { + _thresholdActor->SetOpacity(opacity*0.1); + } + + _theViewPanel->RefreshInterface(); +} + +void wxContourMainFrame::onThresholdRemove() +{ + if (_actorPresent) + { + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); + baseView->GetRenderer()->RemoveActor( _thresholdActor ); + _actorPresent = false; + } + + _theViewPanel->RefreshInterface(); +} + void wxContourMainFrame::showAxis(bool show) { _theViewPanel->SetVisibleAxis(show); @@ -1802,7 +1953,6 @@ int wxContourMainFrame::getWindowLevel(){ void wxContourMainFrame::onBrigthnessColorWindowLevel(int colorwindow,int windowlevel){ _theViewPanel->onBrigthnessColorWindowLevel(colorwindow, windowlevel); - RefreshInterface(); } @@ -2438,4 +2588,8 @@ void wxContourMainFrame::saveFileWithContoursAutomatique(){ }else{ onSave(); } -} \ No newline at end of file +} +void wxContourMainFrame::ShowToolsPanel(bool show){ + _pannew->Show(show); +} +