From 74f65897bc80a14e11838c5cfa853b2761a4c9e1 Mon Sep 17 00:00:00 2001 From: Julien Finet Date: Sat, 8 Jun 2024 20:20:25 +0200 Subject: [PATCH] feat(thresholdpoints): add vtkThresholdPoints filter This filter can threshold points with PointData criteria or point coordinates. --- .../content/docs/gallery/ThresholdPoints.jpg | Bin 0 -> 91528 bytes Documentation/content/examples/index.md | 3 + .../ThresholdPoints/example/controlPanel.html | 28 ++ .../Core/ThresholdPoints/example/index.js | 176 ++++++++++++ .../Filters/Core/ThresholdPoints/index.d.ts | 72 +++++ Sources/Filters/Core/ThresholdPoints/index.js | 251 ++++++++++++++++++ 6 files changed, 530 insertions(+) create mode 100644 Documentation/content/docs/gallery/ThresholdPoints.jpg create mode 100644 Sources/Filters/Core/ThresholdPoints/example/controlPanel.html create mode 100644 Sources/Filters/Core/ThresholdPoints/example/index.js create mode 100644 Sources/Filters/Core/ThresholdPoints/index.d.ts create mode 100644 Sources/Filters/Core/ThresholdPoints/index.js diff --git a/Documentation/content/docs/gallery/ThresholdPoints.jpg b/Documentation/content/docs/gallery/ThresholdPoints.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f73511b262c9bcc0fd5fa5086cbed4b96c336c66 GIT binary patch literal 91528 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 @@ -125,6 +127,7 @@ This will allow you to see the some live code running in your browser. Just pick [TubeFilter]: ../docs/gallery/TubeFilter.jpg [Cutter]: ../docs/gallery/Cutter.jpg [PolyDataNormals]: ../docs/gallery/PolyDataNormals.jpg +[ThresholdPoints]: ../docs/gallery/ThresholdPoints.jpg # Sources diff --git a/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html b/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html new file mode 100644 index 00000000000..774cab3b5c0 --- /dev/null +++ b/Sources/Filters/Core/ThresholdPoints/example/controlPanel.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + +
Arrays to threshold + +
Operation + +
Treshold value + +
\ No newline at end of file diff --git a/Sources/Filters/Core/ThresholdPoints/example/index.js b/Sources/Filters/Core/ThresholdPoints/example/index.js new file mode 100644 index 00000000000..5bdcdc4ecd0 --- /dev/null +++ b/Sources/Filters/Core/ThresholdPoints/example/index.js @@ -0,0 +1,176 @@ +import '@kitware/vtk.js/favicon'; + +// Load the rendering pieces we want to use (for both WebGL and WebGPU) +import '@kitware/vtk.js/Rendering/Profiles/Geometry'; +import '@kitware/vtk.js/Rendering/Profiles/Glyph'; + +import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow'; +import '@kitware/vtk.js/IO/Core/DataAccessHelper/HttpDataAccessHelper'; + +import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; +import vtkHttpDataSetReader from '@kitware/vtk.js/IO/Core/HttpDataSetReader'; +import vtkLookupTable from '@kitware/vtk.js/Common/Core/LookupTable'; +import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper'; +import vtkThresholdPoints from '@kitware/vtk.js/Filters/Core/ThresholdPoints'; +import vtkCalculator from '@kitware/vtk.js/Filters/General/Calculator'; +import { FieldDataTypes } from '@kitware/vtk.js/Common/DataModel/DataSet/Constants'; +import { AttributeTypes } from '@kitware/vtk.js/Common/DataModel/DataSetAttributes/Constants'; +import vtkScalarBarActor from '@kitware/vtk.js/Rendering/Core/ScalarBarActor'; + +import controlPanel from './controlPanel.html'; + +const { ColorMode, ScalarMode } = vtkMapper; + +// ---------------------------------------------------------------------------- +// Standard rendering code setup +// ---------------------------------------------------------------------------- + +const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({ + background: [0.9, 0.9, 0.9], +}); +fullScreenRenderer.addController(controlPanel); + +const renderer = fullScreenRenderer.getRenderer(); +const renderWindow = fullScreenRenderer.getRenderWindow(); + +// ---------------------------------------------------------------------------- +// Example code +// ---------------------------------------------------------------------------- + +const lookupTable = vtkLookupTable.newInstance({ hueRange: [0.666, 0] }); + +const reader = vtkHttpDataSetReader.newInstance({ fetchGzip: true }); +reader.setUrl(`${__BASE_PATH__}/data/cow.vtp`).then(() => { + reader.loadData().then(() => { + renderer.resetCamera(); + renderWindow.render(); + }); +}); + +const calc = vtkCalculator.newInstance(); +calc.setInputConnection(reader.getOutputPort()); +calc.setFormula({ + getArrays: (inputDataSets) => ({ + input: [{ location: FieldDataTypes.COORDINATE }], // Require point coordinates as input + output: [ + // Generate two output arrays: + { + location: FieldDataTypes.POINT, // This array will be point-data ... + name: 'sine wave', // ... with the given name ... + dataType: 'Float64Array', // ... of this type ... + attribute: AttributeTypes.SCALARS, // ... and will be marked as the default scalars. + }, + { + location: FieldDataTypes.UNIFORM, // This array will be field data ... + name: 'global', // ... with the given name ... + dataType: 'Float32Array', // ... of this type ... + numberOfComponents: 1, // ... with this many components ... + tuples: 1, // ... and this many tuples. + }, + ], + }), + evaluate: (arraysIn, arraysOut) => { + // Convert in the input arrays of vtkDataArrays into variables + // referencing the underlying JavaScript typed-data arrays: + const [coords] = arraysIn.map((d) => d.getData()); + const [sine, glob] = arraysOut.map((d) => d.getData()); + + // Since we are passed coords as a 3-component array, + // loop over all the points and compute the point-data output: + for (let i = 0, sz = coords.length / 3; i < sz; ++i) { + const dx = coords[3 * i] - 0.5; + const dy = coords[3 * i + 1] - 0.5; + sine[i] = 10 * dx * dx + dy * dy; + } + // Use JavaScript's reduce method to sum the output + // point-data array and set the uniform array's value: + glob[0] = sine.reduce((result, value) => result + value, 0); + // Mark the output vtkDataArray as modified + arraysOut.forEach((x) => x.modified()); + }, +}); + +const mapper = vtkMapper.newInstance({ + interpolateScalarsBeforeMapping: true, + colorMode: ColorMode.DEFAULT, + scalarMode: ScalarMode.DEFAULT, + useLookupTableScalarRange: true, + lookupTable, +}); +const actor = vtkActor.newInstance(); +actor.getProperty().setEdgeVisibility(true); + +const scalarBarActor = vtkScalarBarActor.newInstance(); +scalarBarActor.setScalarsToColors(lookupTable); +renderer.addActor(scalarBarActor); + +const thresholder = vtkThresholdPoints.newInstance(); +thresholder.setInputConnection(calc.getOutputPort()); + +mapper.setInputConnection(thresholder.getOutputPort()); +actor.setMapper(mapper); +renderer.addActor(actor); + +// ---------------------------------------------------------------------------- +// UI control handling +// ---------------------------------------------------------------------------- + +const thresholdArray = document.querySelector('#thresholdArray'); +const thresholdOperation = document.querySelector('#thresholdOperation'); +const thresholdValue = document.querySelector('#thresholdValue'); +function updateCriterias(arrayName, operation, value) { + thresholder.setCriterias([ + { + arrayName, + fieldAssociation: arrayName === 'sine wave' ? 'PointData' : 'Points', + operation, + value: Number(value), + }, + ]); +} +function onCriteriaChanged(event) { + updateCriterias( + thresholdArray.value, + thresholdOperation.value, + thresholdValue.value + ); + if (event != null) { + renderWindow.render(); + } +} +onCriteriaChanged(); +function onArrayChanged(event) { + if (thresholdArray.value === 'x' || thresholdArray.value === 'y') { + thresholdValue.min = '-5'; + thresholdValue.max = '5'; + thresholdValue.step = '1'; + thresholdValue.value = '0'; + } else if (thresholdArray.value === 'z') { + thresholdValue.min = '-2'; + thresholdValue.max = '2'; + thresholdValue.step = '0.1'; + thresholdValue.value = '0'; + } else { + thresholdValue.min = 0; + thresholdValue.max = 256; + thresholdValue.step = 10; + thresholdValue.value = 30; + } + onCriteriaChanged(event); +} +thresholdArray.addEventListener('change', onArrayChanged); +thresholdOperation.addEventListener('change', onCriteriaChanged); +thresholdValue.addEventListener('input', onCriteriaChanged); + +// ----------------------------------------------------------- +// Make some variables global so that you can inspect and +// modify objects in your browser's developer console: +// ----------------------------------------------------------- + +global.mapper = mapper; +global.actor = actor; +global.source = reader; +global.renderer = renderer; +global.renderWindow = renderWindow; +global.lookupTable = lookupTable; +global.thresholder = thresholder; diff --git a/Sources/Filters/Core/ThresholdPoints/index.d.ts b/Sources/Filters/Core/ThresholdPoints/index.d.ts new file mode 100644 index 00000000000..5eaeb484ed0 --- /dev/null +++ b/Sources/Filters/Core/ThresholdPoints/index.d.ts @@ -0,0 +1,72 @@ +import { vtkAlgorithm, vtkObject } from '../../../interfaces'; + +export interface ThresholdCriteria { + arrayName: string; + fieldAssociation: string; + operation: string; + value: number; +} + +/** + * + */ +export interface IThresholdPointsInitialValues { + criterias?: ThresholdCriteria[]; +} + +type vtkThresholdPointsBase = vtkObject & vtkAlgorithm; + +export interface vtkThresholdPoints extends vtkThresholdPointsBase { + /** + * Get the desired precision for the output types. + */ + getCriterias(): ThresholdCriteria[]; + + /** + * Set the desired precision for the output types. + * @param outputPointsPrecision + */ + setCriterias(criterias: ThresholdCriteria[]): boolean; + + /** + * + * @param inData + * @param outData + */ + requestData(inData: any, outData: any): void; +} + +/** + * Method used to decorate a given object (publicAPI+model) with vtkThresholdPoints characteristics. + * + * @param publicAPI object on which methods will be bounds (public) + * @param model object on which data structure will be bounds (protected) + * @param {IThresholdPointsInitialValues} [initialValues] (default: {}) + */ +export function extend( + publicAPI: object, + model: object, + initialValues?: IThresholdPointsInitialValues +): void; + +/** + * Method used to create a new instance of vtkThresholdPoints + * @param {IThresholdPointsInitialValues} [initialValues] for pre-setting some of its content + */ +export function newInstance( + initialValues?: IThresholdPointsInitialValues +): vtkThresholdPoints; + +/** + * vtkThresholdPoints - extracts points whose scalar value satisfies threshold criterion + * + * vtkThresholdPoints is a filter that extracts points from a dataset that + * satisfy a threshold criterion. The criterion can take three forms: + * 1) greater than a particular value; 2) less than a particular value; or + * 3) between a particular value. The output of the filter is polygonal data. + */ +export declare const vtkThresholdPoints: { + newInstance: typeof newInstance; + extend: typeof extend; +}; +export default vtkThresholdPoints; diff --git a/Sources/Filters/Core/ThresholdPoints/index.js b/Sources/Filters/Core/ThresholdPoints/index.js new file mode 100644 index 00000000000..6df86871114 --- /dev/null +++ b/Sources/Filters/Core/ThresholdPoints/index.js @@ -0,0 +1,251 @@ +import macro from 'vtk.js/Sources/macros'; +import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray'; +import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray'; +import vtkPoints from 'vtk.js/Sources/Common/Core/Points'; +import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData'; +import { POLYDATA_FIELDS } from 'vtk.js/Sources/Common/DataModel/PolyData/Constants'; + +const { vtkErrorMacro } = macro; + +const OperationType = { + Below: 'Below', + Above: 'Above', +}; + +// Function to perform binary search on a sorted array +function binarySearch(items, value) { + let firstIndex = 0; + let lastIndex = items.length - 1; + let middleIndex = Math.floor((lastIndex + firstIndex) / 2); + + while (items[middleIndex] !== value && firstIndex < lastIndex) { + if (value < items[middleIndex]) { + lastIndex = middleIndex - 1; + } else if (value > items[middleIndex]) { + firstIndex = middleIndex + 1; + } + middleIndex = Math.floor((lastIndex + firstIndex) / 2); + } + + return { + found: items[middleIndex] === value, + index: Math.max( + items[middleIndex] < value ? middleIndex + 1 : middleIndex, + 0 + ), + }; +} + +function camelize(str) { + return str + .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter) => letter.toUpperCase()) + .replace(/\s+/g, ''); +} +// ---------------------------------------------------------------------------- +// vtkThresholdPoints methods +// ---------------------------------------------------------------------------- + +function vtkThresholdPoints(publicAPI, model) { + // Set our classname + model.classHierarchy.push('vtkThresholdPoints'); + + publicAPI.requestData = (inData, outData) => { + const input = inData[0]; + const output = vtkPolyData.newInstance(); + outData[0] = output; + + if (model.criterias.length === 0) { + output.shallowCopy(input); + return; + } + const oldPoints = input.getPoints(); + const oldPointCount = oldPoints.getNumberOfPoints(); + const oldPointData = input.getPointData(); + const oldPointsData = oldPoints.getData(); + const newPointsData = macro.newTypedArray( + input.getPoints().getDataType(), + 3 * oldPointCount + ); + const oldArrays = []; + const newArraysData = []; + const numArrays = oldPointData.getNumberOfArrays(); + for (let i = 0; i < numArrays; ++i) { + const oldArray = oldPointData.getArrayByIndex(i); + oldArrays.push(oldArray); + newArraysData.push( + macro.newTypedArray( + oldArray.getDataType(), + oldPointCount * oldArray.getNumberOfComponents() + ) + ); + } + const pointAcceptanceFunctions = model.criterias.map((criteria) => { + let inputArray = null; + let component = 0; + let numberOfComponents = 1; + if (criteria.fieldAssociation === 'PointData') { + inputArray = oldArrays.find( + (oldArray) => oldArray.getName() === criteria.arrayName + ); + numberOfComponents = inputArray.getNumberOfComponents(); + } else if (criteria.fieldAssociation === 'Points') { + inputArray = oldPoints; + if (criteria.arrayName === 'z') { + component = 2; + } else { + component = criteria.arrayName === 'y' ? 1 : 0; + } + numberOfComponents = 3; + } else { + vtkErrorMacro('No field association'); + } + const inputArrayData = inputArray.getData(); + const operation = + criteria.operation === OperationType.Below + ? (a, b) => a < b + : (a, b) => a > b; + const pointAcceptanceFunction = (pointId) => + operation( + inputArrayData[numberOfComponents * pointId + component], + criteria.value + ); + return pointAcceptanceFunction; + }); + + const thresholdedPointIds = []; // sorted list + let newI = 0; + for (let i = 0; i < oldPointCount; ++i) { + const keepPoint = pointAcceptanceFunctions.reduce( + (keep, pointAcceptanceFunction) => keep && pointAcceptanceFunction(i), + true + ); + if (keepPoint) { + let ii = 3 * i; + let newII = 3 * newI; + for (let c = 0; c < 3; ++c) { + newPointsData[newII++] = oldPointsData[ii++]; + } + for (let j = 0; j < numArrays; ++j) { + const oldArrayData = oldArrays[j].getData(); + const newArrayData = newArraysData[j]; + const cc = oldArrays[j].getNumberOfComponents(); + ii = cc * i; + newII = cc * newI; + for (let c = 0; c < cc; ++c) { + newArrayData[newII++] = oldArrayData[ii++]; + } + } + ++newI; + } else { + thresholdedPointIds.push(i); + } + } + if (thresholdedPointIds.length === 0) { + output.shallowCopy(input); + return; + } + + output.setPoints( + vtkPoints.newInstance({ values: newPointsData, size: 3 * newI }) + ); + for (let i = 0; i < numArrays; ++i) { + const oldArray = oldArrays[i]; + const newArray = vtkDataArray.newInstance({ + name: oldArray.getName(), + values: newArraysData[i], + dataType: oldArray.getDataType(), + numberOfComponents: oldArray.getNumberOfComponents(), + size: newI * oldArray.getNumberOfComponents(), + }); + output.getPointData().addArray(newArray); + oldPointData.getAttributes(oldArray).forEach((attrType) => { + output.getPointData().setAttribute(newArray, attrType); + }); + } + + POLYDATA_FIELDS.forEach((cellType) => { + const oldPolysData = input[`get${camelize(cellType)}`]().getData(); + const newCellData = macro.newTypedArray( + input.getPolys().getDataType(), + oldPolysData.length + ); + const newPointIds = []; // first point starts at [1] + const firstPointIndex = cellType === 'verts' ? 0 : 1; + let numberOfPoints = 1; + let newP = 0; + for ( + let c = 0; + c < oldPolysData.length; + c += numberOfPoints + firstPointIndex + ) { + if (firstPointIndex === 1) { + // not for verts + numberOfPoints = oldPolysData[c]; + } + let keepCell = true; + + for (let p = firstPointIndex; p <= numberOfPoints; ++p) { + const { found, index } = binarySearch( + thresholdedPointIds, + oldPolysData[c + p] + ); + if (found) { + keepCell = false; + break; + } + newPointIds[p] = oldPolysData[c + p] - index; + } + if (keepCell) { + newCellData[newP++] = numberOfPoints; + for (let p = firstPointIndex; p <= numberOfPoints; ) { + newCellData[newP++] = newPointIds[p++]; + } + } + } + output[`set${camelize(cellType)}`]( + vtkCellArray.newInstance({ + values: newCellData, + size: newP, // it may shorter than original array if cells are not kept + dataType: input.getPolys().getDataType(), + }) + ); + }); + + outData[0] = output; + }; +} + +// ---------------------------------------------------------------------------- + +function defaultValues(publicAPI, model, initialValues = {}) { + return { + criterias: [], // arrayName: string, fieldAssociation: string, operation: string, value: number + ...initialValues, + }; +} + +// ---------------------------------------------------------------------------- + +export function extend(publicAPI, model, initialValues = {}) { + Object.assign(model, defaultValues(publicAPI, model, initialValues)); + + // Build VTK API + macro.setGet(publicAPI, model, []); + macro.get(publicAPI, model, []); + macro.setGetArray(publicAPI, model, ['criterias']); + + // Make this a VTK object + macro.obj(publicAPI, model); + macro.algo(publicAPI, model, 1, 1); + + // Object specific methods + vtkThresholdPoints(publicAPI, model); +} + +// ---------------------------------------------------------------------------- + +export const newInstance = macro.newInstance(extend, 'vtkThresholdPoints'); + +// ---------------------------------------------------------------------------- + +export default { newInstance, extend, OperationType };