@kitware/vtk.js
Version:
Visualization Toolkit for the Web
257 lines (223 loc) • 7.51 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkCell from './Cell.js';
// ----------------------------------------------------------------------------
// Global methods
// ----------------------------------------------------------------------------
const InitLink = {
ncells: 0,
cells: null
};
function resize(model, sz) {
let newSize = sz;
if (sz >= model.array.length) {
newSize += model.array.length;
}
while (newSize > model.array.length) model.array.push({
ncells: 0,
cells: null
});
model.array.length = newSize;
}
// ----------------------------------------------------------------------------
// vtkCellLinks methods
// ----------------------------------------------------------------------------
function vtkCellLinks(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkCellLinks');
/**
* Build the link list array. All subclasses of vtkAbstractCellLinks
* must support this method.
*/
publicAPI.buildLinks = data => {
const numPts = data.getPoints().getNumberOfPoints();
const numCells = data.getNumberOfCells();
// fill out lists with number of references to cells
const linkLoc = new Uint32Array(numPts);
// Use fast path if polydata
if (data.isA('vtkPolyData')) {
// traverse data to determine number of uses of each point
for (let cellId = 0; cellId < numCells; ++cellId) {
const {
cellPointIds
} = data.getCellPoints(cellId);
cellPointIds.forEach(cellPointId => {
publicAPI.incrementLinkCount(cellPointId);
});
}
// now allocate storage for the links
publicAPI.allocateLinks(numPts);
model.maxId = numPts - 1;
for (let cellId = 0; cellId < numCells; ++cellId) {
const {
cellPointIds
} = data.getCellPoints(cellId);
cellPointIds.forEach(cellPointId => {
publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, cellId);
});
}
} // any other type of dataset
else {
// traverse data to determine number of uses of each point
for (let cellId = 0; cellId < numCells; cellId++) {
// TODO: Currently not supported: const cell = data.getCell(cellId);
const cell = vtkCell.newInstance();
cell.getPointsIds().forEach(cellPointId => {
publicAPI.incrementLinkCount(cellPointId);
});
}
// now allocate storage for the links
publicAPI.allocateLinks(numPts);
model.maxId = numPts - 1;
for (let cellId = 0; cellId < numCells; ++cellId) {
// TODO: Currently not supported: const cell = data.getCell(cellId);
const cell = vtkCell.newInstance();
cell.getPointsIds().forEach(cellPointId => {
publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, cellId);
});
}
} // end else
};
/**
* Build the link list array with a provided connectivity array.
*/
// publicAPI.buildLinks = (data, connectivity) => {};
/**
* Allocate the specified number of links (i.e., number of points) that
* will be built.
*/
publicAPI.allocate = (numLinks, ext = 1000) => {
model.array = Array(numLinks).fill().map(() => ({
ncells: 0,
cells: null
}));
model.extend = ext;
model.maxId = -1;
};
publicAPI.initialize = () => {
model.array = null;
};
/**
* Get a link structure given a point id.
*/
publicAPI.getLink = ptId => model.array[ptId];
/**
* Get the number of cells using the point specified by ptId.
*/
publicAPI.getNcells = ptId => model.array[ptId].ncells;
/**
* Return a list of cell ids using the point.
*/
publicAPI.getCells = ptId => model.array[ptId].cells;
/**
* Insert a new point into the cell-links data structure. The size parameter
* is the initial size of the list.
*/
publicAPI.insertNextPoint = numLinks => {
model.array.push({
ncells: numLinks,
cells: Array(numLinks)
});
++model.maxId;
};
/**
* Insert a cell id into the list of cells (at the end) using the cell id
* provided. (Make sure to extend the link list (if necessary) using the
* method resizeCellList().)
*/
publicAPI.insertNextCellReference = (ptId, cellId) => {
model.array[ptId].cells[model.array[ptId].ncells++] = cellId;
};
/**
* Delete point (and storage) by destroying links to using cells.
*/
publicAPI.deletePoint = ptId => {
model.array[ptId].ncells = 0;
model.array[ptId].cells = null;
};
/**
* Delete the reference to the cell (cellId) from the point (ptId). This
* removes the reference to the cellId from the cell list, but does not
* resize the list (recover memory with resizeCellList(), if necessary).
*/
publicAPI.removeCellReference = (cellId, ptId) => {
model.array[ptId].cells = model.array[ptId].cells.filter(cell => cell !== cellId);
model.array[ptId].ncells = model.array[ptId].cells.length;
};
/**
* Add the reference to the cell (cellId) from the point (ptId). This
* adds a reference to the cellId from the cell list, but does not resize
* the list (extend memory with resizeCellList(), if necessary).
*/
publicAPI.addCellReference = (cellId, ptId) => {
model.array[ptId].cells[model.array[ptId].ncells++] = cellId;
};
/**
* Change the length of a point's link list (i.e., list of cells using a
* point) by the size specified.
*/
publicAPI.resizeCellList = (ptId, size) => {
model.array[ptId].cells.length = size;
};
/**
* Reclaim any unused memory.
*/
publicAPI.squeeze = () => {
resize(model, model.maxId + 1);
};
/**
* Reset to a state of no entries without freeing the memory.
*/
publicAPI.reset = () => {
model.maxId = -1;
};
/**
* Standard DeepCopy method. Since this object contains no reference
* to other objects, there is no ShallowCopy.
*/
publicAPI.deepCopy = src => {
model.array = [...src.array];
model.extend = src.extend;
model.maxId = src.maxId;
};
/**
* Increment the count of the number of cells using the point.
*/
publicAPI.incrementLinkCount = ptId => {
++model.array[ptId].ncells;
};
publicAPI.allocateLinks = n => {
for (let i = 0; i < n; ++i) {
model.array[i].cells = new Array(model.array[i].ncells);
}
};
/**
* Insert a cell id into the list of cells using the point.
*/
publicAPI.insertCellReference = (ptId, pos, cellId) => {
model.array[ptId].cells[pos] = cellId;
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
array: null,
// pointer to data
maxId: 0,
// maximum index inserted thus far
extend: 0 // grow array by this point
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
macro.obj(publicAPI, model);
vtkCellLinks(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkCellLinks');
// ----------------------------------------------------------------------------
var vtkCellLinks$1 = {
newInstance,
extend
};
export { InitLink, vtkCellLinks$1 as default, extend, newInstance };