@cornerstonejs/core 3.8.6 → 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.
- package/dist/esm/cache/classes/Mesh.d.ts +17 -0
- package/dist/esm/cache/classes/Mesh.js +90 -0
- package/dist/esm/cache/index.d.ts +2 -1
- package/dist/esm/cache/index.js +2 -1
- package/dist/esm/enums/Events.d.ts +1 -0
- package/dist/esm/enums/Events.js +1 -0
- package/dist/esm/enums/GeometryType.d.ts +2 -1
- package/dist/esm/enums/GeometryType.js +1 -0
- package/dist/esm/enums/MeshType.d.ts +7 -0
- package/dist/esm/enums/MeshType.js +8 -0
- package/dist/esm/enums/index.d.ts +2 -1
- package/dist/esm/enums/index.js +2 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/loaders/cornerstoneMeshLoader.d.ts +4 -0
- package/dist/esm/loaders/cornerstoneMeshLoader.js +75 -0
- package/dist/esm/loaders/geometryLoader.d.ts +6 -4
- package/dist/esm/loaders/geometryLoader.js +20 -2
- package/dist/esm/loaders/index.d.ts +2 -1
- package/dist/esm/loaders/index.js +2 -1
- package/dist/esm/loaders/utils/mesh/createMesh.d.ts +2 -0
- package/dist/esm/loaders/utils/mesh/createMesh.js +69 -0
- package/dist/esm/loaders/utils/mesh/validateMesh.d.ts +2 -0
- package/dist/esm/loaders/utils/mesh/validateMesh.js +12 -0
- package/dist/esm/types/GeometryLoaderFn.d.ts +4 -1
- package/dist/esm/types/IGeometry.d.ts +2 -1
- package/dist/esm/types/IMesh.d.ts +2 -0
- package/dist/esm/types/IMesh.js +0 -0
- package/dist/esm/types/MeshData.d.ts +11 -0
- package/dist/esm/types/MeshData.js +0 -0
- package/dist/esm/types/index.d.ts +3 -1
- package/package.json +2 -2
|
@@ -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, };
|
package/dist/esm/cache/index.js
CHANGED
|
@@ -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;
|
package/dist/esm/enums/Events.js
CHANGED
|
@@ -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;
|
|
@@ -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, };
|
package/dist/esm/enums/index.js
CHANGED
|
@@ -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, };
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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,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,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 };
|
|
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.
|
|
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": "
|
|
94
|
+
"gitHead": "e44475d4c419201d7042d4648c0335d1b2eebe41"
|
|
95
95
|
}
|