@cornerstonejs/core 3.8.5 → 3.9.0

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 (33) hide show
  1. package/dist/esm/RenderingEngine/Viewport.js +5 -2
  2. package/dist/esm/cache/classes/Mesh.d.ts +17 -0
  3. package/dist/esm/cache/classes/Mesh.js +90 -0
  4. package/dist/esm/cache/index.d.ts +2 -1
  5. package/dist/esm/cache/index.js +2 -1
  6. package/dist/esm/enums/Events.d.ts +1 -0
  7. package/dist/esm/enums/Events.js +1 -0
  8. package/dist/esm/enums/GeometryType.d.ts +2 -1
  9. package/dist/esm/enums/GeometryType.js +1 -0
  10. package/dist/esm/enums/MeshType.d.ts +7 -0
  11. package/dist/esm/enums/MeshType.js +8 -0
  12. package/dist/esm/enums/index.d.ts +2 -1
  13. package/dist/esm/enums/index.js +2 -1
  14. package/dist/esm/index.d.ts +2 -1
  15. package/dist/esm/index.js +2 -1
  16. package/dist/esm/loaders/cornerstoneMeshLoader.d.ts +4 -0
  17. package/dist/esm/loaders/cornerstoneMeshLoader.js +75 -0
  18. package/dist/esm/loaders/geometryLoader.d.ts +6 -4
  19. package/dist/esm/loaders/geometryLoader.js +20 -2
  20. package/dist/esm/loaders/index.d.ts +2 -1
  21. package/dist/esm/loaders/index.js +2 -1
  22. package/dist/esm/loaders/utils/mesh/createMesh.d.ts +2 -0
  23. package/dist/esm/loaders/utils/mesh/createMesh.js +69 -0
  24. package/dist/esm/loaders/utils/mesh/validateMesh.d.ts +2 -0
  25. package/dist/esm/loaders/utils/mesh/validateMesh.js +12 -0
  26. package/dist/esm/types/GeometryLoaderFn.d.ts +4 -1
  27. package/dist/esm/types/IGeometry.d.ts +2 -1
  28. package/dist/esm/types/IMesh.d.ts +2 -0
  29. package/dist/esm/types/IMesh.js +0 -0
  30. package/dist/esm/types/MeshData.d.ts +11 -0
  31. package/dist/esm/types/MeshData.js +0 -0
  32. package/dist/esm/types/index.d.ts +3 -1
  33. package/package.json +2 -2
