@cornerstonejs/tools 4.18.4 → 4.18.5

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.
@@ -0,0 +1,486 @@
1
+ import vtkCellPicker from '@kitware/vtk.js/Rendering/Core/CellPicker';
2
+ import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
3
+ import { Enums } from '@cornerstonejs/core';
4
+ import vtkAnnotatedRhombicuboctahedronActor from '../AnnotatedRhombicuboctahedronActor';
5
+ export class vtkOrientationControllerWidget {
6
+ constructor() {
7
+ this.actors = new Map();
8
+ this.pickers = new Map();
9
+ this.highlightedFace = null;
10
+ this.mouseHandlers = new Map();
11
+ }
12
+ createActors(config) {
13
+ const rgbToHex = (rgb) => {
14
+ return `#${rgb
15
+ .map((x) => {
16
+ const hex = Math.round(x).toString(16);
17
+ return hex.length === 1 ? '0' + hex : hex;
18
+ })
19
+ .join('')}`;
20
+ };
21
+ const rgbToHexColor = (rgb) => {
22
+ return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
23
+ };
24
+ const actorFactory = vtkAnnotatedRhombicuboctahedronActor.newInstance();
25
+ const defaultStyle = {
26
+ fontStyle: 'bold',
27
+ fontFamily: 'Arial',
28
+ fontColor: 'black',
29
+ fontSizeScale: (res) => res / 2,
30
+ faceColor: rgbToHex(config.faceColors.topBottom),
31
+ edgeThickness: 0.1,
32
+ edgeColor: 'black',
33
+ resolution: 400,
34
+ };
35
+ actorFactory.setDefaultStyle(defaultStyle);
36
+ actorFactory.setXPlusFaceProperty({
37
+ text: 'L',
38
+ faceColor: rgbToHex(config.faceColors.leftRight),
39
+ fontColor: rgbToHexColor(config.letterColors.xPlus),
40
+ faceRotation: 0,
41
+ });
42
+ actorFactory.setXMinusFaceProperty({
43
+ text: 'R',
44
+ faceColor: rgbToHex(config.faceColors.leftRight),
45
+ fontColor: rgbToHexColor(config.letterColors.xMinus),
46
+ faceRotation: 0,
47
+ });
48
+ actorFactory.setYPlusFaceProperty({
49
+ text: 'P',
50
+ faceColor: rgbToHex(config.faceColors.frontBack),
51
+ fontColor: rgbToHexColor(config.letterColors.yPlus),
52
+ faceRotation: 180,
53
+ });
54
+ actorFactory.setYMinusFaceProperty({
55
+ text: 'A',
56
+ faceColor: rgbToHex(config.faceColors.frontBack),
57
+ fontColor: rgbToHexColor(config.letterColors.yMinus),
58
+ faceRotation: 0,
59
+ });
60
+ actorFactory.setZPlusFaceProperty({
61
+ text: 'S',
62
+ faceColor: rgbToHex(config.faceColors.topBottom),
63
+ fontColor: rgbToHexColor(config.letterColors.zPlus),
64
+ });
65
+ actorFactory.setZMinusFaceProperty({
66
+ text: 'I',
67
+ faceColor: rgbToHex(config.faceColors.topBottom),
68
+ fontColor: rgbToHexColor(config.letterColors.zMinus),
69
+ });
70
+ actorFactory.setShowMainFaces(true);
71
+ actorFactory.setShowEdgeFaces(config.showEdgeFaces);
72
+ actorFactory.setShowCornerFaces(config.showCornerFaces);
73
+ const actors = actorFactory.getActors();
74
+ actors.forEach((actor) => {
75
+ const property = actor.getProperty();
76
+ property.setOpacity(config.opacity);
77
+ actor.setVisibility(true);
78
+ });
79
+ return actors;
80
+ }
81
+ addActorsToViewport(viewportId, viewport, actors) {
82
+ const existingActors = this.actors.get(viewportId);
83
+ if (existingActors) {
84
+ this.removeActorsFromViewport(viewportId, viewport);
85
+ }
86
+ actors.forEach((actor, index) => {
87
+ const uid = `orientation-controller-${viewportId}-${index}`;
88
+ viewport.addActor({ actor, uid });
89
+ });
90
+ this.actors.set(viewportId, actors);
91
+ }
92
+ removeActorsFromViewport(viewportId, viewport) {
93
+ const actors = this.actors.get(viewportId);
94
+ if (actors) {
95
+ const uids = actors.map((_, index) => `orientation-controller-${viewportId}-${index}`);
96
+ viewport.removeActors(uids);
97
+ this.actors.delete(viewportId);
98
+ }
99
+ }
100
+ setupPicker(viewportId, actors) {
101
+ const picker = vtkCellPicker.newInstance({ opacityThreshold: 0.0001 });
102
+ picker.setPickFromList(true);
103
+ picker.setTolerance(0.001);
104
+ picker.initializePickList();
105
+ actors.forEach((actor) => {
106
+ picker.addPickList(actor);
107
+ });
108
+ this.pickers.set(viewportId, picker);
109
+ return picker;
110
+ }
111
+ pickAtPosition(evt, viewportId, viewport, element, actors) {
112
+ const picker = this.pickers.get(viewportId);
113
+ if (!picker) {
114
+ return null;
115
+ }
116
+ const mainRenderer = viewport
117
+ .getRenderingEngine()
118
+ ?.getRenderer(viewportId) ?? viewport.getRenderer();
119
+ const renderer = mainRenderer;
120
+ if (!renderer) {
121
+ return null;
122
+ }
123
+ const rect = element.getBoundingClientRect();
124
+ const x = evt.clientX - rect.left;
125
+ const y = evt.clientY - rect.top;
126
+ const devicePixelRatio = window.devicePixelRatio || 1;
127
+ const canvasPosWithDPR = [x * devicePixelRatio, y * devicePixelRatio];
128
+ const canvas = viewport.canvas;
129
+ const { width, height } = canvas;
130
+ const [xMin, yMin, xMax, yMax] = renderer.getViewport();
131
+ const viewportWidth = xMax - xMin;
132
+ const viewportHeight = yMax - yMin;
133
+ const scaledX = (canvasPosWithDPR[0] / width) * viewportWidth * width;
134
+ const scaledY = (canvasPosWithDPR[1] / height) * viewportHeight * height;
135
+ const displayCoord = [scaledX, viewportHeight * height - scaledY];
136
+ const displayCoords = [
137
+ displayCoord[0],
138
+ displayCoord[1],
139
+ 0,
140
+ ];
141
+ picker.pick(displayCoords, renderer);
142
+ const pickedActors = picker.getActors();
143
+ if (pickedActors.length === 0) {
144
+ return null;
145
+ }
146
+ const pickedActor = pickedActors[0];
147
+ const cellId = picker.getCellId();
148
+ if (actors.includes(pickedActor) && cellId !== -1) {
149
+ const actorIndex = actors.indexOf(pickedActor);
150
+ return { pickedActor, cellId, actorIndex };
151
+ }
152
+ return null;
153
+ }
154
+ calculateMarkerPosition(viewport, position) {
155
+ const canvas = viewport.canvas;
156
+ if (!canvas) {
157
+ return null;
158
+ }
159
+ const devicePixelRatio = window.devicePixelRatio || 1;
160
+ const canvasWidth = canvas.clientWidth || canvas.width / devicePixelRatio;
161
+ const canvasHeight = canvas.clientHeight || canvas.height / devicePixelRatio;
162
+ const cornerOffset = viewport.type === Enums.ViewportType.VOLUME_3D ? 55 : 35;
163
+ let canvasX;
164
+ let canvasY;
165
+ switch (position) {
166
+ case 'top-left':
167
+ canvasX = cornerOffset;
168
+ canvasY = cornerOffset;
169
+ break;
170
+ case 'top-right':
171
+ canvasX = canvasWidth - cornerOffset;
172
+ canvasY = cornerOffset;
173
+ break;
174
+ case 'bottom-left':
175
+ canvasX = cornerOffset;
176
+ canvasY = canvasHeight - cornerOffset;
177
+ break;
178
+ default:
179
+ canvasX = canvasWidth - cornerOffset;
180
+ canvasY = canvasHeight - cornerOffset;
181
+ }
182
+ const canvasPos = [canvasX, canvasY];
183
+ const worldPos = viewport.canvasToWorld(canvasPos);
184
+ return [worldPos[0], worldPos[1], worldPos[2]];
185
+ }
186
+ positionActors(viewport, actors, config) {
187
+ const canvas = viewport.canvas;
188
+ if (!canvas) {
189
+ console.warn('OrientationControllerWidget: No canvas available');
190
+ return false;
191
+ }
192
+ const mainRenderer = viewport
193
+ .getRenderingEngine()
194
+ ?.getRenderer(viewport.id) ?? viewport.getRenderer();
195
+ const camera = mainRenderer?.getActiveCamera();
196
+ if (!camera) {
197
+ return false;
198
+ }
199
+ const parallelScale = camera.getParallelScale();
200
+ const worldHeight = parallelScale * 2;
201
+ const devicePixelRatio = window.devicePixelRatio || 1;
202
+ const canvasHeight = canvas.clientHeight || canvas.height / devicePixelRatio;
203
+ const canvasWidth = canvas.clientWidth || canvas.width / devicePixelRatio;
204
+ const worldUnitsPerPixel = worldHeight / canvasHeight;
205
+ const canvasSize = Math.min(canvasWidth, canvasHeight);
206
+ const screenSizePixels = canvasSize * config.size;
207
+ const markerSize = screenSizePixels * worldUnitsPerPixel;
208
+ actors.forEach((actor) => {
209
+ actor.setScale(markerSize, markerSize, markerSize);
210
+ const worldPos = this.calculateMarkerPosition(viewport, config.position);
211
+ if (!worldPos) {
212
+ console.warn('OrientationControllerWidget: Could not get world position');
213
+ return;
214
+ }
215
+ actor.setPosition(worldPos[0], worldPos[1], worldPos[2]);
216
+ actor.setOrientation(0, 0, 0);
217
+ });
218
+ return true;
219
+ }
220
+ highlightFace(actor, cellId, viewport, isMainFace = false) {
221
+ if (this.highlightedFace &&
222
+ this.highlightedFace.actor === actor &&
223
+ this.highlightedFace.cellId === cellId &&
224
+ this.highlightedFace.isMainFace === isMainFace) {
225
+ return;
226
+ }
227
+ this.clearHighlight();
228
+ if (isMainFace) {
229
+ return;
230
+ }
231
+ const mapper = actor.getMapper();
232
+ const inputData = mapper.getInputData();
233
+ if (!inputData) {
234
+ return;
235
+ }
236
+ const cellData = inputData.getCellData();
237
+ const colors = cellData.getScalars();
238
+ if (!colors) {
239
+ return;
240
+ }
241
+ const colorArray = colors.getData();
242
+ const offset = cellId * 4;
243
+ const originalColor = [
244
+ colorArray[offset],
245
+ colorArray[offset + 1],
246
+ colorArray[offset + 2],
247
+ colorArray[offset + 3],
248
+ ];
249
+ this.highlightedFace = {
250
+ actor,
251
+ cellId,
252
+ originalColor,
253
+ viewport,
254
+ isMainFace: false,
255
+ };
256
+ colorArray[offset] = 255;
257
+ colorArray[offset + 1] = 255;
258
+ colorArray[offset + 2] = 255;
259
+ colorArray[offset + 3] = 255;
260
+ colors.modified();
261
+ inputData.modified();
262
+ viewport.render();
263
+ }
264
+ clearHighlight() {
265
+ if (!this.highlightedFace) {
266
+ return;
267
+ }
268
+ const { actor, cellId, originalColor, viewport, isMainFace } = this.highlightedFace;
269
+ if (isMainFace && this.highlightedFace.originalScale) {
270
+ const scale = this.highlightedFace.originalScale;
271
+ actor.setScale(scale[0], scale[1], scale[2]);
272
+ viewport.render();
273
+ this.highlightedFace = null;
274
+ return;
275
+ }
276
+ const mapper = actor.getMapper();
277
+ const inputData = mapper.getInputData();
278
+ if (!inputData) {
279
+ this.highlightedFace = null;
280
+ return;
281
+ }
282
+ const cellData = inputData.getCellData();
283
+ const colors = cellData.getScalars();
284
+ if (!colors) {
285
+ this.highlightedFace = null;
286
+ return;
287
+ }
288
+ const colorArray = colors.getData();
289
+ const offset = cellId * 4;
290
+ colorArray[offset] = originalColor[0];
291
+ colorArray[offset + 1] = originalColor[1];
292
+ colorArray[offset + 2] = originalColor[2];
293
+ colorArray[offset + 3] = originalColor[3];
294
+ colors.modified();
295
+ inputData.modified();
296
+ viewport.render();
297
+ this.highlightedFace = null;
298
+ }
299
+ setupMouseHandlers(viewportId, element, viewport, actors, callbacks) {
300
+ let isMouseDown = false;
301
+ const hoverHandler = (evt) => {
302
+ if (isMouseDown) {
303
+ return;
304
+ }
305
+ const pickResult = this.pickAtPosition(evt, viewportId, viewport, element, actors);
306
+ if (pickResult) {
307
+ const { pickedActor, cellId, actorIndex } = pickResult;
308
+ if (actorIndex !== 0) {
309
+ this.highlightFace(pickedActor, cellId, viewport, false);
310
+ }
311
+ if (callbacks.onFaceHover) {
312
+ callbacks.onFaceHover(pickResult);
313
+ }
314
+ }
315
+ else {
316
+ this.clearHighlight();
317
+ if (callbacks.onFaceHover) {
318
+ callbacks.onFaceHover(null);
319
+ }
320
+ }
321
+ };
322
+ const clickHandler = (evt) => {
323
+ if (evt.button !== 0) {
324
+ return;
325
+ }
326
+ const pickResult = this.pickAtPosition(evt, viewportId, viewport, element, actors);
327
+ if (!pickResult) {
328
+ return;
329
+ }
330
+ isMouseDown = true;
331
+ let globalCellId = pickResult.cellId;
332
+ if (pickResult.actorIndex === 1) {
333
+ globalCellId = pickResult.cellId + 6;
334
+ }
335
+ else if (pickResult.actorIndex === 2) {
336
+ globalCellId = pickResult.cellId + 18;
337
+ }
338
+ callbacks.onFacePicked({
339
+ ...pickResult,
340
+ cellId: globalCellId,
341
+ });
342
+ evt.preventDefault();
343
+ evt.stopPropagation();
344
+ };
345
+ const mouseUpHandler = () => {
346
+ isMouseDown = false;
347
+ this.clearHighlight();
348
+ };
349
+ const dblclickHandler = (evt) => {
350
+ const pickResult = this.pickAtPosition(evt, viewportId, viewport, element, actors);
351
+ if (pickResult) {
352
+ evt.preventDefault();
353
+ evt.stopImmediatePropagation();
354
+ }
355
+ };
356
+ element.addEventListener('mousemove', hoverHandler);
357
+ element.addEventListener('mousedown', clickHandler);
358
+ element.addEventListener('mouseup', mouseUpHandler);
359
+ element.addEventListener('mouseleave', mouseUpHandler);
360
+ element.addEventListener('dblclick', dblclickHandler, true);
361
+ const cleanup = () => {
362
+ element.removeEventListener('mousemove', hoverHandler);
363
+ element.removeEventListener('mousedown', clickHandler);
364
+ element.removeEventListener('mouseup', mouseUpHandler);
365
+ element.removeEventListener('mouseleave', mouseUpHandler);
366
+ element.removeEventListener('dblclick', dblclickHandler, true);
367
+ };
368
+ this.mouseHandlers.set(viewportId, { cleanup });
369
+ return { cleanup };
370
+ }
371
+ getActors(viewportId) {
372
+ return this.actors.get(viewportId);
373
+ }
374
+ syncOverlayViewport(_viewportId, _viewport) {
375
+ }
376
+ getOrientationForFace(cellId) {
377
+ const orientations = new Map();
378
+ orientations.set(0, { viewPlaneNormal: [0, 0, -1], viewUp: [0, -1, 0] });
379
+ orientations.set(1, { viewPlaneNormal: [0, 0, 1], viewUp: [0, 1, 0] });
380
+ orientations.set(2, { viewPlaneNormal: [0, -1, 0], viewUp: [0, 0, 1] });
381
+ orientations.set(3, { viewPlaneNormal: [0, 1, 0], viewUp: [0, 0, 1] });
382
+ orientations.set(4, { viewPlaneNormal: [-1, 0, 0], viewUp: [0, 0, 1] });
383
+ orientations.set(5, { viewPlaneNormal: [1, 0, 0], viewUp: [0, 0, 1] });
384
+ const sqrt2 = 1 / Math.sqrt(2);
385
+ orientations.set(6, {
386
+ viewPlaneNormal: [0, -sqrt2, -sqrt2],
387
+ viewUp: [0, -sqrt2, sqrt2],
388
+ });
389
+ orientations.set(7, {
390
+ viewPlaneNormal: [sqrt2, 0, -sqrt2],
391
+ viewUp: [0, 0, 1],
392
+ });
393
+ orientations.set(8, {
394
+ viewPlaneNormal: [0, sqrt2, -sqrt2],
395
+ viewUp: [0, -sqrt2, -sqrt2],
396
+ });
397
+ orientations.set(9, {
398
+ viewPlaneNormal: [-sqrt2, 0, -sqrt2],
399
+ viewUp: [0, 0, 1],
400
+ });
401
+ orientations.set(10, {
402
+ viewPlaneNormal: [0, -sqrt2, sqrt2],
403
+ viewUp: [0, sqrt2, sqrt2],
404
+ });
405
+ orientations.set(11, {
406
+ viewPlaneNormal: [sqrt2, 0, sqrt2],
407
+ viewUp: [0, 0, 1],
408
+ });
409
+ orientations.set(12, {
410
+ viewPlaneNormal: [0, sqrt2, sqrt2],
411
+ viewUp: [0, sqrt2, -sqrt2],
412
+ });
413
+ orientations.set(13, {
414
+ viewPlaneNormal: [-sqrt2, 0, sqrt2],
415
+ viewUp: [0, 0, 1],
416
+ });
417
+ orientations.set(14, {
418
+ viewPlaneNormal: [-sqrt2, -sqrt2, 0],
419
+ viewUp: [0, 0, 1],
420
+ });
421
+ orientations.set(15, {
422
+ viewPlaneNormal: [sqrt2, -sqrt2, 0],
423
+ viewUp: [0, 0, 1],
424
+ });
425
+ orientations.set(16, {
426
+ viewPlaneNormal: [sqrt2, sqrt2, 0],
427
+ viewUp: [0, 0, 1],
428
+ });
429
+ orientations.set(17, {
430
+ viewPlaneNormal: [-sqrt2, sqrt2, 0],
431
+ viewUp: [0, 0, 1],
432
+ });
433
+ const sqrt3 = 1 / Math.sqrt(3);
434
+ orientations.set(18, {
435
+ viewPlaneNormal: [-sqrt3, -sqrt3, -sqrt3],
436
+ viewUp: [0, 0, 1],
437
+ });
438
+ orientations.set(19, {
439
+ viewPlaneNormal: [sqrt3, -sqrt3, -sqrt3],
440
+ viewUp: [0, 0, 1],
441
+ });
442
+ orientations.set(20, {
443
+ viewPlaneNormal: [sqrt3, sqrt3, -sqrt3],
444
+ viewUp: [0, 0, 1],
445
+ });
446
+ orientations.set(21, {
447
+ viewPlaneNormal: [-sqrt3, sqrt3, -sqrt3],
448
+ viewUp: [0, 0, 1],
449
+ });
450
+ orientations.set(22, {
451
+ viewPlaneNormal: [-sqrt3, -sqrt3, sqrt3],
452
+ viewUp: [0, 0, 1],
453
+ });
454
+ orientations.set(23, {
455
+ viewPlaneNormal: [sqrt3, -sqrt3, sqrt3],
456
+ viewUp: [0, 0, 1],
457
+ });
458
+ orientations.set(24, {
459
+ viewPlaneNormal: [sqrt3, sqrt3, sqrt3],
460
+ viewUp: [0, 0, 1],
461
+ });
462
+ orientations.set(25, {
463
+ viewPlaneNormal: [-sqrt3, sqrt3, sqrt3],
464
+ viewUp: [0, 0, 1],
465
+ });
466
+ return orientations.get(cellId) || null;
467
+ }
468
+ cleanup(viewportId) {
469
+ if (viewportId) {
470
+ const handler = this.mouseHandlers.get(viewportId);
471
+ if (handler) {
472
+ handler.cleanup();
473
+ this.mouseHandlers.delete(viewportId);
474
+ }
475
+ this.actors.delete(viewportId);
476
+ this.pickers.delete(viewportId);
477
+ }
478
+ else {
479
+ this.mouseHandlers.forEach((handler) => handler.cleanup());
480
+ this.mouseHandlers.clear();
481
+ this.actors.clear();
482
+ this.pickers.clear();
483
+ }
484
+ this.clearHighlight();
485
+ }
486
+ }
@@ -0,0 +1,7 @@
1
+ export function extend(publicAPI: any, model: any, initialValues?: {}): void;
2
+ export const newInstance: any;
3
+ declare namespace _default {
4
+ export { newInstance };
5
+ export { extend };
6
+ }
7
+ export default _default;
@@ -0,0 +1,144 @@
1
+ import macro from '@kitware/vtk.js/macros';
2
+ import vtkCellArray from '@kitware/vtk.js/Common/Core/CellArray';
3
+ import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
4
+ import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';
5
+ const MAIN_FACES = [
6
+ 4, 0, 1, 2, 3, 4, 4, 5, 6, 7, 4, 8, 9, 10, 11, 4, 12, 13, 14, 15, 4, 16, 17,
7
+ 18, 19, 4, 20, 21, 22, 23,
8
+ ];
9
+ const CORNER_FACES = [
10
+ 3, 0, 16, 8, 3, 1, 9, 20, 3, 2, 23, 13, 3, 3, 12, 19, 3, 4, 17, 11, 3, 5, 10,
11
+ 21, 3, 6, 14, 22, 3, 7, 18, 15,
12
+ ];
13
+ const EDGE_FACES = [
14
+ 4, 0, 1, 9, 8, 4, 1, 2, 23, 20, 4, 2, 3, 12, 13, 4, 3, 0, 16, 19, 4, 4, 5, 10,
15
+ 11, 4, 5, 6, 22, 21, 4, 6, 7, 15, 14, 4, 7, 4, 17, 18, 4, 8, 11, 17, 16, 4, 9,
16
+ 20, 21, 10, 4, 13, 23, 22, 14, 4, 12, 19, 18, 15,
17
+ ];
18
+ function vtkRhombicuboctahedronSource(publicAPI, model) {
19
+ model.classHierarchy.push('vtkRhombicuboctahedronSource');
20
+ publicAPI.requestData = (inData, outData) => {
21
+ const polyData = outData[0]?.initialize() || vtkPolyData.newInstance();
22
+ outData[0] = polyData;
23
+ let scale = 1.0;
24
+ if (model.scale !== undefined && model.scale !== null) {
25
+ if (Array.isArray(model.scale)) {
26
+ scale = model.scale[0] || 1.0;
27
+ }
28
+ else if (typeof model.scale === 'number') {
29
+ scale = model.scale;
30
+ }
31
+ }
32
+ const phi = 1.4;
33
+ const faceSize = 0.88;
34
+ const vertices = [];
35
+ vertices.push(-faceSize, -faceSize, -phi);
36
+ vertices.push(faceSize, -faceSize, -phi);
37
+ vertices.push(faceSize, faceSize, -phi);
38
+ vertices.push(-faceSize, faceSize, -phi);
39
+ vertices.push(-faceSize, -faceSize, phi);
40
+ vertices.push(faceSize, -faceSize, phi);
41
+ vertices.push(faceSize, faceSize, phi);
42
+ vertices.push(-faceSize, faceSize, phi);
43
+ vertices.push(-faceSize, -phi, -faceSize);
44
+ vertices.push(faceSize, -phi, -faceSize);
45
+ vertices.push(faceSize, -phi, faceSize);
46
+ vertices.push(-faceSize, -phi, faceSize);
47
+ vertices.push(-faceSize, phi, -faceSize);
48
+ vertices.push(faceSize, phi, -faceSize);
49
+ vertices.push(faceSize, phi, faceSize);
50
+ vertices.push(-faceSize, phi, faceSize);
51
+ vertices.push(-phi, -faceSize, -faceSize);
52
+ vertices.push(-phi, -faceSize, faceSize);
53
+ vertices.push(-phi, faceSize, faceSize);
54
+ vertices.push(-phi, faceSize, -faceSize);
55
+ vertices.push(phi, -faceSize, -faceSize);
56
+ vertices.push(phi, -faceSize, faceSize);
57
+ vertices.push(phi, faceSize, faceSize);
58
+ vertices.push(phi, faceSize, -faceSize);
59
+ let textureCoords = null;
60
+ if (model.generate3DTextureCoordinates) {
61
+ textureCoords = new Float64Array(24 * 3);
62
+ for (let i = 0; i < 24; i++) {
63
+ const vx = vertices[i * 3];
64
+ const vy = vertices[i * 3 + 1];
65
+ const vz = vertices[i * 3 + 2];
66
+ const len = Math.sqrt(vx * vx + vy * vy + vz * vz) || 1;
67
+ textureCoords[i * 3] = vx / len;
68
+ textureCoords[i * 3 + 1] = vy / len;
69
+ textureCoords[i * 3 + 2] = vz / len;
70
+ }
71
+ }
72
+ for (let i = 0; i < vertices.length; i++) {
73
+ vertices[i] *= scale;
74
+ }
75
+ const vertexArray = Float64Array.from(vertices);
76
+ polyData.getPoints().setData(vertexArray, 3);
77
+ const normals = new Float64Array(24 * 3);
78
+ for (let i = 0; i < 24; i++) {
79
+ const x = vertexArray[i * 3];
80
+ const y = vertexArray[i * 3 + 1];
81
+ const z = vertexArray[i * 3 + 2];
82
+ const len = Math.sqrt(x * x + y * y + z * z);
83
+ normals[i * 3] = x / len;
84
+ normals[i * 3 + 1] = y / len;
85
+ normals[i * 3 + 2] = z / len;
86
+ }
87
+ const normalArray = vtkDataArray.newInstance({
88
+ name: 'Normals',
89
+ values: normals,
90
+ numberOfComponents: 3,
91
+ });
92
+ polyData.getPointData().setNormals(normalArray);
93
+ if (textureCoords) {
94
+ const tcoords = vtkDataArray.newInstance({
95
+ name: 'TextureCoordinates',
96
+ values: textureCoords,
97
+ numberOfComponents: 3,
98
+ });
99
+ polyData.getPointData().setTCoords(tcoords);
100
+ }
101
+ const allFaces = [];
102
+ if (model.generateMainFaces) {
103
+ allFaces.push(...MAIN_FACES);
104
+ }
105
+ if (model.generateEdgeFaces) {
106
+ allFaces.push(...EDGE_FACES);
107
+ }
108
+ if (model.generateCornerFaces) {
109
+ allFaces.push(...CORNER_FACES);
110
+ }
111
+ if (allFaces.length > 0) {
112
+ const polys = vtkCellArray.newInstance({
113
+ values: Uint16Array.from(allFaces),
114
+ });
115
+ polyData.getPolys().deepCopy(polys);
116
+ }
117
+ else {
118
+ polyData.getPolys().initialize();
119
+ }
120
+ polyData.modified();
121
+ };
122
+ }
123
+ const DEFAULT_VALUES = {
124
+ scale: 1.0,
125
+ generate3DTextureCoordinates: false,
126
+ generateMainFaces: true,
127
+ generateEdgeFaces: true,
128
+ generateCornerFaces: true,
129
+ };
130
+ export function extend(publicAPI, model, initialValues = {}) {
131
+ Object.assign(model, DEFAULT_VALUES, initialValues);
132
+ macro.obj(publicAPI, model);
133
+ macro.setGet(publicAPI, model, [
134
+ 'scale',
135
+ 'generate3DTextureCoordinates',
136
+ 'generateMainFaces',
137
+ 'generateEdgeFaces',
138
+ 'generateCornerFaces',
139
+ ]);
140
+ macro.algo(publicAPI, model, 0, 1);
141
+ vtkRhombicuboctahedronSource(publicAPI, model);
142
+ }
143
+ export const newInstance = macro.newInstance(extend, 'vtkRhombicuboctahedronSource');
144
+ export default { newInstance, extend };
@@ -0,0 +1,3 @@
1
+ import vtkRhombicuboctahedronSource from './RhombicuboctahedronSource';
2
+ import vtkAnnotatedRhombicuboctahedronActor from './AnnotatedRhombicuboctahedronActor';
3
+ export { vtkRhombicuboctahedronSource, vtkAnnotatedRhombicuboctahedronActor };
@@ -0,0 +1,3 @@
1
+ import vtkRhombicuboctahedronSource from './RhombicuboctahedronSource';
2
+ import vtkAnnotatedRhombicuboctahedronActor from './AnnotatedRhombicuboctahedronActor';
3
+ export { vtkRhombicuboctahedronSource, vtkAnnotatedRhombicuboctahedronActor };
@@ -1 +1 @@
1
- export declare const version = "4.18.4";
1
+ export declare const version = "4.18.5";
@@ -1 +1 @@
1
- export const version = '4.18.4';
1
+ export const version = '4.18.5';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/tools",
3
- "version": "4.18.4",
3
+ "version": "4.18.5",
4
4
  "description": "Cornerstone3D Tools",
5
5
  "types": "./dist/esm/index.d.ts",
6
6
  "module": "./dist/esm/index.js",
@@ -108,7 +108,7 @@
108
108
  "canvas": "3.2.0"
109
109
  },
110
110
  "peerDependencies": {
111
- "@cornerstonejs/core": "4.18.4",
111
+ "@cornerstonejs/core": "4.18.5",
112
112
  "@kitware/vtk.js": "34.15.1",
113
113
  "@types/d3-array": "3.2.1",
114
114
  "@types/d3-interpolate": "3.0.4",
@@ -127,5 +127,5 @@
127
127
  "type": "individual",
128
128
  "url": "https://ohif.org/donate"
129
129
  },
130
- "gitHead": "372895aea2372079dd442ef54ea110fd3c1d1eef"
130
+ "gitHead": "02e80d90ade8a0e579e6d7c911ec55f7758e173d"
131
131
  }