Skip to content

Commit

Permalink
Add filter neighbors
Browse files Browse the repository at this point in the history
  • Loading branch information
davidborland committed Jan 23, 2020
1 parent 97dc8fa commit 8ce3e80
Show file tree
Hide file tree
Showing 12 changed files with 331 additions and 106 deletions.
1 change: 1 addition & 0 deletions Segmentor.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<file>icons/icon_smooth_normals.svg</file>
<file>icons/icon_plane.svg</file>
<file>icons/icon_filter_plane.svg</file>
<file>icons/icon_filter_neighbors.svg</file>
<file>icons/icon_filter_region.svg</file>
<file>icons/icon_dilate.svg</file>
<file>icons/icon_erode.svg</file>
Expand Down
128 changes: 118 additions & 10 deletions icons/icon_filter_plane.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
66 changes: 63 additions & 3 deletions icons/icon_filter_region.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions interaction/InteractionEnums.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,11 @@ enum InteractionMode {
EditMode
};

enum FilterMode {
FilterNone,
FilterPlane,
FilterNeighbors,
FilterRegion
};

#endif
60 changes: 48 additions & 12 deletions qt/MainWindow.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -358,15 +358,6 @@ void MainWindow::on_actionShowPlane(bool checked) {
visualizationContainer->GetVolumeView()->SetShowPlane(checked);
}

void MainWindow::on_actionFilterPlane(bool checked) {
visualizationContainer->GetVolumeView()->SetFilterPlane(checked);
}

void MainWindow::on_actionFilterRegion(bool checked) {
visualizationContainer->GetSliceView()->SetFilterRegion(checked);
visualizationContainer->GetVolumeView()->SetFilterRegion(checked);
}

void MainWindow::on_actionDilateRegion(bool) {
visualizationContainer->DilateCurrentRegion();
}
Expand Down Expand Up @@ -422,11 +413,13 @@ void MainWindow::SetDefaultDirectory(QString key, QString fileName) {
}

