UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

183 lines (166 loc) 5.5 kB
import { m as macro } from '../../macros2.js'; import vtkMatrixBuilder from '../../Common/Core/MatrixBuilder.js'; import vtkDataArray from '../../Common/Core/DataArray.js'; import vtkActor from './Actor.js'; import vtkMapper from './Mapper.js'; import vtkArrowSource from '../../Filters/Sources/ArrowSource.js'; import vtkAppendPolyData from '../../Filters/General/AppendPolyData.js'; // ---------------------------------------------------------------------------- function centerDataSet(ds) { const bounds = ds.getPoints().getBounds(); const center = [-(bounds[0] + bounds[1]) * 0.5, -(bounds[2] + bounds[3]) * 0.5, -(bounds[4] + bounds[5]) * 0.5]; vtkMatrixBuilder.buildFromDegree().translate(...center).apply(ds.getPoints().getData()); } function shiftDataset(ds, axis, invert = false) { const bounds = ds.getPoints().getBounds(); const center = [0, 0, 0]; if (invert) { center[axis] = -bounds[axis * 2 + 1]; } else { center[axis] = -bounds[axis * 2]; } vtkMatrixBuilder.buildFromDegree().translate(...center).apply(ds.getPoints().getData()); } // ---------------------------------------------------------------------------- function addColor(ds, r, g, b) { const size = ds.getPoints().getData().length; const rgbArray = new Uint8ClampedArray(size); let offset = 0; while (offset < size) { rgbArray[offset++] = r; rgbArray[offset++] = g; rgbArray[offset++] = b; } ds.getPointData().setScalars(vtkDataArray.newInstance({ name: 'color', numberOfComponents: 3, values: rgbArray })); } // ---------------------------------------------------------------------------- // vtkAxesActor // ---------------------------------------------------------------------------- function vtkAxesActor(publicAPI, model) { // Set our className model.classHierarchy.push('vtkAxesActor'); const _mapper = vtkMapper.newInstance(); publicAPI.setMapper(_mapper); publicAPI.update = () => { let currentConfig = { ...model.config, ...model.xConfig }; const xAxis = vtkArrowSource.newInstance({ direction: [1, 0, 0], ...currentConfig }).getOutputData(); if (model.config.recenter) { centerDataSet(xAxis); } else { shiftDataset(xAxis, 0, currentConfig.invert); } addColor(xAxis, ...currentConfig.color); currentConfig = { ...model.config, ...model.yConfig }; const yAxis = vtkArrowSource.newInstance({ direction: [0, 1, 0], ...currentConfig }).getOutputData(); if (model.config.recenter) { centerDataSet(yAxis); } else { shiftDataset(yAxis, 1, currentConfig.invert); } addColor(yAxis, ...currentConfig.color); currentConfig = { ...model.config, ...model.zConfig }; const zAxis = vtkArrowSource.newInstance({ direction: [0, 0, 1], ...currentConfig }).getOutputData(); if (model.config.recenter) { centerDataSet(zAxis); } else { shiftDataset(zAxis, 2, currentConfig.invert); } addColor(zAxis, ...currentConfig.color); const source = vtkAppendPolyData.newInstance(); source.setInputData(xAxis); source.addInputData(yAxis); source.addInputData(zAxis); _mapper.setInputConnection(source.getOutputPort()); }; publicAPI.update(); const _debouncedUpdate = macro.debounce(publicAPI.update, 0); publicAPI.setXAxisColor = color => publicAPI.setXConfig({ ...publicAPI.getXConfig(), color }); publicAPI.setYAxisColor = color => publicAPI.setYConfig({ ...publicAPI.getYConfig(), color }); publicAPI.setZAxisColor = color => publicAPI.setZConfig({ ...publicAPI.getZConfig(), color }); publicAPI.getXAxisColor = () => model.getXConfig().color; publicAPI.getYAxisColor = () => model.getYConfig().color; publicAPI.getZAxisColor = () => model.getZConfig().color; model._onConfigChanged = _debouncedUpdate; model._onXConfigChanged = _debouncedUpdate; model._onYConfigChanged = _debouncedUpdate; model._onZConfigChanged = _debouncedUpdate; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- function defaultValues(initialValues) { return { config: { recenter: true, tipResolution: 60, tipRadius: 0.1, tipLength: 0.2, shaftResolution: 60, shaftRadius: 0.03, invert: false, ...initialValues?.config }, xConfig: { color: [255, 0, 0], invert: false, ...initialValues?.xConfig }, yConfig: { color: [255, 255, 0], invert: false, ...initialValues?.yConfig }, zConfig: { color: [0, 128, 0], invert: false, ...initialValues?.zConfig } }; } // ---------------------------------------------------------------------------- function extend(publicAPI, model, initialValues = {}) { // Inheritance vtkActor.extend(publicAPI, model, defaultValues(initialValues)); macro.setGet(publicAPI, model, ['config', 'xConfig', 'yConfig', 'zConfig']); // Object methods vtkAxesActor(publicAPI, model); } // ---------------------------------------------------------------------------- const newInstance = macro.newInstance(extend, 'vtkAxesActor'); // ---------------------------------------------------------------------------- var vtkAxesActor$1 = { newInstance, extend }; export { vtkAxesActor$1 as default, extend, newInstance };