From 9f3ce26fe4bcc20f4927bec7ec25de8787ca2a1d Mon Sep 17 00:00:00 2001 From: donadio Date: Thu, 16 Apr 2009 15:33:55 +0000 Subject: [PATCH] *** empty log message *** --- .../interfMainPanel.cxx | 112 +++-- .../interfMainPanel.h | 19 +- .../interfSegmentationPanels.cxx | 80 +++- .../interfSegmentationPanels.h | 13 + .../wxContourMainFrame.cxx | 413 ++++++++++++++---- .../wxContourMainFrame.h | 23 +- .../wxContourViewPanel.cxx | 5 +- 7 files changed, 505 insertions(+), 160 deletions(-) diff --git a/lib/Interface_Icons_NDimensions/interfMainPanel.cxx b/lib/Interface_Icons_NDimensions/interfMainPanel.cxx index 4b8c16e..60a8d17 100644 --- a/lib/Interface_Icons_NDimensions/interfMainPanel.cxx +++ b/lib/Interface_Icons_NDimensions/interfMainPanel.cxx @@ -38,8 +38,6 @@ interfMainPanel::interfMainPanel(wxWindow * parent, int sizex, int sizey, wxEvtH splitterwindow->SetMinimumPaneSize( 10 ); sizey = sizey/8; - - wxPanel* toolpanel = new wxPanel(splitterwindow, -1, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE, wxString(_T(""))); wxFlexGridSizer* flexsizer = new wxFlexGridSizer(6,2,1,1); @@ -298,7 +296,7 @@ void interfMainPanel::showPanel(wxWindow* panel) } /** -** Hide the panel in the +** Hide the panel in the lower box **/ void interfMainPanel::hidePanel( ){ wxContourMainFrame::getInstance()->showAxis(false); @@ -415,16 +413,6 @@ void interfMainPanel::onSegmentationAllSlice(int minZ,int maxZ,int isovalue,int wxContourMainFrame::getInstance()->onSegmentationAllSlice(minZ, maxZ,isovalue,sampling,method); } -void interfMainPanel::onMirror() -{ - wxContourMainFrame::getInstance()->onMirror(); -} - -void interfMainPanel::onMirrorChangeWidth(int width) -{ - wxContourMainFrame::getInstance()->refLineChangeWidth(width); -} - void interfMainPanel::setLabelSegmentationPanelVTK(wxString tmpString){ ((interfSegmentationPanelVTK*)segmentationPanel)->setLabel(tmpString); } @@ -496,7 +484,8 @@ void interfMainPanel::onBrigthnessColorWindowLevel(int colorwindow,int windowlev wxContourMainFrame::getInstance()->onBrigthnessColorWindowLevel(colorwindow, windowlevel); } -void interfMainPanel::onInterpolation(bool interpolate){ +void interfMainPanel::onInterpolation(bool interpolate) +{ wxContourMainFrame::getInstance()->onInterpolation(interpolate); } @@ -642,7 +631,10 @@ wxString interfMainPanel::getCellValue(int j,int i){ return ((interfInformationPanel*)informationPanel)->getCellValue(j, i ); } -void interfMainPanel::onSnakePressed(){ +void interfMainPanel::onSnakePressed() +{ + axisshown=false; + wxContourMainFrame::getInstance()->showAxis(axisshown); wxContourMainFrame::getInstance()->onSnakePressed(); } @@ -664,38 +656,81 @@ void interfMainPanel::onMirrorPressed(){ mirrorPanel->Layout(); refLineShown=true; - - showPanel(mirrorPanel); wxContourMainFrame::getInstance()->referenceLine(); } else { - if(refLineShown) - { - wxContourMainFrame::getInstance()->refLineHide(); - refLineShown=false; - - hidePanel(); - } - else if (!refLineShown) + if (!refLineShown) { wxContourMainFrame::getInstance()->refLineShow(); refLineShown=true; - - showPanel(mirrorPanel); } } + showPanel(mirrorPanel); } - +void interfMainPanel::onMirror() +{ + wxContourMainFrame::getInstance()->onMirror(); +} + +void interfMainPanel::onMirrorAxisShow() +{ + if (!refLineShown) + { + wxContourMainFrame::getInstance()->refLineShow(); + refLineShown=true; + } +} + +void interfMainPanel::onMirrorAxisHide() +{ + if (refLineShown) + { + wxContourMainFrame::getInstance()->refLineHide(); + refLineShown=false; + } +} + +void interfMainPanel::onMirrorChangeWidth(int width) +{ + wxContourMainFrame::getInstance()->refLineChangeWidth(width); +} + + void interfMainPanel::onThreshold(int minVal, int maxVal) { wxContourMainFrame::getInstance()->onThreshold(minVal, maxVal); } +void interfMainPanel::onThresholdChange(int minVal, int maxVal) +{ + wxContourMainFrame::getInstance()->onThresholdChange(minVal, maxVal); +} + +void interfMainPanel::onThresholdInstantChange(int range[]) +{ + panelThreshold->onThresholdInstantChange(range); +} + +void interfMainPanel::onThresholdInterpolation(bool interpolate) +{ + wxContourMainFrame::getInstance()->onThresholdInterpolation(interpolate); +} + +void interfMainPanel::onThresholdChangeOpacity (int opacity) +{ + wxContourMainFrame::getInstance()->onThresholdChangeOpacity(opacity); +} + +void interfMainPanel::onThresholdRemove() +{ + wxContourMainFrame::getInstance()->onThresholdRemove(); +} + void interfMainPanel::onThresholdPressed() { if(thresholdPanel==NULL) @@ -713,24 +748,7 @@ void interfMainPanel::onThresholdPressed() flexsizer->Add(stattext,wxALIGN_CENTER | wxALIGN_CENTRE); flexsizer->Add(panelThreshold, wxEXPAND); thresholdPanel->Layout(); - showPanel(thresholdPanel); - } - - else - { - if(thresholdShown) - { - thresholdShown=false; - panelThreshold->onThresholdStop(); - - hidePanel(); - } - - else if (!thresholdShown) - { - thresholdShown=true; - showPanel(thresholdPanel); - } - } + } + showPanel(thresholdPanel); } diff --git a/lib/Interface_Icons_NDimensions/interfMainPanel.h b/lib/Interface_Icons_NDimensions/interfMainPanel.h index 7b2fe74..ddcb703 100644 --- a/lib/Interface_Icons_NDimensions/interfMainPanel.h +++ b/lib/Interface_Icons_NDimensions/interfMainPanel.h @@ -126,14 +126,30 @@ public: void onSegmentationAllSlice(int minZ,int maxZ,int isovalue,int sampling,int method); + void onMirrorPressed(); + void onMirror(); + void onMirrorAxisShow(); + + void onMirrorAxisHide(); + void onMirrorChangeWidth(int width); void onThreshold(int minVal, int maxVal); + void onThresholdChange(int minVal, int maxVal); + + void onThresholdInstantChange(int range[]); + + void onThresholdRemove(); + void onThresholdPressed(); + void onThresholdInterpolation(bool interpolate); + + void onThresholdChangeOpacity (int opacity); + void setLabelSegmentationPanelVTK(wxString tmpString); void onSegmentationPressed(); @@ -192,8 +208,6 @@ public: void onSnakePressed(); - void onMirrorPressed(); - private: @@ -242,7 +256,6 @@ private: bool axisshown; bool refLineShown; - bool thresholdShown; //This attribute contains the panel in charge of adding and removing the corresponding checkboxes in //list of contours diff --git a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx index 9be4d4b..edb257c 100644 --- a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx +++ b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx @@ -201,12 +201,19 @@ void interfSegmentationPanelITK::onSegmentationAllSlice( wxCommandEvent& event ) interfMirrorPanel::interfMirrorPanel(wxWindow* parent) : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN) { - wxButton *mirrorGoBtn = new wxButton(this,-1,_T("Go"), wxDefaultPosition, wxSize(200,35) ); - _thickness = new wxSlider(this, -1, 4, 1, 10, wxDefaultPosition, wxSize(200,35), wxSL_HORIZONTAL|wxSL_LABELS, wxDefaultValidator); + wxButton *axisShowBtn = new wxButton(this,wxID_ANY,_T("Show Axis"), wxDefaultPosition, wxSize(200,35) ); + wxButton *axisHideBtn = new wxButton(this,wxID_ANY,_T("Hide Axis"), wxDefaultPosition, wxSize(200,35) ); + wxButton *mirrorGoBtn = new wxButton(this,wxID_ANY,_T("Mirror Contour"), wxDefaultPosition, wxSize(200,35) ); + _thickness = new wxSlider(this, -1, 4, 1, 10, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL|wxSL_LABELS, wxDefaultValidator); - Connect( mirrorGoBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfMirrorPanel::onMirrorGo ); + Connect( axisShowBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfMirrorPanel::onAxisShow ); + Connect( axisHideBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfMirrorPanel::onAxisHide ); + Connect( mirrorGoBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfMirrorPanel::onMirrorGo ); wxFlexGridSizer * sizer = new wxFlexGridSizer(1); + sizer -> Add( axisShowBtn, 1, wxGROW ); + sizer -> Add( axisHideBtn, 1, wxGROW ); + sizer -> Add( new wxStaticText(this,-1,_T(" ")) , 1, wxGROW ); sizer -> Add( new wxStaticText(this,-1,_T("Thickness")) , 1, wxGROW ); sizer -> Add( _thickness, 1, wxGROW ); sizer -> Add( mirrorGoBtn, 1, wxGROW ); @@ -219,6 +226,16 @@ interfMirrorPanel::interfMirrorPanel(wxWindow* parent) interfMirrorPanel::~interfMirrorPanel(){ } +void interfMirrorPanel::onAxisShow(wxCommandEvent& event) +{ + interfMainPanel::getInstance()->onMirrorAxisShow(); +} + +void interfMirrorPanel::onAxisHide(wxCommandEvent& event) +{ + interfMainPanel::getInstance()->onMirrorAxisHide(); +} + void interfMirrorPanel::onMirrorGo(wxCommandEvent& event) { interfMainPanel::getInstance()->onMirror(); @@ -238,13 +255,19 @@ void interfMirrorPanel::onChangeWidth(wxScrollEvent& event) interfThresholdPanel::interfThresholdPanel(wxWindow* parent) : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN) { - wxButton *thresholdGoBtn = new wxButton(this,-1,_T("Threshold Go"), wxDefaultPosition, wxSize(200,30) ); - + wxButton *thresholdGoBtn = new wxButton(this,wxID_ANY,_T("Add Fake Color"), wxDefaultPosition, wxSize(200,30) ); + wxButton *thresholdRemoveBtn = new wxButton(this,wxID_ANY,_T("Remove Fake Color"), wxDefaultPosition, wxSize(200,30) ); + _interpolationCheckBox = new wxCheckBox(this, -1, _T("Image interpolation") ); + _interpolationCheckBox->SetValue(true); + _opacity = new wxSlider(this, wxID_ANY, 6, 1, 10, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL|wxSL_LABELS, wxDefaultValidator); _thresholdGo = false; double range[2]; interfMainPanel::getInstance()->getImageRange(range); + int min = floor (range[0]); + int max = ceil (range[1]); + _mBarThreshold = new mBarRange(this,70,65); _mBarThreshold->SetMin(0); _mBarThreshold->SetStart(0); @@ -252,21 +275,27 @@ interfThresholdPanel::interfThresholdPanel(wxWindow* parent) _mBarThreshold-> setActiveStateTo(true); _mBarThreshold-> setVisibleLabels( true ); _mBarThreshold-> setDeviceEndMargin(10); - _mBarThreshold-> setRepresentedValues( range[0] , range[1] ); + _mBarThreshold-> setRepresentedValues( min , max ); _mBarThreshold-> setDeviceBlitStart(10,10); _mBarThreshold-> setIfWithActualDrawed( false ); - _mBarThreshold-> SetStart( range[0] ); - _mBarThreshold-> SetEnd( range[1] ); + _mBarThreshold-> SetStart( min ); + _mBarThreshold-> SetEnd( max ); Connect( thresholdGoBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfThresholdPanel::onThresholdGo ); + Connect( thresholdRemoveBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfThresholdPanel::onThresholdRemove ); + Connect( _interpolationCheckBox->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction) &interfThresholdPanel::onThresholdInterpolation ); wxFlexGridSizer * sizer = new wxFlexGridSizer(1); + sizer -> Add( new wxStaticText(this,-1,_T("Image Threshold")) , 1, wxGROW ); sizer -> Add( _mBarThreshold, 1, wxGROW ); - sizer -> Add( thresholdGoBtn, 1, wxGROW ); sizer -> Add( new wxStaticText(this,-1,_T(" ")) , 1, wxGROW ); + sizer -> Add( new wxStaticText(this,-1,_T("Opacity Level")) , 1, wxGROW ); + sizer -> Add( _opacity, 1, wxGROW ); sizer -> Add( new wxStaticText(this,-1,_T(" ")) , 1, wxGROW ); - //sizer -> Add( new wxStaticText(this,-1,_T("Select the image's range to superpose a Fake Color")) , 1, wxGROW ); - + sizer -> Add( thresholdGoBtn, 1, wxGROW ); + sizer -> Add( thresholdRemoveBtn, 1, wxGROW ); + sizer -> Add( new wxStaticText(this,-1,_T(" ")) , 1, wxGROW ); + sizer -> Add( _interpolationCheckBox, 1, wxGROW ); this->SetSizer( sizer ); this->SetAutoLayout( true ); @@ -285,9 +314,9 @@ void interfThresholdPanel::onThresholdChange(wxCommandEvent& event) int minVal = _mBarThreshold->GetStart(); int maxVal = _mBarThreshold->GetEnd(); - interfMainPanel::getInstance()->onThreshold(minVal, maxVal); + interfMainPanel::getInstance()->onThresholdChange(minVal, maxVal); - std::cout<< "Valor Min: " << minVal << " & Valor Max: " << maxVal << std::endl; + //std::cout<< "Valor Min: " << minVal << " & Valor Max: " << maxVal << std::endl; } } @@ -303,11 +332,35 @@ void interfThresholdPanel::onThresholdGo(wxCommandEvent& event) } } +void interfThresholdPanel::onThresholdRemove(wxCommandEvent& event) +{ + interfMainPanel::getInstance()->onThresholdRemove( ); + _thresholdGo=false; +} + void interfThresholdPanel::onThresholdStop() { + interfMainPanel::getInstance()->onThresholdRemove( ); _thresholdGo=false; } +void interfThresholdPanel::onThresholdInstantChange(int range[]) +{ + range[0] = _mBarThreshold->GetStart(); + range[1] = _mBarThreshold->GetEnd(); +} + +void interfThresholdPanel::onThresholdInterpolation(wxCommandEvent& event) +{ + interfMainPanel::getInstance()->onThresholdInterpolation(_interpolationCheckBox->GetValue()); +} + +void interfThresholdPanel::onChangeOpacity(wxScrollEvent& event) +{ + int opacity = _opacity->GetValue(); + interfMainPanel::getInstance()->onThresholdChangeOpacity(opacity); +} + BEGIN_EVENT_TABLE(interfMirrorPanel, wxPanel) EVT_SCROLL(interfMirrorPanel :: onChangeWidth) @@ -317,6 +370,7 @@ BEGIN_EVENT_TABLE(interfThresholdPanel, wxPanel) EVT_COMMAND(wxID_ANY, wxEVT_TSBAR_START, interfThresholdPanel :: onThresholdChange) EVT_COMMAND(wxID_ANY, wxEVT_TSBAR_END, interfThresholdPanel :: onThresholdChange) EVT_COMMAND(wxID_ANY, wxEVT_TSBAR_MOVED, interfThresholdPanel :: onThresholdChange) + EVT_SCROLL(interfThresholdPanel :: onChangeOpacity) END_EVENT_TABLE() diff --git a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h index 5e5b940..72399b1 100644 --- a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h +++ b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h @@ -89,6 +89,10 @@ private: wxSlider* _thickness; + void onAxisShow(wxCommandEvent& event); + + void onAxisHide(wxCommandEvent& event); + void onMirrorGo(wxCommandEvent& event); void onChangeWidth(wxScrollEvent& event); @@ -105,16 +109,25 @@ public: ~interfThresholdPanel(); void onThresholdStop(); + void onThresholdInstantChange(int range[]); private: mBarRange* _mBarThreshold; + wxSlider* _opacity; bool _thresholdGo; + wxCheckBox* _interpolationCheckBox; void onThresholdChange(wxCommandEvent& event); void onThresholdGo(wxCommandEvent& event); + void onThresholdRemove(wxCommandEvent& event); + + void onThresholdInterpolation(wxCommandEvent& event); + + void onChangeOpacity(wxScrollEvent& event); + DECLARE_EVENT_TABLE() }; diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx index 3070d42..4ca7174 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx @@ -58,6 +58,8 @@ char wxContourMainFrame::COPY = 'C'; _refLineControl = NULL; _refLineModel = NULL; _refLineView = 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 +79,8 @@ char wxContourMainFrame::COPY = 'C'; _refLineControl = NULL; _refLineModel = NULL; _refLineView = NULL; + _thresholdActor = NULL; + _actorPresent = false; // set up default notebook style m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER; @@ -592,11 +596,12 @@ void wxContourMainFrame::changeInstant() updateInstantOutlines(); updateInstantImageData(); updateInstantAxes(); - - + updateActor(); } -void wxContourMainFrame :: updateInstantOutlines(){ - + + +void wxContourMainFrame :: updateInstantOutlines() +{ _theViewPanel->removeSceneContours(); _theViewPanel->addNameWrapperToScene(); @@ -613,7 +618,8 @@ std::string wxContourMainFrame::getNameWrapping(int i){ return kernelManager->getNameWrapping(i); } -void wxContourMainFrame::updateInstantImageData(){ +void wxContourMainFrame::updateInstantImageData() +{ std::vector inst; _instantPanel->getInstant(inst); @@ -627,7 +633,84 @@ void wxContourMainFrame::updateInstantImageData(){ } } -void wxContourMainFrame::updateInstantAxes(){ +void wxContourMainFrame::updateInstantAxes() +{ +} + +void wxContourMainFrame :: updateActor() +{ + if (_actorPresent) + { + int minMax[2]; + _pannew->onThresholdInstantChange(minMax); + + int z = _theViewPanel->GetZ(); + + vtkImageData * img = getImageData(); + vtkImageReslice *imageReslice = vtkImageReslice::New(); + + imageReslice->SetInput( img ); + imageReslice->SetInformationInput(img); + imageReslice->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1); + imageReslice->SetResliceAxesOrigin(0,0,z); + imageReslice->SetOutputDimensionality(2); + imageReslice->SetInterpolationModeToLinear(); + + img = imageReslice->GetOutput(); + img->Update(); + img->UpdateInformation(); + + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); + + double range[2]; + img->GetScalarRange(range); + + int min = floor (range[0]); + int max = ceil (range[1]); + + //Lookup Table + vtkLookupTable *lookup = vtkLookupTable::New(); + lookup->SetNumberOfTableValues(max+1); + lookup->SetTableRange(range); + lookup->SetAlphaRange(0, 1); + lookup->SetValueRange(0, 1); + lookup->SetSaturationRange(0, 0); + lookup->SetRampToLinear( ); + + //Assign a fake color for the upper image, and set the white as transparent + int i; + int minVal = minMax[0]; + int maxVal = minMax[1]; + + for(i = min; i <= max; i++) + { + if( i >= minVal && i <= maxVal ) + { + lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1); + } + else if( i >= min && i < minVal ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else if( i > maxVal && i < max ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + } + + lookup->Build( ); + + vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( ); + mapperImage->SetLookupTable( lookup ); + mapperImage->SetInput( img ); + //mapperImage->SetOutputFormatToRGBA( ); + + _thresholdActor->SetInput( mapperImage->GetOutput() ); + } } void wxContourMainFrame::onChangeDeep(int val){ @@ -1576,49 +1659,52 @@ 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 ); + viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl ); + _refLineModel->SetCloseContour(false); + _refLineControl->CreateNewManualContour(); - double z = _refLineControl->GetZ(); -/* - _refLineControl->AddPoint(50,100,z); - _refLineControl->AddPoint(80,40,z); - _refLineControl->SetCompleteCreation(true); + 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 +1712,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 +1728,23 @@ 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 ); + viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl ); + _refLineControl->CreateNewManualContour(); + _refLineControl->SetActive(true); + _refLineView->RefreshContour(); + + RefreshInterface(); + } } } @@ -1697,42 +1793,157 @@ void wxContourMainFrame::onMirror() void wxContourMainFrame::onThreshold(int minVal, int maxVal) { - - vtkImageData * img = _theViewPanel->getImageData(); - - double range[2]; - img->GetScalarRange(range); - - //vtkImageData * fakeImage = new vtkImageData(); + if (!_actorPresent) + { + int z = _theViewPanel->GetZ(); - //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( ); + vtkImageData * img = getImageData(); + vtkImageReslice *imageReslice = vtkImageReslice::New(); + imageReslice->SetInput( img ); + imageReslice->SetInformationInput(img); + imageReslice->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1); + imageReslice->SetResliceAxesOrigin(0,0,z); + imageReslice->SetOutputDimensionality(2); + imageReslice->SetInterpolationModeToLinear(); + img = imageReslice->GetOutput(); + img->Update(); + img->UpdateInformation(); - //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 ) + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); + + double range[2]; + img->GetScalarRange(range); + + int min = floor (range[0]); + int max = ceil (range[1]); + + //Lookup Table + vtkLookupTable *lookup = vtkLookupTable::New(); + lookup->SetNumberOfTableValues(max+1); + lookup->SetTableRange(range); + lookup->SetAlphaRange(0, 1); + lookup->SetValueRange(0, 1); + lookup->SetSaturationRange(0, 0); + lookup->SetRampToLinear( ); + + //Assign a fake color for the upper image, and set the white as transparent + int i; + for(i = min; i <= max; i++) { - lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1); + if( i >= minVal && i <= maxVal ) + { + lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1); + } + else if( i >= min && i < minVal ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else if( i > maxVal && i < max ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } } - else if( i >= range[0] && i < minVal ) + + lookup->Build( ); + + vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( ); + mapperImage->SetLookupTable( lookup ); + mapperImage->SetInput( img ); + //mapperImage->SetOutputFormatToRGBA( ); + + if (_thresholdActor==NULL) { - lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent + _thresholdActor = vtkImageActor::New( ); + _thresholdActor->SetInput( mapperImage->GetOutput() ); + _thresholdActor->SetOpacity( 0.6 ); + _thresholdActor->InterpolateOn( ); } - else if( i > maxVal && i < range[1] ) + else { - lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent + _thresholdActor->SetInput( mapperImage->GetOutput() ); } + + baseView->GetRenderer()->AddActor( _thresholdActor ); + _actorPresent = true; } + + RefreshInterface(); +/* + 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(); +*/ + +} + +void wxContourMainFrame::onThresholdChange(int minVal, int maxVal) +{ + if (_actorPresent) + { + int z = _theViewPanel->GetZ(); + + vtkImageData * img = getImageData(); + vtkImageReslice *imageReslice = vtkImageReslice::New(); + + imageReslice->SetInput( img ); + imageReslice->SetInformationInput(img); + imageReslice->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1); + imageReslice->SetResliceAxesOrigin(0,0,z); + imageReslice->SetOutputDimensionality(2); + imageReslice->SetInterpolationModeToLinear(); + + img = imageReslice->GetOutput(); + img->Update(); + img->UpdateInformation(); + + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); + double range[2]; + img->GetScalarRange(range); + + int min = floor (range[0]); + int max = ceil (range[1]); + + //Lookup Table + vtkLookupTable *lookup = vtkLookupTable::New(); + lookup->SetNumberOfTableValues(max+1); + lookup->SetTableRange(range); + lookup->SetAlphaRange(0, 1); + lookup->SetValueRange(0, 1); + lookup->SetSaturationRange(0, 0); + lookup->SetRampToLinear( ); + + //Assign a fake color for the upper image, and set the white as transparent + int i; + for(i = min; i <= max; i++) + { + if( i >= minVal && i <= maxVal ) + { + lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1); + } + else if( i >= min && i < minVal ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else if( i > maxVal && i < max ) + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + else + { + lookup->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent + } + } + lookup->Build( ); vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( ); @@ -1740,20 +1951,51 @@ void wxContourMainFrame::onThreshold(int minVal, int maxVal) mapperImage->SetInput( img ); //mapperImage->SetOutputFormatToRGBA( ); - vtkImageActor * upperImageActor = vtkImageActor::New( ); - upperImageActor->SetInput( mapperImage->GetOutput() ); - upperImageActor->SetOpacity( 1 ); + _thresholdActor->SetInput( mapperImage->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(); + RefreshInterface(); +} + +void wxContourMainFrame::onThresholdInterpolation(bool interpolate) +{ + if (_thresholdActor!=NULL) + { + if (interpolate) + { + _thresholdActor->InterpolateOn( ); + } + + else + { + _thresholdActor->InterpolateOff( ); + } RefreshInterface(); + } } +void wxContourMainFrame::onThresholdChangeOpacity (int opacity) +{ + if (_actorPresent) + { + _thresholdActor->SetOpacity(opacity*0.1); + } + + RefreshInterface(); +} + +void wxContourMainFrame::onThresholdRemove() +{ + if (_actorPresent) + { + wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView(); + baseView->GetRenderer()->RemoveActor( _thresholdActor ); + _actorPresent = false; + } + + RefreshInterface(); +} void wxContourMainFrame::showAxis(bool show) { @@ -1802,7 +2044,6 @@ int wxContourMainFrame::getWindowLevel(){ void wxContourMainFrame::onBrigthnessColorWindowLevel(int colorwindow,int windowlevel){ _theViewPanel->onBrigthnessColorWindowLevel(colorwindow, windowlevel); - RefreshInterface(); } diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h index ffad5e3..9d3660a 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h @@ -220,6 +220,7 @@ class wxContourMainFrame : public wxPanel { void updateInstantOutlines(); void updateInstantImageData(); void updateInstantAxes(); + void updateActor(); void onChangeDeep(int val); @@ -258,6 +259,10 @@ class wxContourMainFrame : public wxPanel { //AD void onMirror(); void onThreshold(int minVal, int maxVal); + void onThresholdChange(int minVal, int maxVal); + void onThresholdInterpolation(bool interpolate); + void onThresholdChangeOpacity (int opacity); + void onThresholdRemove(); //==================================================================================================== @@ -331,15 +336,15 @@ private: wxAuiManager m_mgr; - /* - wxArrayString m_perspectives; - wxMenu* m_perspectives_menu; - */ - - wxAuiNotebook * notebook; - long m_notebook_style; - long m_notebook_theme; - int _numberOfVariablesStatistics; + wxAuiNotebook * notebook; + + long m_notebook_style; + long m_notebook_theme; + int _numberOfVariablesStatistics; + + vtkImageActor * _thresholdActor; + + bool _actorPresent; //OutlineModelManager * _modelManager; diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx index 08bc31e..1394bfa 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourViewPanel.cxx @@ -213,8 +213,8 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) void wxContourViewPanel::createViewPanel() { std::vector * numViews = new std::vector (); - numViews->push_back(-1); - theViewPanel = new wxMaracas_N_ViewersWidget( this, showingVID, numViews ); + numViews->push_back(0); + theViewPanel = new wxMaracas_N_ViewersWidget( this, showingVID, numViews ); SetVisibleAxis(false); theViewPanel->SetBackgroundColour(wxColour(0,0,0)); @@ -671,6 +671,7 @@ DEFINE_EVENT_TYPE( wxINSTANT_CHANGE ) } wxContourMainFrame::getInstance()->changeInstant(); } + void wxContourViewPanel::onCreateMultipleROI (wxCommandEvent& event){ } void wxContourViewPanel::onCreateROI (wxCommandEvent& event){ -- 2.45.1