@kitware/vtk.js
Version:
Visualization Toolkit for the Web
162 lines (128 loc) • 5.74 kB
JavaScript
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import macro from '../../macros.js';
import vtkImageData from '../../Common/DataModel/ImageData.js';
import vtkDataArray from '../../Common/Core/DataArray.js';
// Global methods
// ----------------------------------------------------------------------------
function generateCoordinates(origin, dimensions, spacing) {
var coordinates = new Float64Array(dimensions[0] * dimensions[1] * dimensions[2] * 3);
var offset = 0;
for (var k = 0; k < dimensions[2]; k++) {
var z = origin[2] + spacing[2] * k;
for (var j = 0; j < dimensions[1]; j++) {
var y = origin[1] + spacing[1] * j;
for (var i = 0; i < dimensions[0]; i++) {
var x = origin[0] + spacing[0] * i;
coordinates[offset++] = x;
coordinates[offset++] = y;
coordinates[offset++] = z;
}
}
}
return coordinates;
} // ----------------------------------------------------------------------------
// vtkSLICSource methods
// ----------------------------------------------------------------------------
function vtkSLICSource(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkSLICSource');
publicAPI.addCluster = function (centerX, centerY, centerZ, fnConst, fnDfDx, fnDfDy, fnDfDz) {
var id = model.clusters.length;
model.clusters.push(new Float64Array([centerX, centerY, centerZ, fnConst, fnDfDx, fnDfDy, fnDfDz]));
publicAPI.modified();
return id;
};
publicAPI.removeCluster = function (id) {
model.clusters.splice(id, 1);
publicAPI.modified();
};
publicAPI.removeAllClusters = function () {
model.clusters = [];
publicAPI.modified();
};
publicAPI.updateCluster = function (id, centerX, centerY, centerZ, fnConst, fnDfDx, fnDfDy, fnDfDz) {
if (!model.clusters[id]) {
model.clusters[id] = new Float64Array(7);
}
model.clusters[id][0] = centerX;
model.clusters[id][1] = centerY;
model.clusters[id][2] = centerZ;
model.clusters[id][3] = fnConst;
model.clusters[id][4] = fnDfDx;
model.clusters[id][5] = fnDfDy;
model.clusters[id][6] = fnDfDz;
publicAPI.modified();
};
publicAPI.getNumberOfClusters = function () {
return model.clusters.length;
};
publicAPI.requestData = function (inData, outData) {
if (model.deleted) {
return;
}
var dataSize = model.dimensions[0] * model.dimensions[1] * model.dimensions[2];
var imageData = vtkImageData.newInstance();
imageData.setSpacing.apply(imageData, _toConsumableArray(model.spacing));
imageData.setExtent(0, model.dimensions[0] - 1, 0, model.dimensions[1] - 1, 0, model.dimensions[2] - 1);
imageData.setOrigin.apply(imageData, _toConsumableArray(model.origin)); // Pixel centers
var centers = generateCoordinates(model.origin, model.dimensions, model.spacing); // Fill clusterIdxValues
var nbBytes = (model.clusters.length < 256 ? 8 : 0) || (model.clusters.length < 65536 ? 16 : 32);
var clusterIdxValues = macro.newTypedArray("Uint".concat(nbBytes, "Array"), dataSize);
var _loop = function _loop(i) {
var clusterDistance = Number.MAX_VALUE;
model.clusters.forEach(function (cluster, idx) {
var dist = (cluster[0] - centers[i * 3]) * (cluster[0] - centers[i * 3]) + (cluster[1] - centers[i * 3 + 1]) * (cluster[1] - centers[i * 3 + 1]) + (cluster[2] - centers[i * 3 + 2]) * (cluster[2] - centers[i * 3 + 2]);
if (dist < clusterDistance) {
clusterDistance = dist;
clusterIdxValues[i] = idx;
}
});
};
for (var i = 0; i < dataSize; i++) {
_loop(i);
}
var clusters = vtkDataArray.newInstance({
name: model.clusterArrayName,
numberOfComponents: 1,
values: clusterIdxValues
});
imageData.getPointData().addArray(clusters); // Fill scalarValues
var scalarValues = new Float32Array(dataSize);
for (var _i = 0; _i < dataSize; _i++) {
var cluster = model.clusters[clusterIdxValues[_i]];
scalarValues[_i] = cluster[3] + cluster[4] * (centers[_i * 3 + 0] - cluster[0]) + cluster[5] * (centers[_i * 3 + 1] - cluster[1]) + cluster[6] * (centers[_i * 3 + 2] - cluster[2]);
}
var scalars = vtkDataArray.newInstance({
name: model.scalarArrayName,
numberOfComponents: 1,
values: scalarValues
});
imageData.getPointData().addArray(scalars); // Update output
outData[0] = imageData;
};
} // ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
var DEFAULT_VALUES = {
clusters: [],
spacing: [1.0, 1.0, 1.0],
origin: [0.0, 0.0, 0.0],
dimensions: [10, 10, 10],
clusterArrayName: 'cluster',
scalarArrayName: 'field'
}; // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API
macro.obj(publicAPI, model);
macro.setGet(publicAPI, model, ['clusterArrayName', 'scalarArrayName']);
macro.setGetArray(publicAPI, model, ['origin', 'spacing', 'dimensions'], 3);
macro.algo(publicAPI, model, 0, 1);
vtkSLICSource(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkSLICSource'); // ----------------------------------------------------------------------------
var vtkSLICSource$1 = {
newInstance: newInstance,
extend: extend
};
export { vtkSLICSource$1 as default, extend, newInstance };