@kitware/vtk.js
Version:
Visualization Toolkit for the Web
194 lines (162 loc) • 5.74 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkActor from './Actor.js';
import vtkMapper from './Mapper.js';
import vtkTexture from './Texture.js';
import vtkCubeSource from '../../Filters/Sources/CubeSource.js';
import ImageHelper from '../../Common/Core/ImageHelper.js';
import AnnotatedCubePresets from './AnnotatedCubeActor/Presets.js';
const FACE_TO_INDEX = {
xPlus: 0,
xMinus: 1,
yPlus: 2,
yMinus: 3,
zPlus: 4,
zMinus: 5
};
// ----------------------------------------------------------------------------
// vtkAnnotatedCubeActor
// ----------------------------------------------------------------------------
function vtkAnnotatedCubeActor(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkAnnotatedCubeActor');
// Make sure face properties are not references to the default value
model.xPlusFaceProperty = {
...model.xPlusFaceProperty
};
model.xMinusFaceProperty = {
...model.xMinusFaceProperty
};
model.yPlusFaceProperty = {
...model.yPlusFaceProperty
};
model.yMinusFaceProperty = {
...model.yMinusFaceProperty
};
model.zPlusFaceProperty = {
...model.zPlusFaceProperty
};
model.zMinusFaceProperty = {
...model.zMinusFaceProperty
};
// private variables
let cubeSource = null;
const canvas = document.createElement('canvas');
const mapper = vtkMapper.newInstance();
const texture = vtkTexture.newInstance();
texture.setInterpolate(true);
// private methods
function updateFaceTexture(faceName, newProp = null) {
if (newProp) {
Object.assign(model[`${faceName}FaceProperty`], newProp);
}
const prop = {
...model.defaultStyle,
...model[`${faceName}FaceProperty`]
};
// set canvas resolution
canvas.width = prop.resolution;
canvas.height = prop.resolution;
const ctxt = canvas.getContext('2d');
// set background color
ctxt.fillStyle = prop.faceColor;
ctxt.fillRect(0, 0, canvas.width, canvas.height);
// draw edge
if (prop.edgeThickness > 0) {
ctxt.strokeStyle = prop.edgeColor;
ctxt.lineWidth = prop.edgeThickness * canvas.width;
ctxt.strokeRect(0, 0, canvas.width, canvas.height);
}
// set face rotation
ctxt.save();
// vertical flip
ctxt.translate(0, canvas.height);
ctxt.scale(1, -1);
ctxt.translate(canvas.width / 2, canvas.height / 2);
ctxt.rotate(-Math.PI * (prop.faceRotation / 180.0));
// set foreground text
const textSize = prop.fontSizeScale(prop.resolution);
ctxt.fillStyle = prop.fontColor;
ctxt.textAlign = 'center';
ctxt.textBaseline = 'middle';
ctxt.font = `${prop.fontStyle} ${textSize}px "${prop.fontFamily}"`;
ctxt.fillText(prop.text, 0, 0);
ctxt.restore();
const vtkImage = ImageHelper.canvasToImageData(canvas);
texture.setInputData(vtkImage, FACE_TO_INDEX[faceName]);
publicAPI.modified();
}
function updateAllFaceTextures() {
cubeSource = vtkCubeSource.newInstance({
generate3DTextureCoordinates: true
});
mapper.setInputConnection(cubeSource.getOutputPort());
updateFaceTexture('xPlus');
updateFaceTexture('xMinus');
updateFaceTexture('yPlus');
updateFaceTexture('yMinus');
updateFaceTexture('zPlus');
updateFaceTexture('zMinus');
}
// public methods
publicAPI.setDefaultStyle = style => {
model.defaultStyle = {
...model.defaultStyle,
...style
};
updateAllFaceTextures();
};
publicAPI.setXPlusFaceProperty = prop => updateFaceTexture('xPlus', prop);
publicAPI.setXMinusFaceProperty = prop => updateFaceTexture('xMinus', prop);
publicAPI.setYPlusFaceProperty = prop => updateFaceTexture('yPlus', prop);
publicAPI.setYMinusFaceProperty = prop => updateFaceTexture('yMinus', prop);
publicAPI.setZPlusFaceProperty = prop => updateFaceTexture('zPlus', prop);
publicAPI.setZMinusFaceProperty = prop => updateFaceTexture('zMinus', prop);
// constructor
updateAllFaceTextures();
// set mapper
mapper.setInputConnection(cubeSource.getOutputPort());
publicAPI.setMapper(mapper);
// set texture
publicAPI.addTexture(texture);
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
defaultStyle: {
text: '',
faceColor: 'white',
faceRotation: 0,
fontFamily: 'Arial',
fontColor: 'black',
fontStyle: 'normal',
fontSizeScale: resolution => resolution / 1.8,
edgeThickness: 0.1,
edgeColor: 'black',
resolution: 200
}
// xPlusFaceProperty: null,
// xMinusFaceProperty: null,
// yPlusFaceProperty: null,
// yMinusFaceProperty: null,
// zPlusFaceProperty: null,
// zMinusFaceProperty: null,
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Inheritance
vtkActor.extend(publicAPI, model, initialValues);
macro.get(publicAPI, model, ['defaultStyle', 'xPlusFaceProperty', 'xMinusFaceProperty', 'yPlusFaceProperty', 'yMinusFaceProperty', 'zPlusFaceProperty', 'zMinusFaceProperty']);
// Object methods
vtkAnnotatedCubeActor(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkAnnotatedCubeActor');
// ----------------------------------------------------------------------------
var vtkAnnotatedCubeActor$1 = {
newInstance,
extend,
Presets: AnnotatedCubePresets
};
export { DEFAULT_VALUES, vtkAnnotatedCubeActor$1 as default, extend, newInstance };