UNPKG

@acransac/vtk.js

Version:

Visualization Toolkit for the Web

142 lines (113 loc) 4.01 kB
import macro from 'vtk.js/Sources/macro'; import DataAccessHelper from 'vtk.js/Sources/IO/Core/DataAccessHelper'; import vtkHttpDataSetReader from 'vtk.js/Sources/IO/Core/HttpDataSetReader'; const { vtkErrorMacro } = macro; // ---------------------------------------------------------------------------- // vtkHttpDataSetLODsLoader methods // ---------------------------------------------------------------------------- function vtkHttpDataSetLODsLoader(publicAPI, model) { // Set our className model.classHierarchy.push('vtkHttpDataSetLODsLoader'); const internal = { downloadStack: [], }; //-------------------------------------------------------------------------- publicAPI.startDownloads = () => { if (!model.mapper) { vtkErrorMacro('Mapper was not set.'); return; } if (!model.files || model.files.length === 0) { vtkErrorMacro('No files set.'); return; } let baseUrl = model.baseUrl; if (baseUrl && !baseUrl.endsWith('/')) { baseUrl += '/'; } // Create the download stack internal.downloadStack = []; model.files.forEach((file) => internal.downloadStack.push(`${baseUrl}${file}`) ); const downloadNextSource = () => { const url = internal.downloadStack.shift(); const nextSource = vtkHttpDataSetReader.newInstance({ dataAccessHelper: DataAccessHelper.get('http'), }); model.currentSource = nextSource; const options = { compression: 'zip', loadData: true, fullpath: true, }; nextSource.setUrl(url, options).then(() => { model.mapper.setInputConnection(nextSource.getOutputPort()); if (model.sceneItem) { // Apply settings to the new source const settings = model.sceneItem.defaultSettings; if (settings.mapper) { if (settings.mapper.colorByArrayName) { nextSource.enableArray( settings.mapper.colorByArrayName, settings.mapper.colorByArrayName ); } } model.sceneItem.source = nextSource; } if (model.stepFinishedCallback) { // In clients like paraview glance, the callback might // involve setting the current source on a proxy model.stepFinishedCallback(); } if (internal.downloadStack.length !== 0) { setTimeout(downloadNextSource, model.waitTimeBetweenDownloads); } }); }; setTimeout(downloadNextSource, model.waitTimeToStart); }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- const DEFAULT_VALUES = { baseUrl: '', // The currentSource is set internally to the most recently // created source. It might be useful to access it in a callback // via 'getCurrentSource'. currentSource: null, files: [], mapper: null, sceneItem: null, stepFinishedCallback: null, // These are in milliseconds waitTimeToStart: 4000, waitTimeBetweenDownloads: 0, }; // ---------------------------------------------------------------------------- export function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); macro.obj(publicAPI, model); // Create get-set macros macro.setGet(publicAPI, model, [ 'baseUrl', 'files', 'mapper', 'sceneItem', 'stepFinishedCallback', 'waitTimeToStart', 'waitTimeBetweenDownloads', ]); macro.get(publicAPI, model, ['currentSource']); // Object specific methods vtkHttpDataSetLODsLoader(publicAPI, model); } // ---------------------------------------------------------------------------- export const newInstance = macro.newInstance( extend, 'vtkHttpDataSetLODsLoader' ); // ---------------------------------------------------------------------------- export default { newInstance, extend };