@kitware/vtk.js 34.10.0 → 34.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/Common/Core/DataArray.js +2 -1
  2. package/Common/Core/Points.d.ts +19 -1
  3. package/Common/Core/Points.js +35 -20
  4. package/Common/DataModel/AbstractPointLocator.d.ts +2 -2
  5. package/Common/DataModel/BoundingBox.d.ts +60 -7
  6. package/Common/DataModel/BoundingBox.js +190 -3
  7. package/Common/DataModel/Cell.js +4 -34
  8. package/Common/DataModel/DataSet.d.ts +7 -0
  9. package/Common/DataModel/DataSet.js +6 -0
  10. package/Common/DataModel/DataSetAttributes/FieldData.d.ts +6 -2
  11. package/Common/DataModel/DataSetAttributes.d.ts +2 -1
  12. package/Common/DataModel/ImageData.d.ts +7 -0
  13. package/Common/DataModel/ImageData.js +11 -0
  14. package/Common/DataModel/Locator.d.ts +97 -5
  15. package/Common/DataModel/MergePoints.d.ts +64 -0
  16. package/Common/DataModel/MergePoints.js +130 -0
  17. package/Common/DataModel/PointLocator.d.ts +217 -0
  18. package/Common/DataModel/PointLocator.js +751 -0
  19. package/Common/DataModel/PointSet.d.ts +6 -0
  20. package/Common/DataModel/PointSet.js +10 -0
  21. package/Common/DataModel/PolyData.d.ts +6 -0
  22. package/Common/DataModel/PolyData.js +7 -0
  23. package/Filters/Core/Cutter.js +1 -1
  24. package/Filters/Core/PolyDataNormals.js +1 -1
  25. package/Filters/Core/ThresholdPoints.js +1 -2
  26. package/Filters/General/AppendPolyData.js +1 -1
  27. package/Filters/General/Calculator.js +1 -1
  28. package/Filters/General/ClipClosedSurface.js +2 -2
  29. package/Filters/General/ClosedPolyLineToSurfaceFilter.js +1 -1
  30. package/Filters/General/ContourLoopExtraction.js +2 -4
  31. package/Filters/General/ContourTriangulator.js +1 -2
  32. package/Filters/General/ImageCropFilter.js +7 -10
  33. package/Filters/General/ImageMarchingCubes.js +1 -1
  34. package/Filters/General/ImageMarchingSquares.js +1 -1
  35. package/Filters/General/ImageOutlineFilter.js +2 -1
  36. package/Filters/General/ImageSliceFilter.js +2 -1
  37. package/Filters/General/ImageStreamline.js +1 -1
  38. package/Filters/General/LineFilter.js +1 -1
  39. package/Filters/General/MoleculeToRepresentation.js +2 -2
  40. package/Filters/General/OutlineFilter.js +1 -1
  41. package/Filters/General/ScalarToRGBA.js +2 -1
  42. package/Filters/General/ShrinkPolyData.js +1 -1
  43. package/Filters/General/TransformPolyDataFilter.js +1 -1
  44. package/Filters/General/TriangleFilter.js +1 -1
  45. package/Filters/General/TubeFilter.js +1 -2
  46. package/Filters/General/WarpScalar.js +1 -1
  47. package/Filters/General/WindowedSincPolyDataFilter.js +1 -1
  48. package/Filters/Sources/ArcSource.js +1 -1
  49. package/Filters/Sources/Arrow2DSource.js +6 -9
  50. package/Filters/Sources/ArrowSource.js +2 -8
  51. package/Filters/Sources/CircleSource.js +3 -10
  52. package/Filters/Sources/ConcentricCylinderSource.js +5 -8
  53. package/Filters/Sources/ConeSource.js +3 -10
  54. package/Filters/Sources/CubeSource.js +3 -9
  55. package/Filters/Sources/Cursor3D.js +1 -4
  56. package/Filters/Sources/CylinderSource.js +3 -10
  57. package/Filters/Sources/DiskSource.js +1 -5
  58. package/Filters/Sources/EllipseArcSource.js +1 -1
  59. package/Filters/Sources/FrustumSource.d.ts +111 -0
  60. package/Filters/Sources/FrustumSource.js +248 -0
  61. package/Filters/Sources/ImageGridSource.js +0 -3
  62. package/Filters/Sources/LineSource.js +1 -4
  63. package/Filters/Sources/PlaneSource.js +1 -4
  64. package/Filters/Sources/PlatonicSolidSource.js +1 -1
  65. package/Filters/Sources/PointSource.js +1 -4
  66. package/Filters/Sources/RTAnalyticSource.js +0 -3
  67. package/Filters/Sources/SLICSource.js +1 -4
  68. package/Filters/Sources/SphereSource.js +1 -4
  69. package/Filters/Sources/ViewFinderSource.js +1 -1
  70. package/Filters/Texture/TextureMapToPlane.js +1 -4
  71. package/Filters/Texture/TextureMapToSphere.js +1 -4
  72. package/Imaging/Core/ImageReslice.js +1 -1
  73. package/Imaging/Hybrid/SampleFunction.js +1 -1
  74. package/Rendering/Core/VectorText.js +4 -3
  75. package/Rendering/OpenGL/Glyph3DMapper.js +16 -0
  76. package/Rendering/OpenGL/glsl/vtkVolumeVS.glsl.js +1 -1
  77. package/Widgets/Representations/ImplicitPlaneRepresentation.js +1 -1
  78. package/Widgets/Representations/RectangleContextRepresentation.js +0 -3
  79. package/Widgets/Representations/SplineContextRepresentation.js +1 -5
  80. package/index.d.ts +3 -0
  81. package/macros2.js +1 -1
  82. package/package.json +1 -1