@@ -906,8 +906,11 @@ class Viewport {
906
906
  if (rotation >= 0) {
907
907
  this.setRotation(rotation);
908
908
  }
909
- if (flipHorizontal || flipVertical) {
910
- this.flip({ flipHorizontal, flipVertical });
909
+ if (flipHorizontal !== undefined) {
910
+ this.flip({ flipHorizontal });
911
+ }
912
+ if (flipVertical !== undefined) {
913
+ this.flip({ flipVertical });
911
914
  }
912
915
  }
913
916
  _getCorners(bounds) {
@@ -0,0 +1,17 @@
1
+ import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
2
+ import type { MeshData, RGB } from '../../types';
3
+ type MeshProps = MeshData;
4
+ export declare class Mesh {
5
+ readonly id: string;
6
+ readonly sizeInBytes: number;
7
+ private _color;
8
+ private _actors;
9
+ private _format;
10
+ constructor(props: MeshProps);
11
+ private _getSizeInBytes;
12
+ get defaultActor(): vtkActor;
13
+ get actors(): vtkActor[];
14
+ get color(): RGB;
15
+ get format(): string;
16
+ }
17
+ export {};
@@ -0,0 +1,90 @@
1
+ import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
2
+ import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
3
+ import vtkPLYReader from '@kitware/vtk.js/IO/Geometry/PLYReader';
4
+ import vtkSTLReader from '@kitware/vtk.js/IO/Geometry/STLReader';
5
+ import vtkXMLPolyDataReader from '@kitware/vtk.js/IO/XML/XMLPolyDataReader';
6
+ import vtkOBJReader from '@kitware/vtk.js/IO/Misc/OBJReader';
7
+ import vtkProperty from '@kitware/vtk.js/Rendering/Core/Property';
8
+ import vtkPolyDataNormals from '@kitware/vtk.js/Filters/Core/PolyDataNormals';
9
+ import { MeshType } from '../../enums';
10
+ export class Mesh {
11
+ constructor(props) {
12
+ this._color = [255, 255, 255];
13
+ this._actors = [];
14
+ this.id = props.id;
15
+ this._color = props.color ?? this._color;
16
+ this._format = props.format;
17
+ const textDecoder = new TextDecoder();
18
+ const normals = vtkPolyDataNormals.newInstance();
19
+ const createActorWithMapper = (mapper) => {
20
+ const actor = vtkActor.newInstance();
21
+ actor.setMapper(mapper);
22
+ const property = vtkProperty.newInstance();
23
+ property.setColor(this._color[0] / 255, this._color[1] / 255, this._color[2] / 255);
24
+ actor.setProperty(property);
25
+ return actor;
26
+ };
27
+ if (this._format === MeshType.PLY) {
28
+ const mapper = vtkMapper.newInstance();
29
+ const reader = vtkPLYReader.newInstance();
30
+ reader.parseAsArrayBuffer(props.arrayBuffer);
31
+ mapper.setInputConnection(reader.getOutputPort());
32
+ this._actors.push(createActorWithMapper(mapper));
33
+ }
34
+ else if (this._format === MeshType.STL) {
35
+ const mapper = vtkMapper.newInstance();
36
+ const reader = vtkSTLReader.newInstance();
37
+ reader.parseAsArrayBuffer(props.arrayBuffer);
38
+ normals.setInputConnection(reader.getOutputPort());
39
+ mapper.setInputConnection(normals.getOutputPort());
40
+ this._actors.push(createActorWithMapper(mapper));
41
+ }
42
+ else if (this._format === MeshType.OBJ) {
43
+ const reader = vtkOBJReader.newInstance({
44
+ splitMode: props.materialUrl ? 'usemtl' : null,
45
+ });
46
+ reader.parseAsText(textDecoder.decode(props.arrayBuffer));
47
+ const size = reader.getNumberOfOutputPorts();
48
+ for (let i = 0; i < size; i++) {
49
+ const source = reader.getOutputData(i);
50
+ const mapper = vtkMapper.newInstance();
51
+ mapper.setInputData(source);
52
+ this._actors.push(createActorWithMapper(mapper));
53
+ }
54
+ }
55
+ else if (this._format === MeshType.VTP) {
56
+ const mapper = vtkMapper.newInstance();
57
+ const reader = vtkXMLPolyDataReader.newInstance();
58
+ reader.parseAsArrayBuffer(props.arrayBuffer);
59
+ mapper.setInputConnection(reader.getOutputPort());
60
+ this._actors.push(createActorWithMapper(mapper));
61
+ }
62
+ this.sizeInBytes = this._getSizeInBytes();
63
+ }
64
+ _getSizeInBytes() {
65
+ let size = 0;
66
+ for (let i = 0; i < this._actors.length; i++) {
67
+ const actor = this._actors[i];
68
+ const mapper = actor.getMapper();
69
+ const pd = mapper.getInputData();
70
+ const points = pd.getPoints();
71
+ const polys = pd.getPolys();
72
+ const pointsLength = points.getData().length;
73
+ const polysLength = polys.getData().length;
74
+ size += pointsLength * 4 + polysLength * 4;
75
+ }
76
+ return size;
77
+ }
78
+ get defaultActor() {
79
+ return this._actors[0];
80
+ }
81
+ get actors() {
82
+ return this._actors;
83
+ }
84
+ get color() {
85
+ return this._color;
86
+ }
87
+ get format() {
88
+ return this._format;
89
+ }
90
+ }
@@ -1,6 +1,7 @@
1
1
  import { Cache } from './cache';
2
2
  import ImageVolume from './classes/ImageVolume';
3
3
  import { Surface } from './classes/Surface';
4
+ import { Mesh } from './classes/Mesh';
4
5
  import StreamingImageVolume from './classes/StreamingImageVolume';
5
6
  import StreamingDynamicImageVolume from './classes/StreamingDynamicImageVolume';
6
- export { ImageVolume, Cache, Surface, StreamingImageVolume, StreamingDynamicImageVolume, };
7
+ export { ImageVolume, Cache, Surface, Mesh, StreamingImageVolume, StreamingDynamicImageVolume, };
@@ -1,6 +1,7 @@
1
1
  import { Cache } from './cache';
2
2
  import ImageVolume from './classes/ImageVolume';
3
3
  import { Surface } from './classes/Surface';
4
+ import { Mesh } from './classes/Mesh';
4
5
  import StreamingImageVolume from './classes/StreamingImageVolume';
5
6
  import StreamingDynamicImageVolume from './classes/StreamingDynamicImageVolume';
6
- export { ImageVolume, Cache, Surface, StreamingImageVolume, StreamingDynamicImageVolume, };
7
+ export { ImageVolume, Cache, Surface, Mesh, StreamingImageVolume, StreamingDynamicImageVolume, };
@@ -41,6 +41,7 @@ declare enum Events {
41
41
  DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED = "DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED",
42
42
  DYNAMIC_VOLUME_TIME_POINT_LOADED = "DYNAMIC_VOLUME_TIME_POINT_LOADED",
43
43
  GEOMETRY_LOADED = "GEOMETRY_LOADED",
44
+ GEOMETRY_LOAD_PROGRESS = "GEOMETRY_LOAD_PROGRESS",
44
45
  GEOMETRY_LOADED_FAILED = "GEOMETRY_LOADED_FAILED"
45
46
  }
46
47
  export default Events;
@@ -42,6 +42,7 @@ var Events;
42
42
  Events["DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED"] = "DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED";
43
43
  Events["DYNAMIC_VOLUME_TIME_POINT_LOADED"] = "DYNAMIC_VOLUME_TIME_POINT_LOADED";
44
44
  Events["GEOMETRY_LOADED"] = "GEOMETRY_LOADED";
45
+ Events["GEOMETRY_LOAD_PROGRESS"] = "GEOMETRY_LOAD_PROGRESS";
45
46
  Events["GEOMETRY_LOADED_FAILED"] = "GEOMETRY_LOADED_FAILED";
46
47
  })(Events || (Events = {}));
