@acransac/vtk.js
Version:
Visualization Toolkit for the Web
235 lines (196 loc) • 7.72 kB
JavaScript
import 'vtk.js/Sources/favicon';
import DeepEqual from 'deep-equal';
import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import vtkCubeSource from 'vtk.js/Sources/Filters/Sources/CubeSource';
import vtkFullScreenRenderWindow from 'vtk.js/Sources/Rendering/Misc/FullScreenRenderWindow';
import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import vtkLineWidget from 'vtk.js/Sources/Widgets/Widgets3D/LineWidget';
import vtkWidgetManager from 'vtk.js/Sources/Widgets/Core/WidgetManager';
import controlPanel from './controlPanel.html';
// ----------------------------------------------------------------------------
// Standard rendering code setup
// ----------------------------------------------------------------------------
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
background: [0, 0, 0],
});
const renderer = fullScreenRenderer.getRenderer();
const renderWindow = fullScreenRenderer.getRenderWindow();
const cube = vtkCubeSource.newInstance();
const mapper = vtkMapper.newInstance();
const actor = vtkActor.newInstance();
actor.setMapper(mapper);
mapper.setInputConnection(cube.getOutputPort());
actor.getProperty().setOpacity(0.5);
renderer.addActor(actor);
// ----------------------------------------------------------------------------
// Widget manager
// ----------------------------------------------------------------------------
const widgetManager = vtkWidgetManager.newInstance();
widgetManager.setRenderer(renderer);
let widget = null;
let lineWidget = null;
let selectedWidgetIndex = 0;
let getHandle = {};
renderer.resetCamera();
// -----------------------------------------------------------
// UI control handling
// -----------------------------------------------------------
fullScreenRenderer.addController(controlPanel);
// Text Modifiers ------------------------------------------
function updateLinePos() {
const input = document.getElementById('linePos').value;
const subState = lineWidget.getWidgetState().getPositionOnLine();
subState.setPosOnLine(input / 100);
lineWidget.placeText();
renderWindow.render();
}
function updateText() {
const input = document.getElementById('txtIpt').value;
lineWidget.setText(input);
renderWindow.render();
}
document.querySelector('#txtIpt').addEventListener('keyup', updateText);
// updateText();
function observeDistance() {
lineWidget.onInteractionEvent(() => {
document.getElementById(
'distance'
).innerHTML = widget.getDistance().toFixed(2);
});
lineWidget.onEndInteractionEvent(() => {
document.getElementById(
'distance'
).innerHTML = widget.getDistance().toFixed(2);
});
}
// setDistance();
document.querySelector('#linePos').addEventListener('input', updateLinePos);
// updateLinePos();
// Handle Sources ------------------------------------------
function updateCheckBoxes(handleId, shape) {
if (shape === 'voidSphere') {
document
.getElementById(`visiH${handleId}`)
.setAttribute('disabled', 'disabled');
} else if (
shape !== 'voidSphere' &&
document.getElementById(`visiH${handleId}`).getAttribute('disabled') ===
'disabled'
) {
document.getElementById(`visiH${handleId}`).removeAttribute('disabled');
}
}
function updateHandleShape(handleId) {
const e = document.getElementById(`idh${handleId}`);
const shape = e.options[e.selectedIndex].value;
const handle = getHandle[handleId];
if (handle) {
handle.setShape(shape);
lineWidget.updateHandleVisibility(handleId - 1);
lineWidget.getInteractor().render();
updateCheckBoxes(handleId, shape);
observeDistance();
}
}
function setWidgetColor(currentWidget, color) {
currentWidget.getWidgetState().getHandle1().setColor(color);
currentWidget.getWidgetState().getHandle2().setColor(color);
currentWidget.getWidgetState().getMoveHandle().setColor(color);
}
const inputHandle1 = document.getElementById('idh1');
const inputHandle2 = document.getElementById('idh2');
inputHandle1.addEventListener('input', updateHandleShape.bind(null, 1));
inputHandle2.addEventListener('input', updateHandleShape.bind(null, 2));
// inputHandle1.value =
// getHandle[1].getShape() === '' ? 'sphere' : getHandle[1].getShape();
// inputHandle2.value =
// getHandle[2].getShape() === '' ? 'sphere' : getHandle[2].getShape();
// updateCheckBoxes(1, getHandles[1].getShape());
// updateCheckBoxes(2, getHandles[2].getShape());
// document.getElementById(
// 'visiH1'
// ).checked = lineWidget.getWidgetState().getHandle1().getVisible();
// document.getElementById(
// 'visiH2'
// ).checked = lineWidget.getWidgetState().getHandle2().getVisible();
const checkBoxes = ['visiH1', 'visiH2'].map((id) =>
document.getElementById(id)
);
const handleCheckBoxInput = (e) => {
if (lineWidget == null) {
return;
}
if (e.target.id === 'visiH1') {
lineWidget.getWidgetState().getHandle1().setVisible(e.target.checked);
lineWidget.updateHandleVisibility(0);
} else {
lineWidget.getWidgetState().getHandle2().setVisible(e.target.checked);
lineWidget.updateHandleVisibility(1);
}
lineWidget.getInteractor().render();
renderWindow.render();
};
checkBoxes.forEach((checkBox) =>
checkBox.addEventListener('input', handleCheckBoxInput)
);
document.querySelector('#addWidget').addEventListener('click', () => {
let currentHandle = null;
widgetManager.releaseFocus(widget);
widget = vtkLineWidget.newInstance();
// widget.placeWidget(cube.getOutputData().getBounds());
currentHandle = widgetManager.addWidget(widget);
lineWidget = currentHandle;
getHandle = {
1: lineWidget.getWidgetState().getHandle1(),
2: lineWidget.getWidgetState().getHandle2(),
};
updateHandleShape(1);
updateHandleShape(2);
observeDistance();
widgetManager.grabFocus(widget);
currentHandle.onStartInteractionEvent(() => {
const index = widgetManager.getWidgets().findIndex((cwidget) => {
if (DeepEqual(currentHandle.getWidgetState(), cwidget.getWidgetState()))
return 1;
return 0;
});
getHandle = {
1: currentHandle.getWidgetState().getHandle1(),
2: currentHandle.getWidgetState().getHandle2(),
};
setWidgetColor(widgetManager.getWidgets()[selectedWidgetIndex], 0.5);
setWidgetColor(widgetManager.getWidgets()[index], 0.2);
selectedWidgetIndex = index;
lineWidget = currentHandle;
document.getElementById('idh1').value =
getHandle[1].getShape() === '' ? 'sphere' : getHandle[1].getShape();
document.getElementById('idh2').value =
getHandle[1].getShape() === '' ? 'sphere' : getHandle[2].getShape();
document.getElementById(
'visiH1'
).checked = lineWidget.getWidgetState().getHandle1().getVisible();
document.getElementById(
'visiH2'
).checked = lineWidget.getWidgetState().getHandle2().getVisible();
console.log('reset text', document.getElementById('txtIpt'));
document.getElementById(
'txtIpt'
).value = lineWidget.getWidgetState().getText().getText();
});
});
document.querySelector('#removeWidget').addEventListener('click', () => {
widgetManager.removeWidget(widgetManager.getWidgets()[selectedWidgetIndex]);
if (widgetManager.getWidgets().length !== 0) {
selectedWidgetIndex = widgetManager.getWidgets().length - 1;
setWidgetColor(widgetManager.getWidgets()[selectedWidgetIndex], 0.2);
}
});
// -----------------------------------------------------------
// globals
// -----------------------------------------------------------
global.widget = widget;
global.renderer = renderer;
global.fullScreenRenderer = fullScreenRenderer;
global.renderWindow = renderWindow;
global.widgetManager = widgetManager;
global.line = lineWidget;