@kitware/vtk.js
Version:
Visualization Toolkit for the Web
208 lines (181 loc) • 6.64 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkActor from '../../Rendering/Core/Actor.js';
import vtkCutter from '../../Filters/Core/Cutter.js';
import vtkImageDataOutlineFilter from '../../Filters/General/ImageDataOutlineFilter.js';
import vtkImageSlice from '../../Rendering/Core/ImageSlice.js';
import vtkImageResliceMapper from '../../Rendering/Core/ImageResliceMapper.js';
import vtkMapper from '../../Rendering/Core/Mapper.js';
import { SlabTypes } from '../../Rendering/Core/ImageResliceMapper/Constants.js';
import vtkPlane from '../../Common/DataModel/Plane.js';
import vtkAbstractRepresentationProxy from '../Core/AbstractRepresentationProxy.js';
// ----------------------------------------------------------------------------
function sum(a, b) {
return a + b;
}
// ----------------------------------------------------------------------------
function mean() {
for (var _len = arguments.length, array = new Array(_len), _key = 0; _key < _len; _key++) {
array[_key] = arguments[_key];
}
return array.reduce(sum, 0) / array.length;
}
// ----------------------------------------------------------------------------
function updateDomains(dataset, dataArray, model, updateProp) {
const dataRange = dataArray.getRange();
const propToUpdate = {
windowWidth: {
domain: {
min: 0,
max: dataRange[1] - dataRange[0],
step: 'any'
}
},
windowLevel: {
domain: {
min: dataRange[0],
max: dataRange[1],
step: 'any'
}
}
};
updateProp('windowWidth', propToUpdate.windowWidth);
updateProp('windowLevel', propToUpdate.windowLevel);
return {
windowWidth: propToUpdate.windowWidth.domain.max,
windowLevel: Math.floor(mean(propToUpdate.windowLevel.domain.min, propToUpdate.windowLevel.domain.max))
};
}
// ----------------------------------------------------------------------------
// vtkResliceRepresentationProxy methods
// ----------------------------------------------------------------------------
function vtkResliceRepresentationProxy(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkResliceRepresentationProxy');
model.mapper = vtkImageResliceMapper.newInstance();
model.actor = vtkImageSlice.newInstance();
model.property = model.actor.getProperty();
// set slicing plane
model.slicePlane = vtkPlane.newInstance();
model.slicePlane.setNormal(0, 1, 0);
model.mapper.setSlicePlane(model.slicePlane);
model.mapper.setSlabType(SlabTypes.MAX);
// for the slice polygon outline
model.outline = {
iof: vtkImageDataOutlineFilter.newInstance(),
sof: vtkCutter.newInstance({
cutFunction: model.slicePlane
}),
mapper: vtkMapper.newInstance(),
actor: vtkActor.newInstance({
visibility: false
})
};
model.outline.sof.setInputConnection(model.outline.iof.getOutputPort());
model.outline.mapper.setInputConnection(model.outline.sof.getOutputPort());
// connect rendering pipeline
model.actor.setMapper(model.mapper);
model.actors.push(model.actor);
model.outline.actor.setMapper(model.outline.mapper);
model.actors.push(model.outline.actor);
function setInputData(inputDataset) {
const state = updateDomains(inputDataset, publicAPI.getDataArray(), model, publicAPI.updateProxyProperty);
publicAPI.set(state);
model.slicePlane.setOrigin(inputDataset.getCenter());
}
// Keep things updated
model.sourceDependencies.push(model.mapper);
model.sourceDependencies.push({
setInputData
});
model.sourceDependencies.push(model.outline.iof);
// API ----------------------------------------------------------------------
const parentSetColorBy = publicAPI.setColorBy;
publicAPI.setColorBy = function (arrayName, arrayLocation) {
let componentIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
if (arrayName === null) {
model.property.setRGBTransferFunction(null);
model.property.setPiecewiseFunction(null);
} else {
parentSetColorBy(arrayName, arrayLocation, componentIndex);
const lutProxy = publicAPI.getLookupTableProxy(arrayName);
const pwfProxy = publicAPI.getPiecewiseFunctionProxy(arrayName);
model.property.setRGBTransferFunction(lutProxy.getLookupTable());
model.property.setPiecewiseFunction(pwfProxy.getPiecewiseFunction());
}
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {};
// ----------------------------------------------------------------------------
function extend(publicAPI, model) {
let initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues);
// Object methods
vtkAbstractRepresentationProxy.extend(publicAPI, model, initialValues);
macro.get(publicAPI, model, ['slicePlane']);
// Object specific methods
vtkResliceRepresentationProxy(publicAPI, model);
// Proxyfy
model.outlineActor = model.outline.actor;
model.outlineProperty = model.outline.actor.getProperty();
macro.proxyPropertyMapping(publicAPI, model, {
visibility: {
modelKey: 'actor',
property: 'visibility'
},
windowWidth: {
modelKey: 'property',
property: 'colorWindow'
},
windowLevel: {
modelKey: 'property',
property: 'colorLevel'
},
interpolationType: {
modelKey: 'property',
property: 'interpolationType'
},
slicePlane: {
modelKey: 'mapper',
property: 'slicePlane'
},
slicePolyData: {
modelKey: 'mapper',
property: 'slicePolyData'
},
slabType: {
modelKey: 'mapper',
property: 'slabType'
},
slabThickness: {
modelKey: 'mapper',
property: 'slabThickness'
},
slabTrapezoidIntegration: {
modelKey: 'mapper',
property: 'slabTrapezoidIntegration'
},
outlineVisibility: {
modelKey: 'outlineActor',
property: 'visibility'
},
outlineColor: {
modelKey: 'outlineProperty',
property: 'color'
},
outlineLineWidth: {
modelKey: 'outlineProperty',
property: 'lineWidth'
}
});
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkResliceRepresentationProxy');
// ----------------------------------------------------------------------------
var index = {
newInstance,
extend
};
export { index as default, extend, newInstance };