47
48
  export default Events;
@@ -1,5 +1,6 @@
1
1
  declare enum GeometryType {
2
2
  CONTOUR = "CONTOUR",
3
- SURFACE = "SURFACE"
3
+ SURFACE = "SURFACE",
4
+ MESH = "MESH"
4
5
  }
5
6
  export default GeometryType;
@@ -2,5 +2,6 @@ var GeometryType;
2
2
  (function (GeometryType) {
3
3
  GeometryType["CONTOUR"] = "CONTOUR";
4
4
  GeometryType["SURFACE"] = "SURFACE";
5
+ GeometryType["MESH"] = "MESH";
5
6
  })(GeometryType || (GeometryType = {}));
6
7
  export default GeometryType;
@@ -0,0 +1,7 @@
1
+ declare enum MeshType {
2
+ PLY = "PLY",
3
+ STL = "STL",
4
+ OBJ = "OBJ",
5
+ VTP = "VTP"
6
+ }
7
+ export default MeshType;
@@ -0,0 +1,8 @@
1
+ var MeshType;
2
+ (function (MeshType) {
3
+ MeshType["PLY"] = "PLY";
4
+ MeshType["STL"] = "STL";
5
+ MeshType["OBJ"] = "OBJ";
6
+ MeshType["VTP"] = "VTP";
7
+ })(MeshType || (MeshType = {}));
8
+ export default MeshType;
@@ -6,6 +6,7 @@ import BlendModes from './BlendModes';
6
6
  import OrientationAxis from './OrientationAxis';
