UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

156 lines (129 loc) 5.17 kB
import { m as macro } from '../../macros2.js'; import vtkDataArray from '../../Common/Core/DataArray.js'; import vtkPolyData from '../../Common/DataModel/PolyData.js'; import vtkCellArray from '../../Common/Core/CellArray.js'; import DataAccessHelper from '../Core/DataAccessHelper.js'; import '../Core/DataAccessHelper/LiteHttpDataAccessHelper.js'; // import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + gz // import 'vtk.js/Sources/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip // import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip // ---------------------------------------------------------------------------- // vtkElevationReader methods // ---------------------------------------------------------------------------- function vtkElevationReader(publicAPI, model) { // Set our className model.classHierarchy.push('vtkElevationReader'); // Create default dataAccessHelper if not available if (!model.dataAccessHelper) { model.dataAccessHelper = DataAccessHelper.get('http'); } // Internal method to fetch Array function fetchCSV(url, options) { return model.dataAccessHelper.fetchText(publicAPI, url, options); } // Set DataSet url publicAPI.setUrl = (url, options) => { model.url = url; // Fetch metadata return publicAPI.loadData(options); }; // Fetch the actual data arrays publicAPI.loadData = options => fetchCSV(model.url, options).then(csv => { publicAPI.parseAsText(csv); return true; }); publicAPI.parseAsText = csv => { model.csv = csv; model.elevation = []; // Parse data const lines = model.csv.split('\n'); lines.forEach((line, lineIdx) => { model.elevation.push(line.split(',').map(str => Number(str))); }); publicAPI.modified(); }; publicAPI.requestData = (inData, outData) => { const polydata = vtkPolyData.newInstance(); polydata.getPoints().setData(new Float32Array(0, 0, 0, 1, 1, 1), 3); if (model.elevation) { const jSize = model.elevation.length; const iSize = model.elevation[0].length; // Handle points and polys const points = polydata.getPoints(); points.setNumberOfPoints(iSize * jSize, 3); const pointValues = points.getData(); const polys = vtkCellArray.newInstance({ size: 5 * (iSize - 1) * (jSize - 1) }); polydata.setPolys(polys); const polysValues = polys.getData(); let cellOffset = 0; // Texture coords const tcData = new Float32Array(iSize * jSize * 2); const tcoords = vtkDataArray.newInstance({ numberOfComponents: 2, values: tcData, name: 'TextureCoordinates' }); polydata.getPointData().setTCoords(tcoords); for (let j = 0; j < jSize; j++) { for (let i = 0; i < iSize; i++) { const offsetIdx = j * iSize + i; const offsetPt = 3 * offsetIdx; // Fill points coordinates pointValues[offsetPt + 0] = model.origin[0] + i * model.xSpacing * model.xDirection; pointValues[offsetPt + 1] = model.origin[1] + j * model.ySpacing * model.yDirection; pointValues[offsetPt + 2] = model.origin[2] + model.elevation[j][i] * model.zScaling; // fill in tcoords tcData[offsetIdx * 2] = i / (iSize - 1.0); tcData[offsetIdx * 2 + 1] = 1.0 - j / (jSize - 1.0); // Fill polys if (i > 0 && j > 0) { polysValues[cellOffset++] = 4; polysValues[cellOffset++] = offsetIdx; polysValues[cellOffset++] = offsetIdx - 1; polysValues[cellOffset++] = offsetIdx - 1 - iSize; polysValues[cellOffset++] = offsetIdx - iSize; } } } } model.output[0] = polydata; }; // return Busy state publicAPI.isBusy = () => !!model.requestCount; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- const DEFAULT_VALUES = { origin: [0, 0, 0], xSpacing: 1, ySpacing: 1, zScaling: 1, xDirection: 1, yDirection: -1, requestCount: 0 // dataAccessHelper: null, // url: null, }; // ---------------------------------------------------------------------------- function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API macro.obj(publicAPI, model); macro.get(publicAPI, model, ['url']); macro.setGet(publicAPI, model, ['dataAccessHelper', 'xSpacing', 'ySpacing', 'zScaling', 'xDirection', 'yDirection']); macro.algo(publicAPI, model, 0, 1); macro.event(publicAPI, model, 'busy'); // Object methods vtkElevationReader(publicAPI, model); } // ---------------------------------------------------------------------------- const newInstance = macro.newInstance(extend, 'vtkElevationReader'); // ---------------------------------------------------------------------------- var vtkElevationReader$1 = { newInstance, extend }; export { vtkElevationReader$1 as default, extend, newInstance };