void MainWindow::CreateToolBar() {
// Create tool bar
QToolBar* toolBar = new QToolBar();
toolBar->setFloatable(true);
toolBar->setMovable(true);
toolBar->setOrientation(Qt::Vertical);

// Interaction toggle
QActionGroup* interactionModeGroup = new QActionGroup(this);
interactionModeGroup->setExclusive(true);

Expand All @@ -437,6 +430,27 @@ void MainWindow::CreateToolBar() {
QAction* actionEdit = new QAction("E", interactionModeGroup);
actionEdit->setCheckable(true);

// Filter mode toggle
// XXX: With Qt 5.14, should be able to set exclusion policy to avoid extra logic below
//QActionGroup* filterModeGroup = new QActionGroup(this);
//interactionModeGroup->setExclusive(false);

QAction* actionFilterPlane = new QAction(QIcon(":/icons/icon_filter_plane.svg"), "Filter to plane", this);
actionFilterPlane->setShortcut(QKeySequence("p"));
actionFilterPlane->setCheckable(true);
actionFilterPlane->setChecked(visualizationContainer->GetFilterMode() == FilterPlane);

QAction* actionFilterNeighbors = new QAction(QIcon(":/icons/icon_filter_neighbors.svg"), "Filter neighbors", this);
actionFilterNeighbors->setShortcut(QKeySequence("k"));
actionFilterNeighbors->setCheckable(true);
actionFilterNeighbors->setChecked(visualizationContainer->GetFilterMode() == FilterNeighbors);

QAction* actionFilterRegion = new QAction(QIcon(":/icons/icon_filter_region.svg"), "Filter region", this);
actionFilterRegion->setShortcut(QKeySequence("l"));
actionFilterRegion->setCheckable(true);
actionFilterRegion->setChecked(visualizationContainer->GetFilterMode() == FilterRegion);

// Add widgets to tool bar
toolBar->addWidget(CreateLabel("Mode"));
toolBar->addAction(actionNavigation);
toolBar->addAction(actionEdit);
Expand All @@ -452,14 +466,15 @@ void MainWindow::CreateToolBar() {
toolBar->addAction(CreateActionIcon(":/icons/icon_plane.svg", "Show plane", "o", visualizationContainer->GetVolumeView()->GetShowPlane(), &MainWindow::on_actionShowPlane));
toolBar->addSeparator();
toolBar->addWidget(CreateLabel("Filter"));
toolBar->addAction(CreateActionIcon(":/icons/icon_filter_plane.svg", "Filter to plane", "p", visualizationContainer->GetVolumeView()->GetFilterPlane(), &MainWindow::on_actionFilterPlane));
toolBar->addAction(CreateActionIcon(":/icons/icon_filter_region.svg", "Filter region", "l", visualizationContainer->GetVolumeView()->GetFilterRegion(), &MainWindow::on_actionFilterRegion));
toolBar->addAction(actionFilterPlane);
toolBar->addAction(actionFilterNeighbors);
toolBar->addAction(actionFilterRegion);
toolBar->addSeparator();
toolBar->addWidget(CreateLabel("Edit"));
toolBar->addAction(CreateActionIcon(":/icons/icon_dilate.svg", "Dilate region", "z", &MainWindow::on_actionDilateRegion));
toolBar->addAction(CreateActionIcon(":/icons/icon_erode.svg", "Erode region", "x",&MainWindow::on_actionErodeRegion));

// Need extra logic for modes
// Need extra logic for interaction mode
QObject::connect(actionNavigation, &QAction::triggered, this, &MainWindow::on_actionNavigation);
QObject::connect(actionEdit, &QAction::triggered, this, &MainWindow::on_actionEdit);
QObject::connect(new QShortcut(QKeySequence(32), this), &QShortcut::activated, [actionNavigation, actionEdit]() {
Expand All @@ -473,6 +488,27 @@ void MainWindow::CreateToolBar() {
}
});

// Need extra logic for filter mode
QObject::connect(actionFilterPlane, &QAction::triggered, [actionFilterPlane, actionFilterNeighbors, actionFilterRegion, this]() {
actionFilterNeighbors->setChecked(false);
actionFilterRegion->setChecked(false);

this->visualizationContainer->SetFilterMode(actionFilterPlane->isChecked() ? FilterPlane : FilterNone);
});
QObject::connect(actionFilterNeighbors, &QAction::triggered, [actionFilterPlane, actionFilterNeighbors, actionFilterRegion, this]() {
actionFilterPlane->setChecked(false);
actionFilterRegion->setChecked(false);

this->visualizationContainer->SetFilterMode(actionFilterNeighbors->isChecked() ? FilterNeighbors : FilterNone);
});
QObject::connect(actionFilterRegion, &QAction::triggered, [actionFilterPlane, actionFilterNeighbors, actionFilterRegion, this]() {
//actionFilterRegion->toggle();
actionFilterPlane->setChecked(false);
actionFilterNeighbors->setChecked(false);

this->visualizationContainer->SetFilterMode(actionFilterRegion->isChecked() ? FilterRegion : FilterNone);
});

toolBarWidget->layout()->addWidget(toolBar);
}

Expand Down
2 changes: 0 additions & 2 deletions qt/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ public slots:
virtual void on_actionSmoothNormals(bool checked);
virtual void on_actionSmoothSurfaces(bool checked);
virtual void on_actionShowPlane(bool checked);
virtual void on_actionFilterPlane(bool checked);
virtual void on_actionFilterRegion(bool checked);
virtual void on_actionDilateRegion(bool checked);
virtual void on_actionErodeRegion(bool checked);

Expand Down
35 changes: 15 additions & 20 deletions visualization/SliceView.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "Region.h"
#include "RegionOutline.h"
#include "RegionVoxelOutlines.h"
#include "RegionSurface.h"
#include "RegionCollection.h"
#include "SliceLocation.h"

Expand All @@ -37,9 +38,9 @@ void SliceView::cameraChange(vtkObject* caller, unsigned long eventId, void* cli
}

SliceView::SliceView(vtkRenderWindowInteractor* interactor, vtkLookupTable* lut) {
filterMode = FilterNone;
showRegionOutlines = true;
showVoxelOutlines = false;
filterRegion = false;

data = nullptr;
labels = nullptr;
Expand Down Expand Up @@ -225,6 +226,13 @@ void SliceView::SetInteractionMode(enum InteractionMode mode) {
style->SetMode(mode);
}

void SliceView::SetFilterMode(enum FilterMode mode) {
filterMode = mode;

FilterRegions();
}


bool SliceView::GetShowLabelSlice() {
return labelSlice->GetVisibility();
}
Expand Down Expand Up @@ -271,16 +279,6 @@ void SliceView::ToggleRegionOutlines() {
ShowRegionOutlines(!showRegionOutlines);
}

void SliceView::SetFilterRegion(bool filter) {
filterRegion = filter;

FilterRegions();
}

void SliceView::ToggleFilterRegion() {
SetFilterRegion(!filterRegion);
}

void SliceView::UpdatePlane() {
vtkCamera* cam = renderer->GetActiveCamera();

Expand Down Expand Up @@ -405,16 +403,13 @@ void SliceView::FilterRegions() {
RegionOutline* outline = region->GetOutline();
RegionVoxelOutlines* voxelOutlines = region->GetVoxelOutlines();

if (filterRegion && currentRegion) {
bool visible = region == currentRegion;
// XXX: Setting based on surface visiblity probably indicates that the logic should be pushed up to visualization container,
// with a method in region for turning on and off individual pieces

bool visible = region->GetSurface()->GetActor()->GetVisibility();

outline->GetActor()->SetVisibility(visible && showRegionOutlines);
voxelOutlines->GetActor()->SetVisibility(visible && showVoxelOutlines);
}
else {
outline->GetActor()->SetVisibility(showRegionOutlines);
voxelOutlines->GetActor()->SetVisibility(showVoxelOutlines);
}
outline->GetActor()->SetVisibility(visible && showRegionOutlines);
voxelOutlines->GetActor()->SetVisibility(visible && showVoxelOutlines);
}

renderer->ResetCameraClippingRange();
Expand Down
7 changes: 3 additions & 4 deletions visualization/SliceView.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class RegionCollection;
class SliceLocation;

enum InteractionMode;
enum FilterMode;

class SliceView {
public:
Expand All @@ -37,6 +38,7 @@ class SliceView {
void SetProbePosition(double x, double y, double z);

void SetInteractionMode(InteractionMode mode);
void SetFilterMode(FilterMode mode);

void SetCurrentRegion(Region* region);

Expand All @@ -52,9 +54,6 @@ class SliceView {
void ShowRegionOutlines(bool show);
void ToggleRegionOutlines();

void SetFilterRegion(bool filter);
void ToggleFilterRegion();

void UpdatePlane();

void Render();
Expand All @@ -63,9 +62,9 @@ class SliceView {
vtkSmartPointer<vtkInteractorStyleSlice> GetInteractorStyle();

protected:
FilterMode filterMode;
bool showVoxelOutlines;
bool showRegionOutlines;
bool filterRegion;

Region* currentRegion;

Expand Down
19 changes: 16 additions & 3 deletions visualization/VisualizationContainer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ VisualizationContainer::VisualizationContainer(vtkRenderWindowInteractor* volume
volumeView = new VolumeView(volumeInteractor);
sliceView = new SliceView(sliceInteractor, labelColors);

// Set to edit mode, then toggle to propagate change
interactionMode = EditMode;
ToggleInteractionMode();
// Set to navigation mode
SetInteractionMode(NavigationMode);

// Set to no filter
SetFilterMode(FilterNone);

// Callbacks

Expand Down Expand Up @@ -396,6 +398,17 @@ void VisualizationContainer::ToggleInteractionMode() {
SetInteractionMode(interactionMode == NavigationMode ? EditMode : NavigationMode);
}

FilterMode VisualizationContainer::GetFilterMode() {
return filterMode;
}

void VisualizationContainer::SetFilterMode(FilterMode mode) {
filterMode = mode;

volumeView->SetFilterMode(filterMode);
sliceView->SetFilterMode(filterMode);
}

void VisualizationContainer::PickLabel(int x, int y, int z) {
if (!labels) return;

Expand Down
7 changes: 7 additions & 0 deletions visualization/VisualizationContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Region;
class RegionCollection;

enum InteractionMode;
enum FilterMode;

class VisualizationContainer {
public:
Expand Down Expand Up @@ -47,6 +48,9 @@ class VisualizationContainer {
void SetInteractionMode(InteractionMode mode);
void ToggleInteractionMode();

FilterMode GetFilterMode();
void SetFilterMode(FilterMode mode);

void PickLabel(int x, int y, int z);
void Paint(int x, int y, int z);
void Erase(int x, int y, int z);
Expand Down Expand Up @@ -95,6 +99,9 @@ class VisualizationContainer {
// Current interaction mode
InteractionMode interactionMode;

// Current filter mode
FilterMode filterMode;

void SetImageData(vtkImageData* imageData);
bool SetLabelData(vtkImageData* labelData);

Expand Down
Loading

0 comments on commit 8ce3e80

Please sign in to comment.