7
7
  import GeometryType from './GeometryType';
8
8
  import ContourType from './ContourType';
9
+ import MeshType from './MeshType';
9
10
  import VOILUTFunctionType from './VOILUTFunctionType';
10
11
  import DynamicOperatorType from './DynamicOperatorType';
11
12
  import CalibrationTypes from './CalibrationTypes';
@@ -15,4 +16,4 @@ import * as VideoEnums from './VideoEnums';
15
16
  import MetadataModules from './MetadataModules';
16
17
  import { GenerateImageType } from './GenerateImageType';
17
18
  import VoxelManagerEnum from './VoxelManagerEnum';
18
- export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, };
19
+ export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, MeshType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, };
@@ -6,6 +6,7 @@ import BlendModes from './BlendModes';
6
6
  import OrientationAxis from './OrientationAxis';
7
7
  import GeometryType from './GeometryType';
8
8
  import ContourType from './ContourType';
9
+ import MeshType from './MeshType';
9
10
  import VOILUTFunctionType from './VOILUTFunctionType';
10
11
  import DynamicOperatorType from './DynamicOperatorType';
11
12
  import CalibrationTypes from './CalibrationTypes';
@@ -15,4 +16,4 @@ import * as VideoEnums from './VideoEnums';
15
16
  import MetadataModules from './MetadataModules';
16
17
  import { GenerateImageType } from './GenerateImageType';
17
18
  import VoxelManagerEnum from './VoxelManagerEnum';
18
- export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, };
19
+ export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, MeshType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, };
@@ -33,6 +33,7 @@ import { registerImageLoader } from './loaders/imageLoader';
33
33
  import triggerEvent from './utilities/triggerEvent';
34
34
  import { cornerstoneStreamingImageVolumeLoader } from './loaders/cornerstoneStreamingImageVolumeLoader';
35
35
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerstoneStreamingDynamicImageVolumeLoader';
36
+ import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
36
37
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports } from './RenderingEngine/helpers';
37
38
  export type { Types, IRetrieveConfiguration, RetrieveOptions, RetrieveStage, ImageLoadListener, IImagesLoader, };
38
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, };
39
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, };
package/dist/esm/index.js CHANGED
@@ -31,5 +31,6 @@ import { registerImageLoader } from './loaders/imageLoader';
31
31
  import triggerEvent from './utilities/triggerEvent';
32
32
  import { cornerstoneStreamingImageVolumeLoader } from './loaders/cornerstoneStreamingImageVolumeLoader';
