Skip to content

Commit 53b3223

Browse files
authored
Merge pull request #558 from Kitware/lut-data-range-rescale
Lut data range rescale
2 parents 09d56fa + 50eb6d6 commit 53b3223

File tree

3 files changed

+38
-2
lines changed
  • Examples/Applications/VolumeViewer
  • Sources/Interaction

3 files changed

+38
-2
lines changed

Examples/Applications/VolumeViewer/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ function createViewer(rootContainer, fileContents, options) {
128128
// Control UI
129129
const controllerWidget = vtkVolumeController.newInstance({
130130
size: [400, 150],
131+
rescaleColorMap: true,
131132
});
132133
const isBackgroundDark = background[0] + background[1] + background[2] < 1.5;
133134
controllerWidget.setContainer(rootContainer);

Sources/Interaction/UI/VolumeController/index.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ function vtkVolumeController(publicAPI, model) {
5858
const dataArray =
5959
sourceDS.getPointData().getScalars() ||
6060
sourceDS.getPointData().getArrays()[0];
61-
const dataRange = dataArray.getRange();
61+
const dataRange = model.rescaleColorMap
62+
? model.colorDataRange
63+
: dataArray.getRange();
6264
const preset = vtkColorMaps.getPresetByName(
6365
model.el.querySelector('.js-color-preset').value
6466
);
@@ -196,6 +198,7 @@ function vtkVolumeController(publicAPI, model) {
196198
model.widget.applyOpacity(piecewiseFunction);
197199
model.widget.setContainer(widgetContainer);
198200
model.widget.bindMouseListeners();
201+
model.colorDataRange = model.widget.getOpacityRange();
199202

200203
// Attach listeners
201204
domToggleButton.addEventListener('click', toggleVisibility);
@@ -206,6 +209,11 @@ function vtkVolumeController(publicAPI, model) {
206209

207210
model.widget.onOpacityChange(() => {
208211
model.widget.applyOpacity(piecewiseFunction);
212+
model.colorDataRange = model.widget.getOpacityRange();
213+
if (model.rescaleColorMap) {
214+
updateColorMapPreset();
215+
}
216+
209217
if (!model.renderWindow.getInteractor().isAnimating()) {
210218
model.renderWindow.render();
211219
}
@@ -251,6 +259,15 @@ function vtkVolumeController(publicAPI, model) {
251259
}
252260
};
253261

262+
const rescaleColorMap = publicAPI.setRescaleColorMap;
263+
publicAPI.setSescaleColorMap = (value) => {
264+
if (rescaleColorMap(value)) {
265+
updateColorMapPreset();
266+
return true;
267+
}
268+
return false;
269+
};
270+
254271
publicAPI.setSize = model.widget.setSize;
255272
publicAPI.render = model.widget.render;
256273
publicAPI.onAnimation = model.widget.onAnimation;
@@ -267,6 +284,7 @@ function vtkVolumeController(publicAPI, model) {
267284
const DEFAULT_VALUES = {
268285
size: [600, 300],
269286
expanded: true,
287+
rescaleColorMap: false,
270288
};
271289

272290
// ----------------------------------------------------------------------------
@@ -276,7 +294,7 @@ export function extend(publicAPI, model, initialValues = {}) {
276294

277295
// Object methods
278296
macro.obj(publicAPI, model);
279-
macro.setGet(publicAPI, model, ['actor', 'renderWindow']);
297+
macro.setGet(publicAPI, model, ['actor', 'renderWindow', 'rescaleColorMap']);
280298
macro.get(publicAPI, model, ['widget']);
281299

282300
// Object specific methods

Sources/Interaction/Widgets/PiecewiseGaussianWidget/index.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,23 @@ function vtkPiecewiseGaussianWidget(publicAPI, model) {
954954
piecewiseFunction.sortAndUpdateRange();
955955
};
956956

957+
publicAPI.getOpacityRange = (dataRange) => {
958+
const rangeToUse = dataRange || model.dataRange;
959+
const delta =
960+
(rangeToUse[1] - rangeToUse[0]) / (model.opacities.length - 1);
961+
let minIndex = model.opacities.length - 1;
962+
let maxIndex = 0;
963+
for (let index = 0; index < model.opacities.length; index++) {
964+
if (model.opacities[index] > 0) {
965+
minIndex = Math.min(minIndex, index);
966+
}
967+
if (model.opacities[index] > 0) {
968+
maxIndex = Math.max(maxIndex, index);
969+
}
970+
}
971+
return [rangeToUse[0] + minIndex * delta, rangeToUse[0] + maxIndex * delta];
972+
};
973+
957974
// Trigger rendering for any modified event
958975
publicAPI.onModified(publicAPI.render);
959976
publicAPI.setSize(...model.size);

0 commit comments

Comments
 (0)