Skip to content

Commit 06902d5

Browse files
committed
feat(UI): Add interface to view planes in the volume rendering mode
1 parent 0f3fb52 commit 06902d5

File tree

4 files changed

+51
-15
lines changed

4 files changed

+51
-15
lines changed

src/ItkVtkViewProxy.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ function ItkVtkViewProxy(publicAPI, model) {
2929
model.camera.setParallelScale(
3030
model.volumeRenderingCameraState.parallelScale
3131
);
32+
model.camera.setPhysicalTranslation(
33+
...model.volumeRenderingCameraState.physicalTranslation
34+
);
3235
}
3336
model.camera.setParallelProjection(false);
34-
volumeRepresentation.setSliceVisibility(false);
37+
volumeRepresentation.setSliceVisibility(model.viewPlanes);
3538
volumeRepresentation.setVolumeVisibility(true);
3639
} else {
3740
model.camera.setParallelProjection(true);
@@ -72,10 +75,8 @@ function ItkVtkViewProxy(publicAPI, model) {
7275
const isVolumeRepresentation = !!rep.getVolumes().length;
7376
return isVolumeRepresentation;
7477
});
75-
console.log(model.viewMode);
7678
if (model.viewMode === 'VolumeRendering') {
7779
model.volumeRenderingCameraState = model.camera.getState();
78-
console.log(model.volumeRenderingCameraState);
7980
}
8081
switch (mode) {
8182
case 'XPlane':
@@ -100,6 +101,18 @@ function ItkVtkViewProxy(publicAPI, model) {
100101
publicAPI.resetCamera();
101102
};
102103

104+
publicAPI.setViewPlanes = (viewPlanes) => {
105+
model.viewPlanes = viewPlanes;
106+
if (model.viewMode === 'VolumeRendering') {
107+
const volumeRepresentations = model.representations.filter((rep) => {
108+
const isVolumeRepresentation = !!rep.getVolumes().length;
109+
return isVolumeRepresentation;
110+
});
111+
volumeRepresentations[0].setSliceVisibility(viewPlanes);
112+
model.renderWindow.render();
113+
}
114+
};
115+
103116
publicAPI.resetOrientation();
104117
}
105118

@@ -109,9 +122,7 @@ function ItkVtkViewProxy(publicAPI, model) {
109122

110123
const DEFAULT_VALUES = {
111124
viewMode: 'VolumeRendering',
112-
volumeRenderingAxis: 1,
113-
volumeRenderingOrientation: 1,
114-
volumeRenderingViewUp: [0, 0, 1],
125+
viewPlanes: false,
115126
};
116127

117128
// ----------------------------------------------------------------------------
@@ -120,7 +131,7 @@ export function extend(publicAPI, model, initialValues = {}) {
120131
Object.assign(model, DEFAULT_VALUES, initialValues);
121132

122133
vtkViewProxy.extend(publicAPI, model, initialValues);
123-
macro.get(publicAPI, model, ['viewMode']);
134+
macro.get(publicAPI, model, ['viewMode', 'viewPlanes']);
124135

125136
// Object specific methods
126137
ItkVtkViewProxy(publicAPI, model);

src/userInterface/ItkVtkImageViewer.mcss

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@
184184
.toggleSwitch {
185185
position: relative;
186186
display: inline-block;
187-
width: 2.8em;
187+
width: 2.4em;
188188
height: 1.4em;
189189
margin: 4px;
190190
}
@@ -205,8 +205,8 @@
205205
right: 0;
206206
bottom: 0;
207207
background-color: #aaa;
208-
-webkit-transition: .4s;
209-
transition: .4s;
208+
-webkit-transition: .2s;
209+
transition: .2s;
210210
border-radius: 1.5em;
211211
}
212212

@@ -218,8 +218,8 @@
218218
left: 0.2em;
219219
bottom: 0.2em;
220220
background-color: white;
221-
-webkit-transition: .4s;
222-
transition: .4s;
221+
-webkit-transition: .2s;
222+
transition: .2s;
223223
border-radius: 50%;
224224
}
225225

@@ -232,9 +232,9 @@ input:focus + .toggleWidget {
232232
}
233233

234234
input:checked + .toggleWidget:before {
235-
-webkit-transform: translateX(1.4em);
236-
-ms-transform: translateX(1.4em);
237-
transform: translateX(1.4em);
235+
-webkit-transform: translateX(1.0em);
236+
-ms-transform: translateX(1.0em);
237+
transform: translateX(1.0em);
238238
}
239239

240240
.selector {

src/userInterface/createMainUI.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import volumeRenderingIcon from './icons/volume-rendering.svg';
1111
import xPlaneIcon from './icons/x-plane.svg';
1212
import yPlaneIcon from './icons/y-plane.svg';
1313
import zPlaneIcon from './icons/z-plane.svg';
14+
import viewPlansIcon from './icons/view-planes.svg';
1415

1516
function createMainUI(
1617
rootContainer,
@@ -99,6 +100,11 @@ function createMainUI(
99100
function setViewModeVolumeRendering() {
100101
view.setViewMode('VolumeRendering');
101102
}
103+
let viewPlanes = false;
104+
function setViewPlanes() {
105+
viewPlanes = !viewPlanes;
106+
view.setViewPlanes(viewPlanes);
107+
}
102108
if (!use2D) {
103109
const xPlaneButton = document.createElement('div');
104110
xPlaneButton.innerHTML = `<div class="${
@@ -127,6 +133,22 @@ function createMainUI(
127133
}">${volumeRenderingIcon}</div>`;
128134
volumeRenderingButton.addEventListener('click', setViewModeVolumeRendering);
129135
mainUIRow.appendChild(volumeRenderingButton);
136+
137+
const viewPlanesButton = document.createElement('div');
138+
viewPlanesButton.innerHTML = `<div class="${
139+
style.viewModeButton
140+
}">${viewPlansIcon}</div>`;
141+
viewPlanesButton.addEventListener('click', setViewPlanes);
142+
const viewPlanesWidget = document.createElement('label');
143+
viewPlanesWidget.setAttribute('class', style.toggleSwitch);
144+
viewPlanesWidget.innerHTML = `<input type="checkbox" class="${
145+
style.toggleSwitchInput
146+
}"><span class="${style.toggleWidget}"></span>`;
147+
viewPlanesWidget.addEventListener('change', (event) => {
148+
setViewPlanes();
149+
});
150+
mainUIRow.appendChild(viewPlanesButton);
151+
mainUIRow.appendChild(viewPlanesWidget);
130152
}
131153

132154
uiContainer.appendChild(mainUIGroup);
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)