33
33
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerstoneStreamingDynamicImageVolumeLoader';
34
+ import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
34
35
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, } from './RenderingEngine/helpers';
35
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, };
36
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, };
@@ -0,0 +1,4 @@
1
+ import type { IGeometryLoadObject } from '../types';
2
+ import type { GeometryLoaderOptions } from '../types/GeometryLoaderFn';
3
+ declare function cornerstoneMeshLoader(meshId: string, options: Record<string, unknown>, loaderOptions: GeometryLoaderOptions): IGeometryLoadObject;
4
+ export { cornerstoneMeshLoader };
@@ -0,0 +1,75 @@
1
+ import { createMesh } from './utils/mesh/createMesh';
2
+ import { Events } from '../enums';
3
+ import eventTarget from '../eventTarget';
4
+ import { triggerEvent } from '../utilities';
5
+ function fetchArrayBuffer({ url, signal, onload, loaderOptions, }) {
6
+ return new Promise((resolve, reject) => {
7
+ const xhr = new XMLHttpRequest();
8
+ xhr.open('GET', url, true);
9
+ const defaultHeaders = {};
10
+ const beforeSendHeaders = loaderOptions.beforeSend(xhr, defaultHeaders);
11
+ const headers = Object.assign({}, defaultHeaders, beforeSendHeaders);
12
+ xhr.responseType = 'arraybuffer';
13
+ Object.keys(headers).forEach(function (key) {
14
+ if (headers[key] === null) {
15
+ return;
16
+ }
17
+ xhr.setRequestHeader(key, headers[key]);
18
+ });
19
+ const onLoadHandler = function (e) {
20
+ if (onload && typeof onload === 'function') {
21
+ onload();
22
+ }
23
+ if (signal) {
24
+ signal.removeEventListener('abort', onAbortHandler);
25
+ }
26
+ resolve(xhr.response);
27
+ };
28
+ const onAbortHandler = () => {
29
+ xhr.abort();
30
+ xhr.removeEventListener('load', onLoadHandler);
31
+ reject(new Error('Request aborted'));
32
+ };
33
+ xhr.addEventListener('load', onLoadHandler);
34
+ const onProgress = (loaded, total) => {
35
+ const data = { url, loaded, total };
36
+ triggerEvent(eventTarget, Events.GEOMETRY_LOAD_PROGRESS, { data });
37
+ };
38
+ xhr.onprogress = function (e) {
39
+ onProgress(e.loaded, e.total);
40
+ };
41
+ if (signal && signal.aborted) {
42
+ xhr.abort();
43
+ reject(new Error('Request aborted'));
44
+ }
45
+ else if (signal) {
46
+ signal.addEventListener('abort', onAbortHandler);
47
+ }
48
+ xhr.send();
49
+ });
50
+ }
51
+ function cornerstoneMeshLoader(meshId, options, loaderOptions) {
52
+ const promise = new Promise((resolve, reject) => {
53
+ fetchAndProcessMeshData(meshId, options, loaderOptions)
54
+ .then(resolve)
55
+ .catch(reject);
56
+ });
57
+ return {
58
+ promise: promise,
59
+ cancelFn: undefined,
60
+ decache: () => { },
61
+ };
62
+ }
63
+ async function fetchAndProcessMeshData(meshId, options, loaderOptions) {
64
+ const parts = meshId.split(':');
65
+ const url = parts.slice(1).join(':');
66
+ const meshBuffer = await fetchArrayBuffer({ url, loaderOptions });
67
+ if (!options || !('geometryData' in options)) {
68
+ throw new Error('Mesh must have a geometryData');
69
+ }
70
+ return createMesh(url, {
71
+ ...options.geometryData,
72
+ arrayBuffer: meshBuffer,
73
+ });
74
+ }
75
+ export { cornerstoneMeshLoader };
@@ -1,9 +1,12 @@
1
1
  import '@kitware/vtk.js/Rendering/Profiles/Geometry';
2
2
  import { GeometryType } from '../enums';
