import '@kitware/vtk.js/favicon';
import '@kitware/vtk.js/Rendering/Profiles/Geometry'; import '@kitware/vtk.js/Rendering/Profiles/Molecule';
import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; import vtkCalculator from '@kitware/vtk.js/Filters/General/Calculator'; import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow'; import vtkPlaneSource from '@kitware/vtk.js/Filters/Sources/PlaneSource'; import vtkSphereMapper from '@kitware/vtk.js/Rendering/Core/SphereMapper';
import { AttributeTypes } from '@kitware/vtk.js/Common/DataModel/DataSetAttributes/Constants'; import { FieldDataTypes, FieldAssociations, } from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
import { throttle } from '@kitware/vtk.js/macros';
import controlPanel from './controlPanel.html';
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({ background: [0, 0, 0], }); const renderer = fullScreenRenderer.getRenderer(); const renderWindow = fullScreenRenderer.getRenderWindow();
const planeSource = vtkPlaneSource.newInstance(); const simpleFilter = vtkCalculator.newInstance(); const mapper = vtkSphereMapper.newInstance(); const actor = vtkActor.newInstance();
simpleFilter.setFormula({ getArrays: (inputDataSets) => ({ input: [{ location: FieldDataTypes.COORDINATE }], output: [ { location: FieldDataTypes.POINT, name: 'pressure', dataType: 'Float32Array', numberOfComponents: 1, }, { location: FieldDataTypes.POINT, name: 'temperature', dataType: 'Float32Array', attribute: AttributeTypes.SCALARS, numberOfComponents: 1, }, ], }), evaluate: (arraysIn, arraysOut) => { const [coords] = arraysIn.map((d) => d.getData()); const [press, temp] = arraysOut.map((d) => d.getData());
for (let i = 0, sz = coords.length / 3; i < sz; ++i) { press[i] = ((coords[3 * i] - 0.5) * (coords[3 * i] - 0.5) + (coords[3 * i + 1] - 0.5) * (coords[3 * i + 1] - 0.5) + 0.125) * 0.1; temp[i] = coords[3 * i + 1]; } arraysOut.forEach((x) => x.modified()); }, });
simpleFilter.setInputConnection(planeSource.getOutputPort());
mapper.setInputConnection(simpleFilter.getOutputPort()); mapper.setScaleArray('pressure');
actor.setMapper(mapper);
renderer.addActor(actor); renderer.resetCamera(); renderWindow.render();
const interactor = renderWindow.getInteractor(); const apiSpecificRenderWindow = interactor.getView(); const hwSelector = apiSpecificRenderWindow.getSelector(); hwSelector.setCaptureZValues(true); hwSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_CELLS);
function eventToWindowXY(event) { const { clientX, clientY } = event; const [width, height] = apiSpecificRenderWindow.getSize(); const x = Math.round((width * clientX) / window.innerWidth); const y = Math.round(height * (1 - clientY / window.innerHeight)); return [x, y]; }
fullScreenRenderer.addController(controlPanel); const attributeIdDiv = document.querySelector('#attributeID');
function pickOnMouseEvent(event) { if (interactor.isAnimating()) { return; } const [x, y] = eventToWindowXY(event);
hwSelector.getSourceDataAsync(renderer, x, y, x, y).then((result) => { const selections = result?.generateSelection(x, y, x, y); if (selections && selections.length >= 1) { const selection = selections[0]; const props = selection.getProperties(); attributeIdDiv.textContent = props.attributeID; } else { attributeIdDiv.textContent = ''; } }); }
document.addEventListener('mousemove', throttle(pickOnMouseEvent, 20));
['xResolution', 'yResolution'].forEach((propertyName) => { document.querySelector(`.${propertyName}`).addEventListener('input', (e) => { const value = Number(e.target.value); planeSource.set({ [propertyName]: value }); renderWindow.render(); }); });
document.querySelector('.scaleFactor').addEventListener('input', (e) => { const value = Number(e.target.value); mapper.setScaleFactor(value); renderWindow.render(); });
global.planeSource = planeSource; global.mapper = mapper; global.actor = actor; global.renderer = renderer; global.renderWindow = renderWindow;
|