@kitware/vtk.js
Version:
Visualization Toolkit for the Web
156 lines (130 loc) • 4.82 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkPiecewiseFunction from '../../Common/DataModel/PiecewiseFunction.js';
import vtkPiecewiseGaussianWidget from '../../Interaction/Widgets/PiecewiseGaussianWidget.js';
import Constants from './PiecewiseFunctionProxy/Constants.js';
const {
Mode,
Defaults
} = Constants;
// ----------------------------------------------------------------------------
function applyPointsToPiecewiseFunction(points, range, pwf) {
const width = range[1] - range[0];
const rescaled = points.map(([x, y]) => [x * width + range[0], y]);
pwf.removeAllPoints();
rescaled.forEach(([x, y]) => pwf.addPoint(x, y));
}
// ----------------------------------------------------------------------------
function applyNodesToPiecewiseFunction(nodes, range, pwf) {
const width = range[1] - range[0];
const rescaled = nodes.map(n => ({
...n,
x: n.x * width + range[0]
}));
pwf.setNodes(rescaled);
}
// ----------------------------------------------------------------------------
function copyGaussians(gaussians) {
// gaussians is assumed to be an array of gaussian objects
return gaussians.map(g => ({
...g
}));
}
// ----------------------------------------------------------------------------
// vtkPiecewiseFunctionProxy methods
// ----------------------------------------------------------------------------
function vtkPiecewiseFunctionProxy(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkPiecewiseFunctionProxy');
model.piecewiseFunction = model.piecewiseFunction || vtkPiecewiseFunction.newInstance();
// Takes an array of gaussians
publicAPI.setGaussians = gaussians => {
model.gaussians = copyGaussians(gaussians || []);
if (model.gaussians.length === 0) {
model.gaussians = copyGaussians(Defaults.Gaussians);
}
publicAPI.applyMode();
};
// Takes an array of points [x, y]
publicAPI.setPoints = points => {
model.points = (points || []).slice();
if (model.points.length === 0) {
model.points = Defaults.Points.slice();
}
publicAPI.applyMode();
};
// Takes an array of PiecewiseFunction nodes
publicAPI.setNodes = nodes => {
model.nodes = (nodes || []).slice();
if (model.nodes.length === 0) {
model.nodes = Defaults.Nodes.slice();
}
publicAPI.applyMode();
};
publicAPI.setMode = mode => {
if (model.mode === mode) {
return;
}
model.mode = mode;
publicAPI.applyMode();
};
publicAPI.applyMode = () => {
switch (model.mode) {
case Mode.Gaussians:
vtkPiecewiseGaussianWidget.applyGaussianToPiecewiseFunction(model.gaussians, 255, model.dataRange, model.piecewiseFunction);
publicAPI.modified();
break;
case Mode.Points:
applyPointsToPiecewiseFunction(model.points, model.dataRange, model.piecewiseFunction);
publicAPI.modified();
break;
case Mode.Nodes:
applyNodesToPiecewiseFunction(model.nodes, model.dataRange, model.piecewiseFunction);
publicAPI.modified();
break;
// noop
}
};
publicAPI.getLookupTableProxy = () => model.proxyManager.getLookupTable(model.arrayName);
publicAPI.setDataRange = (min, max) => {
if (model.dataRange[0] !== min || model.dataRange[1] !== max) {
model.dataRange[0] = min;
model.dataRange[1] = max;
publicAPI.applyMode();
}
};
// Initialization ------------------------------------------------------------
publicAPI.applyMode();
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
mode: Mode.Gaussians,
gaussians: Defaults.Gaussians,
points: Defaults.Points,
nodes: Defaults.Nodes,
arrayName: 'No array associated',
arrayLocation: 'pointData',
dataRange: [0, 1]
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
macro.obj(publicAPI, model);
macro.setGet(publicAPI, model, ['arrayName']);
macro.get(publicAPI, model, ['piecewiseFunction', 'gaussians', 'nodes', 'points', 'mode', 'dataRange']);
// Object specific methods
vtkPiecewiseFunctionProxy(publicAPI, model);
// Proxy handling
macro.proxy(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkPiecewiseFunctionProxy');
// ----------------------------------------------------------------------------
var vtkPiecewiseFunctionProxy$1 = {
newInstance,
extend,
Mode,
Defaults
};
export { vtkPiecewiseFunctionProxy$1 as default, newInstance };