3
- import type { IGeometry, PublicContourSetData, PublicSurfaceData, GeometryLoaderFn } from '../types';
4
- interface GeometryOptions {
3
+ import type { IGeometry, PublicContourSetData, PublicSurfaceData, PublicMeshData, GeometryLoaderFn } from '../types';
4
+ import type { GeometryLoaderOptions } from '../types/GeometryLoaderFn';
5
+ export declare function setOptions(newOptions: GeometryLoaderOptions): void;
6
+ export declare function getOptions(): GeometryLoaderOptions;
7
+ export interface GeometryOptions {
5
8
  type: GeometryType;
6
- geometryData: PublicContourSetData | PublicSurfaceData;
9
+ geometryData: PublicContourSetData | PublicSurfaceData | PublicMeshData;
7
10
  sizeInBytes?: number;
8
11
  segmentIndex?: number;
9
12
  }
@@ -12,4 +15,3 @@ export declare function loadAndCacheGeometry(geometryId: string, options?: Geome
12
15
  export declare function createAndCacheGeometry(geometryId: string, options: GeometryOptions): IGeometry;
13
16
  export declare function registerGeometryLoader(scheme: string, geometryLoader: GeometryLoaderFn): void;
14
17
  export declare function registerUnknownGeometryLoader(geometryLoader: GeometryLoaderFn): GeometryLoaderFn | undefined;
15
- export {};
@@ -3,9 +3,21 @@ import cache from '../cache/cache';
3
3
  import { GeometryType } from '../enums';
4
4
  import { createContourSet } from './utils/contourSet/createContourSet';
5
5
  import { createSurface } from './utils/surface/createSurface';
6
+ import { createMesh } from './utils/mesh/createMesh';
6
7
  import Events from '../enums/Events';
7
8
  import eventTarget from '../eventTarget';
8
9
  import triggerEvent from '../utilities/triggerEvent';
10
+ import { cornerstoneMeshLoader } from './cornerstoneMeshLoader';
11
+ let loaderOptions = {
12
+ beforeSend(xhr) {
13
+ },
14
+ };
15
+ export function setOptions(newOptions) {
16
+ loaderOptions = Object.assign(loaderOptions, newOptions);
17
+ }
18
+ export function getOptions() {
19
+ return loaderOptions;
20
+ }
9
21
  const geometryLoaders = {};
10
22
  let unknownGeometryLoader;
11
23
  function loadGeometryFromGeometryLoader(geometryId, options) {
@@ -19,7 +31,7 @@ function loadGeometryFromGeometryLoader(geometryId, options) {
19
31
  }
20
32
  loader = unknownGeometryLoader;
21
33
  }
22
- const geometryLoadObject = loader(geometryId, options);
34
+ const geometryLoadObject = loader(geometryId, options, loaderOptions);
23
35
  geometryLoadObject.promise.then(function (geometry) {
24
36
  triggerEvent(eventTarget, Events.GEOMETRY_LOADED, { geometry });
25
37
  }, function (error) {
@@ -68,8 +80,13 @@ export function createAndCacheGeometry(geometryId, options) {
68
80
  else if (options.type === GeometryType.SURFACE) {
69
81
  geometry = createSurface(geometryId, options.geometryData);
70
82
  }
83
+ else if (options.type === GeometryType.MESH) {
84
+ createMesh(geometryId, options.geometryData).then((mesh) => {
85
+ geometry = mesh;
86
+ });
87
+ }
71
88
  else {
72
- throw new Error('Unknown geometry type');
89
+ throw new Error(`Unknown geometry type: ${options.type}`);
73
90
  }
74
91
  cache.putGeometrySync(geometryId, geometry);
75
92
  return geometry;
@@ -82,3 +99,4 @@ export function registerUnknownGeometryLoader(geometryLoader) {
82
99
  unknownGeometryLoader = geometryLoader;
83
100
  return oldGeometryLoader;
84
101
  }
102
+ registerGeometryLoader('mesh', cornerstoneMeshLoader);
@@ -1,6 +1,7 @@
1
1
  import { cornerstoneStreamingImageVolumeLoader } from './cornerstoneStreamingImageVolumeLoader';
2
2
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './cornerstoneStreamingDynamicImageVolumeLoader';
3
+ import { cornerstoneMeshLoader } from './cornerstoneMeshLoader';
3
4
  import * as geometryLoader from './geometryLoader';
4
5
  import * as imageLoader from './imageLoader';
5
6
  import * as volumeLoader from './volumeLoader';
6
- export { cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, geometryLoader, imageLoader, volumeLoader, };
7
+ export { cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, cornerstoneMeshLoader, geometryLoader, imageLoader, volumeLoader, };
@@ -1,6 +1,7 @@
1
1
  import { cornerstoneStreamingImageVolumeLoader } from './cornerstoneStreamingImageVolumeLoader';
2
2
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './cornerstoneStreamingDynamicImageVolumeLoader';
3
+ import { cornerstoneMeshLoader } from './cornerstoneMeshLoader';
3
4
  import * as geometryLoader from './geometryLoader';
4
5
  import * as imageLoader from './imageLoader';
5
6
  import * as volumeLoader from './volumeLoader';
6
- export { cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, geometryLoader, imageLoader, volumeLoader, };
7
+ export { cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, cornerstoneMeshLoader, geometryLoader, imageLoader, volumeLoader, };
@@ -0,0 +1,2 @@
1
+ import type { IGeometry, PublicMeshData } from '../../../types';
2
+ export declare function createMesh(geometryId: string, meshData: PublicMeshData): Promise<IGeometry>;
@@ -0,0 +1,69 @@
1
+ import { GeometryType, MeshType } from '../../../enums';
2
+ import { Mesh } from '../../../cache/classes/Mesh';
3
+ import { validateMesh } from './validateMesh';
4
+ import vtkMTLReader from '@kitware/vtk.js/IO/Misc/MTLReader';
5
+ import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
6
+ export function createMesh(geometryId, meshData) {
7
+ validateMesh(meshData);
8
+ const mesh = new Mesh({
9
+ ...meshData,
10
+ });
11
+ const geometry = {
12
+ id: geometryId,
13
+ type: GeometryType.MESH,
14
+ data: mesh,
15
+ sizeInBytes: mesh.sizeInBytes,
16
+ };
17
+ switch (meshData.format) {
18
+ case MeshType.PLY:
19
+ if (meshData.materialUrl) {
20
+ const img = new Image();
21
+ return new Promise((resolve, reject) => {
22
+ img.onload = () => {
23
+ try {
24
+ const texture = vtkTexture.newInstance();
25
+ texture.setInterpolate(true);
26
+ texture.setImage(img);
27
+ mesh.defaultActor.addTexture(texture);
28
+ resolve(geometry);
29
+ }
30
+ catch (error) {
31
+ reject(error);
32
+ }
33
+ };
34
+ img.onerror = (error) => reject(error);
35
+ img.src = meshData.materialUrl;
36
+ });
37
+ }
38
+ return Promise.resolve(geometry);
39
+ case MeshType.OBJ:
40
+ if (meshData.materialUrl) {
41
+ const reader = vtkMTLReader.newInstance();
42
+ return reader
43
+ .setUrl(meshData.materialUrl)
44
+ .then(() => {
45
+ for (let i = 0; i < mesh.actors.length; i++) {
46
+ const actor = mesh.actors[i];
47
+ const mapper = actor.getMapper();
48
+ if (mapper) {
49
+ const inputData = mapper.getInputData();
50
+ if (inputData) {
51
+ const name = inputData.get('name').name;
52
+ reader.applyMaterialToActor(name, actor);
53
+ }
54
+ }
55
+ }
56
+ return geometry;
57
+ })
58
+ .catch((error) => {
59
+ throw new Error(`Failed to load material: ${error}`);
60
+ });
61
+ }
62
+ return Promise.resolve(geometry);
63
+ case MeshType.STL:
64
+ case MeshType.VTP:
65
+ return Promise.resolve(geometry);
66
+ default:
67
+ return Promise.reject(new Error(`Unsupported format: ${meshData.format}`));
68
+ }
69
+ }
@@ -0,0 +1,2 @@
1
+ import type { PublicMeshData } from '../../../types';
2
+ export declare function validateMesh(meshData: PublicMeshData): void;
@@ -0,0 +1,12 @@
1
+ import { MeshType } from '../../../enums';
2
+ export function validateMesh(meshData) {
3
+ if (!meshData.id) {
4
+ throw new Error('Mesh must have an id');
5
+ }
6
+ if (!meshData.arrayBuffer) {
7
+ throw new Error('Mesh must have an arrayBuffer');
8
+ }
9
+ if (!(meshData.format in MeshType)) {
10
+ throw new Error(`Mesh format must be one of the following: ${Object.values(MeshType).join(', ')}`);
11
+ }
12
+ }
@@ -1,7 +1,10 @@
1
1
  import type IGeometry from './IGeometry';
2
- type GeometryLoaderFn = (geometryId: string, options?: Record<string, unknown>) => {
2
+ type GeometryLoaderFn = (geometryId: string, options?: Record<string, unknown>, loaderOptions?: GeometryLoaderOptions) => {
3
3
  promise: Promise<IGeometry>;
4
4
  cancelFn?: () => void | undefined;
5
5
  decache?: () => void | undefined;
6
6
  };
7
+ export interface GeometryLoaderOptions {
8
+ beforeSend?: (xhr: XMLHttpRequest, defaultHeaders: Record<string, string>) => Record<string, string> | void;
9
+ }
7
10
  export type { GeometryLoaderFn as default };
@@ -1,10 +1,11 @@
1
1
  import type { GeometryType } from '../enums';
2
2
  import type { IContourSet } from './IContourSet';
3
+ import type { IMesh } from './IMesh';
3
4
  import type { ISurface } from './ISurface';
4
5
  interface IGeometry {
5
6
  id: string;
6
7
  type: GeometryType;
7
- data: IContourSet | ISurface;
8
+ data: IContourSet | ISurface | IMesh;
8
9
  sizeInBytes: number;
9
10
  }
10
11
  export type { IGeometry as default };
@@ -0,0 +1,2 @@
1
+ import type { Mesh } from '../cache/classes/Mesh';
2
+ export type IMesh = Mesh;
File without changes
@@ -0,0 +1,11 @@
1
+ import type { MeshType } from '../enums';
2
+ import type Point3 from './Point3';
3
+ type PublicMeshData = MeshData;
4
+ interface MeshData {
5
+ id: string;
6
+ format: MeshType;
7
+ arrayBuffer?: ArrayBuffer;
8
+ color?: Point3;
9
+ materialUrl?: string;
10
+ }
11
+ export type { PublicMeshData, MeshData };
File without changes
@@ -64,9 +64,11 @@ import type ImageSliceData from './ImageSliceData';
64
64
  import type IGeometry from './IGeometry';
65
65
  import type { PublicContourSetData, ContourSetData, ContourData } from './ContourData';
66
66
  import type { PublicSurfaceData, SurfaceData } from './SurfaceData';
67
+ import type { PublicMeshData, MeshData } from './MeshData';
67
68
  import type ICachedGeometry from './ICachedGeometry';
68
69
  import type { IContourSet } from './IContourSet';
69
70
  import type { IContour } from './IContour';
71
+ import type { IMesh } from './IMesh';
70
72
  import type RGB from './RGB';
71
73
  import type { Memo, HistoryMemo } from '../utilities/historyMemo';
72
74
  import type { VoxelManager } from '../utilities/VoxelManager';
@@ -99,4 +101,4 @@ import type { IBaseVolumeViewport } from './IBaseVolumeViewport';
99
101
  import type ScrollOptions from './ScrollOptions';
100
102
  import type JumpToSliceOptions from './JumpToSliceOptions';
101
103
  import type GeometryLoaderFn from './GeometryLoaderFn';
102
- export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, };
104
+ export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "3.8.5",
3
+ "version": "3.9.0",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -91,5 +91,5 @@
91
91
  "type": "individual",
92
92
  "url": "https://ohif.org/donate"
93
93
  },
94
- "gitHead": "782551a1523d3619fa002b9b5bb2991519fb5f40"
94
+ "gitHead": "e44475d4c419201d7042d4648c0335d1b2eebe41"
95
95
  }