@acransac/vtk.js
Version:
Visualization Toolkit for the Web
163 lines (123 loc) • 5.27 kB
JavaScript
import macro from 'vtk.js/Sources/macro';
import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import vtkBoundingBox from 'vtk.js/Sources/Common/DataModel/BoundingBox';
import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
import vtkProp3D from 'vtk.js/Sources/Rendering/Core/Prop3D';
import vtkProperty from 'vtk.js/Sources/Rendering/Core/Property';
import vtkResliceCursorPolyDataAlgorithm from 'vtk.js/Sources/Interaction/Widgets/ResliceCursor/ResliceCursorPolyDataAlgorithm';
// ----------------------------------------------------------------------------
// vtkResliceCursorActor methods
// ----------------------------------------------------------------------------
function vtkResliceCursorActor(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkResliceCursorActor');
const superClass = { ...publicAPI };
publicAPI.getActors = () => {
if (model.cursorAlgorithm.getResliceCursor()) {
publicAPI.updateViewProps();
}
return [...model.cursorCenterlineActor];
};
publicAPI.getNestedProps = () => publicAPI.getActors();
publicAPI.updateViewProps = () => {
if (!model.cursorAlgorithm.getResliceCursor()) {
return;
}
model.cursorAlgorithm.update();
const axisNormal = model.cursorAlgorithm.getReslicePlaneNormal();
const axis1 = model.cursorAlgorithm.getPlaneAxis1();
const axis2 = model.cursorAlgorithm.getPlaneAxis2();
model.cursorCenterlineMapper[axis1].setInputData(
model.cursorAlgorithm.getOutputData(0)
);
model.cursorCenterlineMapper[axis2].setInputData(
model.cursorAlgorithm.getOutputData(1)
);
model.cursorCenterlineActor[axis1].setVisibility(model.visibility);
model.cursorCenterlineActor[axis2].setVisibility(model.visibility);
model.cursorCenterlineActor[axisNormal].setVisibility(0);
};
publicAPI.getBounds = () => {
vtkMath.uninitializeBounds(model.bounds);
publicAPI.updateViewProps();
const boundingBox = vtkBoundingBox.newInstance();
let bounds = [];
for (let i = 0; i < 3; i++) {
if (
model.cursorCenterlineActor[i].getVisibility() &&
model.cursorCenterlineActor[i].getUseBounds()
) {
bounds = model.cursorCenterlineActor[i].getBounds();
boundingBox.addBounds(
bounds[0],
bounds[1],
bounds[2],
bounds[3],
bounds[4],
bounds[5]
);
}
}
model.bounds = boundingBox.getBounds();
return model.bounds;
};
publicAPI.getMTime = () => {
let mTime = superClass.getMTime();
if (model.cursorAlgorithm) {
const time = model.cursorAlgorithm.getMTime();
if (time > mTime) {
mTime = time;
}
}
return mTime;
};
publicAPI.getCenterlineProperty = (i) => model.centerlineProperty[i];
publicAPI.getCenterlineActor = (i) => model.cursorCenterlineActor[i];
publicAPI.setUserMatrix = (matrix) => {
model.cursorCenterlineActor[0].setUserMatrix(matrix);
model.cursorCenterlineActor[1].setUserMatrix(matrix);
model.cursorCenterlineActor[2].setUserMatrix(matrix);
superClass.setUserMatrix(matrix);
};
//----------------------------------------------------------------------------
// Public API methods
//----------------------------------------------------------------------------
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {};
// ----------------------------------------------------------------------------
export function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
vtkProp3D.extend(publicAPI, model, initialValues);
model.cursorAlgorithm = vtkResliceCursorPolyDataAlgorithm.newInstance();
model.cursorCenterlineMapper = [];
model.cursorCenterlineActor = [];
model.centerlineProperty = [];
for (let i = 0; i < 3; i++) {
model.cursorCenterlineMapper[i] = vtkMapper.newInstance();
model.cursorCenterlineMapper[i].setScalarVisibility(false);
model.cursorCenterlineMapper[
i
].setResolveCoincidentTopologyToPolygonOffset();
model.cursorCenterlineMapper[
i
].setResolveCoincidentTopologyLineOffsetParameters(-1.0, -1.0);
model.cursorCenterlineActor[i] = vtkActor.newInstance();
model.cursorCenterlineActor[i].setMapper(model.cursorCenterlineMapper[i]);
model.centerlineProperty[i] = vtkProperty.newInstance();
model.cursorCenterlineActor[i].setProperty(model.centerlineProperty[i]);
}
model.centerlineProperty[0].setColor(1, 0, 0);
model.centerlineProperty[1].setColor(0, 1, 0);
model.centerlineProperty[2].setColor(0, 0, 1);
macro.get(publicAPI, model, ['cursorAlgorithm']);
// Object methods
vtkResliceCursorActor(publicAPI, model);
}
// ----------------------------------------------------------------------------
export const newInstance = macro.newInstance(extend, 'vtkResliceCursorActor');
// ----------------------------------------------------------------------------
export default { newInstance, extend };