@@ -8,6 +8,12 @@ import vtkDataSet, { IDataSetInitialValues } from './DataSet';
8
8
  export interface IPointSetInitialValues extends IDataSetInitialValues {}
9
9
 
10
10
  export interface vtkPointSet extends vtkDataSet {
11
+ /**
12
+ * Empty the points and initialize the data set and .
13
+ * @see vtkDataSet::initialize()
14
+ */
15
+ initialize(): void;
16
+
11
17
  /**
12
18
  * Compute the (X, Y, Z) bounds of the data.
13
19
  */
@@ -33,6 +33,16 @@ function vtkPointSet(publicAPI, model) {
33
33
  model.points = vtkPoints.newInstance();
34
34
  model.points.shallowCopy(other.getPoints());
35
35
  };
36
+ const superGetMTime = publicAPI.getMTime;
37
+ publicAPI.getMTime = () => {
38
+ const mTime = superGetMTime();
39
+ return Math.max(mTime, model.points?.getMTime() ?? mTime);
40
+ };
41
+ const superInitialize = publicAPI.initialize;
42
+ publicAPI.initialize = () => {
43
+ model.points?.initialize();
44
+ return superInitialize();
45
+ };
36
46
  }
37
47
 
38
48
  // ----------------------------------------------------------------------------
@@ -8,6 +8,12 @@ import vtkPointSet, { IPointSetInitialValues } from './PointSet';
8
8
  export interface IPolyDataInitialValues extends IPointSetInitialValues {}
9
9
 
10
10
  export interface vtkPolyData extends vtkPointSet {
11
+ /**
12
+ * Empty the cells and initialize the point set.
13
+ * @see vtkPointSet::initialize()
14
+ */
15
+ initialize(): void;
16
+
11
17
  /**
12
18
  * Create data structure that allows random access of cells.
13
19
  */
@@ -48,6 +48,13 @@ function vtkPolyData(publicAPI, model) {
48
48
  model[type].shallowCopy(other.getReferenceByName(type));
49
49
  });
50
50
  };
51
+ const superGetMTime = publicAPI.getMTime;
52
+ publicAPI.getMTime = () => POLYDATA_FIELDS.reduce((mTime, type) => Math.max(mTime, model[type]?.getMTime() ?? mTime), superGetMTime());
53
+ const superInitialize = publicAPI.initialize;
54
+ publicAPI.initialize = () => {
55
+ POLYDATA_FIELDS.forEach(type => model[type]?.initialize());
56
+ return superInitialize();
57
+ };
51
58
  publicAPI.buildCells = () => {
52
59
  // here are the number of cells we have
53
60
  const nVerts = publicAPI.getNumberOfVerts();
@@ -287,7 +287,7 @@ function vtkCutter(publicAPI, model) {
287
287
  vtkErrorMacro('Missing cut function');
288
288
  return;
289
289
  }
290
- const output = vtkPolyData.newInstance();
290
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
291
291
  dataSetCutter(input, output);
292
292
  outData[0] = output;
293
293
  };
@@ -70,7 +70,7 @@ function vtkPolyDataNormals(publicAPI, model) {
70
70
  if (!input) {
71
71
  return;
72
72
  }
73
- const output = vtkPolyData.newInstance();
73
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
74
74
  output.setPoints(input.getPoints());
75
75
  output.setVerts(input.getVerts());
76
76
  output.setLines(input.getLines());
@@ -43,7 +43,7 @@ function vtkThresholdPoints(publicAPI, model) {
43
43
  model.classHierarchy.push('vtkThresholdPoints');
44
44
  publicAPI.requestData = (inData, outData) => {
45
45
  const input = inData[0];
46
- const output = vtkPolyData.newInstance();
46
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
47
47
  outData[0] = output;
48
48
  if (model.criterias.length === 0) {
49
49
  output.shallowCopy(input);
@@ -170,7 +170,6 @@ function vtkThresholdPoints(publicAPI, model) {
170
170
  dataType: input.getPolys().getDataType()
171
171
  }));
172
172
  });
173
- outData[0] = output;
174
173
  };
175
174
  }
176
175
 
@@ -43,7 +43,7 @@ function vtkAppendPolyData(publicAPI, model) {
43
43
  }
44
44
 
45
45
  // Allocate output
46
- const output = vtkPolyData.newInstance();
46
+ const output = outData[0] && inData[0] !== outData[0] ? outData[0].initialize() : vtkPolyData.newInstance();
47
47
  let numPts = 0;
48
48
  let pointType = 0;
49
49
  let ttype = 1;
@@ -172,7 +172,7 @@ function vtkCalculator(publicAPI, model) {
172
172
  return 0;
173
173
  }
174
174
  const arraySpec = model.formula.getArrays(inData);
175
- const newDataSet = vtk({
175
+ const newDataSet = outData[0]?.initialize() || vtk({
176
176
  vtkClass: inData[0].getClassName()
177
177
  });
178
178
  newDataSet.shallowCopy(inData[0]);
@@ -499,7 +499,7 @@ function vtkClipClosedSurface(publicAPI, model) {
499
499
  publicAPI.requestData = (inData, outData) => {
500
500
  // implement requestData
501
501
  const input = inData[0];
502
- const output = vtkPolyData.newInstance();
502
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
503
503
  outData[0] = output;
504
504
  if (!input) {
505
505
  vtkErrorMacro('Invalid or missing input');
@@ -830,8 +830,8 @@ function vtkClipClosedSurface(publicAPI, model) {
830
830
  squeezeOutputPoints(output, points, pointData, inputPointsType);
831
831
  // TODO: Check
832
832
  // output.squeeze();
833
- outData[0] = output;
834
833
  };
834
+
835
835
  Object.keys(ScalarMode).forEach(key => {
836
836
  const name = capitalize(key.toLowerCase());
837
837
  publicAPI[`setScalarModeTo${name}`] = () => {
@@ -125,7 +125,7 @@ function vtkClosedPolyLineToSurfaceFilter(publicAPI, model) {
125
125
  vtkErrorMacro('Invalid or missing input');
126
126
  return;
127
127
  }
128
- const output = vtkPolyData.newInstance();
128
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
129
129
  output.shallowCopy(input);
130
130
 
131
131
  // Extract faces
@@ -9,10 +9,8 @@ const visited = new Set();
9
9
  function vtkContourLoopExtraction(publicAPI, model) {
10
10
  publicAPI.requestData = (inData, outData) => {
11
11
  const [input] = inData;
12
- if (!outData[0]) {
13
- outData[0] = vtkPolyData.newInstance();
14
- }
15
- const [output] = outData;
12
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
13
+ outData[0] = output;
16
14
  publicAPI.extractContours(input, output);
17
15
  output.modified();
18
16
  };
@@ -137,8 +137,7 @@ function vtkContourTriangulator(publicAPI, model) {
137
137
  publicAPI.requestData = (inData, outData) => {
138
138
  // implement requestData
139
139
  const input = inData[0];
140
- // FIXME: do not instantiate a new polydata each time the filter is executed.
141
- const output = vtkPolyData.newInstance();
140
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
142
141
  outData[0] = output;
143
142
  if (!input) {
144
143
  vtkErrorMacro('Invalid or missing input');
@@ -32,6 +32,8 @@ function vtkImageCropFilter(publicAPI, model) {
32
32
  vtkErrorMacro('Invalid or missing input');
33
33
  return;
34
34
  }
35
+ const outImage = outData[0]?.initialize() || vtkImageData.newInstance();
36
+ outData[0] = outImage;
35
37
  const scalars = input.getPointData().getScalars();
36
38
  if (!scalars) {
37
39
  vtkErrorMacro('No scalars from input');
@@ -47,9 +49,7 @@ function vtkImageCropFilter(publicAPI, model) {
47
49
  return Math.min(e, Math.round(model.croppingPlanes[i]));
48
50
  }) : extent.slice();
49
51
  if (cropped[0] === extent[0] && cropped[1] === extent[1] && cropped[2] === extent[2] && cropped[3] === extent[3] && cropped[4] === extent[4] && cropped[5] === extent[5]) {
50
- const sameAsInput = vtkImageData.newInstance();
51
- sameAsInput.shallowCopy(input); // Force new mtime
52
- outData[0] = sameAsInput;
52
+ outImage.shallowCopy(input); // Force new mtime
53
53
  return;
54
54
  }
55
55
 
@@ -88,19 +88,16 @@ function vtkImageCropFilter(publicAPI, model) {
88
88
  index += slice.length;
89
89
  }
90
90
  }
91
- const outImage = vtkImageData.newInstance({
92
- extent: cropped,
93
- origin: input.getOrigin(),
94
- direction: input.getDirection(),
95
- spacing: input.getSpacing()
96
- });
91
+ outImage.setExtent(cropped);
92
+ outImage.setOrigin(input.getOrigin());
93
+ outImage.setSpacing(input.getSpacing());
94
+ outImage.setDirection(input.getDirection());
97
95
  const croppedScalars = vtkDataArray.newInstance({
98
96
  name: scalars.getName(),
99
97
  numberOfComponents,
100
98
  values: croppedArray
101
99
  });
102
100
  outImage.getPointData().setScalars(croppedScalars);
103
- outData[0] = outImage;
104
101
  };
105
102
  publicAPI.isResetAvailable = () => {
106
103
  if (model.croppingPlanes == null || model.croppingPlanes.length === 0) {
@@ -251,7 +251,7 @@ function vtkImageMarchingCubes(publicAPI, model) {
251
251
  edgeLocator.initialize();
252
252
 
253
253
  // Update output
254
- const polydata = vtkPolyData.newInstance();
254
+ const polydata = outData[0]?.initialize() || vtkPolyData.newInstance();
255
255
  polydata.getPoints().setData(new Float32Array(pBuffer), 3);
256
256
  polydata.getPolys().setData(new Uint32Array(tBuffer));
257
257
  if (model.computeNormals) {
@@ -207,7 +207,7 @@ function vtkImageMarchingSquares(publicAPI, model) {
207
207
  }
208
208
 
209
209
  // Update output
210
- const polydata = vtkPolyData.newInstance();
210
+ const polydata = outData[0]?.initialize() || vtkPolyData.newInstance();
211
211
  polydata.getPoints().setData(new Float32Array(points), 3);
212
212
  polydata.getLines().setData(new Uint32Array(lines));
213
213
  outData[0] = polydata;
@@ -19,7 +19,8 @@ function vtkImageOutlineFilter(publicAPI, model) {
19
19
  vtkErrorMacro('Invalid or missing input');
20
20
  return;
21
21
  }
22
- const output = vtkImageData.newInstance(input.get('spacing', 'origin', 'direction'));
22
+ const output = outData[0]?.initialize() || vtkImageData.newInstance();
23
+ output.set(input.get('spacing', 'origin', 'direction'));
23
24
  const getIndex = (point, dims) => point[0] + point[1] * dims[0] + point[2] * dims[0] * dims[1];
24
25
  const getIJK = (index, dims) => {
25
26
  const ijk = [0, 0, 0];
@@ -37,7 +37,8 @@ function vtkImageSliceFilter(publicAPI, model) {
37
37
  numberOfComponents,
38
38
  values: sliceRawArray
39
39
  });
40
- const output = vtkImageData.newInstance(datasetDefinition);
40
+ const output = outData[0]?.initialize() || vtkImageData.newInstance();
41
+ output.set(datasetDefinition);
41
42
  output.getPointData().setScalars(sliceArray);
42
43
  outData[0] = output;
43
44
  };
@@ -210,7 +210,7 @@ function vtkImageStreamline(publicAPI, model) {
210
210
  pointArray.set(data[0], offset2);
211
211
  offset2 += data[0].length;
212
212
  });
213
- const output = vtkPolyData.newInstance();
213
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
214
214
  output.getPoints().setData(pointArray, 3);
215
215
  output.getLines().setData(cellArray);
216
216
  outData[0] = output;
@@ -9,7 +9,7 @@ function vtkLineFilter(publicAPI, model) {
9
9
  // Set our classname
10
10
  model.classHierarchy.push('vtkLineFilter');
11
11
  publicAPI.requestData = (inData, outData) => {
12
- const dataset = vtkPolyData.newInstance();
12
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
13
13
  dataset.getPoints().setData(inData[0].getPoints().getData());
14
14
  dataset.getLines().setData(inData[0].getLines().getData());
15
15
  outData[0] = dataset;
@@ -54,8 +54,8 @@ function vtkMoleculeToRepresentation(publicAPI, model) {
54
54
  }
55
55
 
56
56
  // output
57
- const SphereData = vtkPolyData.newInstance();
58
- const StickData = vtkPolyData.newInstance();
57
+ const SphereData = outData[0]?.initialize() || vtkPolyData.newInstance();
58
+ const StickData = outData[1]?.initialize() || vtkPolyData.newInstance();
59
59
 
60
60
  // Fetch from input molecule data
61
61
  let numPts = 0;
@@ -41,7 +41,7 @@ function vtkOutlineFilter(publicAPI, model) {
41
41
  return;
42
42
  }
43
43
  const bounds = input.getBounds();
44
- const output = vtkPolyData.newInstance();
44
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
45
45
  output.getPoints().setData(Float32Array.from(BOUNDS_MAP.map(idx => bounds[idx])), 3);
46
46
  output.getLines().setData(Uint16Array.from(LINE_ARRAY));
47
47
  outData[0] = output;
@@ -52,7 +52,8 @@ function vtkScalarToRGBA(publicAPI, model) {
52
52
  values: rgbaArray
53
53
  });
54
54
  const datasetDefinition = input.get('extent', 'spacing', 'origin', 'direction');
55
- const output = vtkImageData.newInstance(datasetDefinition);
55
+ const output = outData[0]?.initialize() || vtkImageData.newInstance();
56
+ output.set(datasetDefinition);
56
57
  output.getPointData().setScalars(colorArray);
57
58
  outData[0] = output;
58
59
  };
@@ -258,7 +258,7 @@ function vtkShrinkPolyData(publicAPI, model) {
258
258
  }
259
259
  publicAPI.requestData = (inData, outData) => {
260
260
  const input = inData[0];
261
- const output = outData[0] || vtkPolyData.newInstance();
261
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
262
262
  if (!input) {
263
263
  vtkErrorMacro('No input!');
264
264
  return;
@@ -143,7 +143,7 @@ function vtkTransformPolyDataFilter(publicAPI, model) {
143
143
  }
144
144
  publicAPI.requestData = (inData, outData) => {
145
145
  const input = inData[0];
146
- const output = outData[0] || vtkPolyData.newInstance();
146
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
147
147
  if (transformPolyData(input, output)) {
148
148
  outData[0] = output;
149
149
  } else {
@@ -72,7 +72,7 @@ function vtkTriangleFilter(publicAPI, model) {
72
72
  }
73
73
  }
74
74
  }
75
- const dataset = vtkPolyData.newInstance();
75
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
76
76
  dataset.getPoints().setData(macro.newTypedArrayFrom(pointsDataType, newPoints));
77
77
  dataset.getPolys().setData(macro.newTypedArrayFrom(cellsDataType, newCells));
78
78
  outData[0] = dataset;
@@ -535,7 +535,7 @@ function vtkTubeFilter(publicAPI, model) {
535
535
  publicAPI.requestData = (inData, outData) => {
536
536
  // implement requestData
537
537
  // pass through for now
538
- const output = vtkPolyData.newInstance();
538
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
539
539
  outData[0] = output;
540
540
  const input = inData[0];
541
541
  if (!input) {
@@ -733,7 +733,6 @@ function vtkTubeFilter(publicAPI, model) {
733
733
  output.setStrips(newStrips);
734
734
  output.setPointData(outPD);
735
735
  outPD.setNormals(newNormals);
736
- outData[0] = output;
737
736
  };
738
737
  }
739
738
 
@@ -69,7 +69,7 @@ function vtkWarpScalar(publicAPI, model) {
69
69
  newPtsData[ptOffset + 1] = inPoints[ptOffset + 1] + model.scaleFactor * s * n[1];
70
70
  newPtsData[ptOffset + 2] = inPoints[ptOffset + 2] + model.scaleFactor * s * n[2];
71
71
  }
72
- const newDataSet = vtk({
72
+ const newDataSet = outData[0] && outData[0] !== inData[0] ? outData[0].initialize() : vtk({
73
73
  vtkClass: input.getClassName()
74
74
  });
75
75
  newDataSet.shallowCopy(input);
@@ -513,7 +513,7 @@ function vtkWindowedSincPolyDataFilter(publicAPI, model) {
513
513
  if (!input) {
514
514
  return;
515
515
  }
516
- const output = vtkPolyData.newInstance();
516
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
517
517
  const outputPoints = publicAPI.vtkWindowedSincPolyDataFilterExecute(input.getPoints(), input, output);
518
518
  output.setPointData(input.getPointData());
519
519
  output.setCellData(input.getCellData());
@@ -21,7 +21,7 @@ function vtkArcSource(publicAPI, model) {
21
21
  const numLines = model.resolution;
22
22
  const numPts = model.resolution + 1;
23
23
  const tc = [0.0, 0.0];
24
- const output = outData[0] || vtkPolyData.newInstance();
24
+ const output = outData[0]?.initialize() || vtkPolyData.newInstance();
25
25
  let angle = 0.0;
26
26
  let radius = 0.5;
27
27
  const perpendicular = [0, 0, 0];
@@ -11,8 +11,7 @@ const {
11
11
  // vtkArrow2DSource methods
12
12
  // ----------------------------------------------------------------------------
13
13
 
14
- function vtkStarSource(publicAPI, model) {
15
- const dataset = vtkPolyData.newInstance();
14
+ function vtkStarSource(publicAPI, model, dataset) {
16
15
  const points = macro.newTypedArray(model.pointType, 10 * 3);
17
16
  const edges = new Uint32Array(11);
18
17
  edges[0] = 10;
@@ -27,8 +26,7 @@ function vtkStarSource(publicAPI, model) {
27
26
  dataset.getPolys().setData(edges, 1);
28
27
  return dataset;
29
28
  }
30
- function vtk6PointsArrow(publicAPI, model) {
31
- const dataset = vtkPolyData.newInstance();
29
+ function vtk6PointsArrow(publicAPI, model, dataset) {
32
30
  const points = macro.newTypedArray(model.pointType, 6 * 3);
33
31
  const thickOp = model.height * 0.5 * model.thickness;
34
32
  const offsetOp = model.height * 0.5 - thickOp;
@@ -58,8 +56,7 @@ function vtk6PointsArrow(publicAPI, model) {
58
56
  dataset.getPolys().setData(cells, 1);
59
57
  return dataset;
60
58
  }
61
- function vtk4PointsArrow(publicAPI, model) {
62
- const dataset = vtkPolyData.newInstance();
59
+ function vtk4PointsArrow(publicAPI, model, dataset) {
63
60
  const points = macro.newTypedArray(model.pointType, 4 * 3);
64
61
  const thickOp = model.height / 3 * model.thickness;
65
62
  const offsetOp = model.height / 3 - thickOp;
@@ -81,8 +78,7 @@ function vtk4PointsArrow(publicAPI, model) {
81
78
  dataset.getPolys().setData(cells, 1);
82
79
  return dataset;
83
80
  }
84
- function vtkTriangleSource(publicAPI, model) {
85
- const dataset = vtkPolyData.newInstance();
81
+ function vtkTriangleSource(publicAPI, model, dataset) {
86
82
  const points = macro.newTypedArray(model.pointType, 3 * 3);
87
83
  const baseOffsetOp = model.height * (1 - model.base);
88
84
  points[0] = model.width / 2 * -1;
@@ -107,7 +103,8 @@ function vtkArrow2DSource(publicAPI, model) {
107
103
  [ShapeType.ARROW_6]: vtk6PointsArrow
108
104
  };
109
105
  publicAPI.requestData = (inData, outData) => {
110
- outData[0] = shapeToSource[model.shape](publicAPI, model);
106
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
107
+ outData[0] = shapeToSource[model.shape](publicAPI, model, dataset);
111
108
  vtkMatrixBuilder.buildFromRadian().translate(...model.center).rotateFromDirections([1, 0, 0], model.direction).apply(outData[0].getPoints().getData());
112
109
  };
113
110
  }
@@ -11,10 +11,7 @@ import vtkMatrixBuilder from '../../Common/Core/MatrixBuilder.js';
11
11
  function vtkArrowSource(publicAPI, model) {
12
12
  // Set our className
13
13
  model.classHierarchy.push('vtkArrowSource');
14
- function requestData(inData, outData) {
15
- if (model.deleted) {
16
- return;
17
- }
14
+ publicAPI.requestData = (inData, outData) => {
18
15
  const cylinder = vtkCylinderSource.newInstance({
19
16
  capping: true
20
17
  });
@@ -57,10 +54,7 @@ function vtkArrowSource(publicAPI, model) {
57
54
  // Update output
58
55
  outData[0] = append.getOutputData();
59
56
  }
60
- }
61
-
62
- // Expose methods
63
- publicAPI.requestData = requestData;
57
+ };
64
58
  }
65
59
 
66
60
  // ----------------------------------------------------------------------------
@@ -10,11 +10,8 @@ import { x as multiplyScalar } from '../../Common/Core/Math/index.js';
10
10
  function vtkCircleSource(publicAPI, model) {
11
11
  // Set our classname
12
12
  model.classHierarchy.push('vtkCircleSource');
13
- function requestData(inData, outData) {
14
- if (model.deleted) {
15
- return;
16
- }
17
- let dataset = outData[0];
13
+ publicAPI.requestData = (inData, outData) => {
14
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
18
15
 
19
16
  // Points
20
17
  const points = macro.newTypedArray(model.pointType, model.resolution * 3);
@@ -36,7 +33,6 @@ function vtkCircleSource(publicAPI, model) {
36
33
 
37
34
  // connect endpoints
38
35
  edges[edges.length - 1] = edges[1];
39
- dataset = vtkPolyData.newInstance();
40
36
  dataset.getPoints().setData(points, 3);
41
37
  if (model.lines) {
42
38
  dataset.getLines().setData(edges, 1);
@@ -50,10 +46,7 @@ function vtkCircleSource(publicAPI, model) {
50
46
 
51
47
  // Update output
52
48
  outData[0] = dataset;
53
- }
54
-
55
- // Expose methods
56
- publicAPI.requestData = requestData;
49
+ };
57
50
  }
58
51
 
59
52
  // ----------------------------------------------------------------------------
@@ -64,14 +64,14 @@ function vtkConcentricCylinderSource(publicAPI, model) {
64
64
  }
65
65
  };
66
66
  publicAPI.getMaskLayer = index => index === undefined ? model.mask : model.mask[index];
67
- function requestData(inData, outData) {
68
- if (model.deleted || !model.radius.length) {
67
+ publicAPI.requestData = (inData, outData) => {
68
+ if (!model.radius.length) {
69
+ macro.vtkErrorMacro('No radius defined');
69
70
  return;
70
71
  }
71
72
 
72
73
  // Make sure we have consistency
73
74
  validateCellFields();
74
- let dataset = outData[0];
75
75
  const numLayers = model.radius.length;
76
76
  const zRef = model.height / 2.0;
77
77
 
@@ -324,7 +324,7 @@ function vtkConcentricCylinderSource(publicAPI, model) {
324
324
 
325
325
  // Apply transformation to the point coordinates
326
326
  vtkMatrixBuilder.buildFromRadian().translate(...model.center).rotateFromDirections([0, 0, 1], model.direction).apply(points);
327
- dataset = vtkPolyData.newInstance();
327
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
328
328
  dataset.getPoints().setData(points, 3);
329
329
  dataset.getPolys().setData(polys, 1);
330
330
  dataset.getCellData().setScalars(vtkDataArray.newInstance({
@@ -334,10 +334,7 @@ function vtkConcentricCylinderSource(publicAPI, model) {
334
334
 
335
335
  // Update output
336
336
  outData[0] = dataset;
337
- }
338
-
339
- // Expose methods
340
- publicAPI.requestData = requestData;
337
+ };
341
338
  }
342
339
 
343
340
  // ----------------------------------------------------------------------------
@@ -9,11 +9,7 @@ import vtkMatrixBuilder from '../../Common/Core/MatrixBuilder.js';
9
9
  function vtkConeSource(publicAPI, model) {
10
10
  // Set our className
11
11
  model.classHierarchy.push('vtkConeSource');
12
- function requestData(inData, outData) {
13
- if (model.deleted) {
14
- return;
15
- }
16
- let dataset = outData[0];
12
+ publicAPI.requestData = (inData, outData) => {
17
13
  const angle = 2 * Math.PI / model.resolution;
18
14
  const xbot = -model.height / 2.0;
19
15
  const numberOfPoints = model.resolution + 1;
@@ -60,16 +56,13 @@ function vtkConeSource(publicAPI, model) {
60
56
 
61
57
  // Apply transformation to the points coordinates
62
58
  vtkMatrixBuilder.buildFromRadian().translate(...model.center).rotateFromDirections([1, 0, 0], model.direction).apply(points);
63
- dataset = vtkPolyData.newInstance();
59
+ const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
64
60
  dataset.getPoints().setData(points, 3);
65
61
  dataset.getPolys().setData(polys, 1);
66
62
 
67
63
  // Update output
68
64
  outData[0] = dataset;
69
- }
70
-
71
- // Expose methods
72
- publicAPI.requestData = requestData;
65
+ };
73
66
  }
74
67
 
75
68
  // ----------------------------------------------------------------------------
@@ -17,11 +17,8 @@ const POLY_ARRAY = [4, 0, 1, 3, 2, 4, 4, 6, 7, 5, 4, 8, 10, 11, 9, 4, 12, 13, 15
17
17
  function vtkCubeSource(publicAPI, model) {
18
18
  // Set our className
19
19
  model.classHierarchy.push('vtkCubeSource');
20
- function requestData(inData, outData) {
21
- if (model.deleted) {
22
- return;
23
- }
24
- const polyData = vtkPolyData.newInstance();
20
+ publicAPI.requestData = (inData, outData) => {
21
+ const polyData = outData[0]?.initialize() || vtkPolyData.newInstance();
25
22
  outData[0] = polyData;
26
23
  const numberOfPoints = 24;
27
24
 
@@ -183,7 +180,7 @@ function vtkCubeSource(publicAPI, model) {
183
180
  polyData.getLines().initialize();
184
181
  }
185
182
  polyData.modified();
186
- }
183
+ };
187
184
  publicAPI.setBounds = function () {
188
185
  let boundsArray = [];
189
186
  if (Array.isArray(arguments.length <= 0 ? undefined : arguments[0])) {
@@ -201,9 +198,6 @@ function vtkCubeSource(publicAPI, model) {
201
198
  publicAPI.setZLength(boundsArray[5] - boundsArray[4]);
202
199
  publicAPI.setCenter([(boundsArray[0] + boundsArray[1]) / 2.0, (boundsArray[2] + boundsArray[3]) / 2.0, (boundsArray[4] + boundsArray[5]) / 2.0]);
203
200
  };
204
-
205
- // Expose methods
206
- publicAPI.requestData = requestData;
207
201
  }
208
202
 
209
203
  // ----------------------------------------------------------------------------
@@ -72,9 +72,6 @@ function vtkCursor3D(publicAPI, model) {
72
72
  publicAPI.setAll(false);
73
73
  };
74
74
  publicAPI.requestData = (inData, outData) => {
75
- if (model.deleted) {
76
- return;
77
- }
78
75
  let numPts = 0;
79
76
  let numLines = 0;
80
77
  // Check bounding box and origin
@@ -112,7 +109,7 @@ function vtkCursor3D(publicAPI, model) {
112
109
  if (numPts === 0) {
113
110
  return;
114
111
  }
115
- const polyData = vtkPolyData.newInstance();
112
+ const polyData = outData[0]?.initialize() || vtkPolyData.newInstance();
116
113
  const newPts = vtkPoints.newInstance({
117
114
  size: numPts * 3
118
115
  });