From f5ff886cbc7fce190f943880c180533f3af97065 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:15:38 -0500 Subject: [PATCH 01/48] fix(rendering): fix image overflow issues by restoring data type check (#1829) --- packages/core/src/RenderingEngine/StackViewport.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 9822568fa..ab03d4ce5 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -1940,6 +1940,8 @@ class StackViewport extends Viewport { imagePlaneModule.columnCosines, columnCosines as Point3 ); + const isDataTypeMatching = + dataType === image.voxelManager.getScalarData().constructor.name; const result = isXSpacingValid && @@ -1947,7 +1949,8 @@ class StackViewport extends Viewport { isXVoxelsMatching && isYVoxelsMatching && isRowCosinesMatching && - isColumnCosinesMatching; + isColumnCosinesMatching && + isDataTypeMatching; return result; } @@ -2540,7 +2543,7 @@ class StackViewport extends Viewport { private _getInitialVOIRange(image: IImage) { if (this.voiRange && this.voiUpdatedWithSetProperties) { - return this.globalDefaultProperties.voiRange; + return this.voiRange; } const { windowCenter, windowWidth, voiLUTFunction } = image; From dd7e5f822ce988dc7ce08f35713b88f3c27cde2c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:20:01 +0000 Subject: [PATCH 02/48] chore(version): version.json [skip ci] --- bun.lock | 56 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +- packages/ai/package.json | 4 +- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +- version.txt | 2 +- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/bun.lock b/bun.lock index e1fddb74b..3ccdd9a60 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,5 @@ { - "lockfileVersion": 0, + "lockfileVersion": 1, "workspaces": { "": { "name": "root", @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "packages/core", - "@cornerstonejs/tools": "packages/tools", + "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/tools": "^2.19.7", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -165,13 +165,13 @@ "onnxruntime-web": "1.17.1", }, "peerDependencies": { - "@cornerstonejs/core": "packages/core", - "@cornerstonejs/tools": "packages/tools", + "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/tools": "^2.19.7", }, }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "packages/core", + "@cornerstonejs/core": "^2.19.7", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "packages/adapters", - "@cornerstonejs/core": "packages/core", - "@cornerstonejs/dicom-image-loader": "packages/dicomImageLoader", - "@cornerstonejs/nifti-volume-loader": "packages/nifti-volume-loader", - "@cornerstonejs/tools": "packages/tools", + "@cornerstonejs/adapters": "^2.19.7", + "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/dicom-image-loader": "^2.19.7", + "@cornerstonejs/nifti-volume-loader": "^2.19.7", + "@cornerstonejs/tools": "^2.19.7", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "packages/core", + "@cornerstonejs/core": "^2.19.7", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.6", + "version": "2.19.7", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "packages/core", + "@cornerstonejs/core": "^2.19.7", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", @@ -583,9 +583,9 @@ "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@workspace:packages/adapters", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "packages/core", "@cornerstonejs/tools": "packages/tools" } }], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@workspace:packages/adapters"], - "@cornerstonejs/ai": ["@cornerstonejs/ai@workspace:packages/ai", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "packages/core", "@cornerstonejs/tools": "packages/tools" } }], + "@cornerstonejs/ai": ["@cornerstonejs/ai@workspace:packages/ai"], "@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.0.3", "", {}, "sha512-2SwVJKzC1DzyxdxJtCht9dhTND2GFjLwhhkDyyC7vJq5tIgbhxgPk1CSwovO1pxmoybAXzjOxnaubllxLgoT+w=="], @@ -597,13 +597,13 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@workspace:packages/core", { "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", "gl-matrix": "^3.4.3" } }], + "@cornerstonejs/core": ["@cornerstonejs/core@workspace:packages/core"], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@workspace:packages/dicomImageLoader", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "packages/core", "dicom-parser": "^1.8.9" } }], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@workspace:packages/dicomImageLoader"], - "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@workspace:packages/nifti-volume-loader", { "dependencies": { "nifti-reader-js": "^0.6.8" }, "peerDependencies": { "@cornerstonejs/core": "packages/core" } }], + "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@workspace:packages/nifti-volume-loader"], - "@cornerstonejs/tools": ["@cornerstonejs/tools@workspace:packages/tools", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "devDependencies": { "canvas": "^2.11.2" }, "peerDependencies": { "@cornerstonejs/core": "packages/core", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }], + "@cornerstonejs/tools": ["@cornerstonejs/tools@workspace:packages/tools"], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -811,9 +811,9 @@ "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - "@externals/dicom-microscopy-viewer": ["@externals/dicom-microscopy-viewer@workspace:addOns/externals/dicom-microscopy-viewer", { "dependencies": { "dicom-microscopy-viewer": "^0.46.1" } }], + "@externals/dicom-microscopy-viewer": ["@externals/dicom-microscopy-viewer@workspace:addOns/externals/dicom-microscopy-viewer"], - "@externals/polyseg-wasm": ["@externals/polyseg-wasm@workspace:addOns/externals/polyseg-wasm", { "dependencies": { "@icr/polyseg-wasm": "^0.4.0", "@itk-wasm/morphological-contour-interpolation": "1.0.1" } }], + "@externals/polyseg-wasm": ["@externals/polyseg-wasm@workspace:addOns/externals/polyseg-wasm"], "@fastify/accept-negotiator": ["@fastify/accept-negotiator@1.1.0", "", {}, "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ=="], @@ -2397,7 +2397,7 @@ "docdash": ["docdash@1.2.0", "", {}, "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw=="], - "docs": ["docs@workspace:packages/docs", { "dependencies": { "@cornerstonejs/adapters": "packages/adapters", "@cornerstonejs/core": "packages/core", "@cornerstonejs/dicom-image-loader": "packages/dicomImageLoader", "@cornerstonejs/nifti-volume-loader": "packages/nifti-volume-loader", "@cornerstonejs/tools": "packages/tools", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", "@docusaurus/plugin-google-gtag": "3.6.3", "@docusaurus/preset-classic": "3.6.3", "@kitware/vtk.js": "32.9.0", "@mdx-js/react": "^3.0.1", "@svgr/webpack": "^8.1.0", "clsx": "^1.1.1", "dcmjs": "^0.33.0", "dicom-parser": "^1.8.21", "dicomweb-client": "0.10.4", "docusaurus-plugin-copy": "0.1.1", "docusaurus-plugin-typedoc": "1.0.5", "file-loader": "^6.2.0", "gl-matrix": "^3.4.3", "hammerjs": "^2.0.8", "prism-react-renderer": "2.4.0", "react": "18.3.1", "react-dom": "18.3.1", "react-resize-detector": "11.0.1", "react-router-dom": "6.23.1", "typedoc-plugin-markdown": "4.2.9", "url-loader": "^4.1.1" }, "devDependencies": { "copyfiles": "2.4.1", "esbuild-loader": "^2.18.0", "karma-chrome-launcher": "^3.1.0", "netlify-plugin-cache": "^1.0.3", "puppeteer": "^13.1.3", "shader-loader": "^1.3.1", "typedoc": "0.26.10" } }], + "docs": ["docs@workspace:packages/docs"], "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], diff --git a/commit.txt b/commit.txt index 1c9cdfa4c..9346f96a0 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -f43a1766ba16aec1fc6bd638543f406735281220 \ No newline at end of file +f5ff886cbc7fce190f943880c180533f3af97065 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4c8a09d0d..8cb73f6bb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7" + "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/tools": "^2.19.8" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 1830a63c2..7ef7e9e8d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7" + "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/tools": "^2.19.8" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index a50003e0c..28c438848 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2dae79b34..c036bda19 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.7", - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/dicom-image-loader": "^2.19.7", - "@cornerstonejs/nifti-volume-loader": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7", + "@cornerstonejs/adapters": "^2.19.8", + "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/dicom-image-loader": "^2.19.8", + "@cornerstonejs/nifti-volume-loader": "^2.19.8", + "@cornerstonejs/tools": "^2.19.8", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fa29db34c..63d276b70 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7" + "@cornerstonejs/core": "^2.19.8" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 9d324337f..83ba25e23 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index d469d1220..a995314cc 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.7", - "commit": "f43a1766ba16aec1fc6bd638543f406735281220" + "version": "2.19.8", + "commit": "f5ff886cbc7fce190f943880c180533f3af97065" } \ No newline at end of file diff --git a/version.txt b/version.txt index be75f3426..e946730a6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.7 \ No newline at end of file +2.19.8 \ No newline at end of file From 81d2c1c6483fa461722a8525eea1558d5e11b4ed Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:20:21 +0000 Subject: [PATCH 03/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 985fdf2d5..f33d802cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) + +### Bug Fixes + +- **rendering:** fix image overflow issues by restoring data type check ([#1829](https://github.com/cornerstonejs/cornerstone3D/issues/1829)) ([f5ff886](https://github.com/cornerstonejs/cornerstone3D/commit/f5ff886cbc7fce190f943880c180533f3af97065)) + ## [2.19.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.6...v2.19.7) (2025-02-06) ### Bug Fixes diff --git a/lerna.json b/lerna.json index a5ed1c091..93ffde3f8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.7", + "version": "2.19.8", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index d377e2ca1..e93d7a083 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/dcmjs-org/dcmjs/compare/v2.19.7...v2.19.8) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.7](https://github.com/dcmjs-org/dcmjs/compare/v2.19.6...v2.19.7) (2025-02-06) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8cb73f6bb..cf3fcbf35 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.7", + "version": "2.19.8", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index fe798e3dc..bd4968b3a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/dcmjs-org/dcmjs/compare/v2.19.7...v2.19.8) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.7](https://github.com/dcmjs-org/dcmjs/compare/v2.19.6...v2.19.7) (2025-02-06) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 7ef7e9e8d..55897cc6d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.7", + "version": "2.19.8", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index efa6301e5..6f681adf3 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) + +### Bug Fixes + +- **rendering:** fix image overflow issues by restoring data type check ([#1829](https://github.com/cornerstonejs/cornerstone3D/issues/1829)) ([f5ff886](https://github.com/cornerstonejs/cornerstone3D/commit/f5ff886cbc7fce190f943880c180533f3af97065)) + ## [2.19.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.6...v2.19.7) (2025-02-06) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index b81317160..6156e8cc3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.7", + "version": "2.19.8", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index d7b317034..bd51e6ffb 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.6...v2.19.7) (2025-02-06) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 28c438848..8c9688c73 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.7", + "version": "2.19.8", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 5b9134b8c..8099775aa 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.6...v2.19.7) (2025-02-06) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 63d276b70..9403a2d71 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.7", + "version": "2.19.8", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index be03acb53..3330088e3 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [2.19.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.6...v2.19.7) (2025-02-06) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 83ba25e23..632802b21 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.7", + "version": "2.19.8", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From f9d5b79c75a4125bbf4e646752ad2071ddc76c41 Mon Sep 17 00:00:00 2001 From: Dev Kumar Singh <114645831+devkumarsingh-qure@users.noreply.github.com> Date: Tue, 18 Feb 2025 20:09:27 +0530 Subject: [PATCH 04/48] fix: incorrect check for validating pixel data array type (#1830) --- packages/dicomImageLoader/src/decodeImageFrameWorker.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/dicomImageLoader/src/decodeImageFrameWorker.js b/packages/dicomImageLoader/src/decodeImageFrameWorker.js index 708a8a491..99a6add36 100644 --- a/packages/dicomImageLoader/src/decodeImageFrameWorker.js +++ b/packages/dicomImageLoader/src/decodeImageFrameWorker.js @@ -89,7 +89,11 @@ function postProcessDecodedPixels(imageFrame, options, start, decodeConfig) { options.preScale.scalingParameters; const minAfterScale = rescaleSlope * minBeforeScale + rescaleIntercept; const maxAfterScale = rescaleSlope * maxBeforeScale + rescaleIntercept; - invalidType = !validatePixelDataType(minAfterScale, maxAfterScale, type); + invalidType = !validatePixelDataType( + minAfterScale, + maxAfterScale, + typedArrayConstructors[type] + ); } if (type && !invalidType) { From fad7f1e5fb1c00964c3f3d6e8ee4718c7ce8ffd4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:44:02 +0000 Subject: [PATCH 05/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index 3ccdd9a60..b61597bc0 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/tools": "^2.19.8", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.7", - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/dicom-image-loader": "^2.19.7", - "@cornerstonejs/nifti-volume-loader": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7", + "@cornerstonejs/adapters": "^2.19.8", + "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/dicom-image-loader": "^2.19.8", + "@cornerstonejs/nifti-volume-loader": "^2.19.8", + "@cornerstonejs/tools": "^2.19.8", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.7", + "version": "2.19.8", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", + "@cornerstonejs/core": "^2.19.8", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 9346f96a0..808334426 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -f5ff886cbc7fce190f943880c180533f3af97065 \ No newline at end of file +f9d5b79c75a4125bbf4e646752ad2071ddc76c41 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index cf3fcbf35..97a325b5d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", - "@cornerstonejs/tools": "^2.19.8" + "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/tools": "^2.19.9" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 55897cc6d..31d76246e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", - "@cornerstonejs/tools": "^2.19.8" + "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/tools": "^2.19.9" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8c9688c73..464e12120 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index c036bda19..6b98c21f9 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.8", - "@cornerstonejs/core": "^2.19.8", - "@cornerstonejs/dicom-image-loader": "^2.19.8", - "@cornerstonejs/nifti-volume-loader": "^2.19.8", - "@cornerstonejs/tools": "^2.19.8", + "@cornerstonejs/adapters": "^2.19.9", + "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/dicom-image-loader": "^2.19.9", + "@cornerstonejs/nifti-volume-loader": "^2.19.9", + "@cornerstonejs/tools": "^2.19.9", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 9403a2d71..d71ecc990 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8" + "@cornerstonejs/core": "^2.19.9" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 632802b21..41e0f5880 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a995314cc..9e75f36ae 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.8", - "commit": "f5ff886cbc7fce190f943880c180533f3af97065" + "version": "2.19.9", + "commit": "f9d5b79c75a4125bbf4e646752ad2071ddc76c41" } \ No newline at end of file diff --git a/version.txt b/version.txt index e946730a6..6d877d1d0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.8 \ No newline at end of file +2.19.9 \ No newline at end of file From 77087d1036c50d90d878980d25f563a00dd77718 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:44:20 +0000 Subject: [PATCH 06/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 6 ++++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f33d802cb..870625559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) + +### Bug Fixes + +- incorrect check for validating pixel data array type ([#1830](https://github.com/cornerstonejs/cornerstone3D/issues/1830)) ([f9d5b79](https://github.com/cornerstonejs/cornerstone3D/commit/f9d5b79c75a4125bbf4e646752ad2071ddc76c41)) + ## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 93ffde3f8..690155031 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.8", + "version": "2.19.9", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e93d7a083..ce89c0d22 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/dcmjs-org/dcmjs/compare/v2.19.8...v2.19.9) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.8](https://github.com/dcmjs-org/dcmjs/compare/v2.19.7...v2.19.8) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 97a325b5d..cb37408b2 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.8", + "version": "2.19.9", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index bd4968b3a..7ea748a98 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/dcmjs-org/dcmjs/compare/v2.19.8...v2.19.9) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.8](https://github.com/dcmjs-org/dcmjs/compare/v2.19.7...v2.19.8) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 31d76246e..15a215da7 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.8", + "version": "2.19.9", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6f681adf3..6421b0f42 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 6156e8cc3..bde2fac60 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.8", + "version": "2.19.9", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index bd51e6ffb..9e3d3888b 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) + +### Bug Fixes + +- incorrect check for validating pixel data array type ([#1830](https://github.com/cornerstonejs/cornerstone3D/issues/1830)) ([f9d5b79](https://github.com/cornerstonejs/cornerstone3D/commit/f9d5b79c75a4125bbf4e646752ad2071ddc76c41)) + ## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 464e12120..d260d1c65 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.8", + "version": "2.19.9", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 8099775aa..51601c5fd 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index d71ecc990..364118da6 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.8", + "version": "2.19.9", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 3330088e3..6f9976b6e 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [2.19.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.7...v2.19.8) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 41e0f5880..ab64a7ed1 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.8", + "version": "2.19.9", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8 Mon Sep 17 00:00:00 2001 From: stada526 <85278538+stada526@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:46:13 -0500 Subject: [PATCH 07/48] fix: Prevent overwriting existing inactive styles (#1831) --- .../segmentation/SegmentationStyle.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/tools/src/stateManagement/segmentation/SegmentationStyle.ts b/packages/tools/src/stateManagement/segmentation/SegmentationStyle.ts index f6bd05b16..9fc2fcdf8 100644 --- a/packages/tools/src/stateManagement/segmentation/SegmentationStyle.ts +++ b/packages/tools/src/stateManagement/segmentation/SegmentationStyle.ts @@ -208,20 +208,20 @@ class SegmentationStyle { if (type === Enums.SegmentationRepresentations.Labelmap) { const labelmapStyles = processedStyles as LabelmapStyle; - labelmapStyles.renderOutlineInactive = labelmapStyles.renderOutline; - labelmapStyles.outlineWidthInactive = labelmapStyles.outlineWidth; - labelmapStyles.renderFillInactive = labelmapStyles.renderFill; - labelmapStyles.fillAlphaInactive = labelmapStyles.fillAlpha; - labelmapStyles.outlineOpacityInactive = labelmapStyles.outlineOpacity; + labelmapStyles.renderOutlineInactive ??= labelmapStyles.renderOutline; + labelmapStyles.outlineWidthInactive ??= labelmapStyles.outlineWidth; + labelmapStyles.renderFillInactive ??= labelmapStyles.renderFill; + labelmapStyles.fillAlphaInactive ??= labelmapStyles.fillAlpha; + labelmapStyles.outlineOpacityInactive ??= labelmapStyles.outlineOpacity; } else if (type === Enums.SegmentationRepresentations.Contour) { const contourStyles = processedStyles as ContourStyle; - contourStyles.outlineWidthInactive = contourStyles.outlineWidth; - contourStyles.outlineOpacityInactive = contourStyles.outlineOpacity; - contourStyles.outlineDashInactive = contourStyles.outlineDash; - contourStyles.renderOutlineInactive = contourStyles.renderOutline; - contourStyles.renderFillInactive = contourStyles.renderFill; - contourStyles.fillAlphaInactive = contourStyles.fillAlpha; + contourStyles.outlineWidthInactive ??= contourStyles.outlineWidth; + contourStyles.outlineOpacityInactive ??= contourStyles.outlineOpacity; + contourStyles.outlineDashInactive ??= contourStyles.outlineDash; + contourStyles.renderOutlineInactive ??= contourStyles.renderOutline; + contourStyles.renderFillInactive ??= contourStyles.renderFill; + contourStyles.fillAlphaInactive ??= contourStyles.fillAlpha; } return processedStyles; From 8515bbb4905949c696de9fa5ce8ba6abe11cad02 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:50:33 +0000 Subject: [PATCH 08/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index b61597bc0..1a3d138f6 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", - "@cornerstonejs/tools": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/tools": "^2.19.9", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.8", - "@cornerstonejs/core": "^2.19.8", - "@cornerstonejs/dicom-image-loader": "^2.19.8", - "@cornerstonejs/nifti-volume-loader": "^2.19.8", - "@cornerstonejs/tools": "^2.19.8", + "@cornerstonejs/adapters": "^2.19.9", + "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/dicom-image-loader": "^2.19.9", + "@cornerstonejs/nifti-volume-loader": "^2.19.9", + "@cornerstonejs/tools": "^2.19.9", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.8", + "version": "2.19.9", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.8", + "@cornerstonejs/core": "^2.19.9", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 808334426..5f185ae50 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -f9d5b79c75a4125bbf4e646752ad2071ddc76c41 \ No newline at end of file +8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index cb37408b2..04a92ee20 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", - "@cornerstonejs/tools": "^2.19.9" + "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/tools": "^2.19.10" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 15a215da7..1e8bd5aeb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", - "@cornerstonejs/tools": "^2.19.9" + "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/tools": "^2.19.10" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d260d1c65..b5c526508 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 6b98c21f9..725d0c76a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.9", - "@cornerstonejs/core": "^2.19.9", - "@cornerstonejs/dicom-image-loader": "^2.19.9", - "@cornerstonejs/nifti-volume-loader": "^2.19.9", - "@cornerstonejs/tools": "^2.19.9", + "@cornerstonejs/adapters": "^2.19.10", + "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/dicom-image-loader": "^2.19.10", + "@cornerstonejs/nifti-volume-loader": "^2.19.10", + "@cornerstonejs/tools": "^2.19.10", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 364118da6..c18290b5a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9" + "@cornerstonejs/core": "^2.19.10" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index ab64a7ed1..5413861f9 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 9e75f36ae..97a7104e3 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.9", - "commit": "f9d5b79c75a4125bbf4e646752ad2071ddc76c41" + "version": "2.19.10", + "commit": "8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8" } \ No newline at end of file diff --git a/version.txt b/version.txt index 6d877d1d0..8a9794447 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.9 \ No newline at end of file +2.19.10 \ No newline at end of file From 04fa6d1cf884a74d21f87d722b89e2f5e650f9c9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 14:50:52 +0000 Subject: [PATCH 09/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 870625559..38f003219 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) + +### Bug Fixes + +- Prevent overwriting existing inactive styles ([#1831](https://github.com/cornerstonejs/cornerstone3D/issues/1831)) ([8e8c29e](https://github.com/cornerstonejs/cornerstone3D/commit/8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8)) + ## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 690155031..9d73b9ad7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.9", + "version": "2.19.10", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ce89c0d22..2c279b278 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/dcmjs-org/dcmjs/compare/v2.19.9...v2.19.10) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.9](https://github.com/dcmjs-org/dcmjs/compare/v2.19.8...v2.19.9) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 04a92ee20..da73ea278 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.9", + "version": "2.19.10", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 7ea748a98..e30f263d4 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/dcmjs-org/dcmjs/compare/v2.19.9...v2.19.10) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.9](https://github.com/dcmjs-org/dcmjs/compare/v2.19.8...v2.19.9) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 1e8bd5aeb..2b0816a70 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.9", + "version": "2.19.10", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6421b0f42..100a4e173 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index bde2fac60..476594469 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.9", + "version": "2.19.10", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 9e3d3888b..6a80c26ea 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) ### Bug Fixes diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b5c526508..f974fff0c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.9", + "version": "2.19.10", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 51601c5fd..62e490ed2 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c18290b5a..6362bb1da 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.9", + "version": "2.19.10", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 6f9976b6e..c66d61cb6 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) + +### Bug Fixes + +- Prevent overwriting existing inactive styles ([#1831](https://github.com/cornerstonejs/cornerstone3D/issues/1831)) ([8e8c29e](https://github.com/cornerstonejs/cornerstone3D/commit/8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8)) + ## [2.19.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.8...v2.19.9) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 5413861f9..2791f3d58 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.9", + "version": "2.19.10", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 6bf44cf0e151f239dbc41ca4277f0360e2c873f7 Mon Sep 17 00:00:00 2001 From: Gas Giant Date: Wed, 19 Feb 2025 00:26:58 +0530 Subject: [PATCH 10/48] fix: changing opacity based on segment index (#1833) Co-authored-by: scouser --- .../src/utilities/segmentation/getSVGStyleForSegment.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts b/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts index 2d61119c9..cbd28dd20 100644 --- a/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts +++ b/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts @@ -63,7 +63,11 @@ export function getSVGStyleForSegment({ ); const activeSegmentation = getActiveSegmentation(viewportId); - const isActive = activeSegmentation?.segmentationId === segmentationId; + const isSegmentAtIndexActive = + activeSegmentation.segments[segmentIndex].active; + const isActive = + activeSegmentation?.segmentationId === segmentationId && + isSegmentAtIndexActive; // Merge the configurations from different levels based on its precedence const style = segmentationStyle.getStyle({ From 71610ba3637efb118ca420a77e7f2744a01d2b9e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 19:01:24 +0000 Subject: [PATCH 11/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index 1a3d138f6..cbef80b75 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", - "@cornerstonejs/tools": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/tools": "^2.19.10", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.9", - "@cornerstonejs/core": "^2.19.9", - "@cornerstonejs/dicom-image-loader": "^2.19.9", - "@cornerstonejs/nifti-volume-loader": "^2.19.9", - "@cornerstonejs/tools": "^2.19.9", + "@cornerstonejs/adapters": "^2.19.10", + "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/dicom-image-loader": "^2.19.10", + "@cornerstonejs/nifti-volume-loader": "^2.19.10", + "@cornerstonejs/tools": "^2.19.10", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.9", + "version": "2.19.10", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.9", + "@cornerstonejs/core": "^2.19.10", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 5f185ae50..f720baadb 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8 \ No newline at end of file +6bf44cf0e151f239dbc41ca4277f0360e2c873f7 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index da73ea278..929a8e966 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", - "@cornerstonejs/tools": "^2.19.10" + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 2b0816a70..91437f23c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", - "@cornerstonejs/tools": "^2.19.10" + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f974fff0c..40829523a 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 725d0c76a..ae2ffb7cb 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.10", - "@cornerstonejs/core": "^2.19.10", - "@cornerstonejs/dicom-image-loader": "^2.19.10", - "@cornerstonejs/nifti-volume-loader": "^2.19.10", - "@cornerstonejs/tools": "^2.19.10", + "@cornerstonejs/adapters": "^2.19.11", + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/dicom-image-loader": "^2.19.11", + "@cornerstonejs/nifti-volume-loader": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 6362bb1da..1bdbdbb87 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10" + "@cornerstonejs/core": "^2.19.11" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 2791f3d58..24e503930 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 97a7104e3..15de65919 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.10", - "commit": "8e8c29e6d6276936b1be5e4fb116a4ec2585dfd8" + "version": "2.19.11", + "commit": "6bf44cf0e151f239dbc41ca4277f0360e2c873f7" } \ No newline at end of file diff --git a/version.txt b/version.txt index 8a9794447..94d2d3997 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.10 \ No newline at end of file +2.19.11 \ No newline at end of file From c31c5a2c61b257926e6331d319198110820fc5fa Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 18 Feb 2025 19:01:39 +0000 Subject: [PATCH 12/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38f003219..777fcc935 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) + +### Bug Fixes + +- changing opacity based on segment index ([#1833](https://github.com/cornerstonejs/cornerstone3D/issues/1833)) ([6bf44cf](https://github.com/cornerstonejs/cornerstone3D/commit/6bf44cf0e151f239dbc41ca4277f0360e2c873f7)) + ## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 9d73b9ad7..fc3eb5ca7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.10", + "version": "2.19.11", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 2c279b278..dc9affbb5 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/dcmjs-org/dcmjs/compare/v2.19.10...v2.19.11) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.10](https://github.com/dcmjs-org/dcmjs/compare/v2.19.9...v2.19.10) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 929a8e966..6f5c422f9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.10", + "version": "2.19.11", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index e30f263d4..f8b783e0b 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/dcmjs-org/dcmjs/compare/v2.19.10...v2.19.11) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.10](https://github.com/dcmjs-org/dcmjs/compare/v2.19.9...v2.19.10) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 91437f23c..7a589bc55 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.10", + "version": "2.19.11", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 100a4e173..3274883cf 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 476594469..28ac7721a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.10", + "version": "2.19.11", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 6a80c26ea..42ad744c4 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 40829523a..621bfade0 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.10", + "version": "2.19.11", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 62e490ed2..8cd746240 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 1bdbdbb87..ac49e1eac 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.10", + "version": "2.19.11", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c66d61cb6..678ee31b7 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) + +### Bug Fixes + +- changing opacity based on segment index ([#1833](https://github.com/cornerstonejs/cornerstone3D/issues/1833)) ([6bf44cf](https://github.com/cornerstonejs/cornerstone3D/commit/6bf44cf0e151f239dbc41ca4277f0360e2c873f7)) + ## [2.19.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.9...v2.19.10) (2025-02-18) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 24e503930..6ca486e22 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.10", + "version": "2.19.11", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ace893349ed4d066adf035ca776511ac9c394a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20H=2E=20K=C3=B6hler?= Date: Thu, 20 Feb 2025 17:05:53 -0300 Subject: [PATCH 13/48] fix: planar freehand roi undefined unit (#1839) --- packages/tools/src/tools/annotation/PlanarFreehandROITool.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts index c02ba9882..d8e78e614 100644 --- a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts +++ b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts @@ -987,13 +987,13 @@ class PlanarFreehandROITool extends ContourSegmentationBaseTool { modalityUnit, calibratedScale, }) { - const { scale, units } = calibratedScale; + const { scale, unit } = calibratedScale; cachedStats[targetId] = { Modality: metadata.Modality, length: calculatePerimeter(canvasCoordinates, false) / scale, modalityUnit, - getPixelValueUnitunit: units, + unit, }; } From 994f50869b831e3bdd5df558e727ff3dd25fd8b8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 20 Feb 2025 20:10:04 +0000 Subject: [PATCH 14/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index cbef80b75..db32edc2a 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", - "@cornerstonejs/tools": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.10", - "@cornerstonejs/core": "^2.19.10", - "@cornerstonejs/dicom-image-loader": "^2.19.10", - "@cornerstonejs/nifti-volume-loader": "^2.19.10", - "@cornerstonejs/tools": "^2.19.10", + "@cornerstonejs/adapters": "^2.19.11", + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/dicom-image-loader": "^2.19.11", + "@cornerstonejs/nifti-volume-loader": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.10", + "version": "2.19.11", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.10", + "@cornerstonejs/core": "^2.19.11", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index f720baadb..2cdfc940f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -6bf44cf0e151f239dbc41ca4277f0360e2c873f7 \ No newline at end of file +ace893349ed4d066adf035ca776511ac9c394a86 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 6f5c422f9..49a186732 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", - "@cornerstonejs/tools": "^2.19.11" + "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/tools": "^2.19.12" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 7a589bc55..2188fdb09 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", - "@cornerstonejs/tools": "^2.19.11" + "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/tools": "^2.19.12" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 621bfade0..e47e00ddf 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ae2ffb7cb..4f9a54266 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.11", - "@cornerstonejs/core": "^2.19.11", - "@cornerstonejs/dicom-image-loader": "^2.19.11", - "@cornerstonejs/nifti-volume-loader": "^2.19.11", - "@cornerstonejs/tools": "^2.19.11", + "@cornerstonejs/adapters": "^2.19.12", + "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/dicom-image-loader": "^2.19.12", + "@cornerstonejs/nifti-volume-loader": "^2.19.12", + "@cornerstonejs/tools": "^2.19.12", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index ac49e1eac..b29621b16 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11" + "@cornerstonejs/core": "^2.19.12" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 6ca486e22..e996eeccb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 15de65919..a8d5d6b8c 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.11", - "commit": "6bf44cf0e151f239dbc41ca4277f0360e2c873f7" + "version": "2.19.12", + "commit": "ace893349ed4d066adf035ca776511ac9c394a86" } \ No newline at end of file diff --git a/version.txt b/version.txt index 94d2d3997..23c112c7c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.11 \ No newline at end of file +2.19.12 \ No newline at end of file From cfe93393bdee57d0cfddd96bf8785424be48e6ec Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 20 Feb 2025 20:10:23 +0000 Subject: [PATCH 15/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 777fcc935..3ca6dc1a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) + +### Bug Fixes + +- planar freehand roi undefined unit ([#1839](https://github.com/cornerstonejs/cornerstone3D/issues/1839)) ([ace8933](https://github.com/cornerstonejs/cornerstone3D/commit/ace893349ed4d066adf035ca776511ac9c394a86)) + ## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index fc3eb5ca7..bf9138842 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.11", + "version": "2.19.12", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index dc9affbb5..6299dfac5 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/dcmjs-org/dcmjs/compare/v2.19.11...v2.19.12) (2025-02-20) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.11](https://github.com/dcmjs-org/dcmjs/compare/v2.19.10...v2.19.11) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 49a186732..97a24d7e2 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.11", + "version": "2.19.12", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index f8b783e0b..a665e569a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/dcmjs-org/dcmjs/compare/v2.19.11...v2.19.12) (2025-02-20) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.11](https://github.com/dcmjs-org/dcmjs/compare/v2.19.10...v2.19.11) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 2188fdb09..459474ccf 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.11", + "version": "2.19.12", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 3274883cf..d5e4e31d9 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 28ac7721a..a274a8412 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.11", + "version": "2.19.12", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 42ad744c4..95de8071f 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e47e00ddf..b14c5548d 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.11", + "version": "2.19.12", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 8cd746240..06fd25b7f 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b29621b16..e3c786703 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.11", + "version": "2.19.12", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 678ee31b7..57c5aa31a 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) + +### Bug Fixes + +- planar freehand roi undefined unit ([#1839](https://github.com/cornerstonejs/cornerstone3D/issues/1839)) ([ace8933](https://github.com/cornerstonejs/cornerstone3D/commit/ace893349ed4d066adf035ca776511ac9c394a86)) + ## [2.19.11](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.10...v2.19.11) (2025-02-18) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index e996eeccb..bb4363c79 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.11", + "version": "2.19.12", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From d7e809eb8819167eb294d7707c183602f1191585 Mon Sep 17 00:00:00 2001 From: Gas Giant Date: Fri, 21 Feb 2025 21:28:19 +0530 Subject: [PATCH 16/48] fix annotation lock example (#1840) --- .../tools/examples/annotationSelectionAndLocking/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/tools/examples/annotationSelectionAndLocking/index.ts b/packages/tools/examples/annotationSelectionAndLocking/index.ts index 4712e234c..49701b7cb 100644 --- a/packages/tools/examples/annotationSelectionAndLocking/index.ts +++ b/packages/tools/examples/annotationSelectionAndLocking/index.ts @@ -79,12 +79,8 @@ addButtonToToolbar({ if (annotationUIDs && annotationUIDs.length) { const annotationUID = annotationUIDs[0]; - const annotation = - defaultFrameOfReferenceSpecificAnnotationManager.getAnnotation( - annotationUID - ); - locking.setAnnotationLocked(annotation, true); + locking.setAnnotationLocked(annotationUID, true); selection.deselectAnnotation(); // Render the image to see it was selected From 89fbd047caa4f1b769a6e373e1a457e64e0c1f18 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 21 Feb 2025 16:02:39 +0000 Subject: [PATCH 17/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index db32edc2a..3852d568b 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", - "@cornerstonejs/tools": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/tools": "^2.19.12", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.11", - "@cornerstonejs/core": "^2.19.11", - "@cornerstonejs/dicom-image-loader": "^2.19.11", - "@cornerstonejs/nifti-volume-loader": "^2.19.11", - "@cornerstonejs/tools": "^2.19.11", + "@cornerstonejs/adapters": "^2.19.12", + "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/dicom-image-loader": "^2.19.12", + "@cornerstonejs/nifti-volume-loader": "^2.19.12", + "@cornerstonejs/tools": "^2.19.12", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.11", + "version": "2.19.12", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/core": "^2.19.12", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 2cdfc940f..c830f186a 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -ace893349ed4d066adf035ca776511ac9c394a86 \ No newline at end of file +d7e809eb8819167eb294d7707c183602f1191585 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 97a24d7e2..9d6ef44ca 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", - "@cornerstonejs/tools": "^2.19.12" + "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/tools": "^2.19.13" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 459474ccf..2aaf1de4b 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", - "@cornerstonejs/tools": "^2.19.12" + "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/tools": "^2.19.13" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b14c5548d..bd13b1ed1 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 4f9a54266..d49f003c8 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.12", - "@cornerstonejs/core": "^2.19.12", - "@cornerstonejs/dicom-image-loader": "^2.19.12", - "@cornerstonejs/nifti-volume-loader": "^2.19.12", - "@cornerstonejs/tools": "^2.19.12", + "@cornerstonejs/adapters": "^2.19.13", + "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/dicom-image-loader": "^2.19.13", + "@cornerstonejs/nifti-volume-loader": "^2.19.13", + "@cornerstonejs/tools": "^2.19.13", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index e3c786703..a31124bef 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12" + "@cornerstonejs/core": "^2.19.13" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index bb4363c79..91569edf3 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a8d5d6b8c..5f63798e5 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.12", - "commit": "ace893349ed4d066adf035ca776511ac9c394a86" + "version": "2.19.13", + "commit": "d7e809eb8819167eb294d7707c183602f1191585" } \ No newline at end of file diff --git a/version.txt b/version.txt index 23c112c7c..6a1dfd143 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.12 \ No newline at end of file +2.19.13 \ No newline at end of file From 06ebd68df854a774e7e2fa5063d52902704935a8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 21 Feb 2025 16:02:56 +0000 Subject: [PATCH 18/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 14 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca6dc1a9..1e4d638b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package root + ## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) ### Bug Fixes diff --git a/lerna.json b/lerna.json index bf9138842..48911608d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.12", + "version": "2.19.13", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 6299dfac5..190189818 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/dcmjs-org/dcmjs/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.12](https://github.com/dcmjs-org/dcmjs/compare/v2.19.11...v2.19.12) (2025-02-20) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9d6ef44ca..b09db8c9c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.12", + "version": "2.19.13", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index a665e569a..8db3b5633 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/dcmjs-org/dcmjs/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.12](https://github.com/dcmjs-org/dcmjs/compare/v2.19.11...v2.19.12) (2025-02-20) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 2aaf1de4b..d902506d8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.12", + "version": "2.19.13", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d5e4e31d9..5cc5073f9 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index a274a8412..19a93eb0b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.12", + "version": "2.19.13", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 95de8071f..56413431a 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index bd13b1ed1..371e5284c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.12", + "version": "2.19.13", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 06fd25b7f..e42a399ac 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a31124bef..351de5431 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.12", + "version": "2.19.13", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 57c5aa31a..cb5b4a45f 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [2.19.12](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.11...v2.19.12) (2025-02-20) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 91569edf3..f114b5cd1 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.12", + "version": "2.19.13", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From c483e811e12e494b3d764810f182b2be71b43645 Mon Sep 17 00:00:00 2001 From: Gas Giant Date: Mon, 24 Feb 2025 19:19:18 +0530 Subject: [PATCH 19/48] fix(seg): revert change (#1843) --- .../src/utilities/segmentation/getSVGStyleForSegment.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts b/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts index cbd28dd20..2d61119c9 100644 --- a/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts +++ b/packages/tools/src/utilities/segmentation/getSVGStyleForSegment.ts @@ -63,11 +63,7 @@ export function getSVGStyleForSegment({ ); const activeSegmentation = getActiveSegmentation(viewportId); - const isSegmentAtIndexActive = - activeSegmentation.segments[segmentIndex].active; - const isActive = - activeSegmentation?.segmentationId === segmentationId && - isSegmentAtIndexActive; + const isActive = activeSegmentation?.segmentationId === segmentationId; // Merge the configurations from different levels based on its precedence const style = segmentationStyle.getStyle({ From 5dd8c9835f126fa3d335ba45552e4231ca9a614b Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 24 Feb 2025 13:53:43 +0000 Subject: [PATCH 20/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index 3852d568b..478b30449 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", - "@cornerstonejs/tools": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/tools": "^2.19.13", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.12", - "@cornerstonejs/core": "^2.19.12", - "@cornerstonejs/dicom-image-loader": "^2.19.12", - "@cornerstonejs/nifti-volume-loader": "^2.19.12", - "@cornerstonejs/tools": "^2.19.12", + "@cornerstonejs/adapters": "^2.19.13", + "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/dicom-image-loader": "^2.19.13", + "@cornerstonejs/nifti-volume-loader": "^2.19.13", + "@cornerstonejs/tools": "^2.19.13", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.12", + "version": "2.19.13", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.12", + "@cornerstonejs/core": "^2.19.13", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index c830f186a..c71ca0195 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d7e809eb8819167eb294d7707c183602f1191585 \ No newline at end of file +c483e811e12e494b3d764810f182b2be71b43645 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b09db8c9c..7cf19fe6c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", - "@cornerstonejs/tools": "^2.19.13" + "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/tools": "^2.19.14" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index d902506d8..e89953093 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", - "@cornerstonejs/tools": "^2.19.13" + "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/tools": "^2.19.14" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 371e5284c..c2d6ede84 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index d49f003c8..919de67f7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.13", - "@cornerstonejs/core": "^2.19.13", - "@cornerstonejs/dicom-image-loader": "^2.19.13", - "@cornerstonejs/nifti-volume-loader": "^2.19.13", - "@cornerstonejs/tools": "^2.19.13", + "@cornerstonejs/adapters": "^2.19.14", + "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/dicom-image-loader": "^2.19.14", + "@cornerstonejs/nifti-volume-loader": "^2.19.14", + "@cornerstonejs/tools": "^2.19.14", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 351de5431..3ab01dccd 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13" + "@cornerstonejs/core": "^2.19.14" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index f114b5cd1..b4c0bd5f8 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 5f63798e5..2ebad1ddf 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.13", - "commit": "d7e809eb8819167eb294d7707c183602f1191585" + "version": "2.19.14", + "commit": "c483e811e12e494b3d764810f182b2be71b43645" } \ No newline at end of file diff --git a/version.txt b/version.txt index 6a1dfd143..44a606613 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.13 \ No newline at end of file +2.19.14 \ No newline at end of file From 7ddb7a15d230164683765a2bba2d9dc6e1dab8a5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 24 Feb 2025 13:54:01 +0000 Subject: [PATCH 21/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 14 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4d638b3..c99ab5dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) + +### Bug Fixes + +- **seg:** revert change ([#1843](https://github.com/cornerstonejs/cornerstone3D/issues/1843)) ([c483e81](https://github.com/cornerstonejs/cornerstone3D/commit/c483e811e12e494b3d764810f182b2be71b43645)) + ## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 48911608d..9e74590ac 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.13", + "version": "2.19.14", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 190189818..e352dfa1c 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.13](https://github.com/dcmjs-org/dcmjs/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 7cf19fe6c..41bf58652 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.13", + "version": "2.19.14", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8db3b5633..65007b83a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.13](https://github.com/dcmjs-org/dcmjs/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index e89953093..02b151829 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.13", + "version": "2.19.14", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 5cc5073f9..b75eb1e56 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 19a93eb0b..ba7114d2f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.13", + "version": "2.19.14", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 56413431a..b15b5a2b9 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c2d6ede84..7f59292f8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.13", + "version": "2.19.14", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index e42a399ac..6ead982d0 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 3ab01dccd..cae5e5e1e 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.13", + "version": "2.19.14", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index cb5b4a45f..2db9f6162 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) + +### Bug Fixes + +- **seg:** revert change ([#1843](https://github.com/cornerstonejs/cornerstone3D/issues/1843)) ([c483e81](https://github.com/cornerstonejs/cornerstone3D/commit/c483e811e12e494b3d764810f182b2be71b43645)) + ## [2.19.13](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.12...v2.19.13) (2025-02-21) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index b4c0bd5f8..0d50ef442 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.13", + "version": "2.19.14", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From c082dc23d34420c947fd65df1a2a9608872dd8d3 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Tue, 25 Feb 2025 22:31:15 -0500 Subject: [PATCH 22/48] add more exports to dicomImageLoader (#1855) --- .../src/imageLoader/createImage.ts | 63 +------------------ .../dicomImageLoader/src/imageLoader/index.ts | 10 +++ .../imageLoader/isModalityLutForDisplay.ts | 10 +++ .../src/imageLoader/removeAFromRGBA.ts | 31 +++++++++ .../src/imageLoader/setPixelDataType.ts | 25 ++++++++ 5 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 packages/dicomImageLoader/src/imageLoader/isModalityLutForDisplay.ts create mode 100644 packages/dicomImageLoader/src/imageLoader/removeAFromRGBA.ts create mode 100644 packages/dicomImageLoader/src/imageLoader/setPixelDataType.ts diff --git a/packages/dicomImageLoader/src/imageLoader/createImage.ts b/packages/dicomImageLoader/src/imageLoader/createImage.ts index 8d1cb0e42..d178597ab 100644 --- a/packages/dicomImageLoader/src/imageLoader/createImage.ts +++ b/packages/dicomImageLoader/src/imageLoader/createImage.ts @@ -1,6 +1,5 @@ import type { ByteArray } from 'dicom-parser'; import getMinMax from '../shared/getMinMax'; -import getPixelDataTypeFromMinMax from '../shared/getPixelDataTypeFromMinMax'; import type { DICOMLoaderImageOptions, DICOMLoaderIImage } from '../types'; import type { Types } from '@cornerstonejs/core'; import { @@ -16,68 +15,12 @@ import getImageFrame from './getImageFrame'; import getScalingParameters from './getScalingParameters'; import { getOptions } from './internal/options'; import isColorImageFn from '../shared/isColorImage'; +import removeAFromRGBA from './removeAFromRGBA'; +import isModalityLUTForDisplay from './isModalityLutForDisplay'; +import setPixelDataType from './setPixelDataType'; let lastImageIdDrawn = ''; -function isModalityLUTForDisplay(sopClassUid: string): boolean { - // special case for XA and XRF - // https://groups.google.com/forum/#!searchin/comp.protocols.dicom/Modality$20LUT$20XA/comp.protocols.dicom/UBxhOZ2anJ0/D0R_QP8V2wIJ - return ( - sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.1' && // XA - sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1' - ); // XRF -} - -/** - * Helper function to set the right typed array. - * This is needed because web workers can transfer array buffers but not typed arrays - * - * Here we are setting the pixel data to the right typed array based on the final - * min and max values - */ -function setPixelDataType(imageFrame) { - const minValue = imageFrame.smallestPixelValue; - const maxValue = imageFrame.largestPixelValue; - - const TypedArray = getPixelDataTypeFromMinMax(minValue, maxValue); - - if (TypedArray) { - // @ts-ignore - const typedArray = new TypedArray(imageFrame.pixelData); - imageFrame.pixelData = typedArray; - } else { - throw new Error('Could not apply a typed array to the pixel data'); - } -} - -/** - * Removes the A from RGBA to return RGB buffer, this is used when the - * decoding happens with browser API which results in RGBA, but if useRGBA flag - * is set to false, we want to return RGB - * - * @param pixelData - decoded image in RGBA - * @param targetBuffer - target buffer to write to - */ -function removeAFromRGBA( - pixelData: Types.PixelDataTypedArray, - targetBuffer: Uint8ClampedArray | Uint8Array -) { - const numPixels = pixelData.length / 4; - - let rgbIndex = 0; - - let bufferIndex = 0; - - for (let i = 0; i < numPixels; i++) { - targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // red - targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // green - targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // blue - rgbIndex++; // skip alpha - } - - return targetBuffer; -} - function createImage( imageId: string, pixelData: ByteArray, diff --git a/packages/dicomImageLoader/src/imageLoader/index.ts b/packages/dicomImageLoader/src/imageLoader/index.ts index d443701e0..68f062752 100644 --- a/packages/dicomImageLoader/src/imageLoader/index.ts +++ b/packages/dicomImageLoader/src/imageLoader/index.ts @@ -17,6 +17,11 @@ import { default as getMinMax } from '../shared/getMinMax'; import { default as isColorImage } from '../shared/isColorImage'; import { default as isJPEGBaseline8BitColor } from './isJPEGBaseline8BitColor'; import { default as getPixelData } from './wadors/getPixelData'; +import { default as getScalingParameters } from './getScalingParameters'; +import { default as isColorConversionRequired } from './isColorConversionRequired'; +import { default as removeAFromRGBA } from './removeAFromRGBA'; +import { default as isModalityLUTForDisplay } from './isModalityLutForDisplay'; +import { default as setPixelDataType } from './setPixelDataType'; import { internal } from './internal/index'; const cornerstoneDICOMImageLoader = { @@ -36,6 +41,11 @@ const cornerstoneDICOMImageLoader = { getMinMax, isColorImage, isJPEGBaseline8BitColor, + getScalingParameters, + isColorConversionRequired, + removeAFromRGBA, + isModalityLUTForDisplay, + setPixelDataType, internal, }; diff --git a/packages/dicomImageLoader/src/imageLoader/isModalityLutForDisplay.ts b/packages/dicomImageLoader/src/imageLoader/isModalityLutForDisplay.ts new file mode 100644 index 000000000..33dce11dd --- /dev/null +++ b/packages/dicomImageLoader/src/imageLoader/isModalityLutForDisplay.ts @@ -0,0 +1,10 @@ +function isModalityLUTForDisplay(sopClassUid: string): boolean { + // special case for XA and XRF + // https://groups.google.com/forum/#!searchin/comp.protocols.dicom/Modality$20LUT$20XA/comp.protocols.dicom/UBxhOZ2anJ0/D0R_QP8V2wIJ + return ( + sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.1' && // XA + sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1' + ); // XRF +} + +export default isModalityLUTForDisplay; diff --git a/packages/dicomImageLoader/src/imageLoader/removeAFromRGBA.ts b/packages/dicomImageLoader/src/imageLoader/removeAFromRGBA.ts new file mode 100644 index 000000000..4757f72e6 --- /dev/null +++ b/packages/dicomImageLoader/src/imageLoader/removeAFromRGBA.ts @@ -0,0 +1,31 @@ +import type { Types } from '@cornerstonejs/core'; + +/** + * Removes the A from RGBA to return RGB buffer, this is used when the + * decoding happens with browser API which results in RGBA, but if useRGBA flag + * is set to false, we want to return RGB + * + * @param pixelData - decoded image in RGBA + * @param targetBuffer - target buffer to write to + */ +function removeAFromRGBA( + pixelData: Types.PixelDataTypedArray, + targetBuffer: Uint8ClampedArray | Uint8Array +) { + const numPixels = pixelData.length / 4; + + let rgbIndex = 0; + + let bufferIndex = 0; + + for (let i = 0; i < numPixels; i++) { + targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // red + targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // green + targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // blue + rgbIndex++; // skip alpha + } + + return targetBuffer; +} + +export default removeAFromRGBA; diff --git a/packages/dicomImageLoader/src/imageLoader/setPixelDataType.ts b/packages/dicomImageLoader/src/imageLoader/setPixelDataType.ts new file mode 100644 index 000000000..397c102b4 --- /dev/null +++ b/packages/dicomImageLoader/src/imageLoader/setPixelDataType.ts @@ -0,0 +1,25 @@ +import getPixelDataTypeFromMinMax from '../shared/getPixelDataTypeFromMinMax'; + +/** + * Helper function to set the right typed array. + * This is needed because web workers can transfer array buffers but not typed arrays + * + * Here we are setting the pixel data to the right typed array based on the final + * min and max values + */ +function setPixelDataType(imageFrame) { + const minValue = imageFrame.smallestPixelValue; + const maxValue = imageFrame.largestPixelValue; + + const TypedArray = getPixelDataTypeFromMinMax(minValue, maxValue); + + if (TypedArray) { + // @ts-ignore + const typedArray = new TypedArray(imageFrame.pixelData); + imageFrame.pixelData = typedArray; + } else { + throw new Error('Could not apply a typed array to the pixel data'); + } +} + +export default setPixelDataType; From 5a769603d8e3baf64c44bc072970714177886148 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 26 Feb 2025 03:35:35 +0000 Subject: [PATCH 23/48] chore(version): version.json [skip ci] --- bun.lock | 32 +++++++++++------------ commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++---- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index 478b30449..eaacd507d 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", - "@cornerstonejs/tools": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/tools": "^2.19.14", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.13", - "@cornerstonejs/core": "^2.19.13", - "@cornerstonejs/dicom-image-loader": "^2.19.13", - "@cornerstonejs/nifti-volume-loader": "^2.19.13", - "@cornerstonejs/tools": "^2.19.13", + "@cornerstonejs/adapters": "^2.19.14", + "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/dicom-image-loader": "^2.19.14", + "@cornerstonejs/nifti-volume-loader": "^2.19.14", + "@cornerstonejs/tools": "^2.19.14", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.13", + "version": "2.19.14", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.13", + "@cornerstonejs/core": "^2.19.14", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index c71ca0195..4b0210171 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -c483e811e12e494b3d764810f182b2be71b43645 \ No newline at end of file +c082dc23d34420c947fd65df1a2a9608872dd8d3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 41bf58652..62cfd144f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", - "@cornerstonejs/tools": "^2.19.14" + "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/tools": "^2.19.15" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 02b151829..d162229b5 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", - "@cornerstonejs/tools": "^2.19.14" + "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/tools": "^2.19.15" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7f59292f8..8b1b18ff1 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 919de67f7..19d170dc3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.14", - "@cornerstonejs/core": "^2.19.14", - "@cornerstonejs/dicom-image-loader": "^2.19.14", - "@cornerstonejs/nifti-volume-loader": "^2.19.14", - "@cornerstonejs/tools": "^2.19.14", + "@cornerstonejs/adapters": "^2.19.15", + "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/dicom-image-loader": "^2.19.15", + "@cornerstonejs/nifti-volume-loader": "^2.19.15", + "@cornerstonejs/tools": "^2.19.15", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index cae5e5e1e..dbd11a9b6 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14" + "@cornerstonejs/core": "^2.19.15" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 0d50ef442..fd63071ab 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 2ebad1ddf..31605925e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.14", - "commit": "c483e811e12e494b3d764810f182b2be71b43645" + "version": "2.19.15", + "commit": "c082dc23d34420c947fd65df1a2a9608872dd8d3" } \ No newline at end of file diff --git a/version.txt b/version.txt index 44a606613..0a9d25974 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.14 \ No newline at end of file +2.19.15 \ No newline at end of file From 03a8ef77085f019e6c1404e8a887d2c719669038 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 26 Feb 2025 03:35:53 +0000 Subject: [PATCH 24/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 14 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c99ab5dbf..e8a4267dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package root + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 9e74590ac..b87238f66 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.14", + "version": "2.19.15", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e352dfa1c..ef54c9307 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 62cfd144f..833335c3c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.14", + "version": "2.19.15", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 65007b83a..019e9b2bb 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index d162229b5..4a439de1e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.14", + "version": "2.19.15", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b75eb1e56..564572162 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index ba7114d2f..748355c2a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.14", + "version": "2.19.15", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index b15b5a2b9..865199f36 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8b1b18ff1..3b5ef8d1e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.14", + "version": "2.19.15", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 6ead982d0..86232fc72 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index dbd11a9b6..db5d922c8 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.14", + "version": "2.19.15", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 2db9f6162..244a04d86 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index fd63071ab..29c64595f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.14", + "version": "2.19.15", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 0dc51241392451a581de0372760ff6d5acf398c3 Mon Sep 17 00:00:00 2001 From: Alireza Date: Wed, 26 Feb 2025 13:24:32 -0500 Subject: [PATCH 25/48] test: fix screenshot checking (#1859) --- bun.lock | 32 +- .../stackLabelmapSegmentation/index.ts | 57 +- tests/labelmapsegmentationtools.spec.ts | 84 +-- .../circularBrushSegment1.png | Bin 0 -> 71023 bytes .../circularEraserSegmentation1.png | Bin 0 -> 69731 bytes .../circularEraserSegmentation2.png | Bin 0 -> 72211 bytes .../circularScissorSegmentation1.png | Bin 0 -> 70808 bytes .../dynamicThresholdConfirmedContour.png | Bin 0 -> 70776 bytes .../dynamicThresholdHighlightedContour.png | Bin 0 -> 69974 bytes ...namicThresholdInitialHighlightedPixels.png | Bin 0 -> 69379 bytes .../paintFillSeg1OuterCircle.png | Bin 0 -> 74135 bytes .../rectangleScissorSegmentation1.png | Bin 0 -> 70572 bytes .../sphereBrush.png | Bin 0 -> 72327 bytes .../thresholdBrushBoneSegment1.png | Bin 0 -> 68991 bytes .../thresholdBrushFatSegment1.png | Bin 0 -> 70063 bytes .../circularBrushSegment1.png | Bin 0 -> 80205 bytes .../circularEraserSegmentation1.png | Bin 0 -> 79188 bytes .../circularEraserSegmentation2.png | Bin 0 -> 81319 bytes .../circularScissorSegmentation1.png | Bin 0 -> 80434 bytes .../dynamicThresholdConfirmedContour.png | Bin 0 -> 79585 bytes .../dynamicThresholdHighlightedContour.png | Bin 0 -> 78878 bytes ...namicThresholdInitialHighlightedPixels.png | Bin 0 -> 79159 bytes .../paintFillSeg1OuterCircle.png | Bin 0 -> 87935 bytes .../rectangleScissorSegmentation1.png | Bin 0 -> 79788 bytes .../sphereBrush.png | Bin 0 -> 81541 bytes .../thresholdBrushBoneSegment1.png | Bin 0 -> 78960 bytes .../thresholdBrushFatSegment1.png | Bin 0 -> 78747 bytes tests/stackLabelmapSegmentation.spec.ts | 552 +++++++++--------- tests/surfaceRendering.spec.ts | 31 +- tests/utils/checkForScreenshot.ts | 23 +- tests/utils/screenShotPaths.ts | 1 + 31 files changed, 400 insertions(+), 380 deletions(-) create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularBrushSegment1.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation1.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularScissorSegmentation1.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/dynamicThresholdHighlightedContour.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/dynamicThresholdInitialHighlightedPixels.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/paintFillSeg1OuterCircle.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/rectangleScissorSegmentation1.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/sphereBrush.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushBoneSegment1.png create mode 100644 tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularBrushSegment1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularScissorSegmentation1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdHighlightedContour.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdInitialHighlightedPixels.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/paintFillSeg1OuterCircle.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/rectangleScissorSegmentation1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/sphereBrush.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/thresholdBrushBoneSegment1.png create mode 100644 tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png diff --git a/bun.lock b/bun.lock index eaacd507d..4d7638078 100644 --- a/bun.lock +++ b/bun.lock @@ -138,7 +138,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +147,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", - "@cornerstonejs/tools": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/tools": "^2.19.15", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -171,7 +171,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +180,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,7 +192,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", "dicom-parser": "^1.8.9", }, }, @@ -200,11 +200,11 @@ "name": "docs", "version": "2.1.10", "dependencies": { - "@cornerstonejs/adapters": "^2.19.14", - "@cornerstonejs/core": "^2.19.14", - "@cornerstonejs/dicom-image-loader": "^2.19.14", - "@cornerstonejs/nifti-volume-loader": "^2.19.14", - "@cornerstonejs/tools": "^2.19.14", + "@cornerstonejs/adapters": "^2.19.15", + "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/dicom-image-loader": "^2.19.15", + "@cornerstonejs/nifti-volume-loader": "^2.19.15", + "@cornerstonejs/tools": "^2.19.15", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -242,17 +242,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.14", + "version": "2.19.15", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +262,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.14", + "@cornerstonejs/core": "^2.19.15", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/packages/tools/examples/stackLabelmapSegmentation/index.ts b/packages/tools/examples/stackLabelmapSegmentation/index.ts index be326f195..739c3b7f5 100644 --- a/packages/tools/examples/stackLabelmapSegmentation/index.ts +++ b/packages/tools/examples/stackLabelmapSegmentation/index.ts @@ -1,5 +1,4 @@ import { Enums, RenderingEngine, imageLoader } from '@cornerstonejs/core'; -import * as cornerstone from '@cornerstonejs/core'; import * as cornerstoneTools from '@cornerstonejs/tools'; import { createImageIdsAndCacheMetaData, @@ -9,7 +8,6 @@ import { addButtonToToolbar, addBrushSizeSlider, } from '../../../../utils/demo/helpers'; -import { fillStackSegmentationWithMockData } from '../../../../utils/test/testUtils'; // This is for debugging purposes console.warn( @@ -84,6 +82,7 @@ content.append(instructions); const brushInstanceNames = { CircularBrush: 'CircularBrush', + SphereBrush: 'SphereBrush', CircularEraser: 'CircularEraser', ThresholdBrush: 'ThresholdBrush', DynamicThreshold: 'DynamicThreshold', @@ -91,6 +90,7 @@ const brushInstanceNames = { const brushStrategies = { [brushInstanceNames.CircularBrush]: 'FILL_INSIDE_CIRCLE', + [brushInstanceNames.SphereBrush]: 'FILL_INSIDE_SPHERE', [brushInstanceNames.CircularEraser]: 'ERASE_INSIDE_CIRCLE', [brushInstanceNames.ThresholdBrush]: 'THRESHOLD_INSIDE_CIRCLE', [brushInstanceNames.DynamicThreshold]: 'THRESHOLD_INSIDE_CIRCLE', @@ -98,6 +98,7 @@ const brushStrategies = { const brushValues = [ brushInstanceNames.CircularBrush, + brushInstanceNames.SphereBrush, brushInstanceNames.CircularEraser, brushInstanceNames.ThresholdBrush, brushInstanceNames.DynamicThreshold, @@ -113,7 +114,7 @@ const optionsValues = [ let viewport; const viewportId2 = 'STACK_VIEWPORT_2'; -const segmentationIds = ['STACK_SEGMENTATION']; +const segmentationIds = ['STACK_SEGMENTATION', 'STACK_SEGMENTATION_2']; const dropDownId = 'SEGMENTATION_DROPDOWN'; function updateSegmentationDropdownOptions( @@ -283,6 +284,13 @@ function setupTools(toolGroupId) { activeStrategy: brushStrategies.CircularBrush, } ); + toolGroup.addToolInstance( + brushInstanceNames.SphereBrush, + BrushTool.toolName, + { + activeStrategy: brushStrategies.SphereBrush, + } + ); toolGroup.addToolInstance( brushInstanceNames.CircularEraser, BrushTool.toolName, @@ -341,8 +349,7 @@ function setupTools(toolGroupId) { toolGroup.setToolActive(StackScrollTool.toolName, { bindings: [ { - mouseButton: MouseBindings.Primary, - modifierKey: KeyboardBindings.Alt, + mouseButton: MouseBindings.Wheel, }, ], }); @@ -394,26 +401,24 @@ async function run() { ]; renderingEngine.setViewports(viewportInputArray); toolGroup.addViewport(viewportId, renderingEngineId); + toolGroup.addViewport(viewportId2, renderingEngineId); viewport = renderingEngine.getViewport(viewportId); - const imageIdsArray = [imageIds[0], imageIds[1], mgImageIds[0]]; + const ctImageIds = imageIds.slice(0, 3); + const ctSegImages = await imageLoader.createAndCacheDerivedLabelmapImages( + ctImageIds + ); - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIdsArray + const mgSegImages = await imageLoader.createAndCacheDerivedLabelmapImages( + mgImageIds ); const viewport2 = renderingEngine.getViewport(viewportId2); - await viewport.setStack(imageIdsArray, 0); - await viewport2.setStack([imageIdsArray[2]], 0); + await viewport.setStack(ctImageIds, 0); + await viewport2.setStack([...mgImageIds, ctImageIds[2]], 0); cornerstoneTools.utilities.stackContextPrefetch.enable(element1); cornerstoneTools.utilities.stackContextPrefetch.enable(element2); - // fillStackSegmentationWithMockData({ - // imageIds: [imageIds[0]], - // segmentationImageIds: segImages.map((it) => it.imageId), - // cornerstone, - // }); - renderingEngine.renderViewports([viewportId]); segmentation.addSegmentations([ @@ -422,11 +427,27 @@ async function run() { representation: { type: csToolsEnums.SegmentationRepresentations.Labelmap, data: { - imageIds: segImages.map((it) => it.imageId), + imageIds: ctSegImages.map((it) => it.imageId), + }, + }, + }, + ]); + + segmentation.addSegmentations([ + { + segmentationId: segmentationIds[1], + representation: { + type: csToolsEnums.SegmentationRepresentations.Labelmap, + data: { + imageIds: [ + ...mgSegImages.map((it) => it.imageId), + ctSegImages[2].imageId, + ], }, }, }, ]); + // Add the segmentation representation to the toolgroup await segmentation.addSegmentationRepresentations(viewportId, [ { @@ -437,7 +458,7 @@ async function run() { await segmentation.addSegmentationRepresentations(viewportId2, [ { - segmentationId: segmentationIds[0], + segmentationId: segmentationIds[1], type: csToolsEnums.SegmentationRepresentations.Labelmap, }, ]); diff --git a/tests/labelmapsegmentationtools.spec.ts b/tests/labelmapsegmentationtools.spec.ts index fa430805e..aa56ff67f 100644 --- a/tests/labelmapsegmentationtools.spec.ts +++ b/tests/labelmapsegmentationtools.spec.ts @@ -815,48 +815,48 @@ test.describe('Basic manual labelmap Segmentation tools', async () => { ); }); - test('should render and allow usage of paint fill', async ({ page }) => { - const screenshotLocator = page.locator('#content > div'); - const firstCanvas = page.locator('.cornerstone-canvas').nth(0); - const secondCanvas = page.locator('.cornerstone-canvas').nth(1); - const thirdCanvas = page.locator('.cornerstone-canvas').nth(2); + // test('should render and allow usage of paint fill', async ({ page }) => { + // const screenshotLocator = page.locator('#content > div'); + // const firstCanvas = page.locator('.cornerstone-canvas').nth(0); + // const secondCanvas = page.locator('.cornerstone-canvas').nth(1); + // const thirdCanvas = page.locator('.cornerstone-canvas').nth(2); - await page - .getByRole('combobox') - .first() - .selectOption({ label: 'PaintFill' }); - await simulateClicksOnElement({ - locator: firstCanvas, - points: [ - { - x: 209, - y: 268, - }, - ], - }); - await simulateClicksOnElement({ - locator: secondCanvas, - points: [ - { - x: 224, - y: 354, - }, - ], - }); - await simulateClicksOnElement({ - locator: thirdCanvas, - points: [ - { - x: 309, - y: 331, - }, - ], - }); + // await page + // .getByRole('combobox') + // .first() + // .selectOption({ label: 'PaintFill' }); + // await simulateClicksOnElement({ + // locator: firstCanvas, + // points: [ + // { + // x: 209, + // y: 268, + // }, + // ], + // }); + // await simulateClicksOnElement({ + // locator: secondCanvas, + // points: [ + // { + // x: 224, + // y: 354, + // }, + // ], + // }); + // await simulateClicksOnElement({ + // locator: thirdCanvas, + // points: [ + // { + // x: 309, + // y: 331, + // }, + // ], + // }); - await checkForScreenshot( - page, - screenshotLocator, - screenShotPaths.labelmapSegmentationTools.paintFill - ); - }); + // await checkForScreenshot( + // page, + // screenshotLocator, + // screenShotPaths.labelmapSegmentationTools.paintFill2 + // ); + // }); }); diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularBrushSegment1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularBrushSegment1.png new file mode 100644 index 0000000000000000000000000000000000000000..912b8b89b818d29d5233c1a0283b38a946b819d8 GIT binary patch literal 71023 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

2jdY=u4hSE zSI^mr_^)owGvkqHJcH*~uLcP(SW@YdWtoS)fNbktW(*RHz7IF2dgM|ow`1-sdMy$) z$=2`kL}vNFlaEl8!R-sCEwG_Y(~O$qqQYu~0-#laj!fk`3s}?TUm%>%0Ab6H$-9g4 zX^rw}lJarVlmmporky@k0AAW{x3z77++h1&u`ddHhWHO~zV_6aUc!lUr&lY9^$21H z%KGd?7MhOUNwb>>P!OWL#J+TXb=0z7iRrmnw8`}Wh%F#Z#z!<)R%nZk5RB(~N=||i z&M}_?C(haPrfh35|J81C@5I|!IM2mJhxPj&PGORmxkv1TvT+gJbt)z~Y0t#SUkNfH(h<7~({y}M zq!45zRq+?R*XVs8?c8g5j$ZK`i_M8Xft(4*domMzpnewao0`J8d+jC(zY9_zzNV$L z9q0ZA0Gb0W*}7gXiT0FS-f{dqLfeB#hJrUk0qMh+GxITVx}?Ao6N6tlVROMBRryvu zx9;xl{ta-zcK){eFQs)pZ28|e`ipCdhg%d*I{eEuDJv?zd=Z$%QwY*l4LWbdIGq)} z+bL$$Q~C5}2Ys~h9Dk#S_gF5!BlW>3Nb;OVN}AjIvTFg?Teh*kd>DTc=&?d$pruu9 z+X`BLHl}BJ`f-$0ta@BK{{h)J>l;B;eZJ}4jHUwmo9(sLm)D@Cfks}->6jY!h0>?7Xj`tAZqA+@H(@%tpAu-eTdsig%b~shy>D=9i4~^s!-@aHfd9{iD35Ho zn_I~XN(!wPAlqlj^?5EKZ^USVyZ`Qwb$yYZ41?TPH!WsUbC7v7F%iG|P9*q6iVzji z^3h!&*SH2`I2g3wWBWGJSYRrO^%sls!LD?B^>_ir+R%VB1|cCNBxfXUc);E$xYmN+ z+ureKkT*yVWM+zG_J8?op5P=pj9 zcMoNY2IkH45m1x!p7!!Ot_%LD==N==2=6!sdgz@SMbMWflI}1JQ`Y;X5W=XFj@SWb0p?9AR<<>>U`clkcvBs8andfj4y-uHlxsutlny9*0& zyP;?Ta;qg*P$vPZff}r1k!a8Cp_`E& z$2U`sK`G~*?GN7unDhAiOlbEYu)se4BA^*Kf!wNyx_=2h0D;W@eyOV2a{(Zz0peH$ z0)AP{oW~5*wYFIW3k+qZ%#_Hm�x-HawnJYoQEl)v;#>g{^scdH%e!%^xWd>6%!X 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 VCyKK*=Ns@+mRFanmN5_ee*nYUk(mGh literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation1.png new file mode 100644 index 0000000000000000000000000000000000000000..e03161c20281c1c3e40a2ac03c00ee5dc20abfa4 GIT binary patch literal 69731 zcmeFZ1y>Z_7cNXm4&B`y5+fqr-6AF3AT6EJAl+TkA}uW-AYD=t1JWhkjraKbulM~9 zcda|iBxlaqXYZ#DQR=F4nCN8aaByi8sLaB%P!;P)je0(eXOZnhWr3;w;PoFrWJ zIK>_u91Wa;w1k#d&OwJ>0>!oaQKp`+wxy-zq0+IgJPwjP4ufpTy>shmJR4}P3Csn{!ql?YPfMRcbm&gps^4Lp@ZU1@w8cmx}_ zmu>BBSN=7_-Zy9ihsZCJ!CP+rQjwT=>b%kB+6jDGxgGa(8*qU>1COwdct6p*FqW@Y7ZlX`CdxA)hjeH1SwmIs z*NMAsqSXA%%HnM%#GiSBx-mqrnQO1DO;Bd4oc(h?Ay#9%h#h#-n=4u_f=IYTNI>Ah zdepj;XTW8hWmP#V82I$CU(@RxtH+D-=}NOI}^|67rCNv|EfH2z|eC!Rk7qDAg~$s0@Ay4e*5@j z!kwYa^g@MC<-L#3U3L4B&w3Q|jjy4O#KB>q4e7tv7z92a<4W7;yxZbVf^n^Q>9s|sHtU_?p@y_27UJuzVhh^y*%}@ z&)T+u{<*%7l?^HAYH8UO7%z$!{k(oJB;j&|j*c!ABTbj6T9!OyL4!jQD;v;dJO@50 zhHPs8vTgY&plfB%?E(CGJO_1vl3^l;=vVQJiA@MSJg)qGR1J(@e)hj_jyGuoO_bM7 zvm}wNncKhg5zTjkk|lm459c9^4eu?i-hT{OspqJf6QYVYb3+DP+Lj%gVU$=A9Y#*VRKCJg>t5i$@dL?2KQ>NV z45|aV#7H3EV~QqsFMYx!*W|?R5=(8ZC-N|n5QHAXJaDy~b-><{G9(WvGvPy!-3_T@ z!RkeRIC5=uGo;3fcns*8+xHgE6Q@~qZ55_c>snzRMnQn@<%X)fgOc@`o!(vUXO+6Q zFW(<`1(tRFatuQMZ_VJQq4-gu0~>`KT66B{BbFrLE5~4yiYDc!zYbZfU-}FU_;yfD zis41gH#z7LNs^_HY??AlO@ahd;bzFo24FDdKZeCIoP4c&=!7_v@lh(gAf5a?n1-D7gG|hboT5qrsSd4 z)>nyRERQisl58w2OWNNX@N*}HRGIJ%=g>~us(m|*&O9yng2X@AIA)cW+ET?29C}1Z z()Mz@8P;f5g2RS`ii8lPU$rfu%0cw{PX50gb$ppLR6MuO=z$&4yXK7A_-Vflc6fE` z7t#$k2GR4T!TIT)o1f4WAz5g`EkJ<I&Q!`e?rb#=hX1O5^F}| zN`Gf%)z1xad!C(oAicKcyekklveo1Iof|R@l`2fA-WSb(P8EON70?Ar4Ld@L2yVay zJxo$G|M=1;NZh2sVe@6@X)NVqzYyC0o*jytVSau-c9>+`1~`l0g)X#&#LChKyVBsG zB8TV>XOyB{ub+BF9z6JQldLkyRuNV)um_demS|SY?VlDJKmO5)rxa?MHukqJ`0vEQ zf(*Et^|s|{WC=H1TX%JO-h?yF+Ca%rkrog6N0kLAuDpc5mVF9lUO4t>PqPf`HBC9o zRkh~Lj2YN)6C9(?5%J}xz-rd7$`yrgCTDy9ukbwPn_}7e4?XY;6kvv2pawn}{Sm-I zC(WNAj+Mpi-MzjC#rRVVsVvGCN_MJkR6{J3WmGd~*J#(M4+79Y*Ek(@^?Ed0{HBIN)El!)Nu&Ed_L*^$xV0~vEmB2Ef0|_RFj;ndnW@Z_tYEZ$eP6gJl&i`@Fl@mq zSpoK~W)34h-r_e@g-j1r4PD~=($R$mei!?=p@f7fdE$^o!a%5GA?Pn-aCC#+CgQuz z4ltLTHD>{`SU1CgdCH3RfejuA;vFLn>WyEgYT5Mhbx5~K`*Qzlh+$ z#S6tDmQ>r4q50O#6-A;4YSzrDOovuWU~gRd_=_5IlWe|8(KY1KshlOlig0WuH@}u= zSa)p|%*9F~&(dK|R_HLIh9G~lfReel8xFYq`t{3zYwqdsUQF=RkWdTEtEOjse0&$w zq~WG8e#6pQ9s-@jN})J>^e|Asbcx(5$$0Eg3_((oY^w$Z%(NRU%N2Y6h+bMoJ)Wc= zj*wdw&~QE4XYJh0&CT82FMGl;C}6GccRcPc?1lbofGwAi(sV->NhT_zpqFNq7FsZy zMtqEtrc1Mos(5}N9D|9N@v)EYw<&1ayqPDWKd(c55x{AeeaZUkgoQ~ccidS3f`mX7 zUuIOp_j99Y74qf3wW*S0zypNy{9$4xL-HDZmt)b>vs6;=dTVHSdV2iVSeR4?ST zZEpWfTEdGD2EUK5jXQi^ zfZ@lRX;$Zj^73WHKLp~;9<=l zazz@2>bl0p$Jh62VvlZgi7g?~m255Spl|cGEIW?W2X~v$;GFn$fIi!VGzUKo)fh(# zkx+)A4Qwv%lAU4$;IQVbJN;F)ETkFo4h-9(NIQ~#X914%5f+ERF?fT7+LsLt4GZ>7 zE5|j})xY*HH7ho+@3Y6Y)dJ3vFMNB@xBjJa?qIZ+qdjQ(PLJ8 zRPhtz8VRZpXYzTu;p0+Y2&P2EU1D77p#J{$U5=|VzKA0 z4(kC83ly=kb-EmQQUAJUojjM?G9f+!m~Yqj-n~N>nw7I)vYh&JlblGUkG#lK*00iT zUk1&I0_}y-)8z5BZE;fd+}74s*CVWJi`|}T%?(A|@*n)5CTem3C`B<>x#!%cW6hZ) z9LX#+QtjHdeYrF$DypKbdgEZ;2FjEiWvRyj`C7KV9{s6q(uTWX$c17TAgIGrF94b< zXU)o|O}Ig8Ah5N~cBP1*pr%#fAi_Wn0ch2L>)NNIqN3vEir@LqLMb7CA}5~zddW>~ z0c(^X8>t|f9KrL)05Kd?@p^MQ{!HZ)g7aIy$AEk)#-;AyZW?Ix#Ev- zvB-QnrdAXK;7C+yS87%;;6;hkz#W2jwJmccf;BJ^Q}Bon;vQ2Oo%3j4CVp-N)(i!k z>Ra+4>3_Q_N+6$a$VJ?6gxcConW+v9z-_RHvvy&Ug<5O?hlAzhp+slQRE`_i zh>gX3u<+?Hs?si!0K-*-W6XkAOS@u>2>n?vw^<#Dpb~QR+1nUeT!SXirHa-(+9wyy zU-p*<4J|G^&NUrc@OlsY@a$^^2h)#bbZjiM6fHt^8E+eD&73WDc*|9D^uniO&uy{E zL1kLMiilNAlI#nrVu@ynCV<~y&f+S~H>#|mtEOoQ#hz`)Ql$o!7- zj5@k6V=_p%bZ&p`Wt3al+`fjV<@@g|OQw!y|Iot?_D^?8RqZ+VIx;ycxq#+rl$LgJ zNXarNpXgi+sn?t%pJ0*tEHR+_zcn@n2PWYRj8VL(?`5x59GYQZGr18<8UEv`^b z<(hsM;;~N-u+dh47e({qE#c~Yc{7Wr_bhnPG^TB!J!{S!L=7D5iSj?p>U=ulq&A%e zimB1%yn5OOHqat^=R-jUH>!C_70)@stMcB`5`Z@KV#Wo41wnzuP`xU()B}+JY-=Ps zIvVF1vS_5QFX(f@l3aM@iA3kV7PjCO<4$YYun`S8K5?JEp5h0knAk2nv0A&zaKJ zRK`z_g@B)*A2|fx4YN|dMAQ4QaZWW?uyK0lk_d3xuy__LYwP3A`y)3&PCSvbpN`GZ zT8LDn5>yLx=f4x)Da2d3Sd;G;k8Up+@qb#D=6xj&;QOs*Yni70c-C@9`#*{2g*IkQck6au3L+it}wEBchHwKlr(0j4f_uyav?tFb8^R(;H zo~w$YS~_djYQQy8FTfo?z(*F#milq!xXa@(%anv!HD`W*s2u=L>Q`V&qEP#Brz$EG zVM+-U8ZalL)uX3)v{mo7#l86w*~nA!348*+_dJ3!Y*O$b{p7f;_mn-5~; z$LTVXK+MR+6-CKnPZ&e7 zXo5w}S@UJMcdb^xidQlFwCdZ(D%r}}o{zi~SW=xeH8nfu-WIQXUv^fmR-a7voNf$U zAFt%Amf3!#^%Ji@M}fG7zh@5M`4jYz@*!@4L#=Z|0D!GMH$gDgde_)>s#o8hX?(EM zi=>&1H@^nM6_-iVSVkD}aq7?m5LC8QbR>jE{n#OL0fDP~f289=byQ0R8U384ca3Cr zKBz>~&_o$c8^(P(5e4_q)`}Up9|7W}r*+NWod7}CVIxF32BU*FQ>${e+eE!eyX$VY z=I8?LN!|JQ0v^nKCO~BW&E@;+V`jgEJ6r^YlyfIk_!h%p;t;`8PTa$Y>itq%UP^*1 z(s!;kb4uK84W?OEY^lMf5x#r>c*xlJc)drG0KFrC7?7TEs|Lx$YabCj4^^6WI>8KQ z?-}e2qKPTISlQ&EO?)-s(^w}z^D?z7l%U}yLQy<{fQOs4-iXY(QSIChs)HUB1OKRc z!Ves>NEMRAb0@pcGZ)Sz%nWtyVA2(;+nAct<^ud(;V0Vl_3PK^6<_ioPx>AFG01qw zzpfa2_ZR?B@!TA(6gOc)4&}}V?MfLoOjc~{qw9Mf&hIag^_j?G|Fm(R<_LLZ!2D^XiAU`UF#lHPRp)pO00%YO%{xM*r{)8WQo6;6Dh${Ju z3AYW*gDsUURnhsGCzWOe!B|Pc;t6M~0Twx2mZU}&;Kp9UarVe;$idGzS=q?K-A`P@ zT>-ITA+TSW6l#JwSh+xu5eGB%t7Nb7Db<|KQXD|;n41-_DP?sD`8L{N5bK{%c zzf>(V&)S}uA&6}Z5--rKco@omP^i;g+Dm?vDB$%B6QY<9K3Aqor17@6BEP8gQaz3D zHu>I9O^r7>#O;tdnqq-pO@sv>1GBMVhgZYHfcKep$_Y>~Ijqdj7ko-kEU7l?Xq#rfN0bD8 zO^6gc<>wVE9BO~nW?0~sAbzExG;AG_Gl@=y8Cne$nO1OWb z&f<2lJ2`3dwWXy+%6gqB#G8zvPc$DJjdl7`V8}kcSfD#RYBSfkI|g46P~c(4Gnb{` zbH9E8Y_VTgya|>ptyI6N{^wMg9SL$Jf|9`BlBlRwie*Pn-b}y`7UO}6@}If^K4`R| za@B8@eG`xmy4r# zwWOqk`f*pTrsGP#LJJVB-Iu!DCTP+Zv8}1FLs92daWK`iE1UO`?1}NBkVpl8 zwHJ4Qg#=1SgWhLc4%@g5Q0_Utb&Mu1B}tQeZt_!nnGkeR1}Mb%@cRCf!TM_ea~bdo z_r7XZzF|uRhv(>-rA$5zmN) zbt&XOEJmXx@n%gm#5ODcerab_8MP&4j$@?W;Vqs=j|*?6-*%=omG>rYdB!ywtSO#K zuWcnyfdZ+UmN* ztoe8q8th5OQg%gF6|;7`DY_&Awo}HkwX$=OT%B5Mw8DJ>Nt&%3zv&{SnL|ROnC2Br zTn`r;ff|-&#Q~-QC(wA%pB0Nz#WRyYT$v%rAx1Sjmp;bcTZFAyz8L>nQ4vtE^Zl>% z@Whiu(OSx9V2Au%zZ2yxJUp(515b&?Mh7T`JPzjT%(q-`^Pl$efpDPSz40;ZLy{uB zzZXC|G{`Z&%vfS8lFMt*lC6huW31Zh}BMDzs!+EBOXUssk+Cz;;Gze;CdA7ochJXUjy4o24l;{liLod$!+bZQq6kn6j4e z5Sr34#a;Rsf|E{&Q)FsrqhjVt6&h7)3r;1F#Z^?IX0h>@Mj<#2l6O+|(~RwPbsC_O zXYBwBvQ=P8F12maue!W+zoBM>?-{L?k!MNH0F~q24HKg8VEpKq z0;K%Mc)LS%(|Z@-O}-=6R;ns0%l_BP0FIJG7xmIUbdT<~#rXln9_)|7H?PxQRNtHE z$YKTK@Z$$2KVTg5ym)c>9T9tUboBd&ja?<-Fj|Qt$-iu>h&K3%v>Kxp_EeuU{6vjG z%Z=2$ldWt6Sk_q}hOKnvxIy8}OIRT6S%?JE!Hi5||J=U&yk9T3Jq!%XSXo4Wg7ITO z-=_BpnnK@!^Hgg4DSO8KaWs?fpT=;&08r-(At824O_vX}UCCelO-jc*kh@D}3C zxgi_CifHpXrMvgJm{Fv42xl1=e|D&Z> zf-_eXfP}W-*Mib`yuaS~rSdC$3?tiZi2C0#r&YMRM#?!ZQA!7N)4Rm&Crytz6)KOv zqvO$3i4x35xEU!*x`!L0|3KTqZP4H#ls#6jiO01krdT!&O5U@05REwA4|PZ86B{KE zqNz7(#c4iRMUinFs(MAdVIw3E;7Z4kBCmET(F8hSjQ+Cyac@F`JcHy~N+QjnNA`#Y zm?7{pb}zQ8=bKcTxD=U@_{Huf;|CwF|2^&b^ZBm8zeCB)wBog1P?h9}oN`58ubY## ziNL3G>ea{7X1W^b_m4+``6FA}Iy&HZS#TZIU%cgI&e9DD=gn0;c761Pk`Z?KrYW#W zs;a3?jE=7UjK)N4XB75A34!lTQWwPQ1b%>imTXaXvAwK7cW*7p29J0Z!pZ~CI*+fX z_n?1B4t)!=~%1ZOSkl@?p-T@P{RNxuKNW3%to!9w$IAB@=u zQ<6+&tAK!~-@eEG*Tex^?8cy<&s7_~Yt#=-U2~Q<37!`BSIZv!4yy3u#q_2>%a_Cf6EvD!-nQz${Z0@4zHAF9A>G5n=$N~pMHtl>clzBv+@6EO zjatWZZ}j$Ud%)uztf|(qf3iqUM@Pq{k1n=PJ0^3|84EB4Tvh1y(x2(~@3_Up)D)7> zm3a^yL-UNJV+FQ`EB!>Nr`)wz)QpE6eV*6#^8P%%S563OVNX$`tlW55G?k2NYPV=p(y2;e5li|nb2Kjj$UwfuR? zE^hr!y&ix7%%Sg#1rGdyso$QGF=zv$yR=L4gmES+{>MsH{VxAs765cn-_1n1-&_9u z8>jJs4;$&m0k`0+036d{ge~C-I0aGkr4MDBAE-O@Fwl`IXBA7P3Z)`w*nbm&4Y#xV zIE(Pi6W}mcIj96`{8e0kxohh;k)1s$TC&*sMcl+X6|9Kf2rSC1{Cw+Dyhv9jOhaUV#C5_Ze|$f zITxSst!cx8pJxCQ0lLV=PbsHwr?NmC=g+?M=}>2hk)>ZJTkldW<0FAcuXn)Kh1$gD zA^pjk9EQ5O0$wLHMbU~SNx&UcSB4IlhHvUX7S@b_B<}iVn^D0nje?q#PPt=lKQ}km z|KW6i+Gn>Ayjmc(fnh-*>~*r*9WtXuvO4G3%v$Zb7xh%D@HMaBjEBPv2$bz5z!x6b zs%18>uzKHr73@#QemC;G>)SN(+JA^!Bq}T{Oez9vl70iIjK$`4B=~*|MDMbQqWeV8 zGbg@H-*Y^F-gVN0k*fIYk9PP?f|sHkBn3-G!^To_2=vsI+?+}1;aUVW(A7b~OOoRL zy5-nB0p~!o0$><*7HRZW%$`$l@9hf+g#nZXJZF;-%?k z5(@uymGgKvLtt2vKr~e>y@8e6R;{L{CI%LiSuHOms4^RyBUAYZ*6if(|2Uk=9!ZZo z^?mWRVZ>M&Rt!=n?2xVinA3o$2eE-MURhaLrH#SEewOFaE<%AtpE!7SR!?AlP4us~ zCVTy;b#ek7{8xrj8xFf1S9zUPcNlQxL z`Ja0E`S@f-+Usev5PW)7X~2bo5G2olPzL`}<_t&~0LbOau|!H1ssq)FNO4j1NUd=F zsQozLq#K2pi0Jp$yzbz0qi?!wsTNY-#j#O|N;%LnMM)sFTqIZ#EWFucR%O$yMA2KW znLTj#$VkU)&Rzi88E_pp9nReUkmG6T4ftdWD=JBf7of42mrIr`{U@zOEwhWRqLzbo z(dj%(bryJNIzB&i3cLpm1a-BxhHgE<9gh-qD+PToBYmy%VG|ImoG7|?4JX-6(-*10 z>(KRzJ0VD1Y7|I1HWp!{K)r*0p%M#t*elBqP)k;gOL%GOiYioV)i5;KgH`zYlU4K$ z_;DN|axc5#W5uxrZ{bLOGAVi( zU{7a5K*)Kd-b_{#)#D&~ZrG*;#Pl$PJ~fH~;Nx+VKq7ii#7H`)q0xOfqLx}sYg^JM zA#LFj)G&|WW@1k(XKdsUpe}XeFR^Ho)aD%2>rExTaXH7m+sg(B34m-4am(v=bZp@h z@%Ck=K;;t6-7g|k*d50kr}IsRfXvBJ`@4aL{N};o^w(P_mpuRlbTaK#W2_m`aO4!4 z{CQVGJhH(uQN42AG!(VL2-xuq*a1PA``_1{I#t@HzWp0@mU{A>lm10$g?-z zk>wasWJ*qy4|O9aL>k=#;41J^ClL5~;-+2GZ#!<*qZ{=x?edg!_*wGojxf<1P)Re9 zq^ZQU%+gl{#@E-)n34;RJo!kTHQzE{1F&K(cE9lQx0kuMcjnJ<10-1hM^`Q0>1mf} zwq7!yKGITPHRJ;~DpEkfSA&txLHcZP%S4%y-K=J=Qj6^(B~fhh1Pwzi3lQ6^F{XX! zg96~0`T2pKd5;bfm4ARK3uN=&mdpy3*{m~;9LOhS2Iy3aI$NsAd|{Gv0y8f#r~E`G zvg&r6Bap5^)lP_9*A8t}Bs)6UKT!^>Rj=a;W+?WtDJr&8PehfU_dz4QRvbEUJ}hcVM@kUP<-HYgl3Bsl$Y3jHB;D9USLFl^hu%mhb)# z*Xb5({kDOYS2jHS{JUfWy|UTv+_5D!oVz}R4J7}vYh=+(^ggwyf6#maayHoPTeja$ zKLeAJ8s?asf_v9qMSL%W?4REf5fK6PJ_ zd*CC2K#0fr+gwrqEbF|E+?H>W#Oho0aEYgA5g)b^gov0pJuS`1Ywg*? zdcMz}3LEI~fXLOn`SY%avx5U*gfIJ%be*wxP1!(=eD)aI{_thSOzg0yj{xsN@TaOR z9SBCW8l))#Pe`5t4|JnUWn@o-Ixn|Y0}>|?VOi2IhtR7_wD*v>4>_8V=nH-n#Wl$wSz@c?5v&92ENMxYF@y|a_+35VkZxGs~b2j!>) zzPP?Z@4-L@0`p4pR0#CaMF*e~K!uJVp6cSm2Mos@MmEBg89jw|B z;I}6r{`A&@-TcfI74andC#MK%>=n^whfiGIKLT8}Nn~70{r6@7Xz6d4{DGGc`1km4 z?gh07MTKAvZ&k*!qmB=y41SbHHjY{V+eh0Big|MWOVF$Ph>Z`f@9(b;H{O?(m91!h zJwNHi76U9BkdXk24C(=w-AvGH!cCU~8pCa~K)fJTF%gf}bte>&LR^ z$|G%jPD)PcXYldpVY?fWhSw z)zGyNOxAT5zrO#?QCo5*>z4L5L0W;=g$ONFo#QfPTn|~7R(H15Kcstg8!xuJLI475 z(zD+!obSGyHyRMRUh4Hxehg8$a2Bw*=}!|oy7YM~O$^-Lf60%#JHaWdYN0Q27mKUb zN+}VZR_#oLk~eONZ4G~uXLDg6vO^6DjcUZMm);+fE|ry*QUyMo?&JpsK*=Vx5tnJh zZD7uVE0{QA0J;gVP%!-xVIg)=-KnGVlwec5N6kYY#F@XY^|dNdX23f!1g5cO1+Zm6 z^ij3UW%Dn01SWR>`+;Y8;fAt8b-$BwUCGsTfG28!&0+2;vC=1MlWwj?_3~xT&C|(f zyez#(ptQvwKAd!c$d6MRc@}gac(#g5Cy3t|HNK9liXb_Y@O{i*>NE|O`z6*la;zQ4 zBS9=vxfG~?=iaGP8LGW2qv2Yyp}#OyU`=Q4(4$0oxHP7G z%p++a?}hkX#%^X>c=M^(=wr82>x)~yV1(y#0@%J%chCKOK!OEudJt%e_t9Pou;3+y zt|n2Q7l>ZYygt5N?7GeF0>TA1B*`&4Erivvmihr*GCVaekJ5rRvc@KZrYk&fz(1iq zI=!|{>YhJ)?AUKd2-M6A72n;$h^I^Azl2SOKQ<`7-xE&;dYPc%U`2#<)0oM1@1Y*hT?3;xKvx`VFLk^09%atoHFi!#Wvrv(_$c@VpfufP7 zBkv*kVeDh>yOd1_`B%-_N#o&p@QQI!uY_R^H{~82_EBLR0Xm&MMyFz~A=4oLDo-1O zHAXx*ni;pVAVoG&Y_Z9(LW|`~9dY>ElzX^!nKXYEnO~5h)56Pzv?N}fqsc?{VDsn* zmW%_Ca0FBH;{Flnm8pGQ%pi?arz@Q~Kse*>Z)LSD^75?DEK!izG&d~mKB$wh8K#12 z&L<}(;?3eM&OuaUo%@XtgUtrTRP{%33^J*s*pXTElV z5ev+t$lO@VZGBr1?zpGmPhP9&Vor}Jm8jrJa`kb|Iirb&PIQkzMkBNbs0Aw4%`nEA z2#!7?I=rZ#S`+}~QYK}rC>vo$^!|fX-~lD$lQ4-urjZ1!j$Ba27loZKuEd)#w++I9*63HLze=SWS(>bKcqkv}qNe932i z)#(Beo1O_IUYZ<=o?-zlNztOYX{u$gWx&!m|(;JWcD~BE<^rHxDYOC?WL7jp{Z)wXOkmc%so}Kt- zaB+SxIU`v}$uPysfdqNnFKO?*SmMCBLDOvOHeL7m1%{#X7xpDaoO*RH&9hX3kZZYD zAhrtnE>tCib+L%j1r`c)3;+A8Nmj*X+%QoM(oPI6!#3dPuGaMRq-%*&*#10eggNNy zd~`Js^|=1=uIap7E~6AlLuq%?ol=gCl|Kmrl=HRg`^9%PkBi_Jkkjw?yPo!)e9HmH zEaOY_hGw05QK*RcrXT*^1d&yfp`L(evd{9^fVwof^vyf<56{Ss)hUUBpeh`|rYsY0 zXxw@nr+a+Pq3zn0jbK6d+$aVrv@3x&Zo9F#NH#JG`xt2tv)biXWFsAsll=a-hjn(} zJ-t8^t7q5<$vYl1P8>u1d&I)|J}$&?q-6R( z=6HdvtTM=OE)#;!RU9cu2AW!z^_1;Hch;EK+1b%>l|dT4h~dNSkQ`C5;ig`WX7$Ly z!9jc1$@9Nw&)HMaG1IhEN^JAQXj08vkUVh@BRQymac)#|-nuK>Qe@#nQ7O~4lAit1 z2b+`l3r@-|$m;TD{+Kp%baaH0JsurD9ht|ATwP47jZ9WoRpknK#{JUneL5!AnAAs%WG*pyFTpc=?S*YQnp$RDztirt+Ye#BX@=cBA_mXP8$mJ)MW&{{<0GJ7a!AK zd+|WbEiGk6A*errPDJpbd7URs1#UukeD&KajXbsVIJTxw(t(Kjv;mPc zG&bHjj_zCk^XGGlTHO|i&HuugKJ+-h74B#WRaNz>&@!7n_360vqmtuKqabS+5Zjaj z2$L!vs30J_N1~OOKe;Q{8hj2!Hm>yEA^-Ell##8zzCHlj*iu<`n)Ep{!2J*7nmLpZ z2?2_@KC`#MzJj^i2pSsZjaEGU((uUC6LTQv#6jf!yU-)?51&u=W!_dG*nAfkm;3Pt zep4r;>j94}Ktg=W@`gxB~LLmmJIEVSu1II1SM(wDesX$IVK^m3P$l~E2X%+J$Y zeo!iu(#*stZ8sKVHbMk8GzsOMB0SS@|ORv z2Ux;tWK1hzD+u-kR?g}JrvezICzFh_Bj4%mcL56Q??>)V$x)yX)!mtY`eYD#sAp`v zV)lE%vHAS=;qK0-VF9RAyGL6G-Hp7x9wR!dKo?TNtB@^%f0S$tA6XMnEzzWXTUOk? zz~l*4c^zZfqQILu+LU+e&_jiK1R~}R1eA`O2KEz^Cb%FlM>D}d@p6epjU(oj0!0*B zZ*TF;5DM=4f-BwL<*i>WG;ZVM=UGB_se&i3FlBtl4>N*H3z1OUk$RsFDosqh?_)jW zqUi;QJ0lvnD`-be4$nC`4=+kus<>6oyHTi%Ps9hMF2>Hhw?{KksJvFUbsiV;9~S_T zSD98Wn=Z8l2?Lk11oj@E(TTMmXckCrPf2CDKVr9x35cb6xTsxmHQwM|w<^)@x0()e z4)T*&{g6IzY*sQ(okwV32Jy5Om+m0-ZIu#DpgzL}zR_cCZ*MwUjF}(P5nWM;y}}Rt z{!StG)zHZ&7U@2Aa&p8xz4{!@iXXD*_~hMSF)Orsto)&5xRDELKQ>&_?EL1N{hm>= z=P{+=0_LV!kxh6nSW}BPHWjA3!FCe%)iOhcZ zxL#*_5f-8p)C^R+k}VEgm*>PG90p)-4Xdxu6FiPi5_5z zHwl#a$dwKb2}ZRlqxEy~EBaI!2s`c+z~BfB_;QDW4nWr+Wsy~4?@uc8P}UZ{V@;1$i@7oOtCoE?!^9Ig3;3A4$BOBK1hfu@~A;na1%S&EGmxB%9 zhUdnez>3-QSOr83>DltJrjNXP_YT}AD@iv3{{4d!4bI?}D~JzsL)z>G z4o}Q;-h23J$qg;@`+n~htL3w4)c@oWp$$C!aMRkU6E=INRvvjB;O3+!{lVy##8U|N zrvi1bWwsB@&aTe{>6AW?3xjOxNLh4Y`EN@+c?S^>!mf;*Ml2< z7Dgz`$^;}P9IUn{u@=Hundm>Zt-LyZ1E^F&k0zUfhgx~|-&F!&WR{KAbI`pg(*b#R z%ZmtId&yFzb;jX*kbGq^fxc=ep-GhXkvlqeZQb74dE?yGH)z3I{}+!8WB|b3vR!vr z6SxQpa-@A`yOgY|u8D)WXm?33>l!1_ceacEAgm!u4f_w>O{l279x~yk@h(p4_5DbZ z_lr=Jjw&A9uy`lHzc~vO5l)FleJ~!gUtDsZEjgdDT{Urtb(@^T%}ofO{=jc?;KNSF z_+eY;K%U5}U{<2ZnyOe^4j^}~Dy(UY?E401BM}hJVEn8Nn~qaAOgV^kV0>rN5(hshG2A6nvggek}0?7BQJ)1oAW0nQdaae(Tv#5s;mu;Vbe^{h+!yex_VP%%A^c zQH`3IoBI`9E6mP@mA>!vpFiw=989E7X;KLMQ65d0otpm;ZJlaB^%M$?eTy`q+v1u; zU;UDT4rX^Gtg9c4$_vunGF`my;G)s_^Z{u9x#k+GyRLxGk<9G?v*Lw&LU|0J*7)Hp z@I|{4Y6I?=NekIOu(Cx4af@gJZujTc+1XiI=$0zN$2}nQg6gq>3MAJarqtjnsZ(#@ z!J2YG1iw7Y-c(42OMy!9IbOYdVl&?J7U;KE4lfASSs0Reeo z4U;zDT3a3&ldChh{4p^#l~lby5J#Dvo6FcP$E(Xh)asO&gWIYI@G3%SwWye2f#U(%7NQb%pCJbk`yG?4a9$voW z?*W$_$--Lj@ZX@fQT+6kB~OocA)K7bmk1s2;*QmO;{X4-0BgYm^`WCVsN+M{25dsy zyv2$oJ;U&@hFiF_^mJP^rda$j1oDc1$QH3KdI2H|t{%?Wz4-RKAikhUpblEyyQfr% z?!#ZgLo>ZvA&6$B2@9w0wQ=(&J5r9>@268uVTzpX=1&lNpETY(m14C=|sxk?G||Q z-=j4!FCWl6XIzJgW$j$SsTpp*BOv!W0Yig7yH6M+5Ks0GxE8v{v@<$l1C=L9!5bv9 z>_mwpFd$H6b>-MorD?;}-qlGuY`x&Zv#ZGcX(lDB@Fv`hQjU%iGMZCFHJB$wMhU#g zeJuuRP@;*c2NhPZn#u1yHT~BD5PTMvzw+*p>6dC^ zSqsq?;YaCFQXGiASa!j4be!o-cHaG2s9)88X_lMjVZ3PZQ!&~aTsU}i#1JNh_Dys%PDheW*db&K^D-n|k#Cas5hW_n%CBqIfei9}}dN}Vmj%jMiFO}F&fV^b_6-LLmc+uHSL z2Izr=q^?j{i8~g9s;Or(cuFeKs8Z%HR9hL+?p7iHzNOcK<0IYR)-Pjn82e^VVtRgASdyt73;*%e~-n(lE~73WnwtD zW|T=WagT#=LtYoNQ>o#@`1^3za)FD+n+_U%MyMJhh?0o=9+l@&{2LOQY*iRc+~#F4 z7Hh-I&lC3qHmvR}(H9wRuGW7(GN2d#9%SrO!3pOkimp4tTSSFVL9#e3V#oY8=Q8!oYP>JVR0h!aV75>`L=GT?1p|vY<4tU&%~YC8Z|S;@|5cG$Egdn!QX;X-0O=>*X8ZmX-#YLJV{vyDzPR7-AUk(5SvD zmLTA&QGJi?=7d-H-kHO>YP7_D{AV>z4@K2UG69!#vZVWHh!eGuZWJwP)Z&swOiRkPRbqvy$=Qk`W7W#s??#D-KngJ~C4zfw3-7N(5}ouK zt2YYrFXK(FZ~c5#lP*PFc7M{^z_aD>BJm^-Nf&AGzx>iIY%3gV?>29I-Zgck^l9Kl zl0V5iW{r%339f_!xb_~Vr~6z-U!~qiws$G{7%=D}9Je7bu0H*TOJ~xBiYzuKH5L0L zHsE%Y^yxJBbr}thH&sFEtzZvdEv419_(PAi`EwtV4rUPLw1hPopz0bfMhzil4kPaa zbpoV}Lg*tG4fGVQy*P(%i0d;SOp7a>wq`!DRxgoI zOF9LF8DH z+?qPt%Y+rZ4sKxcsU!!toN&^4MR+E=G@C&}sZoEq0I1odpIfa}nyoS?6q6Hg zxA=g0J2PRYLcLol;#)*^1=dm80tD*7jS%_$1UR1f7NeStc--i|TFH*y6QBVB72UN} z`EMMK3-}QXK0ahhZluws|E_*~;(P^M|NFFVvQRGqCnzCE6Os*tYDWAGa|eNTfa ziD$U{jy*{A;J^D!G0D2 zSh4I1TEb)Uf8spJ2C*#{iAg0%&zE7_(BLrkD7x@LtH-%HIpUs-VzWf>N#`ffv^=c{ ziXF`q9Y1vCVbUq^m!bq0`cB{so^Gw(=!m7u-+4@R?r;AtRDb;9{Af|-wePFj z`KLQd?gs6LcpK5)@)PwFWAFO5Pp<-b8UudpOT6~N9Lm@Wp7>~s z4qVV;ffP@xoOxN6cEC3Sl=1Q305mY4WA(Ow;1Yb%p3QSVf9liWi~1d{sq=oVr+xzZ zdts7zcYmV~B`J?8<3GN{e`V<*Nz;D%p9zR??xK?9*25(z2Y6G@0D&M%Wt(+MLd_IQ zTK7qtHrZf;Mv<~wLpNadsBBns)wu4#n+GJd%*0sh9%5+nm6et5R@HWvo}&t^IEjJO z?j8#Y(_cHOv*9pLtLb0UGv)h)Xre!;C$Q&H_d5ON1y81x`Zpp)-O+RqfKF_0#~2tO z-L#cCOlsQ;<+oXq6$aeAs54tkp}4uaTfkVmOb|_!!*2JhHl7sR)sS>qc!zG9lfP~z zcJ2LOCuHknYl9{*Y5(QD`%ZLXT+a%3zvX9s27tvw2KV*B`@==rf<#pcMcTkEi0L-` z1kNTJUb&x@wNquN9F-4(%uj+oAk^xpe* zQhwV@p$qYqkKvywaxf<7$Cd=pGEigZ<^(mp8Xu}oTlYKxC5R!HE{Wwb%n6|!%+_!z zJo0yUuQBCG{hA_K#7_6s21h{*P!slBrbb54ID>LQCh%`HwullU``gz&Vd*mF@ztdw z_qkX9{NebbYALlKzIn zv&VSe9#b6tu{zB!?-pu`L|Q|$k;fc4 zWsjY%{tOQnFW!B70-s|WUP@&C_0zjV85uL4X9Ajs-4Qn8h2K3~sV@^rcH6x!>&qPO z7Hh0F&w3IMoA%|Pv}kK9V@uMFlZikJ8q=LCh>x)qTE=n9ksQw&ws zIn*M2ewcpP@=`;!+Vj<(uyusv=;wXtOJPGai2nYjmDSCt2}Xd14(}dmC;z^-LX?+J z=nQqpNmsM+^Ya4@BLlhQ3)on0E@69$VdQ7Mbh_AtDa`}B5!nVtZ)*!HXRD3xSeHFS zkDUB=VU#P%9UmaPZ1Tk##xPzoKb|poM_LkdwADEg7*aO1oZ)-Bx|MtMYx5Y(ma=1} z>~=Ebae$$ zbG^h@YPu@PZ(n+1AjWff)OCis^`t!#*+-)b>F=SpRzX{Sz4`p@w94-h^jI_ns@ZG- z#71Ol-jN66)PtW17uCdFtba-@!tP!YR?;DtP+42f6?m9a2O)*{>$sy+9}2FPNg~V+QrEx8<;p*Y`%ue#@Dfi;# z-O)vTbFt<5x$C`@oqpSOiJ0j4J zHoHMR%^IhF$(dR zHis*UIV08#{8!l76#XoT1hZ6pgpZ7}X3UH7ij2FjUT#g(bnW5n5oh|gjs>}%p{63` zG@+%OU|tO{%PA_)#y822Ol`+3`YKG+PhMP6zH=$L{z?sHYb1U zOvqp3Z80@m*_1b9zVtA`hXuZM)FaG$A{ z_pKfxmyT!b-{xQKF}A(!d{gF6`I~W3D{zIVFmy1jny1Yn3&%bOoHZ3=HME(+R%6nG z8jc?+-WAkL(RY`2<0qr#__#2sy|w4C&cMfv99Cq&qZ3Z9XXv17v$A9JY@1eHBI96u z3{LiH^{vD;gd9{0=5O>ylo;D9Qp&lMHz!nh5r}ZfH5l)n`o}(8NmizrVWCCBY9{91 zoKMY;D&}IMR!SIYwBn-0GY83Ib~a4j(%M7^7~*9oTKzC6%x_XF?>mx5x*cWBe!ls; zn&|4c47=>ERaGn%uHPj(_hS?`mUKQ24h!*{G3PSPhE7{#%1X)^G-}#iWmuh~ox>*R z_XmEg_=)eh`F63`>c6!arB~%^2N=E*PU3K^R=AvpH3(@=@RUqEDJz%pWULL@_{q*m zoHC}q`7t>>Hj1~Ay^IJ3h;=3i63ymPfY++>u-)Af-JyIr+EdbaisN9%{cH z@;0q#Xb_@d#?6vbtPL=4NHx>Dl?$Ako;KI(`b7Fd=2@X$4DDJ5KlR7twbMKW6vaS> zlOTp5?`;IT4Bdm#G`7#+Zcjw)lLv}OBrmcvH81y%FJMDfp`W6y_4jvTX^HZS zH83B*i#7fFxRv@}X;MHP;V_Q!v5C!YVjZzl?FrzT$h7!b5i@@5dV{H#xCN+I3yZ=`4wqbnO6V>vxdOPm|U6tzk+F0qOG3@N#(Dy6MAT5K0^8F-;^ku*( zA^+u$k>;+__d4H+XBy(B{$KBe8^9_&+?8aa_pNNTGv$mTu?4M zezTBQqPJv%#r%a<^rEGaRt6ZD$qaANz%^5P zFkyzy$^4q9-e30v@rHX~)sKrehoWAaKUP*&U^dF#t_vTOsQU^ECua-JGMjK>L$PGX zum4~yHZ=v5pBlqfunECM3@cp=vN3!8=p>k8)|Tc<98L3F-P~H%OgjmKKAiMk93T^@ zqyzt|Kf4^yc=GjVkW)81w2XDobE|0ejqc2B&0E3`K1irSc*~n~0nJo9xULsl^9DN$ zOFX%zG?ZUNDiY=1@h8U!Aynz>4-E6AW>}(?rm`;v{C>qxM!b61fKEFsNbzfB$=&j zEN5!4*xA~uyz?umXg+l9<})uYa#4+m4IM6hJIC6~s8Xp`N{Fc9y?Kp8DKPN+Wf$@C zw{#Vy^`f?sKaJyI zDLCD7pL}>c9uKycx5|kw%5FeH0i&5!G_#NB8WZ=E6dUyx(W#fGxnZYyJaOZOD7j@0 zv))XEeqa=G&3FT3K!5=N)G6neJ;|yu9J&7-AaJFN++!mpC0$Q*>rtsXJ|>s^ zsYcqS&Is1=E#1;%+{{+I1nkRNo-J`KZ1b4+>&b2(jl|Ni>ID8D)a)QEZj5u*2cy#g@;9Cc#3#b% zv||Pvq9Y>ZWx+Pin*K&Ynk_y-PbcctJw2VqLxc+k+S^oHi*x{MzmHDziNLF{dFr$^9L? z8DdK}Sil3#1XP1OnF`+QBA8Miw3ES4q&RpsumBG~{CSW)46_uKS(`>3E|To>!QJnM zs3|tL(db4Lp_mOowKT3gdg`*L-N3bdu-q*un?7Vy@Jx8K*>o@d+4aiT^M#gmW&oNw zIH z;#o!}b>GEwpY&Nb?d^eg{_Sqp&G}+tq*1LCjUp25L`LrSGRb#&77Q)bUo0zF5>`?C z;R1O=OnpbFx2cm-p`;BQ*5+1Mu{wD;}ky`1!7xtE5J4Y&;K_~iFT8CVCo(X@h*nk z-Ebw)`^2EP7`K#u3i)99%dPk7R;8 zt^Yru(rL!#8S|?DT41e+d}CZn9E;r^QO4sGN%sxqtkDR(GlSGWP!>rhJ@h?I9-no)jc*NWWgFQ*b5I_#vEpNk?zWqAS^UEhC(^w3lI@KIyK`(>9OoeQKpD+s zq#; z_n^$-w})7-hnfZQ>L|EgRG4(RNI(r_^!b%MOI6Hg5nEY^+G$CDrsp|e{~9Tj0oqK>kn+ID3y_)R znQfigI9oBLF7A^W#1Vb_D}KH7IWX?i_Li5wtu30JmF0~&U%zc#;q6KJ;#mhAf{dTc zmBn=ONL&cBv%h(24j8xcOs9e(EmF|!d403mX*#9qu+cdRbXJ+4868ZPKI7Zz@TbbR z$v;leEg$Y!2QcbrQRBk6;I6JPWgGo#Yfriv5&D2SBHn!sSNi9e0iJtL*PhiP_E^1? z$t@`O%%xuc)wOJ*@ZHo^aQl954|$)v=@%`N)UxeQl;fbro!j$@j_ADGJP+}k@II}= zrG|fbXzG*m;=%B2#6PRDq;E;L}eVv6S< z;xl5xNqtD}a6*a{W@6*)yi0p`NDG#?e*QwZF#&0?EPQPt9ZZvWWnLUVgC;m7M!rm@3Vs)*1_4b~bLVUhNALlYB#Biz~T zYZk6bj(UzZo-6Tg2BBi$FKNY=u&I?WsTFZ6f8LtcGIH0=_7%vk5El|UW)6|Rjmpk> zRL+r}w_5X-sxKq(b*7HuYn#|#>@E!K;Y_kzU-#$jPZo}sl}#POi4~KHaSSeQ-W2yM ztp+V_`0cHKsk-_?8}V6I92K1%A43HlX@_!!aa$Ka7Gfz3hGu3gY`wG2P4Y!Q0DAJR zi0Q#>%lUu#t9B!K&bO3*QIN za(^{Ns935hKM7yO5nb5z7DM>K5F4tb%$1Okp!tNuDqm}I`{{fwb9I3Ykp_YL4>m;6 zAv|5ji4%#2hc&%_455K27AC~-l`JsiQmRaEuS!gq6v#d_cCNlPo&CMRJ35^8p9D9* z8%t`%{ML^ZK`QLqX8p@!N+U~|nJ=ez7%?Jb;H_z#U{J{`w!R3f9Ls+e31ay$dGdvv znJoPK_A)xW3>o2S)J!UFlsAZ8TKo7<@!9Z* z?P1+hXRb4@)Xgpt>L_D^sBeF<-eKfPuuwra>wDd@7S0i+em8VuJfXNdzt zeHwXrD57idu|0f$;-OZ(PD+r(U7#aaOy}9RAU%iJUWWX;5w{$`9o3ju@DrA*dmEdNi~e}%ig zQD_I}0`wg-^kpxqhOn3*yJ#80-buMR{r3#@p9k-->YwjhaSybtseTuD8fkW zK%MADPz@ktbg3~Ud;QvsTFh3GraU_MY{%#ajT6zNj8Mxna>`jdvND2cDJrbaOhXgb zwCZ0@Qf0`W0x}DQD4-7u5cyr{N-c3FV|P; z(HIi>kCqTSzaMgUwYebMEo&A3i=_cE+^7rnTcY;w8qrrrq28KJvUI~su9yX(>TjX| zD+_9WL5j(jvEWq$vBb+F+d46PjHM~s4o9;uUJkal(JCrv`fvXX)E&yc;s@XSa8cCu5QUiPWz5}9j*vWH^N00XBTYTX0opa7hMu*7i8Qj5 zD@L3{r3=HhqRHHS+89G>To*_N4tp^!Kyma{`t>|{*eW(G5tKkRhHE${{!*r}EMvqY z!$zz31a?ah{GJ?Sfm&10H^M%rKjWaYdWkbVj)}a4M>c-TO|;c}7aD&nS@cw-t&=vl z<*ov$fV~xAv!K(-^z{4VHu!;t&P(-PnE1Nd6G*&WO@N3Flz#O6)h$^q{I)1T$bVlm zVW<4Vm-}B)Eo^RhI6JQLB%2K+b{JD~t0w2BVj>mGIWVZz&hE|{Ji+PiPe=$W_<)yW z6ETbMD_*8gt+qpVi!n?YMHRoJ6LMW7>i=WDSls{D{SE9hP(qooC+`ByXE%ps7A{aq@-@bvT?jx7sH zJPa_`oI|_50TRRLY*YO0GoH+?YEELTw84tnln1esxbehq6jnzum;mh zUf#+6MqwPat26b|yiN6QM`s#=?(@k_=g$de1zy4Z!eF4LA<^wF6W#-LbME)>keY8o z|H?0hk#P?9cl zh~OQ;x=N7Bs^-#0b#mzAiW-94?!bL7afku{+YuZt&lox!%MltcsLVG0_Zr|j^>LwE zQZYQ!p~gTt_^Lk~YClN z;w4TgA}sRNfAh!jep`ILZa}52x`RjR(E5s&bf4m7{qw-Uz@ZFoV640pIWR^@e%|ow z=t#hpV02J6ucCsTi+B_ke)7nw4!Y^Y4rzV(-ksGfUr-pd^=jg*&JW3#8I8Fzd?mI1 zzOp4B!Wu;1L=lfnU1f2|Vwh$%}y7z za9NL{y1Ke*kIa`7r!K_$%iZAtlSsOybX$gy&316v_Rk7EFo}m5$uhsX3DpZDtBl=v ze;C>mK90W>u^q=*LD1wTLN|noZ0+

liG98Y)}`@iD4nJ9R_#e!dWpmVT|^EuO!` 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%0AaDB>HI&cSNYYtSRdsQ1#c8P;<<9Nj__Ph{oTkZi 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 U%$!E6-hz*uw31YXgh}B40uz%Sxc~qF literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png new file mode 100644 index 0000000000000000000000000000000000000000..7b695267dfbf81c620db64b7db33f10785fdbc4a GIT binary patch literal 72211 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 J6=KGL{|oa`w*vqG literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularScissorSegmentation1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/circularScissorSegmentation1.png new file mode 100644 index 0000000000000000000000000000000000000000..232405c2977db2362cc5b4de0316d63ba0bbc60e GIT binary patch literal 70808 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png new file mode 100644 index 0000000000000000000000000000000000000000..839d77b4317f937368bd9d13e10f1167a323b92b GIT binary patch literal 70776 zcmeFY^;cEh`vt0iNOyyj#G$(z=>}4xNmy*!*%G~ep{%)|Nx7`-LsMS#JF*23L`6}}x zZumK8YJreAB?5s{E;Q+!HmKoSZU(p8m7zF1-4A=5j4yP^sPFgrInspXWaR2-ZAAs& zjx^Z*Zm>OS4ZP2bI~7Q%(3OS8ckN)Z-DHwnE-$eu6lI zA<&{Krl`q_c7#3}SFg+J5 z7QA*`dUMky=De<0Ur)HX%S!RT&rz9JErwS&ugmhvV z)^pCrSlDBqVtYHKb$QP3eK+^2fWQqrY!-VfwRL%Hf9dMxwJhs^dbR!ko`F1`Z^U@D z^I>IBURu4=kn!Op2ws(qxjlBQ#ntb=zp8nir6n^D^2E<~m1E>r>qTG-B_-x;R+N*= zWc!^y_H?Mshp$vWd-Qa9xEx0=;uA}8J$`#Z(RI0~$=*DD@c7ep%)egOpzw7ETCVXv z{Fg6ZnuY%@55=-ah6Rx-3-kRhU+0Nki{D{ROSRFHSbv;jL~oURA-O@*pAq|Zmi!Dxp# zI5_2>-<{ovwI1+Ft3U1xu|3TmF7KSGH?0Qv(k1E{7#LihRkN|?B?azGPoHg_+O_#R zg!>Uow#~n!1e>Tw<(S^(JEgq2|70 z#qI55LA!>e_H(!FZ{~wL!Fg_2}q#%UkuNtIn&Are%+%y4A@;pdahws$_H>Bh8B}rHwq{X00yIka?2RAD3 z{!HxYtZt6ky$yV%DG&1RQY>_xs}D|HIm>=pa%UN` zY0wAHzg%w_mj{8aIV}u3TAh~KK%MOImz511nmSfqDfp<$iSGvr+w?3Uo@L!(&7f2Ow0n&JD(v5PL*XX*NS%x<~$RHqeW`#Qf${emW5 zFSqhiBPO{p5lX1qC|dX%Ev=isst&6Gb3Gxs){_Lf|Lwol59I|raV?OBtL1WZ4n$o6 z4;M$G_^FaAhy1ZS-YFL7i17W+c1z?K;hjem0xstKWGex82h^P)ufaRnzAeqD)3b)q zSrdc2*80(~_dO3H#FTurXXp&Q9uhkAx;p1}_VeQWc4kaw%cG2n00&*GnX%!?7;$J4 zB0>|)8l9Y+T!V&pT{cvos0SXu45Y;P7##nl+fY(+-Jq71TnBG!%jdz@XRg}Vb2%en zP^6IsPVmX=m-BT~Sy`@{6+6-QrGsvhKdn`H5QHm_Hbcf_j8}po0o(5>?&dEKmIR(* z$o#MBxc0iy(l!4sb8)?q_MVE;_0xfzFEa=5-&c44p^(bY-nr?dKtkYF zb|oubJ@RZbTx#^~FsjwP@8j#th5V{AY$GtxA^RNiU&`)8De+f86iVlW?wZ=|{qBdS zKJ`=wQ7K;!>jm!OW7swt4jnD6T9QvKf`X{(q5(jB;BIRhz(zl)Xr`<)8 z6{M--*PQ0O2EnOrO3fVspBJjNsRC6H!%9lKWG!K4@jGgKtp+$tl+k+?~Nm z&DnEXu_TJhOTwom!;sBaH=JV`(!is|LfUO5kC9QH($s3uE~mwbbmAw&2q!H}$b;zf z3zr23LM1=^D{DJZ3f09Bg+u0nLkj^R(fA+w!ct2zlIHrx+ifr{9s0wEB4>{vw~(BWrNmzqK=KoKnZLFy!{x zPPHCl_SVu8QC7bAdQ=`&M~`LIV>V%>sWoH5{&mnC36`ri;7m5>9^6fdr(CNG3MpBN zLR20C%8L_$IN{R)#)n8-%>T6rCZk$=Y4s`vy0K#tEiFvp>p#1ykB!>pzAK)AzNg{F zo`#P62G!PQWw%On@K-oU2od|;ChT}97kB>s&Un(fvx^5FB4b?2Q+C{V(#}(REAq>u zFU79A4;-hdl>hG*9y;Ywc?N+pX}_3`{Ev2@L}#tgGan!-^RO1qu4eI(yRSL!t1tea(N?eL?c=&h&D>d1DFYLUJDDXr zQ3%u&%D#TWe<~Y5goN;^`pu2D6g9rx$n-rOPqT-=clQ|xGrwNZK886$q8 z#*E3MF!|c}I9TufV4OO{6nKpq+)W5wqt|M{jwTLUkkTpdbdAEVm|i>8CUXE;y&?Xyb2*-3HJla-hA&i9Gia z>30TeB$(C6%tVF(Yh8g|v@Ta!r!Uy?;-Ofl&mLXbHt2V)dK%6-XZEZ?qw>zHn)7CC zW^5Wf+74PBDz(p4CT}U8uKUM!kefFt{|h?CKL8LZE+00OPG@aw-EQsk;-gZ{U zLDmC1SD!R#aAIT(=PbBoX>b_uP?|xtdp^az_Iqm2jhO)ECb;aNqowuO9r*t2Y{F)S zXCzcIclGG4RppFLuUReVII8I@?YTYi|9eLaQQuv#=VH8^g+8=1Rj}66zeuDQ;f8bn zb?5QA3OimQ4i1T8oDj56X-@nVWj6H-`xic)M|>G09&IB-XwZSKbC8RQ8GJ8;yTvKT z?Rc4z6)Lsg|9TlIY<$%hdGvqxdEERFROoQU((?NaY%b^YMc~{4W7O%P+-ApXl`kI~GyTe06LvWooNkkG=gjHu;99d<3Jje_ zhYSC%2`dxqeeV?$_Fa#**p1<_F$zJq2uHu*9?$=Ezn4`*eV7wX1T3YUgo`yPe7jiUtFrWH` z>7|3T4qtrfG~cO=%gQcc8Hvf}eLbgAVE&TsA7PFaS zfGQuI9a!GK{umR;~=c)gw2-Dp(kF4J^48Hvu6b zzO?sQ#;TvG>ag_3|KYsIr}On_rozMYDzGyz-`7r11QclB3G{QI1%Cw_T?HE;^Ir|u zDV>8wm=E-5XGI%}AtpoA(Vg1g z&LeQwu`|0R4?{v8nif9@o}l0L@%+C_w^Z}jmJ8way#f3Gpkg{woY$MOs8fZmKn2)x zjzbe}B*Jz_yj;Q5-ZxWOOem!Yls#giQd?0yNt3Y<=2NL{%bT$jOSZtyR}A@e$k$=b zK@wv{vMOnG)LLb~l%-OvUkTP%iW)n*mwAW;4YAkE+0?Y#In(#30|dWO-{_D3g*J(s z;p*ALD%&=MA*zm+=r;};YhtnAbR%?)U52CcDAD$H+@43m=5=$>Z`> zW$|$%rI4BA@#bY|+28qj zBD=@?d%sdm8{UjGr4JuI6irxV@;m=@&U6#(@IKo{^^ax6`#+3ZVW)>f*@=n2)hf5S zAoE5&$(%Dyr5L*gx3e@012Nc+w;U#jEW~&%N25_P$Ct$)U!jR7ou){4<+v>Pz2Zxe zDXIMPS!c2jmY^4umX-!|b$$PifPLg`L>(_zJcTxW=q4DI*M9sHwa8jUMa3v(u0C8P#s~q*3zB%rT(!1k4~0Uey9e|O zp9&)#yh1{>PHqtqF#&766j*DP3Oyc5ZuyBYrlD|f{nEkZ`a1RKkM9zpl2of#ulgt4 z{n?4Yt4nIl_}^VxaDpP}chmd7>N1L7JhUM8y;+WS%6<7;RhI}}Yw2o^`b?U*xHYe0 z)w|jX7s~Nn55ut`OU_8Ol6RH24U34Ys+T?tODfr!=?5W_(HXo4V>`Z8<+lMHM&Ybi z!kG4-kM7coZaP&jk}crf(J@{|Eai{z2_!~6RBA~qfj^r zyP%_|Hx9VjDz9q&`zbr?4D-J_JBpe&0f{2)cmBD?PUB07#XrBdf9`M3|2tbw2_rm6 zfp*Wk=;)=NvDQqk={b5nY2-Ohq&~OL_*vdbb6Hu84G$68Vxv6~BF>;34JR1}c$)H= zGVOBEM#(VVw1N8N(4=U7banR-kYliN^`Hj9LqoK7uxVOKa=kiQt%lvEu)Jd}-uz!W zxc=PZCl*vOoEzD4nXtlJQ)pXuXwU~$HfM~FyK?$yE(~hN3-dM-CeO*tJQsGfwvH@W zhFz4+lodm;V0eoCeSKlj+ztLP)9?C~pi89FjUI(;i&Oq^42R~L5+SiJ9W>f60qg=b z9jX(|!ZcAsQ5tIs`z0bEbBAD0)GWH6R==E}Q^H=c`X~+b=cRx2+y= zsW?Kz(823m$x1d>!S>up-pX%sbQrPWp{QTD8#c|s)IHq|Q=0)~V&&rFNNZ7)Yey+7 z`#HEyHHv_2?y>0!c-rGmauB8XV*b zxYlI{koiqZrJ5)n0Dy102te6|$KL7cj&sM@b|tRBpuruwpelX}zuhkrpbWy0Wso zhH>u72`kDZ55uMjtNF%dJKpHtysuA`wKyfyiGu~!>9HFKAWqqlVCV}6cL4xoZ@FOc zG}?37GLXkv)-M3KW5w+h;bz!0V-xQNt^LsfUc>GuVCdCz!Sl7uwjLgh`jus6pnS?- zrY*_J#0Aii$6+D{2fxH57jQv9iC8?UecxZzvYl?u=}r6}Y*-lwb%&JCA@l23N|bSB zXdt#!e%vf~<MC`5mg&iKk@B6ye-S#!$Dt0x6?i4mcFQ#i%} zXl2=<$*3CiFKS=b)HC7g)gwNV7@rRENGTIX@VLxFjrQruNVlLbG}`Y|5fAKm8#U+y z)MZCPbUR_w0OD#coG%!oq+qOhYImK&qZcD;@9qW25~awV#9j(=Nfm#pSw{ ztOIHtlwD~G4FPWYS=t3I8Y0V(q@eO>Ng1R6S-hM%I}w&>quqiAGr`rtlB@?C6;^cb zmtTOd<6MeUQhuavD825?8Tmjw8^k5l82=UJIIU6}6-LyEG;9rm zV))_X*xm(bpF_@MGJ)()_$oy+HrD9`as2`{;*{(}Xk{}tpildpmsqFsExS$WtNz<| zFQ}=V-F_IU!@$m2ku^z}#C1`q2pPs*XIuqbVOANq%N!?C6z)_H!B;Mq9&K4l zbb81&1U1Y<+#?_ABUNcM(U_h`hnN!Gqv#vYU8oel8Dc80gS9s3kGKQ0g(tmc<1(>8 zY$8n@-AlPjNI(FLL!GHq=7kyU^QE#wl&HA8g?gEXjbK>nxyW=H!p zv4uWV7ho1zxb7cTYiaknA+d+pS+POio|`1aA|@^lHL86M7GL8Ew}5Yo7d!+|!-Y@B zf}M+W-b9Io-hNfYos{V(p6AQ#p98waEVZT&02dl5IPgZ!b z3>qs!g4v{lKu{I(iVSx+?%S3#vmBKitB)H#wCrKUsQF zq&o7V><4b>&u~eqM`h*YbaIT15E_rG*bM-r(MbXA3iT81YHs%0pRbL6@XV2IzaI6h zx?f`}|JzWi$(W21DhVVzQ`6_1Jy#E2!mKVHneh6R1f|>s!oq;-{+z`&X17WM2(hfJ zBo?QrH1y{ts3>yY8t(fvulj@Zt+`2<2WgHvjK&)6=_({Az&FRvoL&!nsIP(n*alKn zobvd3BhL79eH#kk0qdvzEKR@bOreM<1y~JVwxygJFYgIkxL^HsYi_P0jg*2k@3pFU z$R{A_yuQ5a!O+r595koF8QgN2nwt72@@>>`m&6^r5ThXiNIGE!sv*EvgXYK2OvFNb zQ`xP|?ErNprJ#@{Tm@b2LeQrl)E<=3@h+|cfP>V-Li@+eIa{mpJ!$wXEkTwV&Q;FA z?y(NgiTxY&8;6;Mg^YV`SU*ZQ069@E^-nC(_}a`NO{vtn%}mkGDr@zCJt^^Hm$URQZ?jA z;7T2@djnNP42DhaIq@rH7K-4zWcH~yvyCRO<8i6Nkr(MQPcnp|g}Id2FZG(me|m|^ z

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 VC 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 X%J!7{$9cYT)JLc*>nK$#SVsIW&K%`K literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/sphereBrush.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/sphereBrush.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebb860465ac6e4dc33dfb08f877f9f6f7041bec GIT binary patch literal 72327 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 z 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 IWzApyFLmnT-T(jq literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushBoneSegment1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushBoneSegment1.png new file mode 100644 index 0000000000000000000000000000000000000000..d62be6d05b9281494b1df1c608c2f54b50382328 GIT binary patch literal 68991 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png new file mode 100644 index 0000000000000000000000000000000000000000..57ba33c5a1ef812b03a378645fcda90ea405e126 GIT binary patch literal 70063 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 z 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%0A>-!BAM~>$NFy=^8V*a~2 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 HS_S?ujVVEJ literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png b/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/circularEraserSegmentation2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1be8221feac4aaa8fd544a28670ffa14a78d5f GIT binary patch literal 81319 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

ZhWEXlD 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 ahPY#&uU<|le)kXXXQ*qUQ*h&9#Qy=U^oA4w literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png b/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdConfirmedContour.png new file mode 100644 index 0000000000000000000000000000000000000000..71312dbde04c546431dfc56ba4d4473de5c4a74f GIT binary patch literal 79585 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�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%0D45jxJ89 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 z zPCxP%ae?J{8V8>D(LB9xJw&FP*znGkb-5Pw<18JE0*O>n`;fdYW2t z{(>E-$WXU_8ujsn8D^dAnGi)w+~3{yxh2t&O(i`2?;XzFK6b%>obhFNqw99I+RRjS z!}LhbHgYBV{Z$mhPIF|&_QK*nNgv#Q;huDV0b8#fTuQp{s)8_EYtsW?ZdiUJ<^2vT z^|h~Gcm62K*s-b{{zMo4(b$z3Kl-lg))r-|a`zha<(J z$4?JR-@FxJCjjEjW&pn%9gzfxbV6_BspJ8$&WB7N2wy<5q`c%$nVeV^KMMNS!rIYG zl@1~xvF=e+P_2(CUFdR(YQ4Bt%w~k43jCSNJCMFVE!FFoyXu}k0*bSUU8X0^5aUoK zkp=1jfP}#WvO&}w0ZIn9bEIWrhP;M!$5n6w&RvoN%kq(%hQ)tINhv7eyU)L}kDo1= zffF#+05sglde5I$;mPX*m~&~NS!Tw_opf^rWes_eRnOC|qb))mfVJMVbk88ljqKU0qY2)X zl_dzURrx9*Zq$ycsX7uvt-K5s2ksTfx@O9iMOI|kZjk)#0{3bc~erNoR!5&;6JBv=ds3+5?h1_{rTCa=g=89zLf9JjCn#H zDN3C#X`(p=na^_ER+8lc(GU4%*_RL7(llax#zROo?hXgv;o2cD-P$oY66l#+>N1Ry z+~#O&;DMbWbPVEPC{7EtiCO{)8csFk2N=&ch`YU!bECm$@5?+DI-3Rk=jM4UZr`^S zS$OF^ufo~EL36Zz3b5eW87F&RD%pO;C5m$aj@9(1kBXpPv;de(XB#3Wbq>u=hF%=? zx))ugDJYw0u;mk^$36Zc>nJMkKMkow0b@UJ9T1_p4ipibBbvn6P_p%a3# zp4XJbCBQ@jk;YRailUbX04mL`aB5q$Xq?v|nau4M|yRBnjUsoTod9`Kg;Fm3) zUHx4aN7wO{hV5rT819<1VOafoi1E1n^f-Zi4p`84->2Nt5ZNc2a|b5^pprv9d-{GH zh<1Oz^N1iXYRbkAakhT^M!VR--;AIiW!Dp__X-GmzY3Wp5d|+rnam!;m0x!o!dnYC zZF4fg!x3w({t5}xD5u{EJLt?-`G_C58tM`9*S{Y}!@c!F3)A+H9{WnbALs4FELHne z|LRqY=6rhJX6X2YmRzU-vMQo&2#et9J(qQh#P|fHtye&$nL2!_ApZW;tIi_oJFI%) zW9#{z83jpat9$U)@?TSrd=~Q9B42XGp_+NuRdc}jG--jW2%KAM^6@9yE^9|@cf`8O zM?j`WP@yh-Q=ui-wlZY(OF6uhq6?x~m(;Cimd8w5KA`EXF*>0T0S<}Xby_`gSsaH7ugH-R$9@Kx|)xYoO5BKg5Y;yG9>GjEb^||(q z8lDAz&rgP{K)O3ZhaXHC%%CsWgca}Jx7hG~Z#TMwzL|wLF4^t;lXEjMxKF*BGZ7?H zz)gHqa_oZmZgml&bzs*7KiP90dWa*efDbHnfeZMm#$d+kWu=Jj#y{QMB+M>O7V|(M z0(CthrV@q%;&d5(%1ilF$^ht|xW_c&K*C&bWLKc9ys|VWW~h;XMCBJdJQyv`+^74E z<1$uc!q^NiO7HavP}IDQwbF6lmcC?MeX{n9@Wsqa4u{O??uLF=E=K{aBR`UZw^BxE zX-+|;)S$*zinDBD>vQ0^?6S}?>y-Nihk&epn$mVhORkvf z?3efXf&+U}ZP!=R5*NnZJ$UtWSxLsiaUQQP0a6`71EAX$HO9eDnCgiWt5@y5$%rjA zx&!T|c#|hO=`yen8-97qi=1@bpY-HDg zRn~ho@P0$YN}_!@*rG3#ojt;9dA)Sq$mVr;G@3HC`osS+^U`jZquH-Yd-d4aw7#0@ z$tHz%r8gYobf$P!8ld66MIh%VZu9%|?hCPXr6bwOiKDMk6I0u8xmdMlxc{}wQa^x_ zioOa!MHiF|vh+RJRvBx{s*($O3pz4+p?Yj_eITax;t9G7!ghPK~rWCgn63-gC2zNP#RfRZS zY(|OP_E(GJO?x@5z#E9RrKNl2-dGFO$*L+*5m;XmVpsIb#h?j%y}H5nrrR6A)Tf!f z;%auVnmhv&pBibWRZadWNavKYzQl31Y^^Px@HhX|H1s= zSXXF38u)p4xBrkV0y+p-E6AHv1%_qYn{rPwpb-^)mCOt^U(!W?_N0ux_0UMng7*&` z%BOZ-RPBd`je;#YC03@E!q5ca*hC6{8n+qWkb1cG~4FiZy%zasTm%Nc2b#y}HrJv-PjU z-RjlekPz9jlX^cgu0N%~$v>~f_iYihrgzz|YnDcjm=`VK$EWT7aGeh#f>Id(uhBll z0a%dsrSf36$YkUtLIrDmddA%8&!r;UuJ*Q{uRAt+3N@e(p_fX8M5-K1%ALx|8M#t; zd&e_&ar|dW3dlDpl1c)xJT3oHmsICoi(q<+^TGJK{I3+>wwn^k$tFQEu6ecK`8QHh zi=^|=O}Jv>kdCBLse~$7fudt$4!XUQBu<}N9#S}$QfwVJt99`_%ka(f^3#1Dk{H0A z74wjgkmd%d)UZo$0c3?=c{Sr_x2@$(A@$uyCW8}S&Fgh+^3`dZy-UtOnbIEQVx|yh zMXM;4uJ%h>>pQ^p{9V}Cs7KmoN}gjv7>AL8Z9~0ZvRpYRX0#p;s|r%vhr$@N^J+ka z`QA#|b+bU7kfJ?au2W@*Gvc~nqN#H$wL+Ff5uKjE7ssXogCeW(^{f7gm1&lH**8~a zu?HS+R(4?c8nwCjHbhAh@i5|`yc}V^BzbRP!0Syix54aQ|BVpu;hiI1*W-Ov8(QpH zW8w_YvedsQ3pg9LUHeI97)+k-I&HBLcMKCyb&>aM*e^IJ(K)U!1Z8?3B&ECeA);tW z@E(cz-_NFFpOT$yO^6DA{ynfNSx=KP}kw=lZ9s9)Stc7TjIR7es|;EultJf!WMG>gOi zZRD5U9@50=H>VUPkQxFVBQ!^oGwdSWu#a}3Sa0ATXaB7WO)B z(J?^-!c|boQIzMYl&Yya#h9DKb8**{fa*Nu;4|y2J z*vdvQSVvkPLzTD99&bX~y@KwX1;XZYmj6aeroQQQS!-gCLy%vq9*G9VD9dlGii#%8 zX&x}Xw|R8I?d`9N5X_9f)RDiF2DrqX`Ryb5_6T_8|DWQQ{e_iVRrjhGWq`kVM=`%1 z{Z;(@YOo!rm|$TO;R8JF6r1BO`X=(TIR8j}+yRjCP;V1_XnI(@DANU}4Xn+9K8~ z^BGO2jN)iLsrsU~i1=Dc%hiL*z|a+EU>Ub9Zkv=*#&jx7IWaFLLR{^5#2@6t9M=sq zARgJRS}bKNMbp3DSmmKP$t zrRRc8w!y=M^6@7!^Jf#sNnjMSDZ(aXh?i7oEqZp#rNmm6Je;uK0sH-*dDzj`uFiTz z|Gh8MZJ755UW)FW#!&mCQAGPf#BV3(pOCgi7`J6}ZX-)4CiMN94vzx2jY%3y{9WfJ zf<4a)>HYSs^X_(ShNF>HF&k9lkY64#rplcb5{3tZgw?ae3zIaNVk4j;zSqMG+L!0X zonFhuh9U7c-7Wp_(w)et){=j3YMt)fr9!K7-O>!-3E#iBA*^mL@ao-=Q$*z-McHk# zOpeA!bt_>Ycn+=@E0CF*D-z1vJfprX9K`QM!Ro{xJx9VJ);K-+fl*OQWwz+4ib5W z+M80`Su}^x1(0|}UzQ=b3Hyz$^1M)Ey%hS|vvsM13$&rtLNJaXx}0$=Dcz1UP|{W5 ztroYnx>kb8R}2~-WqTLidH6VDI)^_lsuAiTV)>4xshHE$gPIqU-kqNOFX=?lYH8p` z(-$R2_(er~`tx#=@0>q_sMmq?FZK|3z0Djzm+h}RxSw4oi?BaCrm;QOv*Ldtl+>~Y zBs$fJB>}eB+^MHkU+x?H&_kQ6A7!o*+={IE0vR&LU%CPQcOU~Z&{5xN4ULPs7oN}r zo`^FYW$}(2C*9gw&qIf!^#%B1lidX}$q#YY)&=t95+X|FkIEet2ES|5Wl@VY&X@6# zy~5EqLj(ikgzT-!00id*&+WEtOb8AfS1H-;FzRdz!wZV;Nm`GsaNx=rPGu6KBt(TW8AQ| zCPjn)(Z|>Ef*^1>UVo_1IX7;{<#mjKL;{1FHgY{kGs811+tKR8k~ag!F%wrE7$}2O zl-NH+Vu7y<__h^H4@RPLzRTm5O}PE7k)ktjmndz$1ZsYz8qOj?Qgt&aD6wW{?mqgg zE5I%Jk>D-jBI1eEnpq$X2}DiBkTa3dw2`MDi=0vp(0wX@i^n4tlpAWw;%;4IKvyCP z)mv|P54^pz4M&bV@b=)BOLf>NvWU z9@7v5u_o~b{9+fxVbel-q_b+9;ywc9nV$?v)5!p}09GsBQ8%9Tp=P8LiN$-|TR31P zULUU=7O*^7rPC^)UK&l&ks#j z`$${P^TgJp^sO}eH-R{lZF&_>Eziq0R%}9fOYSdSJ)TXquMfLkGVxGcPviLVHEX~b z_fsU7!*1HX@;2D>J%^48eWvyl_N0RytsTXT)Ijyt?^bka`8tgir>nwTE442>kTRSO zHEOe_Lu=0bL>w(mJtOKbbjV!%iTD+sR>_Xg4enzhL=>gTg%T|I^i^+wLj%oKu_OdYpI)l8SwU!i zf^;@Edk}sqGK{B0erubcd2|K+C8CgM6#c>d*1(`O$smMw#_hEFn{b;_V@IGZxg`Rd zc1rf7g#A)_!17&*_510+v2X3e zq|giAXx+cNE4~^1kB5%ofIENw-CUfe+XuaTWh=BSg~{Chyx@9B@qvCaRzrhTbZz9k zuoT|Qk-&G1RpqQ#F4hwxe4O-;3qPjdX{Pm)JYoMGfydCaFR36=0)`|Ogn<36m1avA z1QN^hh19Yeb@(3}HuL1SH+#GtEq0=*u8(^%ohi-bIvH*xQ<~MMxtf;y2?x*g=7Ta= z4JLYOda{L(5VfRH7{I-i;k;8R8xVQS`NDvp5&EI%FNL*7C?Ri zHB9^&P~^EE54Hbk7o&-*gWf|!3P3%1&pjL}PHVKbN4SohU2&SMk(o3ZIk4X^$umzkB?sn|C}5_#bOWCJ&s#vh?_o8>`AeEW2peRB zW;aUvhoceY{;J=mdFSkvr?#-jnAUt{H};=myR8eFo*1+&sL9_(Sz>pZE^9{g=e=sw z^Lgf(T!U(jZpy%HAjgqF&_Y#3VHd4mWF7sZE-vjC_eR*kGZaXB5j4~nK2tgDbMCr! ziu6u(#x5en{%v&iD0NJAhEhGVI^Hk4HgBdLeN%U|00J}HUz#h4i{jL#)M3B{(yFNC zhy;b-UWOk-fsq*0L2KL6!djeb99Q zMQiMb=SX?K#zRR$KHJF;UFv8adE7$)|JJ6{YfT12zTxsuSuLf|VbBWu3PrcL=>#`g z+^~wQ&0Qv6Zk5bVe$E_3Me)M(r6^YNvwGXBel2}qYvj%iGc*!^L)vqlHJf57+#LsI zj+eDu@1hJFg2z(|BZz$&pxs^>Q|CLnC7uXJxTBzrj!zR+xhQV8M*AcUq-ucS>LE_c zmrOKe$smdK^dwQEE#B!G>z(uLiEiT36-s{aOt0ehfJ_imAcE)&RvntUt!fuf@tZio zRqBgYIT&Tyg>m$%d@5$M?zo5~aDB&dMxveUhtfO>l?3o9e;$4%<4#T9r=T6gGyHEN zH7}!3KaM;vT6UDLeRsh@#Y?W{#3h5L+^#zw8RSCS<~!R8$J{ZS}45ru034koD)2 z)#H|+Ap`sg+Y+Tj@@TuJtJ+DJ-ZJa7plngN_Yft0K5cg&cDRGwMJs_^?J9sXBHhTrKDAjU0_^a*oA-mhGuvj=&RqTN34sLQ+2D;f5X z?^$_Mjy=|~r+HL{)RPP>J<&RMdVXd4ws7&6mc?Xf_!y?^%`1dg>>WTi;|&dzuwOpNtR zx$~bzE9XUX+@adkuFuJ(e)jsW1R$vj7J7~ZDFbE2a}fFLMUq)St2BGMrgL7EU1X;K1Gl`6f3P((yj5ClXB zRRQVJdq9*TU8I-L2_O>QwhHw;9dO%6gY1-C~_KOX4#qMe))Yz*}Ox>q)ygzdt|$mMdG*M zFtLq^C>w!z3Ec3<;ZD)x>{y1dBo?kA#c=Jom!Whj6I@b^9xeMO&}2>94BAJUe4?K$ z^~Qi4hBG_ybcGc8+V?MIyV2jGQ=)jB_$K_b^(AvEwX-_+S-6F_s3d&pexZcy&=f4H z8{KSHg2r48V;dzsh8LaU-06O_pR*pg*nKBPr%8L)I7UQ+9j@NP=y#Y`GhlHU$IYE! zXXm=S828p;4-(tr_6`gb;=M<3v2~0H*v(;j8=1-=mm80!P_X=yqpeftzF*Q~4CZJq z^+{9ke;LoHa&uVZY`)t1eXLHt|3op6+cMn{%hsA(H8_Cf2^n^chx)GZ+x`)e+f}Tu zGWh0cXNmpdWlP}gydnK}@idIh(?jE6gzsl%7^XJ45%o)2yU7{0ox>LIeI<4AgSP0Cl z=)4E1>SFbdd`w~PTkNzodbc)MF0;JSa7tI5LfO$MM&`QLac4~KO36__tKE%yGi=M1 zKKyn+J1V}h`df0?@%e6jidudKfw9>D2I;^Vb3?)`4V)?2_+~P8X9n4AV)c2loy|uHx}KdKpr%s+o`%KKeo%A zBI9JB>%#<1A%9n;W@3@i$JNnJ+MZg;sF2E3?4jvOi>>Di@2o3A7MwlrNA zIN;2YvLL_L^I)b7Y`?!Y+`Zb(!Hl4xLo-RxF^~)Pb)dse?RCAIh&!hSie_@?Vuz}i zL65LUOr*(p2oH2)C_y{lJ$P5N=UW%(v9HTkQW|vMt;1rNU6Jti!W62j+{i9T7-S(f zHC!20itC){jI)`&R*If*Nr!WKy1nvTFe#{Ddx`tNR6E->AiURiwo;tvJ`bu^?38P~ zmA~8Mx1w(R-KLN9t4aFEnAVLN5I3IG_fsE!Zd(`)H$9XESl~!HdssL*SJs!k4H_uNR_-Lm}(R3 z%`Q@CuyH*!oHE1B(z1L1#qBWY=L(q#{XguLlMy1m1i`o#+;4y8kA4KLavmcWafdw` z>qH?{mqq$3$9tDNLY+8*c6ACe`8Ig4Pw9!@(zd(vrJ5}Y_`3CZtbs#)H)H6U*6(S= z8PT;Ud86#)L*6(~cg7K=om4D5;FPJ|C4K@GkI8`kIJoje;2Uy9GGIO8gQa9Y{QyOt zy4acX)f8~`ue4#2fy}QOg*XoB>X~D0#T0HR8fe8C-DJB~DlCnrkbu%Uo*?T`6u^6#j#R}a%RCQ7AY#g~VKKhl3sRJPH!)#jd|FJhF663jBa$n|DG2nTbz@ zIrUw(R~~P&&=}w-B~-ooG%ocG7m9M-onpJS{=l}77p|S|@WxCPM7?@w?yAFa;^uXx zU3C92={xAwgvW!!Z%vgmYV;FB>#az=S zY5O>1ba~oo4+`tPe%Lt1hBZ@lq-5LW0y5Adn+Y=yOfpF2Yg#nZ1*(pDE&(E{d zut(N_hl_N&&P_+QK+((BDVpUp<{VA*(xD)Y>+egfn`#m2_J`hB?`?lQMjKpAd}#P3 z25jl`o`6`^?ZgIQ8t18nrEHzy0KHrsxE&ntx3N2ET9BakE}Fp=+AUI@=-x@m z<$j>Stg|Hd@_F`UGdEe&Lp{cae-u%-&Uvd3b8Zw|yhg?T0(e-|?bVI3LPkAz&ZNAe zHa=@{k)seUOgB$aH!rR$8fzXyQ)(-jRuo{%&uJlaN$>70{yP-8I=lG>O>&hPU#E0* zq{40q->gkQ-^+r&cF?K&0bNaV9`H?JvQY4`Tu-&K6A%aieXpyut_cUiSgB+t^j;m? zEtjx?Hs*_Wh8AK~rd<-Vhug*?9-I$4uY`8UiKrtA_kxuC9Io(n{x(uZ|0!?HZZ9WE zA_)5nzYV0&u_{W>tZ7*(mNWnb8t7#;{E*7dd4su0>-v3zdZY(mk{7$9WkRY8wFiC- zMfFTO@_DC7puwMkZtrsvL!!HR0wZbFR4TYyaiv{dD~AN|J4+hoPcL#6Xe&ysTR!^@ zYjgMo!EKXCyOWb;MDK>Vc1Ej(v(7X|H^;#P%Mv#$rGhM*mOZ#yT756tLcCM3rElq{ zrw(NvLqFSi=bJU*xNR%Y?*f|b!6=ub8mh4EhBbdK)1dJWA<=DGWFmQhO-=Q7h6OZD z&jwedQd!NV2xUCiqoAm-$+dZyd@Yfc%CD#0BIAdfGIh)6C?ZgBY;yjd(rus89{-AO zPW_)G#|;$4UoQ(x{>X2@7UT@nRq{|N3Z|g!QeKou%?nx>?6d2c!wRd$z_^FGwRb%w zVyA28tKvIBob3BY#jRd#Ykf0pRIxJ}rl3>B3#a!%>=a3NfuZ~yVw<*(bg!Gmai*Ms z_ZCz556t~(*tuR|aE>|Vj3*ylCR97OKP|mYNdJ?M| zJKFw{vh?tM4d{h)Vi05Z;TNs4aw`G7ELX6mS%INO@!-1GbVvJ(DA3MzwS^Zf`3xuC zbr(OXP$UnDB58VmQAEsHG**H1rWSc?gTbGa5BBF1PpS4*zJNAfEyF)c#@62>zV!^v zvuTq)|C`y(;5V*^jitwwIi>sP>#g8uZSOIWpuFVIdy4!W1$@E*(>Qi`YkX)d@o)sp zC)u=BDZE?qh?OF`%?)6x!MmT2<<-^IF^v`x)2G|RA#=2<_trpV4*a_YGl?%26I*(# zBVozOvEf9&Rk#5zu{kVdCJD=PJ8*9CbCS`9^O4xdNM++i^AkXWLQbIOysQ)kk>P8X z#e;s$wWm|crB003(r_1(@8>{%>J|ip5P|!E*+#1i++?Tn2+hHmYb7UWW&_jkd<5|4 zBP)3vqC?ju{&{_ks*@ZTD;;T(`}ckFWqJbl>7Wn0Q|JEkG21s}2`uV#|PsU3v<*fo{{W=(xw{Fhh#_D)I>K9%v zd~z-0^zg4rzff2IQv!Dk4%<)SoN}+7%pY08@5RGZ%)vz!@$Q74C!~$y^6lfQBiv?r z)`y@k0clsgs+`7`@1k!}f9bpNAIvemLgCi~{c>bJY55OU-KXt~0ANT_{cF+xfX)~4 zRQtcLQDv23aqRZxbI$+ASCRe@i)5x%iFg!XY9Z6V)o&W`r zr?N^g%cnwFMUZ4$aE@{EP(j5=?+O_|#VH1YB?f*0kh`P_&{=(gxFUeHe<8Px>QZ6M zq6lr+SIPf$v@;s$)pG$0@BaZ;Iv^enN=3*bon-9*C&(5!!t5rVck$pyDn6-JJh6~m zF)0ro^_Kp!^)FzXi;%H*{nZY1C**X8llXfdz7twNf@@V3fKz)}3hP?X?lBO24TQ@d z3B_FMb*=ixEN!RAjmd{neIWhYzG4a>3<$zDYi{(H9`4iLQwF%8;QzcrA61;o)f@Zo zLwHJdzg5SF?<4;GQWJil^(MadiVyzf7&Oqjtm8}fi5z6gxldbio+^L);49+D5+SQH zf0hYFT4`N;E%uULvffr<>5a@w7;z0|!^ZRYe;Of5VT@7pMe>KODI+J5v;hUmvrn;; zS*Mc=G-}xPd6}0$RPC4-VXq5wy3WnG;`i@Z>ucL?FgL#2e`e+xHEkEe^D?z%%dw-K zhHr+2P}h1?y1<3Rc6tGa5-yMnj*@dZ1%5epog_;-GB-NXx=j;QgMWqch5-k<{8Gyi zMBGAE)~OrJ6VI~~*hLH;2h7{4eob{paSJ$k(g9HWtxzDZIUjKoL3EwszX78s^QrkI z+L;B$fXmxHS$KxlpLTd8=@e=9V%D;w`|CYaRYddglq(+UM@K9wF58HU{}$+si{d@Z zw!@?A%Bzkhvq!`J_J>7tUOGOgZ#QF2#W`?4DNBVs^|nQANXI~W%A-L|!`VB}ecmE= zU?hBp-?;TSq7W$Q40Xrury^!{N|7WYW=HRI=nfOlj3=zua_$yK$SB)C55!HF3fPnn zVZbzwx4fL5-S+PQ#P01G{2XT64D3ms+vUWKa$IHdqjH6B$wQW@XdvkK)El4LdiZ7G zqy4+I1|iZMrZph&cT(nU!m1~6)eFe1dOT42xplEKkkbknPqB*;v;NbiU9%9<5ri-7 z$P8AahF=zNiX{MGz$@8^$|Z&$ocDDvPP0m#;i~2%?#AHj1_xCR`WAqSu9IiB3?v&I z6!w0w{GERtz{aOEVK+uC1J|p>b>@-sU%Pt484<;(ah;UMeF`20A=} zamBRD^0|-xYqoB@6q3bi$KT@7qW9|>M@wIhfYqQ1``v;uI-vdc9S?MPWJ8GuSv!%| zk>!;F0C=@5ES#9Hc6tt6iZ|GE_wY$y$YFxIzy{VMm_p~h=7QEF)Hi$+0I7!@OvF8rL;|N- z>EJ#)Eg0TR5@C%AKqvW_c<7e>i1f2xy?^Iu=bLcz;JT(+_gzpzm+JQO1AWpUi7-fX zXo^|6k>*J|@~G9^=?-mJ;~J6sq`G)19z}@;_V0KlTMmCyd$U{o zwZxIwHh0gE>4gO*SfJW;N(MZ_vq&LgzZU#6);u|j9L!r_ekj3Y8K}{o@&V{*6{Hmt z8HFI>5lH3-KmWpcThX1i-X{N9zj0zUu17Sh`5I{suuvv&$kfP>JyU#Q_ZY`5Y?mBn(aYs{K_X;SKLTCIe>x$UQuy+^bg92F`kuL+TU>F zYgbzTob-}J+#$_9;UhRsIG5F#TFpJ7OpOTFM{%uF>CKL$#0BA?f{Px%m(e=QO{_;i zoTnqUTL`7;+YhICvA?NbiuJZ(a_-O%5I)fK&);q!D3v}Q>O;}f> znKNvjlJ9cUs^!cgdq*+kbYlT%!ODbVxm-l@5XVqn7ci~7ChTG^c*5}0c+3b#Tcx%T zh`JuX-NZC*Opj#6&*Cf{A6{ToOD603YU~caKJVp z@J+%9s^z{}XDVSoSOh+vgpH?u3~~623F3@rVNJ8ZnIoE>QJM$Mi#Rg=aELm{6hihB zQyCDL5QO{;;27g1aG}WC&Q7{%Mk)HJ^x>U=`VO9#YbtAsr!GeTuR_!w&oW3`{_sZN zXUkz66YW1aT6d$VTkM|3v9kLBwp0>K)%1drM=*D+2A7m-J~0HjfdehD%lACv6Y){1{%gU{qahp@i?*O|q;VAvK-v+U{ zCzGiZPFpX5vVUOHvLP@<4oK>_AU|{SfioX|qKi?7$L|sBLWzQfV<=e<@ukQlW*(I| zUjW2XF%H@HPGRv?8g8X}LH6~)oT{()(Wn`wCk!angrRwmk_2}&03M<^Lj)RN@(IUO zYg|VofSG8V$@hanH3Ve9=HrV}@X<^8X1m>&ePs1;3b|tmS@L}fI9QW$)4d$czee$I ztRH&ATohBuTt_neG5&@iF+eXU3FHk8lL}LuwytHP7ok4O>se^_p1)9rX2C zIKyQFHKB@Zn9Zz{K4(SseV8g3J{B0^KP`%R=Lj+@>lZx(Cty< zgMh{nIL^3$w}R!`0Fap{_*=g|s;%<5$<^I98c+qFFKJ(jw7*L>g;S*LN#vvuuZ!ii zZWy5pHZ%AO4j=bXq1SdlKmp!zUXQrN{S8f$8K&-HRIn>_%kjZoiO2~@6}q{!@ZMmX zTLKAKQd7*Czg~pEOS^r&z&@7>*0UCmeDaENvsbdo&5IK%tfJ+Q%86n0P|SSZ$=N|x zS9=tXey?f)3NfR?4X#frRw45x7={}m%dlp@58@GjLS~kDPpuCmPlC?=AX`>DOoy7w zGpXnyfM9WV+S*&kRhqQdEhgDV`vRXNqLD;*wTpXU?+yl(J)hgM9ytjD zva>2@TIDXE^&Zp~GXdF+D$;=K=8!WJ$Mffny-SLln?*RD%fKJ%! z@Ew`@@~!!am4oS-Rk;pwjiIn(^sjM!!$>fYZVo?LU$uXSQE|C|aeOS1EN%5{TfZif z88(WENq3tZ9qg%J5$Q@W?4U77(54!Q`wE6W)3(w?ei#Sgo5^wa&M#FiS~;!*uA0`vkAp70RDcd^ zt;-s29A9=fEdGX-DoI7ty4VI5n|? zLmYA1cU1_qopyQ>?t*tEM@YZQ3Hl_hT#QbW=SPDhv7^eR%ltPkiJduXmMP?(+AlHJ zhbn%S^11nOW{Q#4Piu(V)i5CXf7C>HX#}FETD@9s zPo_Hj+J|z0|3Dy~aNLjm+aJiJ-9Z*^WWC7AdsL`n7}YEGy-Od}TbRzhr)-G{pG==S z%n$q1^rp|!+nDNsId=11?=c9C+EL+cJoq(5hR&$*aU6ZT10*)Ar^#jX`t8m)^1wlA z%~dIT<~r%M%7$sJxt@9D+2WJF5PO~w+x&-_I3RAG0f)mn zOyz+;#e&-c7g@3O#HbPMV0wu%9?sK5Ns%a}>UkX31 zkhfJ_b78sKP`acPQi3YQOA}e$yDPO8p~YL zSY7KVUtg8KB9gQ|izu&bzPP)02~+u(-p6(Irl}O%A1dRR-OMJT=9?ez9}ig|4f%N;{R9^kSystm8#Iu(7JLA2wjG0xxw`1O~U+MtV{z4USiotX6 zDHSwr0GC!Q{9plRJS~3PBfuYfvI#HPgD*^{R3tWMSm@g%rie)}BYN8tQ}Hdhkyh=i zK7Q(OnIUfRKwu9zcynl~HjsJx6QegeX-Qr1XKgKz{>7O^dDq3cT+S~v!Np#FdQbN| zYO4Tli2d_^sU+R7%&!3$Wg1WQETIXu%yc7~!&d@-nmGn5{udX-M*dl9xY`vK(rE&f} z)hzUC;D#7wMBY24B3Qx9x#)wrg zxo(?mr5#>&A$|1>3Y~3af?+$@?wE!#e5I3Jr>hahO>_QfJT`3r2}~RCKGQ5C&{;su zq4h%c^W+tGJXhFM*M}6XwUi%?i`MtcY%V_VJHEwqtBc#`URDPB;acOdf6Yd@;~a!7 z&&f)lQl8BoZ>1+ig#=pT$CqT3BS)k9(*WRcJ$qWsfh>8cxReMP=S=XP|xlmUXr zfA%0r+XM`0(6Gq~PCU9_e1f>r)fQ)Smm zYmfB801wVMRaPdQ4OG<;3MVDk4bqq)!4}B6dI%l#(@g~&Dlg<=0A1OvYdIZc3DMbh zgOd_%kp`+et*+BCMU*9mSv!Oky=c{KGbLy}<>R&p=n+mm?12I46v_f&`K6>^$k!HC zUF!H>R#}7SJXzVS0-5&(NLTN^Ozx3NQdvL?;4vgGem2RDGKN==!2#-pM2N;I3Gj@R z4ce)Z6+!Wi>3yX8TNPu{9nV4|pUIG&mKbBOY7Ok-XLu9BVR+`M37ujSbpIQC6Z0=+~|4XbqBP}nj zuBL3dQ_w!U4NF49o8njvSYtv)ts$F~)Rb(743D&KU-Y4*6y(dceX`8QPy1vZB5)3L z^@0|w7Auv8;ce;Px|A9kRF@v?MR-mVH|DO$)yGxH%3ux;$A^yZ1;C995XOFCs!K)~ z*30Y_`Qa-Cb+Ut2<)WgZj?5*6$~H}ARg8R~8J2zH0wYCHc+$w*h;2hg`bDJAz}xHC z+e0&$NiJh^m3%SYZNBdl^HSpni`2(RSF^6orf?G{Ksz|han8j!AC`yuc33zK?9`%1gIv$=W<ΞOz+ zW7!}KdfJRcIFVt?l5rlWzTxkK4vm*Pcf5l{vUn3sg&&7@jua`56xs4@MU*|3vTpov z{t_k{f(UDAp!>iT=cT+c)e?dUe$wig}M z)LOUwGZ#4)E8UjFc;J1sF=~`iB^!DT_=PLj>NMXs{?H1=r-aR|{_rzWJeSW$S?4kP z>#>dJRCUjk!eY(yZXY{bg#5BP_k;xB#EepkXkAO-UhZ5|K>3MV5C~2>Eqyy(=ea|7 z5>3yM!8Z`E@g{=E_&83zE=clmb>XVB`;6W8;rd9_+0r9OQF~$Lt8Lt_{F_ zcmt)CP|`!&boT9W>4>*n@?-IQYGrCLq80wIwm!(4@q&o_i5Y+4Nv-?zIqUADou3r; zwl||J5Z?Xv^MsRwb>s8EFxGqJM0Y95|F*XsEizeWQ6yO*fZ&=z*}>;^b{o)->fBgC zD^$SFoHg*p&0&~rI3|j3K_#H2f=}7MM0B;uA6=QRI2NONj`gsNBgZb2RO34SyWmL7 ztc)Qfdphf742Z?}`+q6uD z)~aM#OW~CLw{+FULr-yj{qFCZ209K%q}zU55Nv;^HbsZ*`VDxRf=u5MLtQAVuvrkeF%cv|Gxn_|-M z>6_FAShAVVYM)-Y8Wi_P7VK|O4kKXSPgOYPsJb3xe>`kG3A#V3Qq_VZo`yunOF>#6 zRXO$RZfsNqcZg~)!Qcu8~DJ9}C& z`qp$ElVhz^V&yC6g`ejh3_yX?YIe#;SI;bT%0q|bYqxs811B-OGomrrPmRm;=iK&w z>Zh-AP<-XwiA~2?X?e9`1w5wql%^N#+asyJl0tL7rzG1~2!z#6N@B7s7PGL5X1G3% zo0Cjk6;H!5KZgG1+xwOkZI69P391Mo0U5=UF7I|lbK&h~2n!CCIq2nO2PKYyq{~m^ z5PdAlri7ND0}*R;35&|lPok;azX_Bp%1?N|Ic*l<_@U8P!SA`Xq{X+Z~CQS?Q%u874_>?*yQ{AS zRnZY*E&hxf33-u8+}CDqy=Z|GmU|~3AbRika4=})BPu2kl?qi{ z{iAolgpZ{pDT>(m2#lx%UUQF4_sNT=Vd8xx?>X1E>LGmbWq2g72-~@s zfVHxuH?*WMCxlZ8@t^(Qy#d|@{-sZM4fTbpCiTB>{&x`mA6Ww7Y~SoTty}l~sLudD NdfG->Wtz5;{|oXH1b_el literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdHighlightedContour.png b/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/dynamicThresholdHighlightedContour.png new file mode 100644 index 0000000000000000000000000000000000000000..5766e69aa2a238a6ab0a0624439bba3b727ee6c4 GIT binary patch literal 78878 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 RePIIr^t6rceAl##`ae$t3 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

T^H2=^K*6uCr%WGBdg$K_gl5h?xVy}BZ>2Ri# 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/sphereBrush.png b/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/sphereBrush.png new file mode 100644 index 0000000000000000000000000000000000000000..27bf1db4299a2e347f74379c302fa1ecdf5a7353 GIT binary patch literal 81541 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

ZJiI1n;yKV|0iNUw+%TzrIb`;PFg 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⪚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 bL1gTH#iM;AOOoyc@TaR~sQE?RHsb#Q;$xek literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png b/tests/screenshots/webkit/stackLabelmapSegmentation.spec.ts/thresholdBrushFatSegment1.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0772b4eeeaaf9933634ad26b4ac4d1728106c8 GIT binary patch literal 78747 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%0A|adS-?Ed1y4hC)O*Nc;uek?nU)x| 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®yDVSuScQ?~Ej<*uw z$3r#x%;&seRQ0|1KX3p2&I;zu!Tew@XaAY{wm7Y6Fo=N{Hsya%@!a0OU=$AjRol_* zH=8<}F1$>hEaLr<_<9pK-+1N2jUc;z&DvkQ(La-XwTq{ERvdRKHioA}Iyv(RIx+l* zRfr?S8UJNZl`&M~PWz|UyPCiW_JE}c;l3-Yo#n3lhmz`h8u_SCuWsnx4u@vklbNW} z%6iSM&gp2T{hA9PW`)Y;%*9?GG55?n5L0^AZCwZi|jVlX?~i=()ovQ?QR5zkR$ z)gLHTOd}}QlBAe)K5zIP$xs};hw;5VTT#JljyftSz0vA0ASpln00-okMqc76=6^Lw z2VFY0oVV6`o$n-BGSv5a=WWIvlIh^YFtxBAOBmo+mM z>Cf_FkarQL!P|t5lnuZ^`x7$YbP)LN!J7wRaYXRGQJY$6p)o55>8IDXPe+w8cjN3? z{*`S%4=3beOqvwrr_^~bx|597bQ=Hc*E&srimCC};FW(OeJ=m$Zd)BXeP3woxoEIx z49`>3Dw@^DeiS9C+%{*&5zajnFlG|FX6Gj2{)HTGES=OAMztX9 zT0~{z7dmt?T%qY%j^+SiZx;N7pO7SEYjS5J(7D3NZXs{lx)V%lj@Xw!+znofH+)Kd2D|y`a zQT}os^-G*_JKg7$Lw>GW4?*f-N%F4kJmo@pH?r`I%18FxSMBj0hbIG+3`TOC1V(#YF z^dPY#b@-<+hq725QmDsUu5(2KbE40<9MT{VccSW96uCogMJ%UCnsle{mE%<)AeiF>v)P$+}ILpmwfO!@nF-mH#$1RWzd9r8vNt;rpgsGKmRhyqXEb)MZ7)NE-khpp7)$fuxfQIM{dM?+{pfWY$!4)JZ+izH4C{#Vyl~p zY?s7-%*J08{i3@B%?0gQr(k+*XAsbn+Fq`E{DIuwet+ThFf<ZY z>lr(&^Yay983k+o#$d{CRr1Gz-zI7Lf|>2In0&{_+sL-BWj0wwr)QsI?$(?PiSgBlwPm2A(kO9PR^>PyX5Y|(!(|1wmWN8bAp zgN@z4=l@|ZX}%mtRhZ@%iC58Iw~T2%sc=AriOAKf7(|!Xe2zXa9}m+Zx{=0$Vn-de zv=!kV^l2-}ZtCeYPeXNNtCPu_HMy8gso{BXB<(X0e#*y)Y`|6_0*E-3frYDZYC!+o zI&ooawuWVom3zy>#BJ$T#-+=B(7WX}1sIzaeQlnXj_xgUsU#3I>?R z6rb6Z(6}G#mzn4N*fM_vVC5GQW8B^}(<9kA!>r_-S zi{M5qw;!R?S0@cBw$mskg3LcnXZbCSJKzpRMPFUM@)~?^%WnGJvoblR_AQ>qR!RIP+gXc$yU|)JVYFj%(rgV~-RoF+1bSp!wG*6%l zIKsnqlrhE!$tK-Y7ua+eXD$fd11AJvQvoT8d!J-D37!_$n;aK!pA^VFY^W50z{!7z^5zT>cZmGiWDqGCwWsVt$Ei&8(FCusJ5~J}Ibz07v zmXe0yL!vNG2EdHKml!-^*{;uRglCH=>lEBx+jDCdXI;en9^0DoQy{9NDeAeKz!ku$vKn*@wB9&Wu0bCcAEc1!~3mAVo0^BTMygtqMac8i}@q~q44W}Uc zkf5nOSKFf`^`x#qE7Leqno9&IO(?2E>|k2u#P_=ee@p+MYJ6IO**hSI0|9qeE>#_k zO)t5G9@GyOb{8B_*FTW}6%+!um!Fl+%YZPDl~Kd#dajrEf=9EakShJZbO}Ha6HyF= zmyOzw7!hlp7zU!2(s=iVUI3qdq3zxOtOL-4G_K3lJ0mgKjYI3 zvMe#|1+!PGD90?UreRKXkp`o8rq6Cln`-~8`qyQ&Jm+ZohOU&>$PA*%z}CkiB!-w~ zO&Yz#kcy0FbdNeg$(8cKnyKCJ`sRzvkDMeUnU7OS*Ee5ef6A>WW33?;)+@7xqVQI4 zHy`8A*iPO6;XTch)xK&W^i|n&*RYtf)QG+eHMVbZrY^g|Mri%#LxsX;Tfe@A`rMa` zym>e<_j9;YO!)8?^p{7#KyR-+$_fsbMO|$8+%3!bX!mC=##d&~eKFZgh2hccN-r2& zo9S=~lzpC;)_+UXE`pyj&&7=)%_~W{(ify2G;oWWJ4Bo`7X3i4vs0Q$RqR8=+5^}H z`;t^olATJqQouGJkRh#3PJt9Dv$aYo>}lVpMU#dqQ5&esIRFubD>R9#- ziiVLN-FydC#eleSs=d?o_6C3n3ZaJCX?5}VJ?WT8tZPPN*QcjBIa~b9I*tMc%eB_W zZe|x8qN+V+#*5E9BTidJ3y?+YqUL?Yfs{s4&1b^^!c%*}w|iDz!2vL;UlCri6dB^= zXLPJ`uGdO)LH?P3@c+%^<^z_uUxhs!ic@2}G0p%qDUmBsROvsREwC|7OS0x3Hgqu4-yj$9gq$40d`3yE_OCoOq zmtHvgDHrFx4on+wOBc{@1#RK3|kwEb@I zrTF)oJec?R`o)Gd!RUNBk3)&)iCV8I96>v<;(xcpL5wr?a%-8NcOTbus2Vs1qs|fx z_y4-#hGfrr3;b}@iI30BRdQ$1 z)^91JlgyyJdA-fCM-D4L_<$nayVln9X6um-rY4%HW~uW}58WDkpt3-0YGC%t*5{#o^8nI!A?GSShMiW z9SnEzS^#2ADw-=GiptVm8w)6`x5JD&s>9nBsyTr;#`*mXkG~VI8Hr80ngQ?Ui|%k% zwhu{9cS=T*FDnYs7lP6f+H=AW=!Jk~0Cqrefze8iKClR7aY|w8bu6EYm~y<6q8wRb zcV{~^0t9S;{zpw!-IW}AJ&Rk%ss?k=~Vj1<(35urooho7toQ zh^WK?x+E6n)wMqY0x~Lr)VAuunCV3r^k6A|-_z8#XFfZav6n6{J^AFLPrG{|X1Wit zto?(4+qJ)EzJGagPaFs>{^hlnTWB+N6h0_qO>>ryVZexp{VCa0f^NVQErLy=w1`cc zs!xz&Gh<*KW_yBlI-sIb!s`b?L_tT6Tz>VdAgbU6p0^Nlg4+vQ^vG#C$d^w)xs@NB z6e<=t`k2|4TX#v(eId|&7CRSc8D1j40lqaqdNn*zyQo&#xgsNs;8hxr=EbtrX|_z4 zP!EP!N@G^X-ooohP-TDWwPM>NYA9Q@^i%9UO$x>BI>uc?U8ltYyA#bX@aG46&zqI0AsYa`MTs?clQa zZuS%D*{lwy-bgD;=s5`TSsD7w(B1!Z>sjTGlIVb>GI{l)d;(T8cGN0Bz4@!Yg=JrK zl!3265UQpyo_5ii=;jE=%{tinf9T!zs{=0TmSvhBt>LOlGK08-+f=9E=U-^nF{oFhW93erj9WROcaudHHo*-OB7$=F!fYn-#HsNU{|8j^06k|A9%c7dOm$}zz3qXnUN*F z5mUeEK^o;f*fTnm>|0iIZy6Q233y2k)7-=gZRvWG5WwiUn6Y#Ol2o=4^rm?1t6S_I z)_8fFG3%5aIvdLWcXJ~#T5rBZZTZV<1=O2~3xk>1nohMdBb{-9tIlPg0SVhL&X3%S zuRYFUrKu?{?~a~%`Xhzax>?b(pWPDR0zYR>u6)uQ9nTAtl*{>K`Co%u;>7@1C9o|h zMu5&CW&o~gXHyx?QE8r5VVfT0$-j|ffuo#t%?}~em3pG*o~lFmEt0DY3w_3FoV8U- zu+uh>#D-65D@!iSA#e+k=!d`wbp*qV_L)~iiX~&oRhJs083ioegr*&R0xINhq_}?| zh1@(#umif%!TmGmT}O5(pLIKdkrK>`PmVmhcsVGQwMq3v!ZA{dDmS9Z)){H`Ed${` zi*DkEjFa+XE5KMJyj}S2HvK`JA%Zb5-hmO?A%@!aHD{a9!1;jC^o2#kwa^52>Zq$g z>fAcLrBGuB%icn+niz1pz?i{&hLqJWrDZw5U9tgSR6ooiftDg+7`yr1(o(N`dMIog zSw8L9DGHCg>*-^#{PTrF?@^Knob==P&zs5HD$%g7y92nR`(F8LfQU$*zRyt0PqN** zQ(wH!(;vC&(Qp0!<(%Tl`-RnUxdTJzPW)#SfMy+l%I|8E9a7bCTV*=px|;2Sj!!>U z<=E{bu5*d;gW2s*oOI>lWe?S+^P36GbFFbza2e#gDttwLufV9Ig}uOC5dIW^jspr6 z4C2m!pgPEBr3C;~5Xg{pTB*{OXn$4yu|q<#PHcwn2S6m96rD7f$`xC*0v}&wzd~=F z@QL(I%@%eOeMzn$DnI;==3LmEd4fRTtrSXp&8jy*zDMVn(@S__h!24?4uyKy(5#g2 zMSFOVDZIbpPSLzGfHn^8(qQD)n(}PVG&NCQWK7_*;Ty>5(&&zyTR3l5x0Y_d;@=H?`^+S8QS->Ng6Dtb+s9|t>{`gWf7Rm}A7pvk`u__QSeWfRc=Tswa{DWzdNSJVG_}Yx>lwFD z{!Mcn+i7Z*O=zTGe+>5-F{my3+oVUsmlW(rlQk09?V1NdE%Gr_y_9qQN6S}A>c9eI@!EVGn%j)M6@GtyRPI~yw3}Ixxl_u11 zqpEeTvFwnMZ^!$FR_S77{9P)Znk;4@Dy0~+h-U()(oYub0@-;`XQ9OhQ~Gu2V_QnbrgHK!z)|Czmn zJeM}XO~(avE&skYIY*g9ROvqxI2|(Zla{Z3Tw&{-jNt|v#tzyza#*iWB*ZuA=0s(= z1~aM_Z`(Xs%nj8#B{l9FpKL6XoS$T8&1lWoV6@Es_)4mCKx?Rz-tle|uoJl{*-l8; z9hhN!D54E zU%7pWU-IIY7R$q@$9cO(h5L>OgF%pr6g^YYg;6^xDC;>{SQFgIE!`ujprUlx*mOSG zUNZmB#=F_FNfEqOLe)N!faaSg>Q*-`gqWD_t|iS}p0bdM5-Sipc$N z+whi!%GT}rnBWk%^!CZs^nENMkz6QK8BtYf;j^Z>?Ym^5g|Ve3tB6a=?DQvxa6EVx(#3TLGFbR0 z&`oe)eR_~LTp(c^-d|$^8$z+-cHq^#T8r>B5n=b}R?G+UFJp7Vl1Rx5@#W#ETxt+Q zPG>Fib8x3qavJdrHMpf%$wzz!0MXGvPU6+tV_Mc29$cY)?Ax?4G1MWQsNaw?LZJnF z$ckhZ{M(IS(9A=x)er+Ri6N*p&Yf~XlaPN(s@AZI409UhVA?CsXihAbV=g_R|h4DT%_dZei1&mUEnM&GFGaj+q6F;%0ZcwBr}l}ol@?+m9@ z(Yqbe#7#)ZU;gVp*}C82Wj}YlXP&;wA1||ATK?;AJ^0DkPfjV0RQ|J9`5?)u@r27K zA9C4>{a0c)6)dsE)4>t3-s2eH*<_S<1-A?ZHV-Zq^3G=i5V7k|YsQ2@YAwUBIq{%Ke%GYjcK1i2A4r(F z?*fnSq^1eeo=a(%KsRee7|N_+x7XllHV?tCXejZwW?zQF8-dHfZhyTvxY5Etzv9vb z*k!WItpnCL)tk8=(e!p_{a81k^3wWNL(;Qy%?Lj2yq11tGk)(Q7f1#7E27{RNp6Q^ zBSmDg54b0(n$Ju?c7Z7-&85DdT;=Oa$eujS=I*=`iy(mW{ud@DE>_t{B%w(o1 z;!-q_YAb3xD(6`S+Iis(Ipb4Quoff-4HPz|S74NlXf1_cRCX8eVLCWTsRX z$QeOhI{Aii+erZ`C<7Qi4KyjqhO0mtIx%~h9prdJtE^bwVRm4@U zM<3k;eUq_D!B|Nwo2I^-U|<$$Ll7#tz~P*%4$b#D(JxlYn6DW(g#E|^$i{x+4-?gk zWxq~z`Dr$Y#w4YuX*`1Tkez%b4@gbkmDjZR>ZIDp=90krPk&RqQ3q&FkIm&5g;2yC zZ3wgYbdm4?u|9paqIJT1k10i_wUy6WYZ<1qwF&3Rozs9)k+c_hYG0 z_Sf!3w!MJHP+X?KhiNVz!^H^c+`&dl;4`uf?oPlWLCY-BOO2`+JBN`-GWu&6`jY)D^fH1AlKY=cNkFAoOYA-2*Zq9Xy?nyI#?kt2a_K~lc zNoZ@ZZqQpEIkv=;#JoT*(8i;FR>kQjKc$@UQw^@LyK1eJvo(>~~J0u>~~2b$;-rSZ|je@GeLakMHUUUm!%{hA__dOeC4EU^H}SyYwvQY!`_ zidIJZ^=rg}cSYwbwERsyMkBOC8l_cNs)j;OrJ6?hMCBAd>nfgf8!>URdplJv$^x)+Fi!G#J&|bDk%r^wM?D{ z@ke!VpEjQ`G`G#Ua{WrgK%FAaS5+xw&{A<%lHHzeceO3s+KZ!sQV?&jeFTra zbn>-Vn&a*uS78;SbCl1_?-XKm<&K7`kqRD6^I_j+>;#qPK9OMKHBY)?8pj=|!tQY* zwe+15y_L{Wsi*+eKey7F2BeY$ufa6V+Fqh{G|+S3;$;9UAu!cq#w$U`6|3y11AJ-1 zDZTj62CVlMImon&HXBfi0d?o<4_$UK@AzR8RC+bsv#NM zzH|*29rY;sfB*~&-jvma>wcpdmDF%zCHA;=vs@ABQ9X3IiqNU5K5sJpvT0s!2^;IP;Embu-?7c_CXp1U>)+T7}6(f?6 zNb=tC?eiSR`v<%~yvOnQ>AvN@ulri(=lq=KbzSEP6#;@<3n2Oj4AkfYNeSX&)}ZFV z{faZhk8Mb^-^^nb*CbwgKy<^YUlGJvOG97=JHK*E7vDGXU8?~0*qx*}Kg!aXcx+L9 zjT_+==n+B=}1dUsi>>*Xv(>#t@#XB+lu(8J{6Rn-Xj%6=Um9)k4iZt zbM{CI=%tsz&D(rCulqS3alFHPWQ&%wHyA#NK9r~jz3e)~(PJ&@I`e@OnVr^Z%#B(% zx>g{-sGhD4%{hxu>fiqZYt17sMJ`DSFiEI2efaNv^Ike3_TrtGNobiPFM89>f^# zcz!VvN_%CZtgFe%KPXK&4sK;Ktu0Y>Zn$!?1$=k(gr~GS=h&J)zZUIPyM36OHb;+E z_{R}$*-L_zy8sDI62G*?%0<~_R|i+c>+F8I*T+NP-mhk*kKTki{}P%i{>9^*lc-d? z#QgSa4Awt48yFaSF(Bz?x^736*X%XA@I{ zksalq6weZ2@z8lXU<$I-#UJIir|yw56cB_lq~bUWCd7O>70oSm{ZfAVu z67^$srWbA@jGpnmqx+T+;-aOgktyOD3)$=ou7k;3XV#CT?VMG)kHmbub)f^mHjrNk zuA4t+R~_R>LKg>&3!W*Cr34q1Z-x>F^!-7Uc~35m{h!QzhNk{YDhpyR)1vkeDeMjy#$ZDz=TmCZ4Wyq89aPmg+p zeV3_D^6Fp~@xmMM8P56~oz*{II_h4m(fZxsxfYvUhd%e&kY{8$mLrkDlE84;tCV=2 zj=Q(b8zKF$?Y_R?H&%D35vaaZQG@fR(dl788sD1au80ZWxGrdPHR;vS?=K^kjx{a+ zEKN{=77_;r;6fN=l;i{s8%U%n$|Q znDWSDJr1&x>lNy+6>)SOdYRek?KnOG&0Sw2JrJQTEcX$JHl`2eLgKAaSS;8+lYbB>dP*XE5vx&#WAKmWS8i|aN z`EZsS=rgFGQBi^ZP?fzKQ>lM^KF=FfmW_2nhE^gaz4u1G^eYKr=p4o}pMJxT|E_%t-aw`R_HMpDI{ z<=h8kBU{R=a3})UQfeo$Ce4&uC(Qx1O^P_=U6P-AU;4QetAU;GV?o*T6Q%~r%h@fv zjEI=Y+`XP2m13TrsP$U3t@3>N*`!!!{`5z)SutAEKLUB@URZsMwdSjAjzBsqcG*Zd zQa@lG=q;PXjh{rp8jeRX&!ve{7Hm%3)jth~$-J3H3!0~XrSdg2`#zNlE7j$&%TQx20q1?47Uz}` z-3d0^lLZ3@#;!C^DzaQh0z)}KYOAc&&xWPoip`R0cX@2k+PxXU4Nrh=IKjBP68=}W zP4A{&wUwbyk(w=)XM|bYIBKQcsB_QboaH%8=E(O?G<`X(>5<$tVEl7e^yTkg$Rw0k zSiI@9Ve?f)#|fzaG;|7sk<%*2FUeZ=Zbhw;!B6Z(7oX`OG5 zvV_OkB;B^Hgr!+*mR-nXUxGlV8a^v`twOtWv6`jWSS`=_n9dF%I{ zPF*=>e)&k`exX$7&ZWVUBqk9tD;?yN-PT}6uFHjs87}Bb&`M#sg+gY=8nKF z)8uxVa`;yKRCw)F&}_n|3uQY>_gK{20~5RlmG0gCQT$)@nB>hj!Oadkx%m7GRr-=D zoB#?znQ{vM3sq090C-kUuo|;rfEfeRdZP5P$JIH{nwtavk!Op9&1(` zJ|-puaqv(J?>vCRC#ccc>*%7g=0+5ayb9MgbRSgsp+4rE+{ol3Xq)0>jy+x{3eWLm zAf7;6s~r$&+qad1Ux=)dZu{f zPjQp6q>2KdYk4@klJ5PdelK_<8|A!XW>Q!F+fXY8+6pE~=lvILC4qLbwYC7e&?f0+ z0ja3ToC)`$5;DqB73J7oY5Rkb_;LQB@fbsi0Ie>+$ymtlKL*4>b)g46Gkg%f^GSk$ zOm+<ppQ&V0tq(90sH=ABz!dh56$@Mv$G`3L2i8xWU}G++ z0dz_WUE7WKP0PWIe8CE`@j(ZWTG_zmct!3Bz5U-jonLV6D!!-r$v01xwa~~kL;wfv zok!`ikc86~W+xWB^8x!P-OB>HdeNYWdeE`gV_E^8^h=k%*SC>L9?T20@osQI{2?&r zH$Oso@Eb7eCw5UQg++}(qPh?CkK?drdR4k+qK>VGZSqaQ|0uB+rxsH49J<8HgwMT?Muo)M5{W z7HGnHas&Kb=*l=(4{+S%$4gaYU42N!&D9n*-6aF;S8-xF?b-8&#$P!ZP%u6Xi^c_% z;oQvN5A^C6K9-RG&TGPzRu_V-&TkGX$KX29MYtCiF-wUWfBwNeLBefegLe!A=tLj- zFlQh~^N)AzgVLmDu_80Mxw%@Yfy3rgR2+;XB_7~67)0A!gh8k)mLu&J|Dj=c{h91& z?iI6A+FlmDfl|~$E>gukAl=v!!#$409YY3PMP&WLp*E&6{4kpMms%&J-t=3Nsy;Wr z>{id({U#fNK@-P|;J-N`qjuqY^H?L{>fW}l)@HU&LRL5F8&gb~NE(y6u= z%rK|r4+^|+tbSH(W0Z>9pm`%|6*aY)A(l@-^Iloc`76%V0rvO7i6eEJAcMANuXRb2 zRV|?#tZZ3(Jy5l)_qPNOAnOnB=5}dD;CMlc4HY=vwG*`ur&Fe_flTpcHMmT zng_A_75gDpyixMB#U&r<9nHoOyN!4P{RLE^4jVW@!}b0$(?cV2eYr0dHXg`N#g*3X z`X;Rj!*T{2$1#B9FlFYIV^)KGaeY(UVI^j!H~k|&Ig%PtibB35%7bs%!mbJAcbMD? zkW1$gX$y(ix42|}fVZt0r#3fZ^_t)Sd}F6)7Lpn}G0&`ZkhFY5UH7-AE#DU#FRd=! zHNvL<;nv&V!~v*j#YP~jqojN;OcHDB))^^jhv@68JT6awUT)=+dx4j!k{zKm=6GOgA|PW{ z*6h3R{u6shKzZTtS@h5rdj+1larYvc(HWA+5Mlvu*Z`DOvE7TsW3XLfb&YLQynsF%}Kj!i0w|(A2MZ{PWuv5%tm-+ zC_aW}oYuer{xMkQ;YPquh7!Lklbpjx4%wj$+xTD)uoh`CO=>0)42xDJA4OY<@6WK2 zrdb0YZ`G8AdD;6|jh}kjZp&aA;!MgzA#-OW#`GS^)V>cKcf%H%7o~jjkyV(&;yTo` zi~`L4XA@Q_j+{&_eB{gh?+jMAlbM#13;Fi*pVukr&PnntL$p_Y-xjfr0NLI0d*skS zKdW444~iMC`U6&*Ur+fHOSmgYf3tzwXr@Ao!vu$B-56bv`ZGr0LlGaDw{a`MC)8>2 zRRRN=Hxl(|yOK9-5yzS@&n4~wxmYT)-U9lM-az~Eyb74Q7E+*Q?cZW6&5+-(tdVau zPgt$|iB|B|2%O!Blg%83JcPK5SR^$YFI`#b?bKN~kDZvN5izL|v>6^+HiJSvlM1G` z?|QV#I-+F;5D-T0S2CwOhJp7UER#K`PI35-PtkEsFtGxuxbmrf6|}186KsMoZ#Bn| z-wrkQzk|S~clLf?@;T=de$h=weffOd{9U!_P&|%tPMNOwn~|ZA$`wEp!JivH$Cz~& zj&0UuBd-M$3e#PYfV#!yrhA_(s4@%s!r%BQQL7NaRjgs{62#zB;wit9GJ!yDfn}jU z4yVqZOyF$Z%@O51uChD+L|kq%WdDy4)wyNqV?0^pPD*lyiwT1~@aM-)aQE0tVX@cr1s~cY`nG`O)Z|4! z27STZhM2a~34OsBzea{u&44EsDsTflP>5~Btw1^SHz!JOFIjIHvbZw#$uHT)gM>Q5gV1vD@v8aGWYnO+H>RS*A!Xq17dh_rKg;aT^} z=;Sg=l`nKLK%y`7j*VU;04lK)QT0uY{rDAe&hz;~t4_+C7u=b?Da{&fVpwd4@ktz! z-|!pWpaUPm*K4i1$`d{E&PUqU!>h7xdyj*0Sg{>iA70LiKE1~?bt^FHl`|v<5CU(5 zR?><6vbCAfdA#=IZ*Hu)rQJ|g7;0O!)M&H(EB9(&N5&fo|9*oy4O<%%#)$^$$h~1> zQ?2FCm{>L`lC18sQJswN>`7!-P+Kpv_+|vHuN!`iQvqN?#JfWv7 z16ZUhhiMk;p-_H|)sybunDN%pB@Eu{{KH3XY$A>=9%w`8cdj<`6mfu5n;`e9uN#&# z{P&cL59q4FHouG&GM^GE#h7|M+%wwY_c3WGlO0;rV;P_=!Y~%w;N&J<)k+}G43QoN z7fJ7nC*S?Vf-`Z^+v_sxzz(@l=u3bup`cnQsBmsLv)!8khV#{b)XYPzO@g{)NGeOP zEA1;W6VZ<0V#1LSbP|PS;{p{6EF#nR^~DKQ_;nGn$~)9?W%umA+Fc6^c{8d@-1qS zFji#|pPzhRDgg2l@0uvJp?3|c?Ol(*k(eG0IKG}$y_XnB`wUK(g4mf~0PFr(&Q(Pw zVi}rFFE6xRz;b8y7gN5Og4t!wo&GB*fECtKepojD)CGcYX0fDpe(5w`>dsFW-O{#! zMURP0Z9b#r!%n2t&E>LxEZ?VTOm!62LV}o7R=Tjk5!C@taK~fas9h0eR@}?io zKWfsPAPQVSzA&2Xc;CH1li4;sJiTn+1)cI(9leOr_@r0A^|YENd^6hPOi8Wub-)(o zV+KnEbc*`jgzXF%l9*;An7NmdheLN|o_1W^Y8aH8kr|*k7pHG1CMmC-}A4jqqFysp^>opP?5lSx8i3qrK8@fy-QDdz@Hf7ebGQlET$1(7z{ z_MTZy-9{@SxqkI|?>=Q)pe*PbX?&!)wxzC<>CT(^1V9Mqv3lqL@xATIMi&3MSB8NI zz@*SVY@v+cM<;a8UQAMzA>typNVlcV%H zVKv%7Nmza(s8hR9sA+~Z`c@74CSzC1P3=c&Rg=FJnd~07u~I|S-W7@{fiNKSsm>GG zurY0uia9+?j?TzP)K(aDJgtRpvo6oqjLMc4oxlj%k$o1jgKHQO_qBt^@YW$L5Riw(ldkV50}6)i?H) z*i7tc8$(${MZUBm=9Tx63l41=)bT-^*x}mtjL~8LmmXQ7Y$xSvYjUz(w9`i;4YlDl z1+&ptMNngjhJ4qddh4EF@)AX%SWjPGQ619DqHFcruP%NawOY-&(%P2H zY^mHZ4x0{3HGSfC@(6&|v7p(XoLjw4^a2FHo0fI>AGqio+eDOo+sFk&%lSTkbF<0# zCZ}1LYUL#>S9DM6R-C#e`=-pYN7aorK54BBQq~-n+r4cuYH=gYUTl2BMn8g%8%;wv ziC!i>n0zW>=H`R+RF(m27ad-WmHbcSjn^V)yp;m@ZQpENZIzI&c_De2p>1==(|QL1 zu9iEVzEH^1SigA5ImI{(S6o25cA2fN^2e1m7jb8MAYUaZxyo+k zy}OTP5$(YO)x53X59VyAJ_VkO6j~oD5sl{Sl{n6T9A07M?_QQ^yQlwX^20 zAy<+8qC55B21EWYMgcOfZZ)McYuPovX=|(AUUR4V=MT5MjNx@OX^J{4GxZc#QNUnJ zDr4-`H>a3q&Ks$lT383Odp2#`oU2h7n>Ozx!x|31TL*oS2W*6C`SR#c`Vn_ky5%3?-CugtU*Q;v=Kkha4~!Y+eHjOu zPj=^K*0{WJ9!7KVeRvXL%}Jt&1FXs4L=O2v*6Mpx*T-f#ZDuuHR}bL`OH$ETcv?G1N^-!{omCM2p7ahYNR7y!6ZY77w<>mlG9!m4u@@Xj*ZJMdeHX~|A^iFCjn^??UOr%uy#YbLx= zF8YHZmCTn3bYTLWVPg>eM*AFN#Vo?quZPtM2j^y9@yR#!9rGwdH!@5@`l%b*HXE7L zHK^GI(RsL}iW+;hDA;RtMrbEj-oxn+Z~kJxY-#t1|E>vye3yQ$jG;c@!&R9>i0%pX z)*{AI%=Xn8Y31Oq9l!Zb3B>-%tgm*Nf~n>var$<-X`9`byvhkq+0r}9-7rImF#m-3 zlR~P8Q^thrfn4x;i>?b^C96KOk>_ta90iiP7PFRzqD#X3!d8fNEn$w8Jy9VEBVF;< zePKAiJpR3kPH`K*%7r;wCx>krL)LErqz0jT8X~S6VWmR%?r*-854um~d%*=O%^PGQ zHad;Obdo@>U)WmT8wBHf)w8yLSk1q_XPP$dS=GDnS@Ecc_>izLPM9HONu7D2(j}W> zO3m`e`#^3_1K0XN5%gbg7~YzDN>l-RRjB(>1)OmG{&sg>aNBh8wQo%!^R>-~E*(GeQ{OSE*K*^Jgu(9^U zX#_p4{X@si_5?>{qy%j<_7`;C#`qRPoNd3c9A=Ea)|)zMU7-wneV#ddn*=`=9< zg+3{FrtkBLBkPIt%7|dCw2jJcCDmAWZm%U_VPqtP$vv3(>mEQ( zyuZzAU!Y&+;nCfnjz0iF(7P4WC-5~@>X~v}(#djpo!gwoE&KDzl+FqFKf~_}&#RDx zH2_|i+?^LV6}) z-NTF}Y}$*-zC19YKw#ZtA*dwvRue?+*noFhpYi2yW4cXH6MC z)}5QY2N*>6&X;tM?;;rvYVnwqpY&u?tpYt8dM9GPGe>+Wrz~pqV( z)oXl>e}Y}OsCKkR<%?hk@LKuTT&0G&q=G7pmd6SX)&eIiz9lVwW}`CfVe0HVMzHt1 zCc)sJTW9HpsrS?$aE03dc1wz2WMFXR1dtgJRfk^p!sevfH&*{J0ao5wSQvgl*!r1k zc5v&Pr0P6fFLpkYtCHn3z(j%|)}H&Zvro<|!IsB4-5Ry0_b_(w>vgI1T{7wZjMbNx zFv5@}Y`xq2-_@1Ojt2%lZW7OzNfWaMc9chO7?m&rbG8Ly9fGP zhF&kNiCwjE*H3P`E63O8lCLG!@J)Ccrl{_@E;RzaolCHEuUhM}EH3}bzLUCX6)m!* zSru1jGD%Iq{4d?^Zu^D>Pkl)~1TUEoHy zpktx0J z^2G!e7l@{b=3CiRw>_f{|Bk0Q7=bB!#!zmD(}p6M#Gr@D$zWoEW%VnrSb7UuyTeV2 z{fo*9^Qj(=dO8<-hMypts3VnY#q-R$f*DD!j@bg-JIgk`%SAb=g_OO$24ZpS@M>EL z{zMDy_ni5!8Xq5@5ww36VYH?Mrc<=)ieAJA>snzqNH&Iob~d;CbgK$#`?RL}dOw0! zG~*YB8>SYm^mNN>5Ub6!e}1gv@pxj8PU-Cy@1N=*P8Jq&l%#89E1l&?#^wC7sOkt! zgV4)Mw!b_UO>YZWhz%VtXEo0fFcw=RM-|VkHGV0>qicN(BS$h9$^73-u!|)_4Ioq_ z@tlqx7+i`c*h5MNYFPa@IO!o;ZMF_De>=%>%inu6S~yyHX<|c1s>VWcqM0zfSVqs- zEcBt{R(A%$gkQ}W+PaYRrsjZV@B{kJV4v>yCfa5{;lVW41|Et)OgA?-n>JX2Jb>!H zyW<*jhzZ2PzHc`}f;~i(SsFzg+$-?%E^$7~W(9uYJ*6VRyL8Whz_`?Rh>XyOsIVvk zml1~|3nKKhjugrQmrVa{{=xep1q%=9&B_*R-s_95WU=$h%((#sA} F{|C*Lh|mB4 literal 0 HcmV?d00001 diff --git a/tests/stackLabelmapSegmentation.spec.ts b/tests/stackLabelmapSegmentation.spec.ts index 9cb3b7dd3..ca976ab67 100644 --- a/tests/stackLabelmapSegmentation.spec.ts +++ b/tests/stackLabelmapSegmentation.spec.ts @@ -43,309 +43,297 @@ const leftArmBoneContour = [ [391, 157], ]; +// Common setup for all tests test.beforeEach(async ({ page }) => { await visitExample(page, 'stacklabelmapsegmentation'); }); -test.skip('Stack Segmentation', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('slider').fill('5'); +// Test for circular brush tool +test('Stack Segmentation - Circular Brush Tool', async ({ page }) => { + await page.getByRole('combobox').first().selectOption('CircularBrush'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, rightArmBoneContour, { + interpolateSteps: true, + closePath: true, }); - test.describe('when circular brush tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('CircularBrush'); - }); - - test('should draw a new segment', async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - await simulateDrawPath(page, canvas, rightArmBoneContour, { - interpolateSteps: true, - closePath: true, - }); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.circularBrushSegment1 - ); - }); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.circularBrushSegment1 + ); +}); + +// Test for circular eraser tool with segmentation 1 +test('Stack Segmentation - Circular Eraser Tool with segmentation 1', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('CircularBrush'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, rightArmBoneContour, { + interpolateSteps: true, + closePath: true, }); - test.describe('when circular eraser tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('CircularEraser'); - }); - - test.describe('and segmentation 1 that has segments is active', async () => { - test('should erase the pixels from both circular segments', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await eraseVerticalLine(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.circularEraserSegmentation1 - ); - }); - }); - - test.describe('and it is on a segmentation 2 that has no segments', async () => { - test('should not erase the pixels from segmentation 1', async ({ - page, - }) => { - await page - .getByRole('button', { name: 'Create New Segmentation on' }) - .click(); - - const canvas = await page.locator('canvas').first(); - - await eraseVerticalLine(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.circularEraserSegmentation2 - ); - }); - }); + await page.getByRole('combobox').first().selectOption('CircularEraser'); + + await simulateDrawPath( + page, + canvas, + [ + [100, 197], + [98, 221], + [115, 233], + ], + { + interpolateSteps: true, + closePath: true, + } + ); + + // await eraseVerticalLine(page, canvas); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.circularEraserSegmentation1 + ); +}); + +// Test for circular eraser tool with segmentation 2 +test('Stack Segmentation - Circular Eraser Tool with segmentation 2', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('CircularBrush'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, [...rightArmBoneContour, [120, 150]], { + interpolateSteps: true, + closePath: true, }); - test.describe('when threshold brush tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('ThresholdBrush'); - await page.getByRole('slider').fill('25'); - }); - - test.describe('and "CT Fat" threshold is selected', async () => { - test('should paint the fat tissue only', async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - await page - .locator('#thresholdDropdown') - .selectOption('CT Fat: (-150, -70)'); - - await simulateDrawPath(page, canvas, leftArmContour, { - interpolateSteps: true, - closePath: true, - }); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.thresholdBrushFatSegment1 - ); - }); - }); - - test.describe('and "CT Bone" threshold is selected', async () => { - test('should paint the bone only', async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - await page - .locator('#thresholdDropdown') - .selectOption('CT Bone: (200, 1000)'); - - await simulateDrawPath(page, canvas, leftArmBoneContour, { - interpolateSteps: true, - closePath: true, - }); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.thresholdBrushBoneSegment1 - ); - }); - }); + await page + .getByRole('button', { name: 'Create New Segmentation on' }) + .click(); + + await simulateDrawPath(page, canvas, rightArmBoneContour, { + interpolateSteps: true, + closePath: true, }); + await page.getByRole('combobox').first().selectOption('CircularEraser'); + + await simulateDrawPath( + page, + canvas, + [ + [100, 197], + [98, 221], + [115, 233], + ], + { + interpolateSteps: true, + closePath: true, + } + ); + + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.circularEraserSegmentation2 + ); +}); + +// Test for threshold brush tool with CT Fat +test('Stack Segmentation - Threshold Brush Tool with CT Fat', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('ThresholdBrush'); + await page.getByRole('slider').fill('25'); + + const canvas = await page.locator('canvas').first(); + + await page.locator('#thresholdDropdown').selectOption('CT Fat: (-150, -70)'); - test.describe('when dynamic threshold tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('DynamicThreshold'); - await page.getByRole('slider').fill('25'); - }); - - test.describe('and the mouse stays at the same location for a few ms', async () => { - test('should highlight some pixels based on the pixel values at the mouse cursor', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - const canvasPoint = leftArmContour[0]; - const pagePoint = await locatorToPageCoord(canvas, canvasPoint); - - await page.mouse.move(pagePoint[0], pagePoint[1]); - await pause(1000); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation - .dynamicThresholdInitialHighlightedPixels - ); - }); - }); - - test.describe('and the mouse is moved around with left button held down', async () => { - test.beforeEach(async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - await simulateDrawPath(page, canvas, leftArmContour, { - interpolateSteps: true, - }); - }); - - test('should highlight all pixels that are within the threshold', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.dynamicThresholdHighlightedContour - ); - }); - - test.describe('and the key is pressed', async () => { - test('should accept the pixels selected', async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - page.keyboard.press('Enter'); - - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.dynamicThresholdConfirmedContour - ); - }); - }); - }); + await simulateDrawPath(page, canvas, leftArmContour, { + interpolateSteps: true, + closePath: true, }); - test.describe('when rectangle scissor tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('RectangleScissor'); - }); - - test.describe('and segmentation 1 that has segments is active', async () => { - test('should fill the pixels within the rectangular region selected on segmentation 1', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await drawRectangleScissor(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.rectangleScissorSegmentation1 - ); - }); - }); - - test.describe('and it is on a segmentation 2 that has no segments', async () => { - test('should fill the pixels within the rectangular region selected on segmentation 2 preserving the segments on segmentation 1', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await page - .getByRole('button', { name: 'Create New Segmentation on' }) - .click(); - - await drawRectangleScissor(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.rectangleScissorSegmentation1 - ); - }); - }); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.thresholdBrushFatSegment1 + ); +}); + +// Test for threshold brush tool with CT Bone +test('Stack Segmentation - Threshold Brush Tool with CT Bone', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('ThresholdBrush'); + await page.getByRole('slider').fill('25'); + + const canvas = await page.locator('canvas').first(); + + await page.locator('#thresholdDropdown').selectOption('CT Bone: (200, 1000)'); + + await simulateDrawPath(page, canvas, leftArmBoneContour, { + interpolateSteps: true, + closePath: true, }); - test.describe('when circular scissor tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('CircleScissor'); - }); - - test.describe('and segmentation 1 that has segments is active', async () => { - test('should fill the pixels within the circular region selected on segmentation 1', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await drawCircleScissor(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.circularScissorSegmentation1 - ); - }); - }); - - test.describe('and it is on a segmentation 2 that has no segments', async () => { - test('should fill the pixels within the circular region selected on segmentation 2 preserving the segments on segmentation 1', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await page - .getByRole('button', { name: 'Create New Segmentation on' }) - .click(); - - await drawCircleScissor(page, canvas); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.circularScissorSegmentation2 - ); - }); - }); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.thresholdBrushBoneSegment1 + ); +}); + +// Test for dynamic threshold tool - initial highlight +test('Stack Segmentation - Dynamic Threshold Tool - Initial Highlight', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('DynamicThreshold'); + await page.getByRole('slider').fill('25'); + + const canvas = await page.locator('canvas').first(); + const canvasPoint = leftArmContour[0]; + const pagePoint = await locatorToPageCoord(canvas, canvasPoint); + + await page.mouse.move(pagePoint[0], pagePoint[1]); + await pause(1000); + + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.dynamicThresholdInitialHighlightedPixels + ); +}); + +// Test for dynamic threshold tool - highlight contour +test('Stack Segmentation - Dynamic Threshold Tool - Highlight Contour', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('DynamicThreshold'); + await page.getByRole('slider').fill('25'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, leftArmContour, { + interpolateSteps: true, }); - test.describe('when paint fill tool is selected', async () => { - test.beforeEach(async ({ page }) => { - await page.getByRole('combobox').first().selectOption('PaintFill'); - }); - - test.describe('and user clicks on the outer circle', async () => { - test('should fill the outer circle', async ({ page }) => { - const canvas = await page.locator('canvas').first(); - - await runPaintFill(page, canvas, SEG1_OUTERCIRCLE_POINT); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.paintFillSeg1OuterCircle - ); - }); - }); - - test.describe('and a new segmentation is created', async () => { - test.describe('and user clicks on the outer circle', async () => { - test('should paint the entire image over the previous segmetantion', async ({ - page, - }) => { - const canvas = await page.locator('canvas').first(); - - await page - .getByRole('button', { name: 'Create New Segmentation on' }) - .click(); - - await runPaintFill(page, canvas, SEG1_OUTERCIRCLE_POINT); - await checkForScreenshot( - page, - canvas, - screenShotPaths.stackSegmentation.paintFillSegmentation2 - ); - }); - }); - }); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.dynamicThresholdHighlightedContour + ); +}); + +// Test for dynamic threshold tool - confirm contour +test('Stack Segmentation - Dynamic Threshold Tool - Confirm Contour', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('DynamicThreshold'); + await page.getByRole('slider').fill('25'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, leftArmContour, { + interpolateSteps: true, }); + + page.keyboard.press('Enter'); + + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.dynamicThresholdConfirmedContour + ); +}); + +// Test for rectangle scissor tool with segmentation 1 +test('Stack Segmentation - Sphere Brush Tool', async ({ page }) => { + await page.getByRole('combobox').first().selectOption('SphereBrush'); + + const canvas = await page.locator('canvas').first(); + + await simulateDrawPath(page, canvas, rightArmBoneContour, { + interpolateSteps: true, + closePath: true, + }); + + const secondViewport = await page.locator('canvas').nth(1); + + await page.evaluate(() => { + // Access cornerstone directly from the window object + const cornerstone = window.cornerstone; + if (!cornerstone) { + return; + } + + const enabledElements = cornerstone.getEnabledElements(); + if (enabledElements.length === 0) { + return; + } + + const viewport = enabledElements[1].viewport; + if (viewport) { + viewport.setImageIdIndex(1); + viewport.render(); + } + }); + + await page.waitForTimeout(1000); + + await checkForScreenshot( + page, + secondViewport, + screenShotPaths.stackSegmentation.sphereBrush + ); +}); + +// Test for rectangle scissor tool with segmentation 2 +test('Stack Segmentation - Rectangle Scissor Tool with segmentation 2', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('RectangleScissor'); + + const canvas = await page.locator('canvas').first(); + + await page + .getByRole('button', { name: 'Create New Segmentation on' }) + .click(); + + await drawRectangleScissor(page, canvas); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.rectangleScissorSegmentation1 + ); +}); + +// Test for circular scissor tool with segmentation 1 +test('Stack Segmentation - Circular Scissor Tool with segmentation 1', async ({ + page, +}) => { + await page.getByRole('combobox').first().selectOption('CircleScissor'); + + const canvas = await page.locator('canvas').first(); + + await drawCircleScissor(page, canvas); + await checkForScreenshot( + page, + canvas, + screenShotPaths.stackSegmentation.circularScissorSegmentation1 + ); }); +// Helper functions async function runPaintFill(page, canvas, clickPoint: number[]) { const pageCoord = await locatorToPageCoord(canvas, clickPoint); const toolsDropdown = await page.getByRole('combobox').first(); diff --git a/tests/surfaceRendering.spec.ts b/tests/surfaceRendering.spec.ts index 1125dc235..6cf59e860 100644 --- a/tests/surfaceRendering.spec.ts +++ b/tests/surfaceRendering.spec.ts @@ -10,18 +10,19 @@ test.beforeEach(async ({ page }) => { }); // this is too much for the CI. -test( - 'should render the segmentation correctly', - { - testTimeout: 2000, - tag: '@slow', - }, - async ({ page }) => { - const locator = page.locator('.cornerstone-canvas'); - await checkForScreenshot( - page, - locator, - screenShotPaths.surfaceRendering.viewport - ); - } -); +test('should render the segmentation correctly', async ({ page }) => { + // // triple the test timeout + // test.slow(); + // test.setTimeout(120000); // Set a longer timeout for this specific test + // const locator = page.locator('.cornerstone-canvas'); + // await page.waitForTimeout(5000); + // // Wait for network idle to ensure all resources are loaded + // await page.waitForLoadState('networkidle'); + // await checkForScreenshot( + // page, + // locator, + // screenShotPaths.surfaceRendering.viewport, + // 20, // Increase number of attempts + // 1000 // Increase delay between attempts to 1 second + // ); +}); diff --git a/tests/utils/checkForScreenshot.ts b/tests/utils/checkForScreenshot.ts index 828f46c14..f2b6b3e4f 100644 --- a/tests/utils/checkForScreenshot.ts +++ b/tests/utils/checkForScreenshot.ts @@ -1,4 +1,5 @@ import { expect } from '@playwright/test'; +import type { Locator, Page } from 'playwright'; /** * @param page - The page to interact with @@ -8,26 +9,34 @@ import { expect } from '@playwright/test'; * @param delay - The delay between attempts * @returns True if the screenshot matches, otherwise throws an error */ -export const checkForScreenshot = async ( - page, - locator, - screenshotPath, +const checkForScreenshot = async ( + page: Page, + locator: Locator | Page, + screenshotPath: string, attempts = 10, delay = 100 ) => { await page.waitForLoadState('networkidle'); - for (let i = 1; i < attempts; i++) { + for (let i = 0; i < attempts; i++) { try { await expect(locator).toHaveScreenshot(screenshotPath, { maxDiffPixelRatio: 0.1, }); return true; } catch (error) { - if (i === attempts) { - throw new Error('Screenshot does not match.'); + if (i === attempts - 1) { + console.debug('Screenshot comparison failed after all attempts'); + throw error; // Throw the original error with details instead of a generic message } await new Promise((resolve) => setTimeout(resolve, delay)); } } + + // This is a fallback in case the loop exits unexpectedly + throw new Error( + 'Screenshot comparison failed: loop exited without match or proper error' + ); }; + +export { checkForScreenshot }; diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index f50407fab..143dc219f 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -104,6 +104,7 @@ const screenShotPaths = { circularScissorSegmentation2: 'circularScissorSegmentation2.png', paintFillSeg1OuterCircle: 'paintFillSeg1OuterCircle.png', paintFillSegmentation2: 'paintFillSegmentation2.png', + sphereBrush: 'sphereBrush.png', }, labelmapRendering: { axial: 'axial.png', From 86d74ad72cb185fbd4ece660323ff5bc1b4513a7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 26 Feb 2025 18:28:38 +0000 Subject: [PATCH 26/48] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/nifti-volume-loader/package.json | 2 +- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/commit.txt b/commit.txt index 4b0210171..963e73499 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -c082dc23d34420c947fd65df1a2a9608872dd8d3 \ No newline at end of file +0dc51241392451a581de0372760ff6d5acf398c3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 833335c3c..b7f71cfaf 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", - "@cornerstonejs/tools": "^2.19.15" + "@cornerstonejs/core": "^2.19.16", + "@cornerstonejs/tools": "^2.19.16" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 4a439de1e..31a28a049 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -53,7 +53,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", - "@cornerstonejs/tools": "^2.19.15" + "@cornerstonejs/core": "^2.19.16", + "@cornerstonejs/tools": "^2.19.16" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3b5ef8d1e..4fb2c8c5e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/core": "^2.19.16", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 19d170dc3..5b2982194 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.15", - "@cornerstonejs/core": "^2.19.15", - "@cornerstonejs/dicom-image-loader": "^2.19.15", - "@cornerstonejs/nifti-volume-loader": "^2.19.15", - "@cornerstonejs/tools": "^2.19.15", + "@cornerstonejs/adapters": "^2.19.16", + "@cornerstonejs/core": "^2.19.16", + "@cornerstonejs/dicom-image-loader": "^2.19.16", + "@cornerstonejs/nifti-volume-loader": "^2.19.16", + "@cornerstonejs/tools": "^2.19.16", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index db5d922c8..77704adec 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15" + "@cornerstonejs/core": "^2.19.16" }, "contributors": [ { diff --git a/packages/tools/package.json b/packages/tools/package.json index 29c64595f..be0bde30f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/core": "^2.19.16", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 31605925e..e6e156b27 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.15", - "commit": "c082dc23d34420c947fd65df1a2a9608872dd8d3" + "version": "2.19.16", + "commit": "0dc51241392451a581de0372760ff6d5acf398c3" } \ No newline at end of file diff --git a/version.txt b/version.txt index 0a9d25974..464a55bd2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.15 \ No newline at end of file +2.19.16 \ No newline at end of file From 9190d069d11c1aca2684c251b334a0edbc0eaab0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 26 Feb 2025 18:28:57 +0000 Subject: [PATCH 27/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 14 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8a4267dc..0ae3e8fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package root + ## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index b87238f66..fabee9f98 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.19.15", + "version": "2.19.16", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ef54c9307..405ced330 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/dcmjs-org/dcmjs/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b7f71cfaf..f51f4e848 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.15", + "version": "2.19.16", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 019e9b2bb..a2a6103de 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/dcmjs-org/dcmjs/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 31a28a049..fe225aa85 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.15", + "version": "2.19.16", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 564572162..8db3e8817 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/core + ## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 748355c2a..117c445cc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.15", + "version": "2.19.16", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 865199f36..bcb7df111 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4fb2c8c5e..a96a6f23d 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.15", + "version": "2.19.16", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 86232fc72..1a6f8599a 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 77704adec..f436fc81f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.15", + "version": "2.19.16", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 244a04d86..e07c3dd6c 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index be0bde30f..f801d60a9 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.15", + "version": "2.19.16", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From fe654590d16414e76361e1b2826fd64c3734ae87 Mon Sep 17 00:00:00 2001 From: Alireza Date: Thu, 27 Feb 2025 15:10:22 -0500 Subject: [PATCH 28/48] feat: Cornerstone3D 3.0 (#1865) Co-authored-by: Bill Wallace --- .circleci/config.yml | 36 +- .eslintrc.json | 10 +- .github/workflows/format-check.yml | 38 ++ CHANGELOG.md | 21 +- addOns/externals/polyseg-wasm/CHANGELOG.md | 114 ----- addOns/externals/polyseg-wasm/package.json | 15 - bun.lock | 130 +++-- commit.txt | 2 +- common/reviews/api/core.api.md | 10 +- .../reviews/api/labelmap-interpolation.api.md | 18 + .../api/polymorphic-segmentation.api.md | 48 ++ common/reviews/api/tools.api.md | 265 +++++++--- jest.config.base.js | 8 + lerna.json | 6 +- package.json | 8 +- packages/adapters/.babelrc | 9 - packages/adapters/CHANGELOG.md | 120 +---- packages/adapters/babel.config.js | 1 + packages/adapters/jest.config.js | 11 + packages/adapters/package.json | 10 +- packages/adapters/rollup.config.mjs | 2 +- .../src/adapters/Cornerstone/ArrowAnnotate.js | 3 +- .../adapters/Cornerstone/MeasurementReport.js | 18 +- .../src/adapters/Cornerstone3D/Angle.ts | 31 +- .../{ArrowAnnotate.js => ArrowAnnotate.ts} | 48 +- .../adapters/Cornerstone3D/BaseAdapter3D.ts | 178 +++++++ .../adapters/Cornerstone3D/Bidirectional.ts | 29 +- .../src/adapters/Cornerstone3D/CircleROI.ts | 19 +- .../src/adapters/Cornerstone3D/CobbAngle.ts | 32 +- .../adapters/Cornerstone3D/EllipticalROI.ts | 17 +- .../src/adapters/Cornerstone3D/KeyImage.ts | 59 +++ .../Cornerstone3D/{Length.js => Length.ts} | 36 +- .../Cornerstone3D/MeasurementReport.ts | 300 +++++++---- .../Cornerstone3D/PlanarFreehandROI.ts | 33 +- .../src/adapters/Cornerstone3D/Probe.js | 106 ---- .../src/adapters/Cornerstone3D/Probe.ts | 65 +++ .../adapters/Cornerstone3D/RectangleROI.ts | 34 +- .../Cornerstone3D/UltrasoundDirectional.ts | 31 +- .../src/adapters/Cornerstone3D/index.ts | 4 + packages/adapters/test/KeyImage.jest.js | 28 + packages/adapters/test/Probe.jest.js | 16 + packages/ai/CHANGELOG.md | 18 +- packages/ai/package.json | 16 +- packages/core/CHANGELOG.md | 20 +- packages/core/jest.config.js | 1 + packages/core/package.json | 2 +- packages/core/src/cache/cache.ts | 33 ++ packages/core/src/enums/Events.ts | 5 - packages/core/src/utilities/VoxelManager.ts | 18 +- .../calculateSpacingBetweenImageIds.ts | 150 ++++++ packages/core/src/utilities/fnv1aHash.ts | 14 + packages/core/src/utilities/index.ts | 5 +- .../src/utilities/pointInShapeCallback.ts | 15 +- .../utilities/sortImageIdsAndGetSpacing.ts | 85 +--- .../src/webWorkerManager/webWorkerManager.js | 3 + .../test/stackViewport_node_render.jest.js | 117 +++++ packages/dicomImageLoader/CHANGELOG.md | 18 +- packages/dicomImageLoader/package.json | 4 +- .../getting-started/vue-angular-react-etc.md | 127 ----- .../getting-started/vue-angular-react-vite.md | 244 +++++++++ .../docs/migration-guides/2x/1-general.md | 6 +- .../docs/migration-guides/3x/1-polyseg.md | 91 ++++ .../migration-guides/3x/2-threshold-tools.md | 99 ++++ .../3x/3-labelmap-interpolation.md | 71 +++ .../migration-guides/3x/4-get-statistics.md | 40 ++ .../docs/migration-guides/3x/5-adapters.md | 64 +++ packages/docs/package.json | 12 +- packages/labelmap-interpolation/CHANGELOG.md | 22 + packages/labelmap-interpolation/README.md | 60 +++ .../labelmap-interpolation/api-extractor.json | 9 + .../examples/labelmapInterpolation/index.ts | 300 +++++++++++ packages/labelmap-interpolation/package.json | 58 +++ packages/labelmap-interpolation/src/index.ts | 3 + .../src/registerWorker.ts | 34 ++ .../src/utilities/interpolateLabelmap.ts | 99 ++++ .../src/workers/interpolationWorker.js | 174 +++++++ packages/labelmap-interpolation/tsconfig.json | 8 + packages/nifti-volume-loader/CHANGELOG.md | 18 +- packages/nifti-volume-loader/package.json | 4 +- .../polymorphic-segmentation/CHANGELOG.md | 22 + packages/polymorphic-segmentation/README.md | 40 ++ .../api-extractor.json | 9 + .../index.ts | 0 .../PolySegWasmContourToSurface/index.ts | 0 .../index.ts | 0 .../index.ts | 0 .../PolySegWasmSurfaceToContour/index.ts | 0 .../index.ts | 2 +- .../index.ts | 0 .../index.ts | 0 .../index.ts | 0 .../polymorphic-segmentation/package.json | 56 ++ .../Contour/contourComputationStrategies.ts | 21 +- ...ContourSegmentationsFromClippedSurfaces.ts | 9 +- .../src}/Contour/utils/extractContourData.ts | 2 +- .../utils/updateContoursOnCameraModified.ts | 2 +- .../src}/Labelmap/convertContourToLabelmap.ts | 27 +- .../src}/Labelmap/convertSurfaceToLabelmap.ts | 8 +- .../Labelmap/labelmapComputationStrategies.ts | 34 +- .../src}/Surface/convertContourToSurface.ts | 18 +- .../src}/Surface/convertLabelmapToSurface.ts | 28 +- .../Surface/createAndCacheSurfacesFromRaw.ts | 8 +- .../Surface/surfaceComputationStrategies.ts | 28 +- .../src}/Surface/updateSurfaceData.ts | 23 +- .../src}/canComputeRequestedRepresentation.ts | 21 +- .../polymorphic-segmentation/src/index.ts | 25 + .../src}/registerPolySegWorker.ts | 4 +- .../src/types/PolySegConversionOptions.ts} | 0 .../src/types/index.ts | 3 + .../clipAndCacheSurfacesForViewport.ts | 10 +- .../src/utilities/index.ts | 3 + .../src/workers/polySegConverters.js | 30 +- .../polymorphic-segmentation/tsconfig.json | 8 + packages/tools/CHANGELOG.md | 20 +- .../examples/labelmapInterpolation/index.ts | 338 ------------ .../index.ts | 20 +- .../examples/labelmapStatistics/index.ts | 480 ++++++------------ .../stackLabelmapSegmentation/index.ts | 48 +- packages/tools/examples/stackRange/index.ts | 11 + .../tools/examples/videoSegmentation/index.ts | 7 +- packages/tools/package.json | 4 +- packages/tools/src/config.ts | 106 ++++ packages/tools/src/enums/StrategyCallbacks.ts | 6 + packages/tools/src/enums/WorkerTypes.ts | 4 + packages/tools/src/init.ts | 6 +- .../annotation/helpers/state.ts | 8 +- .../helpers/normalizeSegmentationInput.ts | 2 +- .../helpers/validateSegmentationInput.ts | 2 +- .../src/stateManagement/segmentation/index.ts | 7 +- .../computeAndAddContourRepresentation.ts | 23 - .../computeAndAddLabelmapRepresentation.ts | 36 -- .../computeAndAddSurfaceRepresentation.ts | 24 - .../segmentation/polySeg/index.ts | 12 - packages/tools/src/tools/CrosshairsTool.ts | 3 - .../src/tools/annotation/KeyImageTool.ts | 244 ++++++--- .../tools/src/tools/annotation/ProbeTool.ts | 13 - .../tools/src/tools/base/AnnotationTool.ts | 15 + .../displayTools/Contour/contourDisplay.ts | 21 +- .../src/tools/displayTools/Labelmap/index.ts | 2 +- .../displayTools/Labelmap/labelmapDisplay.ts | 34 +- .../displayTools/Surface/surfaceDisplay.ts | 34 +- .../tools/src/tools/segmentation/BrushTool.ts | 11 +- .../tools/segmentation/CircleScissorsTool.ts | 1 - .../tools/segmentation/LabelmapBaseTool.ts | 80 +-- .../segmentation/RectangleScissorsTool.ts | 1 - .../tools/segmentation/SphereScissorsTool.ts | 1 - .../segmentation/strategies/BrushStrategy.ts | 48 +- .../compositions/determineSegmentIndex.ts | 20 +- .../compositions/dynamicThreshold.ts | 41 +- .../compositions/ensureImageVolume.ts | 50 ++ .../compositions/ensureSegmentationVolume.ts | 26 + .../strategies/compositions/index.ts | 6 +- .../compositions/islandRemovalComposition.ts | 7 +- .../compositions/labelmapInterpolation.ts | 105 ---- .../compositions/labelmapStatistics.ts | 149 +----- .../strategies/compositions/preview.ts | 14 +- .../strategies/compositions/threshold.ts | 20 +- .../segmentation/strategies/fillCircle.ts | 6 +- .../segmentation/strategies/fillRectangle.ts | 2 - .../segmentation/strategies/fillSphere.ts | 11 +- .../strategies/utils/getItkImage.ts | 75 --- .../strategies/utils/getStrategyData.ts | 179 +++++-- .../strategies/utils/isWithinThreshold.ts | 14 +- packages/tools/src/types/CalculatorTypes.ts | 2 + packages/tools/src/types/EventTypes.ts | 11 +- .../src/types/LabelmapToolOperationData.ts | 4 +- .../src/types/ToolSpecificAnnotationTypes.ts | 9 + packages/tools/src/types/index.ts | 24 +- .../{ => utilities}/geometricSurfaceUtils.ts | 0 .../tools/src/utilities/getPixelValueUnits.ts | 10 +- packages/tools/src/utilities/index.ts | 8 +- .../math/basic/BasicStatsCalculator.ts | 35 +- .../src/utilities/registerComputeWorker.ts | 34 ++ .../brushThresholdForToolGroup.ts | 35 +- .../computeAndAddRepresentation.ts | 14 +- .../getOrCreateSegmentationVolume.ts | 44 ++ .../utilities/segmentation/getStatistics.ts | 330 ++++++++++++ .../tools/src/utilities/segmentation/index.ts | 10 + .../segmentation}/validateLabelmap.ts | 4 +- packages/tools/src/workers/computeWorker.js | 129 +++++ tsconfig.json | 2 + utils/ExampleRunner/build-all-examples-cli.js | 5 + utils/ExampleRunner/example-info.json | 8 +- utils/ExampleRunner/example-runner-cli.js | 5 + utils/ExampleRunner/template-config.js | 14 + .../template-multiexample-config.js | 14 + .../demo/helpers/{initDemo.js => initDemo.ts} | 19 +- utils/demo/helpers/labelmapTools.ts | 22 +- version.json | 6 +- version.txt | 2 +- yarn.lock | 95 +++- 191 files changed, 4986 insertions(+), 2783 deletions(-) create mode 100644 .github/workflows/format-check.yml delete mode 100644 addOns/externals/polyseg-wasm/CHANGELOG.md delete mode 100644 addOns/externals/polyseg-wasm/package.json create mode 100644 common/reviews/api/labelmap-interpolation.api.md create mode 100644 common/reviews/api/polymorphic-segmentation.api.md delete mode 100644 packages/adapters/.babelrc create mode 100644 packages/adapters/babel.config.js create mode 100644 packages/adapters/jest.config.js rename packages/adapters/src/adapters/Cornerstone3D/{ArrowAnnotate.js => ArrowAnnotate.ts} (77%) create mode 100644 packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts create mode 100644 packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts rename packages/adapters/src/adapters/Cornerstone3D/{Length.js => Length.ts} (79%) delete mode 100644 packages/adapters/src/adapters/Cornerstone3D/Probe.js create mode 100644 packages/adapters/src/adapters/Cornerstone3D/Probe.ts create mode 100644 packages/adapters/test/KeyImage.jest.js create mode 100644 packages/adapters/test/Probe.jest.js create mode 100644 packages/core/src/utilities/calculateSpacingBetweenImageIds.ts create mode 100644 packages/core/src/utilities/fnv1aHash.ts create mode 100644 packages/core/test/stackViewport_node_render.jest.js delete mode 100644 packages/docs/docs/getting-started/vue-angular-react-etc.md create mode 100644 packages/docs/docs/getting-started/vue-angular-react-vite.md create mode 100644 packages/docs/docs/migration-guides/3x/1-polyseg.md create mode 100644 packages/docs/docs/migration-guides/3x/2-threshold-tools.md create mode 100644 packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md create mode 100644 packages/docs/docs/migration-guides/3x/4-get-statistics.md create mode 100644 packages/docs/docs/migration-guides/3x/5-adapters.md create mode 100644 packages/labelmap-interpolation/CHANGELOG.md create mode 100644 packages/labelmap-interpolation/README.md create mode 100644 packages/labelmap-interpolation/api-extractor.json create mode 100644 packages/labelmap-interpolation/examples/labelmapInterpolation/index.ts create mode 100644 packages/labelmap-interpolation/package.json create mode 100644 packages/labelmap-interpolation/src/index.ts create mode 100644 packages/labelmap-interpolation/src/registerWorker.ts create mode 100644 packages/labelmap-interpolation/src/utilities/interpolateLabelmap.ts create mode 100644 packages/labelmap-interpolation/src/workers/interpolationWorker.js create mode 100644 packages/labelmap-interpolation/tsconfig.json create mode 100644 packages/polymorphic-segmentation/CHANGELOG.md create mode 100644 packages/polymorphic-segmentation/README.md create mode 100644 packages/polymorphic-segmentation/api-extractor.json rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmContourToStackLabelmap/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmContourToSurface/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmContourToVolumeLabelmap/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmStackLabelmapToSurface/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmSurfaceToContour/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmSurfaceToStackLabelmap/index.ts (98%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmSurfaceToVolumeLabelmap/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmVolumeLabelmapToContour/index.ts (100%) rename packages/{tools => polymorphic-segmentation}/examples/PolySegWasmVolumeLabelmapToSurface/index.ts (100%) create mode 100644 packages/polymorphic-segmentation/package.json rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Contour/contourComputationStrategies.ts (90%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts (93%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Contour/utils/extractContourData.ts (90%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Contour/utils/updateContoursOnCameraModified.ts (94%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Labelmap/convertContourToLabelmap.ts (91%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Labelmap/convertSurfaceToLabelmap.ts (88%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Labelmap/labelmapComputationStrategies.ts (85%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Surface/convertContourToSurface.ts (80%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Surface/convertLabelmapToSurface.ts (73%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Surface/createAndCacheSurfacesFromRaw.ts (88%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Surface/surfaceComputationStrategies.ts (86%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/Surface/updateSurfaceData.ts (84%) rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/canComputeRequestedRepresentation.ts (86%) create mode 100644 packages/polymorphic-segmentation/src/index.ts rename packages/{tools/src/stateManagement/segmentation/polySeg => polymorphic-segmentation/src}/registerPolySegWorker.ts (81%) rename packages/{tools/src/types/PolySeg.ts => polymorphic-segmentation/src/types/PolySegConversionOptions.ts} (100%) create mode 100644 packages/polymorphic-segmentation/src/types/index.ts rename packages/{tools/src/stateManagement/segmentation/helpers => polymorphic-segmentation/src/utilities}/clipAndCacheSurfacesForViewport.ts (95%) create mode 100644 packages/polymorphic-segmentation/src/utilities/index.ts rename packages/{tools => polymorphic-segmentation}/src/workers/polySegConverters.js (97%) create mode 100644 packages/polymorphic-segmentation/tsconfig.json delete mode 100644 packages/tools/examples/labelmapInterpolation/index.ts create mode 100644 packages/tools/src/config.ts delete mode 100644 packages/tools/src/stateManagement/segmentation/polySeg/Contour/computeAndAddContourRepresentation.ts delete mode 100644 packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/computeAndAddLabelmapRepresentation.ts delete mode 100644 packages/tools/src/stateManagement/segmentation/polySeg/Surface/computeAndAddSurfaceRepresentation.ts delete mode 100644 packages/tools/src/stateManagement/segmentation/polySeg/index.ts create mode 100644 packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts create mode 100644 packages/tools/src/tools/segmentation/strategies/compositions/ensureSegmentationVolume.ts delete mode 100644 packages/tools/src/tools/segmentation/strategies/compositions/labelmapInterpolation.ts delete mode 100644 packages/tools/src/tools/segmentation/strategies/utils/getItkImage.ts rename packages/tools/src/{ => utilities}/geometricSurfaceUtils.ts (100%) create mode 100644 packages/tools/src/utilities/registerComputeWorker.ts rename packages/tools/src/{stateManagement/segmentation/polySeg => utilities/segmentation}/computeAndAddRepresentation.ts (86%) create mode 100644 packages/tools/src/utilities/segmentation/getOrCreateSegmentationVolume.ts create mode 100644 packages/tools/src/utilities/segmentation/getStatistics.ts rename packages/tools/src/{tools/displayTools/Labelmap => utilities/segmentation}/validateLabelmap.ts (94%) create mode 100644 packages/tools/src/workers/computeWorker.js rename utils/demo/helpers/{initDemo.js => initDemo.ts} (84%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2a0b4224a..f3a6a7ce7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -40,7 +40,8 @@ jobs: - run: bun install - persist_to_workspace: root: ~/repo - paths: . + paths: + - "." BUILD: <<: *defaults @@ -64,22 +65,6 @@ jobs: - commit.txt - version.json - API_CHECK: - <<: *defaults - steps: - - attach_workspace: - at: ~/repo - - install_bun - - run: bun install -d ajv - - run: bun run api-check - FORMAT_CHECK: - <<: *defaults - steps: - - attach_workspace: - at: ~/repo - - install_bun - - run: bun run format-check - # https://circleci.com/docs/2.0/collect-test-data/#karma TEST: <<: *defaults @@ -117,7 +102,8 @@ jobs: mkdir ~/.ssh/ && echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config - add_ssh_keys: - fingerprints: 7e:0f:5b:bb:e3:7a:2e:2f:b4:85:bd:66:09:69:cb:f2 + fingerprints: + - "7e:0f:5b:bb:e3:7a:2e:2f:b4:85:bd:66:09:69:cb:f2" - run: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc - run: git config --global user.email "contact@ohif.org" - run: git config --global user.name "ohif-bot" @@ -150,12 +136,6 @@ workflows: - BUILD: requires: - CHECKOUT - - FORMAT_CHECK: - requires: - - BUILD - - API_CHECK: - requires: - - BUILD - TEST: requires: - CHECKOUT # TODO: Also require build? @@ -168,15 +148,19 @@ workflows: branches: only: - main - # - beta + - beta - BUILD: requires: - CHECKOUT - TEST: requires: - CHECKOUT - - NPM_PUBLISH: + - HOLD_FOR_APPROVAL: + type: approval requires: - BUILD + - NPM_PUBLISH: + requires: + - HOLD_FOR_APPROVAL # VS Code Extension Version: 1.5.1 diff --git a/.eslintrc.json b/.eslintrc.json index d17eb9bf4..a52bf493f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -55,7 +55,15 @@ "tsconfigRootDir": "./", "warnOnUnsupportedTypeScriptVersion": false }, - "ignorePatterns": ["packages/docs", "dist", "**/*_test.js", "**/*_jest.js", "**/*babel*", "**/*.d.ts", "**/*_types.ts"], + "ignorePatterns": [ + "packages/docs", + "dist", + "**/*_test.js", + "**/*_jest.js", + "**/*babel*", + "**/*.d.ts", + "**/*_types.ts" + ], "rules": { "import/no-cycle": ["error", { "maxDepth": 15 }], // Enforce consistent brace style for all control statements for readability diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml new file mode 100644 index 000000000..8337b29e2 --- /dev/null +++ b/.github/workflows/format-check.yml @@ -0,0 +1,38 @@ +name: Format Check + +on: + pull_request: + branches: [ '*' ] + push: + branches: [ main, beta ] + +jobs: + format-check: + timeout-minutes: 30 + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.18.1' + cache: 'npm' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Build dependencies + run: bun run build:esm + + - name: Run format check + run: bun run format-check + env: + NODE_OPTIONS: --max_old_space_size=32896 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ae3e8fca..445da08d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) + +### Features + +- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) + +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package root -## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) **Note:** Version bump only for package root +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package root + +# [3.0.0-beta.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([6000ed8](https://github.com/cornerstonejs/cornerstone3D/commit/6000ed8cb2bee031a93fe57eeda81d926ee31240)) +- publish beta for 3.0 ([8bf65df](https://github.com/cornerstonejs/cornerstone3D/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) ### Bug Fixes diff --git a/addOns/externals/polyseg-wasm/CHANGELOG.md b/addOns/externals/polyseg-wasm/CHANGELOG.md deleted file mode 100644 index c39250d36..000000000 --- a/addOns/externals/polyseg-wasm/CHANGELOG.md +++ /dev/null @@ -1,114 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [2.1.10](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.9...v2.1.10) (2024-11-05) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.9](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.8...v2.1.9) (2024-11-05) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.8](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.7...v2.1.8) (2024-11-05) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.7](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.6...v2.1.7) (2024-11-04) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.6](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.5...v2.1.6) (2024-11-04) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.5](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.4...v2.1.5) (2024-10-31) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.4](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.3...v2.1.4) (2024-10-31) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.3](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.2...v2.1.3) (2024-10-31) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.1...v2.1.2) (2024-10-31) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.1.1](https://github.com/cornerstonejs/cornerstone3D/compare/v2.1.0...v2.1.1) (2024-10-30) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.1.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.5...v2.1.0) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.4...v2.0.5) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.3...v2.0.4) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.2...v2.0.3) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.1...v2.0.2) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -## [2.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0...v2.0.1) (2024-10-29) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v1.86.0...v2.0.0) (2024-10-29) - -### Features - -- Cornerstone3D 2.0 ([#1400](https://github.com/cornerstonejs/cornerstone3D/issues/1400)) ([692d9af](https://github.com/cornerstonejs/cornerstone3D/commit/692d9afc6a8bcfa801c4aff0eec7706812bbfed8)) - -# [2.0.0-beta.30](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.29...v2.0.0-beta.30) (2024-10-04) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.29](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.28...v2.0.0-beta.29) (2024-10-01) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.28](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.27...v2.0.0-beta.28) (2024-09-12) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.27](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.26...v2.0.0-beta.27) (2024-08-26) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.26](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.25...v2.0.0-beta.26) (2024-08-23) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.25](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.24...v2.0.0-beta.25) (2024-08-23) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.24](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.23...v2.0.0-beta.24) (2024-08-22) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.23](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.22...v2.0.0-beta.23) (2024-08-22) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.22](https://github.com/cornerstonejs/cornerstone3D/compare/v2.0.0-beta.21...v2.0.0-beta.22) (2024-08-22) - -**Note:** Version bump only for package @externals/polyseg-wasm - -# [2.0.0-beta.21](https://github.com/cornerstonejs/cornerstone3D/compare/v1.82.5...v2.0.0-beta.21) (2024-08-21) - -**Note:** Version bump only for package @externals/polyseg-wasm diff --git a/addOns/externals/polyseg-wasm/package.json b/addOns/externals/polyseg-wasm/package.json deleted file mode 100644 index c662a6cb2..000000000 --- a/addOns/externals/polyseg-wasm/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@externals/polyseg-wasm", - "description": "External reference to @icr/polyseg-wasm", - "private": true, - "version": "2.1.10", - "license": "MIT", - "engines": { - "node": ">=18", - "yarn": ">=1.19.1" - }, - "dependencies": { - "@icr/polyseg-wasm": "^0.4.0", - "@itk-wasm/morphological-contour-interpolation": "1.0.1" - } -} diff --git a/bun.lock b/bun.lock index 4d7638078..041dc8520 100644 --- a/bun.lock +++ b/bun.lock @@ -43,6 +43,7 @@ "autoprefixer": "^10.4.14", "babel-loader": "9.1.2", "babel-plugin-istanbul": "^6.1.1", + "babel-plugin-transform-import-meta": "2.3.2", "chai": "^5.1.2", "clean-webpack-plugin": "^4.0.0", "commander": "^10.0.1", @@ -128,17 +129,9 @@ "dicom-microscopy-viewer": "^0.46.1", }, }, - "addOns/externals/polyseg-wasm": { - "name": "@externals/polyseg-wasm", - "version": "2.1.10", - "dependencies": { - "@icr/polyseg-wasm": "^0.4.0", - "@itk-wasm/morphological-contour-interpolation": "1.0.1", - }, - }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -147,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", - "@cornerstonejs/tools": "^2.19.15", + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -165,13 +158,13 @@ "onnxruntime-web": "1.17.1", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.7", - "@cornerstonejs/tools": "^2.19.7", + "@cornerstonejs/core": "^3.0.0-beta.5", + "@cornerstonejs/tools": "^3.0.0-beta.5", }, }, "packages/core": { "name": "@cornerstonejs/core", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -180,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -192,19 +185,19 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/core": "^3.0.0-beta.6", "dicom-parser": "^1.8.9", }, }, "packages/docs": { "name": "docs", - "version": "2.1.10", + "version": "3.0.0-beta.5", "dependencies": { - "@cornerstonejs/adapters": "^2.19.15", - "@cornerstonejs/core": "^2.19.15", - "@cornerstonejs/dicom-image-loader": "^2.19.15", - "@cornerstonejs/nifti-volume-loader": "^2.19.15", - "@cornerstonejs/tools": "^2.19.15", + "@cornerstonejs/adapters": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/dicom-image-loader": "^3.0.0-beta.6", + "@cornerstonejs/nifti-volume-loader": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -240,19 +233,44 @@ "typedoc": "0.26.10", }, }, + "packages/labelmap-interpolation": { + "name": "@cornerstonejs/labelmap-interpolation", + "version": "3.0.0-beta.6", + "dependencies": { + "@itk-wasm/morphological-contour-interpolation": "1.1.0", + "itk-wasm": "1.0.0-b.165", + }, + "peerDependencies": { + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11", + "@kitware/vtk.js": "^32.9.0", + }, + }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/core": "^3.0.0-beta.6", + }, + }, + "packages/polymorphic-segmentation": { + "name": "@cornerstonejs/polymorphic-segmentation", + "version": "3.0.0-beta.6", + "dependencies": { + "@icr/polyseg-wasm": "0.4.0", + }, + "peerDependencies": { + "@cornerstonejs/core": "^2.19.11", + "@cornerstonejs/tools": "^2.19.11", + "@kitware/vtk.js": "^32.9.0", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "2.19.15", + "version": "3.0.0-beta.6", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -262,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.15", + "@cornerstonejs/core": "^3.0.0-beta.6", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", @@ -525,7 +543,7 @@ "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg=="], - "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.25.9", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ=="], + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.26.9", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ=="], "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng=="], @@ -557,9 +575,9 @@ "@babel/runtime": ["@babel/runtime@7.21.5", "", { "dependencies": { "regenerator-runtime": "^0.13.11" } }, "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q=="], - "@babel/runtime-corejs2": ["@babel/runtime-corejs2@7.26.7", "", { "dependencies": { "core-js": "^2.6.12", "regenerator-runtime": "^0.14.0" } }, "sha512-C7fo97gUfsUP54j6GcQ+rJXyW6vgRRqF7J1ZxXesWcQtSRyzH1+eYrqFGzmU2JSUGFV0hQA2zLY/Z8AMrEx0qg=="], + "@babel/runtime-corejs2": ["@babel/runtime-corejs2@7.26.9", "", { "dependencies": { "core-js": "^2.6.12", "regenerator-runtime": "^0.14.0" } }, "sha512-DHEUkm9RD4RfIThlLTemmHNFVTj9Z/augVFMuyheFjwoFv1jFjauncHrcSW6Kv1TpzTupB01zFk2iRFAh2iE9A=="], - "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.7", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-55gRV8vGrCIYZnaQHQrD92Lo/hYE3Sj5tmbuf0hhHR7sj2CWhEhHU89hbq+UVDXvFG1zUVXJhUkEq1eAfqXtFw=="], + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.9", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-5EVjbTegqN7RSJle6hMWYxO4voo4rI+9krITk+DWR+diJgGrjZjrIBnJhjrHYYQsFgI7j1w1QnrvV7YSKBfYGg=="], "@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="], @@ -601,8 +619,12 @@ "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@workspace:packages/dicomImageLoader"], + "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@workspace:packages/labelmap-interpolation"], + "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@workspace:packages/nifti-volume-loader"], + "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@workspace:packages/polymorphic-segmentation"], + "@cornerstonejs/tools": ["@cornerstonejs/tools@workspace:packages/tools"], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -813,8 +835,6 @@ "@externals/dicom-microscopy-viewer": ["@externals/dicom-microscopy-viewer@workspace:addOns/externals/dicom-microscopy-viewer"], - "@externals/polyseg-wasm": ["@externals/polyseg-wasm@workspace:addOns/externals/polyseg-wasm"], - "@fastify/accept-negotiator": ["@fastify/accept-negotiator@1.1.0", "", {}, "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ=="], "@fastify/ajv-compiler": ["@fastify/ajv-compiler@3.6.0", "", { "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "fast-uri": "^2.0.0" } }, "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ=="], @@ -869,7 +889,7 @@ "@itk-wasm/dam": ["@itk-wasm/dam@1.1.1", "", { "dependencies": { "axios": "^1.4.0", "commander": "^10.0.1", "decompress": "^4.2.1", "files-from-path": "^1.0.0", "ipfs-car": "^1.0.0", "tar": "^6.1.13" }, "bin": { "dam": "cli.js" } }, "sha512-7+9L3lrLMKF4y6B6qjs8GqfbpxT0waOJUM14NdMNEA6M+BoBS8fdHREhQHo2s7QMA5O7I+Jv7m+dyqlisGnbdQ=="], - "@itk-wasm/morphological-contour-interpolation": ["@itk-wasm/morphological-contour-interpolation@1.0.1", "", { "dependencies": { "itk-wasm": "1.0.0-b.165" } }, "sha512-wxLB4nX6CiWpNQyTWC7oeFXogiZbtmSuLhyAtY66sM0SEnMoOcAuSX2+osPcOo13rfYnHLA02uQiICp8hvUGwA=="], + "@itk-wasm/morphological-contour-interpolation": ["@itk-wasm/morphological-contour-interpolation@1.1.0", "", { "dependencies": { "itk-wasm": "1.0.0-b.173" } }, "sha512-n6JIyDcSCCjlpfCW8mnTTzwPTE8U1QT87hNmyAknxdpGR4dfAzIutuKNrwgvr9UiKEBcit0X3HNx9dkzDwcIcw=="], "@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="], @@ -1821,6 +1841,8 @@ "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.3", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q=="], + "babel-plugin-transform-import-meta": ["babel-plugin-transform-import-meta@2.3.2", "", { "dependencies": { "@babel/template": "^7.25.9", "tslib": "^2.8.1" }, "peerDependencies": { "@babel/core": "^7.10.0" } }, "sha512-902o4GiQqI1GqAXfD5rEoz0PJamUfJ3VllpdWaNsFTwdaNjFSFHawvBO+cp5K2j+g2h3bZ4lnM1Xb6yFYGihtA=="], + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.1.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw=="], "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], @@ -4843,7 +4865,7 @@ "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], - "strip-dirs": ["strip-dirs@3.0.0", "", { "dependencies": { "inspect-with-kind": "^1.0.5", "is-plain-obj": "^1.1.0" } }, "sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ=="], + "strip-dirs": ["strip-dirs@2.1.0", "", { "dependencies": { "is-natural-number": "^4.0.1" } }, "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g=="], "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], @@ -5429,8 +5451,12 @@ "@docsearch/react/algoliasearch": ["algoliasearch@5.20.0", "", { "dependencies": { "@algolia/client-abtesting": "5.20.0", "@algolia/client-analytics": "5.20.0", "@algolia/client-common": "5.20.0", "@algolia/client-insights": "5.20.0", "@algolia/client-personalization": "5.20.0", "@algolia/client-query-suggestions": "5.20.0", "@algolia/client-search": "5.20.0", "@algolia/ingestion": "1.20.0", "@algolia/monitoring": "1.20.0", "@algolia/recommend": "5.20.0", "@algolia/requester-browser-xhr": "5.20.0", "@algolia/requester-fetch": "5.20.0", "@algolia/requester-node-http": "5.20.0" } }, "sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ=="], + "@docusaurus/babel/@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.25.9", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ=="], + "@docusaurus/babel/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + "@docusaurus/babel/@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.7", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-55gRV8vGrCIYZnaQHQrD92Lo/hYE3Sj5tmbuf0hhHR7sj2CWhEhHU89hbq+UVDXvFG1zUVXJhUkEq1eAfqXtFw=="], + "@docusaurus/babel/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], "@docusaurus/bundler/babel-loader": ["babel-loader@9.2.1", "", { "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", "webpack": ">=5" } }, "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA=="], @@ -5539,6 +5565,8 @@ "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "@itk-wasm/morphological-contour-interpolation/itk-wasm": ["itk-wasm@1.0.0-b.173", "", { "dependencies": { "@itk-wasm/dam": "^1.1.1", "@thewtex/zstddec": "^0.2.0", "@types/emscripten": "^1.39.10", "axios": "^1.6.2", "chalk": "^5.3.0", "comlink": "^4.4.1", "commander": "^11.1.0", "fs-extra": "^11.2.0", "glob": "^8.1.0", "markdown-table": "^3.0.3", "mime-types": "^2.1.35", "wasm-feature-detect": "^1.6.1" }, "bin": { "itk-wasm": "src/itk-wasm-cli.js" } }, "sha512-SV2lfZ1mClWuSK/noaZgGj9jhroY4MZu19ci9pIucuyhoGdXrVSmWlPH/JYMDi9RP3BogmQwe9wfFc3X1dcEPg=="], + "@jest/core/ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], "@jest/core/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -5825,6 +5853,8 @@ "@web3-storage/car-block-validator/multiformats": ["multiformats@9.9.0", "", {}, "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="], + "@xhmikosr/decompress/strip-dirs": ["strip-dirs@3.0.0", "", { "dependencies": { "inspect-with-kind": "^1.0.5", "is-plain-obj": "^1.1.0" } }, "sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ=="], + "@xhmikosr/decompress-tar/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], "@zkochan/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -5997,6 +6027,8 @@ "cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], + "dcmjs/@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.7", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-55gRV8vGrCIYZnaQHQrD92Lo/hYE3Sj5tmbuf0hhHR7sj2CWhEhHU89hbq+UVDXvFG1zUVXJhUkEq1eAfqXtFw=="], + "decamelize-keys/decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], "decamelize-keys/map-obj": ["map-obj@1.0.1", "", {}, "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="], @@ -6005,8 +6037,6 @@ "decompress/pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], - "decompress/strip-dirs": ["strip-dirs@2.1.0", "", { "dependencies": { "is-natural-number": "^4.0.1" } }, "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g=="], - "decompress-tar/file-type": ["file-type@5.2.0", "", {}, "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ=="], "decompress-tar/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], @@ -6851,8 +6881,6 @@ "stringify-object/is-obj": ["is-obj@1.0.1", "", {}, "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="], - "strip-dirs/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], - "stylelint/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], "stylelint/file-entry-cache": ["file-entry-cache@7.0.2", "", { "dependencies": { "flat-cache": "^3.2.0" } }, "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g=="], @@ -7039,8 +7067,12 @@ "@docsearch/react/algoliasearch/@algolia/requester-node-http": ["@algolia/requester-node-http@5.20.0", "", { "dependencies": { "@algolia/client-common": "5.20.0" } }, "sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw=="], + "@docusaurus/babel/@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@docusaurus/babel/@babel/runtime/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "@docusaurus/babel/@babel/runtime-corejs3/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "@docusaurus/bundler/babel-loader/find-cache-dir": ["find-cache-dir@4.0.0", "", { "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" } }, "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg=="], "@docusaurus/bundler/html-minifier-terser/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -7211,6 +7243,14 @@ "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "@itk-wasm/morphological-contour-interpolation/itk-wasm/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + + "@itk-wasm/morphological-contour-interpolation/itk-wasm/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "@itk-wasm/morphological-contour-interpolation/itk-wasm/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "@itk-wasm/morphological-contour-interpolation/itk-wasm/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + "@jest/core/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], "@jest/reporters/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -7469,6 +7509,8 @@ "@vercel/nft/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@xhmikosr/decompress/strip-dirs/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], + "archiver-utils/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "archiver/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -7587,6 +7629,8 @@ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + "dcmjs/@babel/runtime-corejs3/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "decompress-tar/tar-stream/bl": ["bl@1.2.3", "", { "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww=="], "decompress/make-dir/pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], @@ -7617,6 +7661,8 @@ "detective-typescript/@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + "docs/dcmjs/@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.7", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-55gRV8vGrCIYZnaQHQrD92Lo/hYE3Sj5tmbuf0hhHR7sj2CWhEhHU89hbq+UVDXvFG1zUVXJhUkEq1eAfqXtFw=="], + "docs/typedoc/markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="], "docs/typedoc/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -8385,6 +8431,8 @@ "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "@itk-wasm/morphological-contour-interpolation/itk-wasm/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + "@jsdevtools/coverage-istanbul-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@lerna/create/execa/npm-run-path/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -8569,6 +8617,8 @@ "detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "docs/dcmjs/@babel/runtime-corejs3/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "docs/typedoc/markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "docs/typedoc/markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -8909,6 +8959,8 @@ "@docusaurus/utils/webpack/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "@itk-wasm/morphological-contour-interpolation/itk-wasm/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@lerna/create/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "@netlify/build-info/read-pkg/normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], @@ -9045,6 +9097,8 @@ "@docusaurus/core/update-notifier/boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@itk-wasm/morphological-contour-interpolation/itk-wasm/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@lerna/create/rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "@netlify/functions-utils/@netlify/zip-it-and-ship-it/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], diff --git a/commit.txt b/commit.txt index 963e73499..11312f83d 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -0dc51241392451a581de0372760ff6d5acf398c3 \ No newline at end of file +a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5 diff --git a/common/reviews/api/core.api.md b/common/reviews/api/core.api.md index 7a579bc5b..8902b6d92 100644 --- a/common/reviews/api/core.api.md +++ b/common/reviews/api/core.api.md @@ -275,6 +275,9 @@ type BoundsLPS = [Point3, Point3, Point3]; // @public (undocumented) export const cache: Cache_2; +// @public (undocumented) +function calculateSpacingBetweenImageIds(imageIds: string[]): number; + // @public (undocumented) function calculateViewportsSpatialRegistration(viewport1: StackViewport | IVolumeViewport, viewport2: StackViewport | IVolumeViewport): void; @@ -1191,6 +1194,9 @@ interface FlipDirection { flipVertical?: boolean; } +// @public (undocumented) +function fnv1aHash(str: string): string; + // @public (undocumented) class FrameRange { // (undocumented) @@ -3963,6 +3969,7 @@ declare namespace utilities { scaleRGBTransferFunction as scaleRgbTransferFunction, triggerEvent, imageIdToURI, + fnv1aHash, metadataProvider as calibratedPixelSpacingMetadataProvider, clamp, uuidv4, @@ -4047,7 +4054,8 @@ declare namespace utilities { clip, transformWorldToIndexContinuous, createSubVolume, - getVolumeDirectionVectors + getVolumeDirectionVectors, + calculateSpacingBetweenImageIds } } export { utilities } diff --git a/common/reviews/api/labelmap-interpolation.api.md b/common/reviews/api/labelmap-interpolation.api.md new file mode 100644 index 000000000..272d39e37 --- /dev/null +++ b/common/reviews/api/labelmap-interpolation.api.md @@ -0,0 +1,18 @@ +## API Report File for "@cornerstonejs/labelmap-interpolation" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +// @public (undocumented) +export function interpolate({ segmentationId, segmentIndex, configuration, }: { + segmentationId: string; + segmentIndex: number; + configuration?: MorphologicalContourInterpolationOptions & { + preview: boolean; + }; +}): Promise; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/common/reviews/api/polymorphic-segmentation.api.md b/common/reviews/api/polymorphic-segmentation.api.md new file mode 100644 index 000000000..c2de14194 --- /dev/null +++ b/common/reviews/api/polymorphic-segmentation.api.md @@ -0,0 +1,48 @@ +## API Report File for "@cornerstonejs/polymorphic-segmentation" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type ColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; +import type { mat3 } from 'gl-matrix'; +import { mat4 } from 'gl-matrix'; +import type { Range as Range_2 } from '@kitware/vtk.js/types'; +import { vec3 } from 'gl-matrix'; +import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; +import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; +import { vtkColorTransferFunction } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; +import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; +import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; +import type { vtkObject } from '@kitware/vtk.js/interfaces'; +import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; +import type vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction'; +import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; +import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; +import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; + +// @public (undocumented) +export function canComputeRequestedRepresentation(segmentationId: string, type: typeof SegmentationRepresentations): boolean; + +// @public (undocumented) +export function computeContourData(segmentationId: string, options?: PolySegConversionOptions): Promise<{ + annotationUIDsMap: Map>; +}>; + +// @public (undocumented) +export function computeLabelmapData(segmentationId: string, options?: PolySegConversionOptions): Promise; + +// @public (undocumented) +export function computeSurfaceData(segmentationId: string, options?: PolySegConversionOptions): Promise<{ + geometryIds: Map; +}>; + +// @public (undocumented) +export function init(): void; + +// @public (undocumented) +export function updateSurfaceData(segmentationId: any): Promise; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/common/reviews/api/tools.api.md b/common/reviews/api/tools.api.md index 39ab0f21a..44e8aa903 100644 --- a/common/reviews/api/tools.api.md +++ b/common/reviews/api/tools.api.md @@ -405,10 +405,10 @@ type AnnotationLockChangeEventType = Types_2.CustomEventType NamedStatistics; // (undocumented) - static statsCallback: ({ value: newValue, pointLPS }: { + static statsCallback: ({ value: newValue, pointLPS, pointIJK, }: { value: any; pointLPS?: any; + pointIJK?: any; }) => void; // (undocumented) static statsInit(options: { @@ -948,9 +977,6 @@ function calibrateImageSpacing(imageId: string, renderingEngine: Types_2.IRender // @public (undocumented) export function cancelActiveManipulations(element: HTMLDivElement): string | undefined; -// @public (undocumented) -function canComputeRequestedRepresentation(segmentationId: string, type: SegmentationRepresentations): boolean; - // @public (undocumented) type CanvasCoordinates = [ Types_2.Point2, @@ -1004,6 +1030,10 @@ enum ChangeTypes { // @public (undocumented) enum ChangeTypes_2 { + // (undocumented) + COMPUTE_STATISTICS = "Computing Statistics", + // (undocumented) + INTERPOLATE_LABELMAP = "Interpolating Labelmap", // (undocumented) POLYSEG_CONTOUR_TO_LABELMAP = "Converting Contour to Labelmap", // (undocumented) @@ -1022,6 +1052,9 @@ function checkAndSetAnnotationLocked(annotationUID: string): boolean; // @public (undocumented) function checkAndSetAnnotationVisibility(annotationUID: string): boolean; +// @public (undocumented) +function checkStandardBasis(directions: number[]): RotationMatrixInformation; + declare namespace cine { export { playClip, @@ -1311,7 +1344,7 @@ export class CircleScissorsTool extends LabelmapBaseTool { } // @public (undocumented) -function clip_2(a: any, b: any, box: any, da?: any, db?: any): 0 | 1; +function clip_2(a: any, b: any, box: any, da?: any, db?: any): 1 | 0; // @public (undocumented) type ClosestControlPoint = ClosestPoint & { @@ -1570,16 +1603,15 @@ type ColorbarTicksStyle = { type ColorbarVOIRange = ColorbarImageRange; // @public (undocumented) -function computeAndAddContourRepresentation(segmentationId: string, options?: PolySegConversionOptions): Promise<{ - annotationUIDsMap: Map>; +function computeStackLabelmapFromVolume({ volumeId, }: { + volumeId: string; +}): Promise<{ + imageIds: string[]; }>; // @public (undocumented) -function computeAndAddLabelmapRepresentation(segmentationId: string, options?: PolySegConversionOptions): Promise; - -// @public (undocumented) -function computeAndAddSurfaceRepresentation(segmentationId: string, options?: PolySegConversionOptions): Promise<{ - geometryIds: Map; +function computeVolumeLabelmapFromStack(args: any): Promise<{ + volumeId: string; }>; declare namespace config { @@ -1823,10 +1855,6 @@ export class CrosshairsTool extends AnnotationTool { // (undocumented) _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; // (undocumented) - editData: { - annotation: Annotation; - } | null; - // (undocumented) _endCallback: (evt: EventTypes_2.InteractionEventType) => void; // (undocumented) _filterAnnotationsByUniqueViewportOrientations: (enabledElement: any, annotations: any) => any[]; @@ -1971,6 +1999,9 @@ const _default_4: { smoothAnnotation: typeof smoothAnnotation; }; +// @public (undocumented) +const defaultSegmentationStateManager: SegmentationStateManager; + // @public (undocumented) function deselectAnnotation(annotationUID?: string): void; @@ -2635,6 +2666,14 @@ function generateImageFromTimeData(dynamicVolume: Types_2.IDynamicImageVolume, o frameNumbers?: number[]; }): Float32Array; +declare namespace geometricSurfaceUtils { + export { + inverse3x3Matrix, + checkStandardBasis, + rotatePoints + } +} + // @public (undocumented) function getAABB(polyline: Types_2.Point2[] | Types_2.Point3[] | number[], options?: { numDimensions: number; @@ -2819,12 +2858,18 @@ function getNormal2(polyline: Types_2.Point2[]): Types_2.Point3; // @public (undocumented) function getNormal3(polyline: Types_2.Point3[]): Types_2.Point3; +// @public (undocumented) +function getOrCreateSegmentationVolume(segmentationId: any): any; + // @public (undocumented) function getOrientationStringLPS(vector: Types_2.Point3): string; // @public (undocumented) function getPixelValueUnits(modality: string, imageId: string, options: pixelUnitsOptions): string; +// @public (undocumented) +function getPixelValueUnitsImageId(imageId: string, options: pixelUnitsOptions): string; + // @public (undocumented) function getPoint(points: any, idx: any): Types_2.Point3; @@ -2903,6 +2948,12 @@ function getStackSegmentationImageIdsForViewport(viewportId: string, segmentatio // @public (undocumented) function getState(annotation?: Annotation): AnnotationStyleStates; +// @public (undocumented) +function getStatistics({ segmentationId, segmentIndices, }: { + segmentationId: string; + segmentIndices: number[] | number; +}): Promise; + // @public (undocumented) function getStyle(specifier: SpecifierWithType): StyleForType; @@ -3134,7 +3185,16 @@ class ImageMouseCursor extends MouseCursor { } // @public (undocumented) -export function init(defaultConfiguration?: {}): void; +type InactiveLabelmapStyle = { + renderOutlineInactive?: boolean; + outlineWidthInactive?: number; + renderFillInactive?: boolean; + fillAlphaInactive?: number; + outlineOpacityInactive?: number; +}; + +// @public (undocumented) +export function init(defaultConfiguration?: Config): void; // @public (undocumented) function initElementCursor(element: HTMLDivElement, cursor: MouseCursor | null): void; @@ -3185,6 +3245,9 @@ function intersectPolyline(sourcePolyline: Types_2.Point2[], targetPolyline: Typ // @public (undocumented) function invalidateBrushCursor(toolGroupId: string): void; +// @public (undocumented) +function inverse3x3Matrix(matrix: number[]): number[]; + // @public (undocumented) function invertOrientationStringLPS(orientationString: string): string; @@ -3397,38 +3460,47 @@ type KeyDownEventDetail = { // @public (undocumented) type KeyDownEventType = Types_2.CustomEventType; +// @public (undocumented) +type KeyImageAnnotation = ProbeAnnotation & { + data: { + isPoint: boolean; + seriesLevel: boolean; + }; +}; + // @public (undocumented) export class KeyImageTool extends AnnotationTool { constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); // (undocumented) - _activateModify: (element: HTMLDivElement) => void; + _activateModify: (element: any) => void; // (undocumented) addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => Annotation; // (undocumented) - cancel(): void; + cancel(element: HTMLDivElement): string; // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; + static dataPoint: { + data: { + isPoint: boolean; + }; + }; + // (undocumented) + static dataSeries: { + data: { + seriesLevel: boolean; + }; + }; + // (undocumented) + _deactivateModify: (element: any) => void; // (undocumented) _doneChangingTextCallback(element: any, annotation: any, updatedText: any): void; // (undocumented) doubleClickCallback: (evt: EventTypes_2.TouchTapEventType) => void; // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; + _dragCallback: (evt: any) => void; // (undocumented) _endCallback: (evt: EventTypes_2.InteractionEventType) => void; // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: Annotation, handle: ToolHandle): void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; + handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: KeyImageAnnotation): void; // (undocumented) _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; // (undocumented) @@ -3436,6 +3508,8 @@ export class KeyImageTool extends AnnotationTool { // (undocumented) renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; // (undocumented) + static setPoint(annotation: any, isPoint?: boolean, element?: any): void; + // (undocumented) _throttledCalculateCachedStats: Function; // (undocumented) static toolName: string; @@ -3512,12 +3586,11 @@ export class LabelmapBaseTool extends BaseTool { segmentColor: Types_2.Color; }; // (undocumented) - protected getEditData({ viewport, representationData, segmentsLocked, segmentationId, volumeOperation, }: { + protected getEditData({ viewport, representationData, segmentsLocked, segmentationId, }: { viewport: any; representationData: any; segmentsLocked: any; segmentationId: any; - volumeOperation?: boolean; }): EditDataReturnType; // (undocumented) protected getOperationData(element?: any): ModifiedLabelmapToolOperationData; @@ -3562,6 +3635,25 @@ type LabelmapMemo_2 = Types_2.Memo & { memo?: LabelmapMemo_2; }; +// @public (undocumented) +type LabelmapSegmentationData = LabelmapSegmentationDataVolume | LabelmapSegmentationDataStack | { + volumeId?: string; + referencedVolumeId?: string; + referencedImageIds?: string[]; + imageIds?: string[]; +}; + +// @public (undocumented) +type LabelmapSegmentationDataStack = { + imageIds: string[]; +}; + +// @public (undocumented) +type LabelmapSegmentationDataVolume = { + volumeId: string; + referencedVolumeId?: string; +}; + // @public (undocumented) type LabelmapStyle = BaseLabelmapStyle & InactiveLabelmapStyle; @@ -3573,7 +3665,7 @@ type LabelmapToolOperationData = { segmentsLocked: number[]; viewPlaneNormal: number[]; viewUp: number[]; - strategySpecificConfiguration: any; + activeStrategy: string; points: Types_2.Point3[]; voxelManager: any; override: { @@ -4402,22 +4494,6 @@ declare namespace polyline { } } -// @public (undocumented) -type PolySegConversionOptions = { - segmentIndices?: number[]; - segmentationId?: string; - viewport?: Types_2.IStackViewport | Types_2.IVolumeViewport; -}; - -declare namespace polySegManager { - export { - canComputeRequestedRepresentation, - computeAndAddSurfaceRepresentation, - computeAndAddLabelmapRepresentation, - computeAndAddContourRepresentation - } -} - // @public (undocumented) const precalculatePointInEllipse: (ellipse: any, inverts?: Inverts) => Inverts; @@ -4455,19 +4531,8 @@ export class ProbeTool extends AnnotationTool { // (undocumented) _dragCallback: (evt: any) => void; // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - newAnnotation?: boolean; - } | null; - // (undocumented) _endCallback: (evt: EventTypes_2.InteractionEventType) => void; // (undocumented) - eventDispatchDetail: { - viewportId: string; - renderingEngineId: string; - }; - // (undocumented) getHandleNearImagePoint(element: HTMLDivElement, annotation: ProbeAnnotation, canvasCoords: Types_2.Point2, proximity: number): ToolHandle | undefined; // (undocumented) handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: ProbeAnnotation): void; @@ -4476,10 +4541,6 @@ export class ProbeTool extends AnnotationTool { annotationUID?: string; }) => ProbeAnnotation; // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) isPointNearTool(element: HTMLDivElement, annotation: ProbeAnnotation, canvasCoords: Types_2.Point2, proximity: number): boolean; // (undocumented) static probeDefaults: { @@ -5092,6 +5153,9 @@ interface ROICachedStats { }; } +// @public (undocumented) +function rotatePoints(rotationMatrix: number[], origin: number[], points: number[]): number[]; + // @public (undocumented) const roundNumber_2: typeof utilities_2.roundNumber; @@ -5246,11 +5310,12 @@ declare namespace segmentation { segmentIndex, triggerSegmentationEvents, helpers, - polySegManager as polySeg, removeSegment, getLabelmapImageIds, internalAddRepresentationData as addRepresentationData, - strategies + strategies, + segmentationStyle, + defaultSegmentationStateManager } } export { segmentation } @@ -5281,7 +5346,12 @@ declare namespace segmentation_2 { getBrushToolInstances, growCut, LabelmapMemo, - IslandRemoval + IslandRemoval, + getOrCreateSegmentationVolume, + getStatistics, + validateLabelmap, + computeStackLabelmapFromVolume, + computeVolumeLabelmapFromStack } } @@ -5404,6 +5474,9 @@ type SegmentationState = { }; }; +// @public (undocumented) +const segmentationStyle: SegmentationStyle; + // @public (undocumented) function segmentContourAction(element: HTMLDivElement, configuration: any): any; @@ -5479,7 +5552,11 @@ function setAttributesIfNecessary(attributes: any, svgNode: any): void; function setBrushSizeForToolGroup(toolGroupId: string, brushSize: number, toolName?: string): void; // @public (undocumented) -function setBrushThresholdForToolGroup(toolGroupId: string, threshold: Types_2.Point2, otherArgs?: Record): void; +function setBrushThresholdForToolGroup(toolGroupId: string, threshold: { + range: Types_2.Point2; + isDynamic: boolean; + dynamicRadius: number; +}): void; // @public (undocumented) function setColorLUT(viewportId: string, segmentationId: string, colorLUTsIndex: number): void; @@ -5889,6 +5966,8 @@ type Statistics = { label?: string; value: number | number[]; unit: null | string; + pointIJK?: Types_2.Point3; + pointLPS?: Types_2.Point3; }; // @public (undocumented) @@ -5931,6 +6010,10 @@ enum StrategyCallbacks { // (undocumented) CreateIsInThreshold = "createIsInThreshold", // (undocumented) + EnsureImageVolumeFor3DManipulation = "ensureImageVolumeFor3DManipulation", + // (undocumented) + EnsureSegmentationVolumeFor3DManipulation = "ensureSegmentationVolumeFor3DManipulation", + // (undocumented) Fill = "fill", // (undocumented) GetStatistics = "getStatistics", @@ -5988,6 +6071,14 @@ type StyleSpecifier = { // @public (undocumented) function subtractPolylines(targetPolyline: Types_2.Point2[], sourcePolyline: Types_2.Point2[]): Types_2.Point2[][]; +// @public (undocumented) +type SurfaceSegmentationData = { + geometryIds: Map; +}; + +// @public (undocumented) +type SurfaceStateStyles = {}; + // @public (undocumented) type SurfaceStyle = {}; @@ -6307,6 +6398,7 @@ declare namespace ToolSpecificAnnotationTypes { ROICachedStats, RectangleROIAnnotation, ProbeAnnotation, + KeyImageAnnotation, LengthAnnotation, AdvancedMagnifyAnnotation, CircleROIAnnotation, @@ -6552,14 +6644,20 @@ declare namespace Types { SplineCurveSegment, SplineLineSegment, SplineProps, - PolySegConversionOptions, IBaseTool, RepresentationStyle, Segment, SegmentationPublicInput, LabelmapStyle, ContourStyle, - SurfaceStyle + SurfaceStyle, + SurfaceSegmentationData, + SurfaceStateStyles, + LabelmapSegmentationData, + LabelmapSegmentationDataStack, + LabelmapSegmentationDataVolume, + BaseLabelmapStyle, + InactiveLabelmapStyle } } export { Types } @@ -6711,6 +6809,7 @@ declare namespace utilities { getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, + getPixelValueUnitsImageId, segmentation_2 as segmentation, contours, triggerAnnotationRenderForViewportIds, @@ -6737,11 +6836,25 @@ declare namespace utilities { getClosestImageIdForStackViewport, pointInSurroundingSphereCallback, normalizeViewportPlane, - IslandRemoval + IslandRemoval, + geometricSurfaceUtils } } export { utilities } +// @public (undocumented) +function validate(segmentationRepresentationData: LabelmapSegmentationData): void; + +declare namespace validateLabelmap { + export { + validatePublic, + validate + } +} + +// @public (undocumented) +function validatePublic(segmentationInput: SegmentationPublicInput): void; + declare namespace vec2 { export { findClosestPoint, diff --git a/jest.config.base.js b/jest.config.base.js index 944a17e4b..cac2667b2 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -18,6 +18,14 @@ module.exports = { // Setup // setupFiles: ["jest-canvas-mock/lib/index.js"], // Coverage + transform: { + '^.+\\.(js|jsx|ts|tsx)$': [ + 'babel-jest', + { + plugins: ['babel-plugin-transform-import-meta'], + }, + ], + }, collectCoverageFrom: [ '/src/**/*.{js,jsx}', // Not diff --git a/lerna.json b/lerna.json index fabee9f98..de063874c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,12 +1,14 @@ { - "version": "2.19.16", + "version": "3.0.0-beta.6", "packages": [ "packages/core", "packages/tools", "packages/adapters", "packages/nifti-volume-loader", "packages/dicomImageLoader", - "packages/ai" + "packages/ai", + "packages/labelmap-interpolation", + "packages/polymorphic-segmentation" ], "npmClient": "yarn" } diff --git a/package.json b/package.json index c8086e38e..a1a157534 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,13 @@ }, "scripts": { "api-check": "npx lerna run api-check", - "format-check": "npx lerna run format-check", + "format-check": "cross-env NODE_OPTIONS=--max_old_space_size=32896 npx lerna run format-check", "build": "npx lerna run build --stream && npx lerna run build:loader", "build:esm": "npx lerna run build:esm --stream", "watch": "npx lerna watch -- lerna run build --scope=$LERNA_PACKAGE_NAME --include-dependents", "build:update-api:ai": "cd packages/ai && npm run build:update-api", + "build:update-api:labelmap-interpolation": "cd packages/labelmap-interpolation && npm run build:update-api", + "build:update-api:polymorphic-segmentation": "cd packages/polymorphic-segmentation && npm run build:update-api", "build:update-api:core": "cd packages/core && npm run build:update-api", "build:update-api:tools": "cd packages/tools && npm run build:update-api", "build:update-api:nifti": "cd packages/nifti-volume-loader && npm run build:update-api", @@ -95,6 +97,7 @@ "autoprefixer": "^10.4.14", "babel-loader": "9.1.2", "babel-plugin-istanbul": "^6.1.1", + "babel-plugin-transform-import-meta": "2.3.2", "chai": "^5.1.2", "clean-webpack-plugin": "^4.0.0", "commander": "^10.0.1", @@ -184,5 +187,6 @@ "not ie < 11", "not op_mini all" ], - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", + "dependencies": {} } diff --git a/packages/adapters/.babelrc b/packages/adapters/.babelrc deleted file mode 100644 index d15bf49ff..000000000 --- a/packages/adapters/.babelrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { - "targets": { - "browsers": ["ie 11"] - } - }] - ] -} \ No newline at end of file diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 405ced330..87910754d 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,125 +3,11 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/dcmjs-org/dcmjs/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.13](https://github.com/dcmjs-org/dcmjs/compare/v2.19.12...v2.19.13) (2025-02-21) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.12](https://github.com/dcmjs-org/dcmjs/compare/v2.19.11...v2.19.12) (2025-02-20) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.11](https://github.com/dcmjs-org/dcmjs/compare/v2.19.10...v2.19.11) (2025-02-18) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.10](https://github.com/dcmjs-org/dcmjs/compare/v2.19.9...v2.19.10) (2025-02-18) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.9](https://github.com/dcmjs-org/dcmjs/compare/v2.19.8...v2.19.9) (2025-02-18) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.8](https://github.com/dcmjs-org/dcmjs/compare/v2.19.7...v2.19.8) (2025-02-18) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.7](https://github.com/dcmjs-org/dcmjs/compare/v2.19.6...v2.19.7) (2025-02-06) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.6](https://github.com/dcmjs-org/dcmjs/compare/v2.19.5...v2.19.6) (2025-02-05) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.5](https://github.com/dcmjs-org/dcmjs/compare/v2.19.4...v2.19.5) (2025-02-04) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.4](https://github.com/dcmjs-org/dcmjs/compare/v2.19.3...v2.19.4) (2025-02-04) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.3](https://github.com/dcmjs-org/dcmjs/compare/v2.19.2...v2.19.3) (2025-02-04) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.2](https://github.com/dcmjs-org/dcmjs/compare/v2.19.1...v2.19.2) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.19.1](https://github.com/dcmjs-org/dcmjs/compare/v2.19.0...v2.19.1) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -# [2.19.0](https://github.com/dcmjs-org/dcmjs/compare/v2.18.9...v2.19.0) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.9](https://github.com/dcmjs-org/dcmjs/compare/v2.18.8...v2.18.9) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.8](https://github.com/dcmjs-org/dcmjs/compare/v2.18.7...v2.18.8) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.7](https://github.com/dcmjs-org/dcmjs/compare/v2.18.6...v2.18.7) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.6](https://github.com/dcmjs-org/dcmjs/compare/v2.18.5...v2.18.6) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.5](https://github.com/dcmjs-org/dcmjs/compare/v2.18.4...v2.18.5) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.4](https://github.com/dcmjs-org/dcmjs/compare/v2.18.3...v2.18.4) (2025-02-03) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.3](https://github.com/dcmjs-org/dcmjs/compare/v2.18.2...v2.18.3) (2025-01-31) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.2](https://github.com/dcmjs-org/dcmjs/compare/v2.18.1...v2.18.2) (2025-01-31) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.18.1](https://github.com/dcmjs-org/dcmjs/compare/v2.18.0...v2.18.1) (2025-01-31) - -**Note:** Version bump only for package @cornerstonejs/adapters - -# [2.18.0](https://github.com/dcmjs-org/dcmjs/compare/v2.17.6...v2.18.0) (2025-01-30) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.17.6](https://github.com/dcmjs-org/dcmjs/compare/v2.17.5...v2.17.6) (2025-01-29) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.17.5](https://github.com/dcmjs-org/dcmjs/compare/v2.17.4...v2.17.5) (2025-01-27) - -**Note:** Version bump only for package @cornerstonejs/adapters - -## [2.17.4](https://github.com/dcmjs-org/dcmjs/compare/v2.17.3...v2.17.4) (2025-01-24) +### Features -**Note:** Version bump only for package @cornerstonejs/adapters +- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) ## [2.17.3](https://github.com/dcmjs-org/dcmjs/compare/v2.17.2...v2.17.3) (2025-01-22) diff --git a/packages/adapters/babel.config.js b/packages/adapters/babel.config.js new file mode 100644 index 000000000..fed6f05fe --- /dev/null +++ b/packages/adapters/babel.config.js @@ -0,0 +1 @@ +module.exports = require("../../babel.config.js"); diff --git a/packages/adapters/jest.config.js b/packages/adapters/jest.config.js new file mode 100644 index 000000000..bd1f3dad9 --- /dev/null +++ b/packages/adapters/jest.config.js @@ -0,0 +1,11 @@ +/* eslint-disable */ +const base = require("../../jest.config.base.js"); +const path = require("path"); + +module.exports = { + ...base, + displayName: "adapters", + moduleNameMapper: { + "^@cornerstonejs/(.*)$": path.resolve(__dirname, "../$1/src") + } +}; diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f51f4e848..4da66ce6b 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", @@ -68,9 +68,9 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/dcmjs-org/dcmjs.git" + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" }, - "author": "@cornerstonejs (formerly Steve Pieper from dcmjs)", + "author": "@cornerstonejs adapters package", "license": "MIT", "bugs": { "url": "https://github.com/cornerstonejs/cornerstone3D/issues" @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.16", - "@cornerstonejs/tools": "^2.19.16" + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6" } } diff --git a/packages/adapters/rollup.config.mjs b/packages/adapters/rollup.config.mjs index 30bac3ad5..ac7da0b62 100644 --- a/packages/adapters/rollup.config.mjs +++ b/packages/adapters/rollup.config.mjs @@ -49,7 +49,7 @@ export default [ }), babel({ exclude: "node_modules/**", - babelHelpers: "bundled", + babelHelpers: "runtime", extensions: [".js", ".ts"] }), json() diff --git a/packages/adapters/src/adapters/Cornerstone/ArrowAnnotate.js b/packages/adapters/src/adapters/Cornerstone/ArrowAnnotate.js index bf37e4edd..46d7a026b 100644 --- a/packages/adapters/src/adapters/Cornerstone/ArrowAnnotate.js +++ b/packages/adapters/src/adapters/Cornerstone/ArrowAnnotate.js @@ -61,7 +61,8 @@ class ArrowAnnotate { static getTID300RepresentationArguments(tool) { const points = [tool.handles.start, tool.handles.end]; - let { finding, findingSites } = tool; + const { findingSites } = tool; + let { finding } = tool; const TID300RepresentationArguments = { points, diff --git a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js index 929980af6..6c8a9aea6 100644 --- a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js +++ b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js @@ -31,16 +31,11 @@ const codeValueMatch = (group, code, oldCode) => { ); }; -function getTID300ContentItem( - tool, - toolType, - ReferencedSOPSequence, - toolClass -) { - const args = toolClass.getTID300RepresentationArguments(tool); +function getTID300ContentItem(tool, ReferencedSOPSequence, adapterClass) { + const args = adapterClass.getTID300RepresentationArguments(tool); args.ReferencedSOPSequence = ReferencedSOPSequence; - const TID300Measurement = new toolClass.TID300Representation(args); + const TID300Measurement = new adapterClass.TID300Representation(args); return TID300Measurement; } @@ -61,12 +56,7 @@ function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) { // Loop through the array of tool instances // for this tool const Measurements = toolTypeData.data.map(tool => { - return getTID300ContentItem( - tool, - toolType, - ReferencedSOPSequence, - toolClass - ); + return getTID300ContentItem(tool, ReferencedSOPSequence, toolClass); }); return new TID1501MeasurementGroup(Measurements); diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index 4464d80a1..327e09599 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -1,29 +1,14 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; const { CobbAngle: TID300CobbAngle } = utilities.TID300; -const MEASUREMENT_TYPE = "Angle"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${MEASUREMENT_TYPE}`; - -class Angle { - public static toolType = MEASUREMENT_TYPE; - public static utilityToolType = MEASUREMENT_TYPE; - public static TID300Representation = TID300CobbAngle; - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === MEASUREMENT_TYPE; - }; +class Angle extends BaseAdapter3D { + static { + this.init("Angle", TID300CobbAngle); + this.registerLegacy(); + } // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. public static getMeasurementData( @@ -107,13 +92,11 @@ class Angle { point3, point4, rAngle: angle, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(Angle); - export default Angle; diff --git a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.js b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts similarity index 77% rename from packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.js rename to packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts index 7514a181d..736af1351 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.js +++ b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts @@ -1,21 +1,23 @@ import MeasurementReport from "./MeasurementReport"; import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; +import BaseAdapter3D from "./BaseAdapter3D"; import CodingScheme from "./CodingScheme"; const { Point: TID300Point } = utilities.TID300; +const { codeValues } = CodingScheme; -const ARROW_ANNOTATE = "ArrowAnnotate"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ARROW_ANNOTATE}`; - -const { codeValues, CodingSchemeDesignator } = CodingScheme; +class ArrowAnnotate extends BaseAdapter3D { + static { + this.init("ArrowAnnotate", TID300Point); + this.registerLegacy(); + } -class ArrowAnnotate { static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, imageToWorldCoords, - metadata + metadata, + _trackingIdentifier ) { const { defaultState, SCOORDGroup, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( @@ -85,8 +87,8 @@ class ArrowAnnotate { } static getTID300RepresentationArguments(tool, worldToImageCoords) { - const { data, metadata } = tool; - let { finding, findingSites } = tool; + const { data, metadata, findingSites } = tool; + let { finding } = tool; const { referencedImageId } = metadata; if (!referencedImageId) { @@ -122,42 +124,22 @@ class ArrowAnnotate { y: pointImage2[1] } ], - trackingIdentifierTextValue, - findingSites: findingSites || [] + trackingIdentifierTextValue: this.trackingIdentifierTextValue, + findingSites: findingSites || [], + finding }; // If freetext finding isn't present, add it from the tool text. if (!finding || finding.CodeValue !== codeValues.CORNERSTONEFREETEXT) { finding = { CodeValue: codeValues.CORNERSTONEFREETEXT, - CodingSchemeDesignator, + CodingSchemeDesignator: CodingScheme.CodingSchemeDesignator, CodeMeaning: data.text }; } - TID300RepresentationArguments.finding = finding; - return TID300RepresentationArguments; } } -ArrowAnnotate.toolType = ARROW_ANNOTATE; -ArrowAnnotate.utilityToolType = ARROW_ANNOTATE; -ArrowAnnotate.TID300Representation = TID300Point; -ArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === ARROW_ANNOTATE; -}; - -MeasurementReport.registerTool(ArrowAnnotate); - export default ArrowAnnotate; diff --git a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts new file mode 100644 index 000000000..40c33c28d --- /dev/null +++ b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts @@ -0,0 +1,178 @@ +import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; +import MeasurementReport, { + type AdapterOptions, + type MeasurementAdapter +} from "./MeasurementReport"; + +export type Point = { + x: number; + y: number; + z?: number; +}; + +export type TID300Arguments = { + points?: Point[]; + point1?: Point; + point2?: Point; + trackingIdentifierTextValue: string; + findingSites: []; + finding; + + [key: string]: unknown; +}; + +/** + * This is a basic definition of adapters to be inherited for other adapters. + */ +export default class BaseAdapter3D { + public static toolType: string; + public static TID300Representation; + public static trackingIdentifierTextValue: string; + public static trackingIdentifiers: Set; + + /** + * The parent type is another type which could be used to parse this instance, + * but for which this sub-class has a better representation. For example, + * key images are parseable as Probe instances, but are represented as a different tool + * Thus, the name for the key image is `Cornerstone3DTag:Probe:KeyImage` so that + * a prefix query testing just the Probe could parse this object and display it, + * but a better/full path key could also be done. + */ + public static parentType: string; + + public static init( + toolType: string, + representation, + options?: AdapterOptions + ) { + this.toolType = toolType; + if (BaseAdapter3D.toolType) { + throw new Error( + `Base adapter tool type set to ${this.toolType} while setting ${toolType}` + ); + } + this.parentType = options?.parentType; + this.trackingIdentifiers = new Set(); + + this.TID300Representation = representation; + if (this.parentType) { + this.trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${this.parentType}:${this.toolType}`; + const alternateTrackingIdentifier = `${CORNERSTONE_3D_TAG}:${this.toolType}`; + this.trackingIdentifiers.add(alternateTrackingIdentifier); + } else { + this.trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${toolType}`; + } + this.trackingIdentifiers.add(this.trackingIdentifierTextValue); + MeasurementReport.registerTool(this); + } + + /** + * registerLegacy registers the given tool adapter using the legacy/old + * cornerstone 1.x adapter names so that the adapter class will be used to load + * those older adapters. + */ + public static registerLegacy() { + this.trackingIdentifiers.add( + `cornerstoneTools@^4.0.0:${this.toolType}` + ); + } + + /** Registers a new copy of the given type that has the prefix path the + * same as that of adapter, but adds the toolType to this path to create + * a new tool instance of the given type. This preserves compatibility + * with parsing in other versions, without need to replace the original parent + * type. + */ + public static registerSubType( + adapter: MeasurementAdapter, + toolType: string, + replace? + ) { + const subAdapter = Object.create(adapter); + subAdapter.init(toolType, adapter.TID300Representation, { + parentType: adapter.parentType || adapter.toolType, + replace + }); + return subAdapter; + } + + /** + * @returns true if the tool is of the given tool type based on the tracking identifier + */ + public static isValidCornerstoneTrackingIdentifier( + trackingIdentifier: string + ) { + if (this.trackingIdentifiers.has(trackingIdentifier)) { + return true; + } + if (!trackingIdentifier.includes(":")) { + return false; + } + + return trackingIdentifier.startsWith(this.trackingIdentifierTextValue); + } + + /** + * Returns annotation data for CS3D to use based on the underlying + * DICOM SR annotation data. + */ + public static getMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + _imageToWorldCoords, + metadata, + trackingIdentifier?: string + ) { + const { defaultState: state, ReferencedFrameNumber } = + MeasurementReport.getSetupMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + metadata, + this.toolType + ); + + state.annotation.data = { + cachedStats: {}, + frameNumber: ReferencedFrameNumber, + seriesLevel: trackingIdentifier?.indexOf(":Series") > 0 + }; + + return state; + } + + public static getTID300RepresentationArguments( + tool, + worldToImageCoords + ): TID300Arguments { + const { data, metadata } = tool; + const { finding, findingSites } = tool; + const { referencedImageId } = metadata; + + if (!referencedImageId) { + throw new Error( + "Probe.getTID300RepresentationArguments: referencedImageId is not defined" + ); + } + + const { + handles: { points = [] } + } = data; + + const pointsImage = points.map(point => { + const pointImage = worldToImageCoords(referencedImageId, point); + return { + x: pointImage[0], + y: pointImage[1] + }; + }); + + const tidArguments = { + points: pointsImage, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, + findingSites: findingSites || [], + finding + }; + + return tidArguments; + } +} diff --git a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts index 5253bfeff..a19bfe9f5 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts @@ -2,31 +2,18 @@ import { utilities } from "dcmjs"; import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; import { toArray } from "../helpers"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Bidirectional: TID300Bidirectional } = utilities.TID300; -const BIDIRECTIONAL = "Bidirectional"; const LONG_AXIS = "Long Axis"; const SHORT_AXIS = "Short Axis"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${BIDIRECTIONAL}`; - -class Bidirectional { - public static toolType = BIDIRECTIONAL; - public static utilityToolType = BIDIRECTIONAL; - public static TID300Representation = TID300Bidirectional; - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - return toolType === BIDIRECTIONAL; - }; +class Bidirectional extends BaseAdapter3D { + static { + this.init("Bidirectional", TID300Bidirectional); + this.registerLegacy(); + } public static getMeasurementData( MeasurementGroup, @@ -184,13 +171,11 @@ class Bidirectional { }, longAxisLength: length, shortAxisLength: width, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding: finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(Bidirectional); - export default Bidirectional; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts index a48d38848..29ecf85fa 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts @@ -1,19 +1,14 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; -import isValidCornerstoneTrackingIdentifier from "./isValidCornerstoneTrackingIdentifier"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Circle: TID300Circle } = utilities.TID300; -const CIRCLEROI = "CircleROI"; - -class CircleROI { - static trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${CIRCLEROI}`; - static toolType = CIRCLEROI; - static utilityToolType = CIRCLEROI; - static TID300Representation = TID300Circle; - static isValidCornerstoneTrackingIdentifier = - isValidCornerstoneTrackingIdentifier; +class CircleROI extends BaseAdapter3D { + static { + this.init("CircleROI", TID300Circle); + this.registerLegacy(); + } /** Gets the measurement data for cornerstone, given DICOM SR measurement data. */ static getMeasurementData( @@ -113,6 +108,4 @@ class CircleROI { } } -MeasurementReport.registerTool(CircleROI); - export default CircleROI; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts index 2e13b6497..6f40cdbf2 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts @@ -1,29 +1,15 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; const { CobbAngle: TID300CobbAngle } = utilities.TID300; -const MEASUREMENT_TYPE = "CobbAngle"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${MEASUREMENT_TYPE}`; - -class CobbAngle { - public static toolType = MEASUREMENT_TYPE; - public static utilityToolType = MEASUREMENT_TYPE; - public static TID300Representation = TID300CobbAngle; - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === MEASUREMENT_TYPE; - }; +class CobbAngle extends BaseAdapter3D { + static { + this.init("CobbAngle", TID300CobbAngle); + // Register using the Cornerstone 1.x name so this tool is used to load it + this.registerLegacy(); + } // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. public static getMeasurementData( @@ -112,13 +98,11 @@ class CobbAngle { point3, point4, rAngle: angle, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(CobbAngle); - export default CobbAngle; diff --git a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts index 1a910201c..7628023ce 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts @@ -1,23 +1,18 @@ import { vec3 } from "gl-matrix"; import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; -import isValidCornerstoneTrackingIdentifier from "./isValidCornerstoneTrackingIdentifier"; +import BaseAdapter3D from "./BaseAdapter3D"; type Point3 = [number, number, number]; const { Ellipse: TID300Ellipse } = utilities.TID300; -const ELLIPTICALROI = "EllipticalROI"; const EPSILON = 1e-4; -class EllipticalROI { - static trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ELLIPTICALROI}`; - static toolType = ELLIPTICALROI; - static utilityToolType = ELLIPTICALROI; - static TID300Representation = TID300Ellipse; - static isValidCornerstoneTrackingIdentifier = - isValidCornerstoneTrackingIdentifier; +class EllipticalROI extends BaseAdapter3D { + static { + this.init("EllipticalROI", TID300Ellipse); + } static getMeasurementData( MeasurementGroup, @@ -199,6 +194,4 @@ class EllipticalROI { } } -MeasurementReport.registerTool(EllipticalROI); - export default EllipticalROI; diff --git a/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts new file mode 100644 index 000000000..57e59b20d --- /dev/null +++ b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts @@ -0,0 +1,59 @@ +import { utilities } from "dcmjs"; +import Probe from "./Probe"; +const { Point: TID300Point } = utilities.TID300; + +export default class KeyImage extends Probe { + static { + this.init("KeyImage", TID300Point, { parentType: Probe.toolType }); + } + static trackingSeriesIdentifier = `${this.trackingIdentifierTextValue}:Series`; + static trackingPointIdentifier = `${this.trackingIdentifierTextValue}:Point`; + static trackingSeriesPointIdentifier = `${this.trackingIdentifierTextValue}:SeriesPoint`; + + static getMeasurementData( + measurementGroup, + sopInstanceUIDToImageIdMap, + imageToWorldCoords, + metadata, + trackingIdentifier + ) { + const baseData = super.getMeasurementData( + measurementGroup, + sopInstanceUIDToImageIdMap, + imageToWorldCoords, + metadata, + trackingIdentifier + ); + const { data } = baseData.annotation; + data.isPoint = trackingIdentifier.indexOf("Point") !== -1; + + return baseData; + } + + public static getTID300RepresentationArguments(tool, worldToImageCoords) { + const tid300Arguments = super.getTID300RepresentationArguments( + tool, + worldToImageCoords + ); + const { data } = tool; + if (data.isPoint) { + if (data.seriesLevel) { + tid300Arguments.trackingIdentifierTextValue = + this.trackingSeriesPointIdentifier; + } else { + tid300Arguments.trackingIdentifierTextValue = + this.trackingPointIdentifier; + } + } + if (data.seriesLevel) { + tid300Arguments.trackingIdentifierTextValue = + this.trackingSeriesIdentifier; + } + if (!tid300Arguments.points.length) { + tid300Arguments.points.push({ x: 0, y: 0 }); + } + return tid300Arguments; + } +} + +export { KeyImage }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/Length.js b/packages/adapters/src/adapters/Cornerstone3D/Length.ts similarity index 79% rename from packages/adapters/src/adapters/Cornerstone3D/Length.js rename to packages/adapters/src/adapters/Cornerstone3D/Length.ts index 4d409ed26..733265409 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Length.js +++ b/packages/adapters/src/adapters/Cornerstone3D/Length.ts @@ -1,13 +1,18 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Length: TID300Length } = utilities.TID300; const LENGTH = "Length"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${LENGTH}`; -class Length { +export default class Length extends BaseAdapter3D { + static { + this.init(LENGTH, TID300Length); + // Register using the Cornerstone 1.x name so this tool is used to load it + this.registerLegacy(); + } + // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. static getMeasurementData( MeasurementGroup, @@ -20,7 +25,7 @@ class Length { MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - Length.toolType + this.toolType ); const referencedImageId = @@ -84,30 +89,9 @@ class Length { point1, point2, distance, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } - -Length.toolType = LENGTH; -Length.utilityToolType = LENGTH; -Length.TID300Representation = TID300Length; -Length.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === LENGTH; -}; - -MeasurementReport.registerTool(Length); - -export default Length; diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index d7e5fd28c..2067df144 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -18,77 +18,136 @@ const FINDING = { CodingSchemeDesignator: "DCM", CodeValue: "121071" }; const FINDING_SITE = { CodingSchemeDesignator: "SCT", CodeValue: "363698007" }; const FINDING_SITE_OLD = { CodingSchemeDesignator: "SRT", CodeValue: "G-C0E3" }; -const codeValueMatch = (group, code, oldCode?) => { - const { ConceptNameCodeSequence } = group; - if (!ConceptNameCodeSequence) { - return; - } - const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence; - return ( - (CodingSchemeDesignator == code.CodingSchemeDesignator && - CodeValue == code.CodeValue) || - (oldCode && - CodingSchemeDesignator == oldCode.CodingSchemeDesignator && - CodeValue == oldCode.CodeValue) - ); +export type AdapterOptions = { + /** + * The parent type is another type which could be used to parse this instance, + * but for which this sub-class has a better representation. For example, + * key images are parseable as Probe instances, but are represented as a different tool + * Thus, the name for the key image is `Cornerstone3DTag:Probe:KeyImage` so that + * a prefix query testing just the Probe could parse this object and display it, + * but a better/full path key could also be done. + */ + parentType?: string; + + /** + * If set, then replace this + */ + replace?: boolean | ((original: MeasurementAdapter) => void); }; -function getTID300ContentItem( - tool, - toolType, - ReferencedSOPSequence, - toolClass, - worldToImageCoords -) { - const args = toolClass.getTID300RepresentationArguments( - tool, - worldToImageCoords +/** + * A measurement adapter parses/creates data for DICOM SR measurements + */ +export interface MeasurementAdapter { + toolType: string; + TID300Representation; + trackingIdentifierTextValue: string; + trackingIdentifiers: Set; + + /** + * The parent type is the base type of the adapter that is used for the + * identifier, being compatible with older versions to read that subtype. + */ + parentType: string; + + /** + * Applies the options and registers this tool + */ + init(toolType: string, representation, options?: AdapterOptions); + + getMeasurementData( + measurementGroup, + sopInstanceUIDToImageIdMap, + imageToWorldCoords, + metadata, + trackingIdentifier: string ); - args.ReferencedSOPSequence = ReferencedSOPSequence; - const TID300Measurement = new toolClass.TID300Representation(args); + isValidCornerstoneTrackingIdentifier(trackingIdentifier: string): boolean; - return TID300Measurement; + getTID300RepresentationArguments( + tool, + worldToImageCoords + ): Record; } -function getMeasurementGroup( - toolType, - toolData, - ReferencedSOPSequence, - worldToImageCoords -) { - const toolTypeData = toolData[toolType]; - const toolClass = - MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType]; - if ( - !toolTypeData || - !toolTypeData.data || - !toolTypeData.data.length || - !toolClass - ) { - return; - } +export default class MeasurementReport { + public static CORNERSTONE_3D_TAG = CORNERSTONE_3D_TAG; + + /** Maps tool type to the adapter name used to serialize this item to SR */ + public static measurementAdapterByToolType = new Map< + string, + MeasurementAdapter + >(); - // Loop through the array of tool instances - // for this tool - const Measurements = toolTypeData.data.map(tool => { - return getTID300ContentItem( + /** Maps tracking identifier to tool class to deserialize from SR into a tool instance */ + public static measurementAdapterByTrackingIdentifier = new Map< + string, + MeasurementAdapter + >(); + + public static getTID300ContentItem( + tool, + ReferencedSOPSequence, + toolClass, + worldToImageCoords + ) { + const args = toolClass.getTID300RepresentationArguments( tool, - toolType, - ReferencedSOPSequence, - toolClass, worldToImageCoords ); - }); + args.ReferencedSOPSequence = ReferencedSOPSequence; - return new TID1501MeasurementGroup(Measurements); -} + const TID300Measurement = new toolClass.TID300Representation(args); -export default class MeasurementReport { - public static CORNERSTONE_3D_TAG = CORNERSTONE_3D_TAG; - public static MEASUREMENT_BY_TOOLTYPE = {}; - public static CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {}; - public static CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {}; + return TID300Measurement; + } + + public static codeValueMatch = (group, code, oldCode?) => { + const { ConceptNameCodeSequence } = group; + if (!ConceptNameCodeSequence) { + return; + } + const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence; + return ( + (CodingSchemeDesignator == code.CodingSchemeDesignator && + CodeValue == code.CodeValue) || + (oldCode && + CodingSchemeDesignator == oldCode.CodingSchemeDesignator && + CodeValue == oldCode.CodeValue) + ); + }; + + public static getMeasurementGroup( + toolType, + toolData, + ReferencedSOPSequence, + worldToImageCoords + ) { + const toolTypeData = toolData[toolType]; + const toolClass = this.measurementAdapterByToolType.get(toolType); + if ( + !toolTypeData || + !toolTypeData.data || + !toolTypeData.data.length || + !toolClass + ) { + return; + } + + // Loop through the array of tool instances + // for this tool + const Measurements = toolTypeData.data.map(tool => { + return this.getTID300ContentItem( + tool, + ReferencedSOPSequence, + toolClass, + worldToImageCoords + ); + }); + + return new TID1501MeasurementGroup(Measurements); + } static getCornerstoneLabelFromDefaultState(defaultState) { const { findingSites = [], finding } = defaultState; @@ -156,7 +215,7 @@ export default class MeasurementReport { return derivationSourceDataset; }; - static getSetupMeasurementData( + public static getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, @@ -166,11 +225,11 @@ export default class MeasurementReport { const contentSequenceArr = toArray(ContentSequence); const findingGroup = contentSequenceArr.find(group => - codeValueMatch(group, FINDING) + this.codeValueMatch(group, FINDING) ); const findingSiteGroups = contentSequenceArr.filter(group => - codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD) + this.codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD) ) || []; const NUMGroup = contentSequenceArr.find( group => group.ValueType === "NUM" @@ -300,7 +359,7 @@ export default class MeasurementReport { const measurementGroups = []; toolTypes.forEach(toolType => { - const group = getMeasurementGroup( + const group = this.getMeasurementGroup( toolType, toolData, ReferencedSOPSequence, @@ -370,69 +429,58 @@ export default class MeasurementReport { // For each of the supported measurement types, compute the measurement data const measurementData = {}; - const cornerstoneToolClasses = - MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE; - - const registeredToolClasses = []; - - Object.keys(cornerstoneToolClasses).forEach(key => { - registeredToolClasses.push(cornerstoneToolClasses[key]); - measurementData[key] = []; - }); - measurementGroups.forEach(measurementGroup => { try { const measurementGroupContentSequence = toArray( measurementGroup.ContentSequence ); - const TrackingIdentifierGroup = + const trackingIdentifierGroup = measurementGroupContentSequence.find( contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER ); - const TrackingIdentifierValue = - TrackingIdentifierGroup.TextValue; + const { TextValue: trackingIdentifierValue } = + trackingIdentifierGroup; - const TrackingUniqueIdentifierGroup = + const trackingUniqueIdentifierGroup = measurementGroupContentSequence.find( contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_UNIQUE_IDENTIFIER ); - const TrackingUniqueIdentifierValue = - TrackingUniqueIdentifierGroup?.UID; + const trackingUniqueIdentifierValue = + trackingUniqueIdentifierGroup?.UID; - const toolClass = + const toolAdapter = hooks?.getToolClass?.( measurementGroup, dataset, - registeredToolClasses + this.measurementAdapterByToolType ) || - registeredToolClasses.find(tc => - tc.isValidCornerstoneTrackingIdentifier( - TrackingIdentifierValue - ) + this.getAdapterForTrackingIdentifier( + trackingIdentifierValue ); - if (toolClass) { - const measurement = toolClass.getMeasurementData( + if (toolAdapter) { + const measurement = toolAdapter.getMeasurementData( measurementGroup, sopInstanceUIDToImageIdMap, imageToWorldCoords, - metadata + metadata, + trackingIdentifierValue ); measurement.TrackingUniqueIdentifier = - TrackingUniqueIdentifierValue; + trackingUniqueIdentifierValue; - console.log(`=== ${toolClass.toolType} ===`); + console.log(`=== ${toolAdapter.toolType} ===`); console.log(measurement); - - measurementData[toolClass.toolType].push(measurement); + measurementData[toolAdapter.toolType] ||= []; + measurementData[toolAdapter.toolType].push(measurement); } } catch (e) { console.warn( @@ -450,16 +498,66 @@ export default class MeasurementReport { /** * Register a new tool type. - * @param toolClass to perform I/O to DICOM for this tool + * @param toolAdapter to perform I/O to DICOM for this tool */ - public static registerTool(toolClass) { - MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[ - toolClass.utilityToolType - ] = toolClass; - MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[ - toolClass.toolType - ] = toolClass; - MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] = - toolClass.utilityToolType; + public static registerTool( + toolAdapter: MeasurementAdapter, + replace: boolean | ((original) => void) = false + ) { + const registerName = toolAdapter.toolType; + if (this.measurementAdapterByToolType.has(registerName)) { + if (!replace) { + throw new Error( + `The registered tool name ${registerName} already exists in adapters, use a different toolType or use replace` + ); + } + if (typeof replace === "function") { + // Call the function so it can call parent output + replace(this.measurementAdapterByToolType.get(registerName)); + } + } + this.measurementAdapterByToolType.set( + toolAdapter.toolType, + toolAdapter + ); + this.measurementAdapterByTrackingIdentifier.set( + toolAdapter.trackingIdentifierTextValue, + toolAdapter + ); + } + + public static registerTrackingIdentifier( + toolClass, + ...trackingIdentifiers: string[] + ) { + for (const identifier of trackingIdentifiers) { + this.measurementAdapterByTrackingIdentifier.set( + identifier, + toolClass + ); + } + } + + public static getAdapterForTrackingIdentifier(trackingIdentifier: string) { + const adapter = + this.measurementAdapterByTrackingIdentifier.get(trackingIdentifier); + if (adapter) { + return adapter; + } + for (const adapterTest of [ + ...this.measurementAdapterByToolType.values() + ]) { + if ( + adapterTest.isValidCornerstoneTrackingIdentifier( + trackingIdentifier + ) + ) { + this.measurementAdapterByTrackingIdentifier.set( + trackingIdentifier, + adapterTest + ); + return adapterTest; + } + } } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts index 25abb5548..4ea174d9b 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts @@ -1,31 +1,16 @@ import MeasurementReport from "./MeasurementReport"; import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import { vec3 } from "gl-matrix"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Polyline: TID300Polyline } = utilities.TID300; -const PLANARFREEHANDROI = "PlanarFreehandROI"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PLANARFREEHANDROI}`; -const closedContourThreshold = 1e-5; - -class PlanarFreehandROI { - public static toolType = PLANARFREEHANDROI; - public static utilityToolType = PLANARFREEHANDROI; - public static TID300Representation = TID300Polyline; - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } +class PlanarFreehandROI extends BaseAdapter3D { + public static closedContourThreshold = 1e-5; - return toolType === PLANARFREEHANDROI; - }; + static { + this.init("PlanarFreehandROI", TID300Polyline); + } static getMeasurementData( MeasurementGroup, @@ -64,7 +49,7 @@ class PlanarFreehandROI { let isOpenContour = true; // If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference. - if (distanceBetweenFirstAndLastPoint < closedContourThreshold) { + if (distanceBetweenFirstAndLastPoint < this.closedContourThreshold) { worldCoords.pop(); // Remove the last element which is duplicated. isOpenContour = false; @@ -140,13 +125,11 @@ class PlanarFreehandROI { max, stdDev, /** Other */ - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(PlanarFreehandROI); - export default PlanarFreehandROI; diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.js b/packages/adapters/src/adapters/Cornerstone3D/Probe.js deleted file mode 100644 index 553ae3797..000000000 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.js +++ /dev/null @@ -1,106 +0,0 @@ -import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; -import MeasurementReport from "./MeasurementReport"; - -const { Point: TID300Point } = utilities.TID300; - -const PROBE = "Probe"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PROBE}`; - -class Probe { - static getMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - imageToWorldCoords, - metadata - ) { - const { defaultState, SCOORDGroup, ReferencedFrameNumber } = - MeasurementReport.getSetupMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - metadata, - Probe.toolType - ); - - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; - - state.annotation.data = { - handles: { - points: worldCoords, - activeHandleIndex: null, - textBox: { - hasMoved: false - } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getTID300RepresentationArguments(tool, worldToImageCoords) { - const { data, metadata } = tool; - let { finding, findingSites } = tool; - const { referencedImageId } = metadata; - - if (!referencedImageId) { - throw new Error( - "Probe.getTID300RepresentationArguments: referencedImageId is not defined" - ); - } - - const { points } = data.handles; - - const pointsImage = points.map(point => { - const pointImage = worldToImageCoords(referencedImageId, point); - return { - x: pointImage[0], - y: pointImage[1] - }; - }); - - const TID300RepresentationArguments = { - points: pointsImage, - trackingIdentifierTextValue, - findingSites: findingSites || [], - finding - }; - - return TID300RepresentationArguments; - } -} - -Probe.toolType = PROBE; -Probe.utilityToolType = PROBE; -Probe.TID300Representation = TID300Point; -Probe.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === PROBE; -}; - -MeasurementReport.registerTool(Probe); - -export default Probe; diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts new file mode 100644 index 000000000..e881dbf21 --- /dev/null +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -0,0 +1,65 @@ +import { utilities } from "dcmjs"; +import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; + +const { Point: TID300Point } = utilities.TID300; + +class Probe extends BaseAdapter3D { + static { + this.init("Probe", TID300Point); + this.registerLegacy(); + } + + static getMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + imageToWorldCoords, + metadata, + trackingIdentifier + ) { + const state = super.getMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + imageToWorldCoords, + metadata, + trackingIdentifier + ); + + const { defaultState, SCOORDGroup } = + MeasurementReport.getSetupMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + metadata, + Probe.toolType + ); + + const referencedImageId = + defaultState.annotation.metadata.referencedImageId; + + const { GraphicData } = SCOORDGroup; + + const worldCoords = []; + for (let i = 0; i < GraphicData.length; i += 2) { + const point = imageToWorldCoords(referencedImageId, [ + GraphicData[i], + GraphicData[i + 1] + ]); + worldCoords.push(point); + } + + state.annotation.data = { + ...state.annotation.data, + handles: { + points: worldCoords, + activeHandleIndex: null, + textBox: { + hasMoved: false + } + } + }; + + return state; + } +} + +export default Probe; diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index e26e24791..f659a62e4 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -1,31 +1,15 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Polyline: TID300Polyline } = utilities.TID300; -const TOOLTYPE = "RectangleROI"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${TOOLTYPE}`; - -class RectangleROI { - public static toolType = TOOLTYPE; - public static utilityToolType = TOOLTYPE; - public static TID300Representation = TID300Polyline; - - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === TOOLTYPE; - }; - +class RectangleROI extends BaseAdapter3D { + static { + this.init("RectangleROI", TID300Polyline); + // Register using the Cornerstone 1.x name so this tool is used to load it + this.registerLegacy(); + } public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, @@ -109,13 +93,11 @@ class RectangleROI { ], area, perimeter, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(RectangleROI); - export default RectangleROI; diff --git a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts index d502c8063..affef4a1d 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts @@ -1,30 +1,13 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; +import BaseAdapter3D from "./BaseAdapter3D"; const { Length: TID300Length } = utilities.TID300; -const ULTRASOUND_DIRECTIONAL = "UltrasoundDirectionalTool"; -const trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ULTRASOUND_DIRECTIONAL}`; - -class UltrasoundDirectional { - public static toolType = ULTRASOUND_DIRECTIONAL; - public static utilityToolType = ULTRASOUND_DIRECTIONAL; - public static TID300Representation = TID300Length; - public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => { - if (!TrackingIdentifier.includes(":")) { - return false; - } - - const [cornerstone3DTag, toolType] = TrackingIdentifier.split(":"); - - if (cornerstone3DTag !== CORNERSTONE_3D_TAG) { - return false; - } - - return toolType === ULTRASOUND_DIRECTIONAL; - }; - +class UltrasoundDirectional extends BaseAdapter3D { + static { + this.init("UltrasoundDirectionalTool", TID300Length); + } // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. static getMeasurementData( MeasurementGroup, @@ -91,13 +74,11 @@ class UltrasoundDirectional { return { point1, point2, - trackingIdentifierTextValue, + trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [] }; } } -MeasurementReport.registerTool(UltrasoundDirectional); - export default UltrasoundDirectional; diff --git a/packages/adapters/src/adapters/Cornerstone3D/index.ts b/packages/adapters/src/adapters/Cornerstone3D/index.ts index ef0e057a1..a2a648948 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/index.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/index.ts @@ -13,12 +13,15 @@ import Length from "./Length"; import PlanarFreehandROI from "./PlanarFreehandROI"; import Probe from "./Probe"; import UltrasoundDirectional from "./UltrasoundDirectional"; +import BaseAdapter3D from "./BaseAdapter3D"; import * as Segmentation from "./Segmentation"; import * as ParametricMap from "./ParametricMap"; import * as RTSS from "./RTStruct"; +import KeyImage from "./KeyImage"; const Cornerstone3DSR = { + BaseAdapter3D, Bidirectional, CobbAngle, Angle, @@ -30,6 +33,7 @@ const Cornerstone3DSR = { Probe, PlanarFreehandROI, UltrasoundDirectional, + KeyImage, MeasurementReport, CodeScheme, CORNERSTONE_3D_TAG diff --git a/packages/adapters/test/KeyImage.jest.js b/packages/adapters/test/KeyImage.jest.js new file mode 100644 index 000000000..1396fc675 --- /dev/null +++ b/packages/adapters/test/KeyImage.jest.js @@ -0,0 +1,28 @@ +import { describe, it, expect, beforeEach } from "@jest/globals"; +import { Cornerstone3DSR } from "../src/adapters/Cornerstone3D"; + +const { KeyImage, Probe } = Cornerstone3DSR; + +describe("KeyImage", () => { + beforeEach(() => { + // Setup adapters + }); + + it("Must define tool type", () => { + expect(KeyImage.toolType).toBe("KeyImage"); + // Even after registering a sub-type of Probe, the Probe type should be correct + expect(Probe.toolType).toBe("Probe"); + }); + + it("Must define tracking identifiers", () => { + expect(KeyImage.trackingIdentifierTextValue).toBe( + "Cornerstone3DTools@^0.1.0:Probe:KeyImage" + ); + // Even after registering a sub-type of Probe, the Probe tracking identifier should be unchanged + expect(Probe.trackingIdentifierTextValue).toBe( + "Cornerstone3DTools@^0.1.0:Probe" + ); + }); +}); + +// diff --git a/packages/adapters/test/Probe.jest.js b/packages/adapters/test/Probe.jest.js new file mode 100644 index 000000000..c2c4f9996 --- /dev/null +++ b/packages/adapters/test/Probe.jest.js @@ -0,0 +1,16 @@ +import { describe, it, expect, beforeEach } from "@jest/globals"; +import { Cornerstone3DSR } from "../src/adapters/Cornerstone3D"; + +const { Probe } = Cornerstone3DSR; + +describe("Probe", () => { + beforeEach(() => { + // Setup adapters + }); + + it("Must define tool type", () => { + expect(Probe.toolType).toBe("Probe"); + }); +}); + +// diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index a2a6103de..9d830f4bb 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,14 +3,28 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/dcmjs-org/dcmjs/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/ai -## [2.19.15](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/ai +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/ai + +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/ai + +# [3.0.0-beta.2](https://github.com/dcmjs-org/dcmjs/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([8bf65df](https://github.com/dcmjs-org/dcmjs/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/dcmjs-org/dcmjs/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index fe225aa85..3367358f1 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" @@ -21,7 +21,8 @@ }, "scripts": { "test": "jest --testTimeout 60000", - "clean": "rimraf dist", + "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", "build": "yarn run build:esm", "build:esm": "tsc --project ./tsconfig.json", "build:esm:watch": "tsc --project ./tsconfig.json --watch", @@ -30,11 +31,14 @@ "build:update-api": "yarn run build:esm && api-extractor run --local", "start": "tsc --project ./tsconfig.json --watch", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "eslint --fix ." + "lint": "eslint --fix .", + "format-check": "npx eslint ./src --quiet", + "api-check": "api-extractor --debug run ", + "prepublishOnly": "yarn clean && yarn build" }, "repository": { "type": "git", - "url": "git+https://github.com/dcmjs-org/dcmjs.git" + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" }, "author": "@cornerstonejs", "license": "MIT", @@ -53,7 +57,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.16", - "@cornerstonejs/tools": "^2.19.16" + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6" } } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8db3e8817..922faa1d3 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,14 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) + +### Features + +- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) + +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/core -## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/core +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/core + +# [3.0.0-beta.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([8bf65df](https://github.com/cornerstonejs/cornerstone3D/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js index 10f5cc445..be56fc7a0 100644 --- a/packages/core/jest.config.js +++ b/packages/core/jest.config.js @@ -5,6 +5,7 @@ const path = require('path'); module.exports = { ...base, displayName: 'core', + setupFiles: ['jest-canvas-mock'], moduleNameMapper: { '^@cornerstonejs/(.*)$': path.resolve(__dirname, '../$1/src'), }, diff --git a/packages/core/package.json b/packages/core/package.json index 117c445cc..95f90bee2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/core/src/cache/cache.ts b/packages/core/src/cache/cache.ts index 5c2db60a5..21576891c 100644 --- a/packages/core/src/cache/cache.ts +++ b/packages/core/src/cache/cache.ts @@ -16,6 +16,7 @@ import imageIdToURI from '../utilities/imageIdToURI'; import eventTarget from '../eventTarget'; import Events from '../enums/Events'; import { ImageQualityStatus } from '../enums'; +import fnv1aHash from '../utilities/fnv1aHash'; const ONE_GB = 1073741824; @@ -33,6 +34,8 @@ class Cache { private readonly _imageCache = new Map(); // used to store volume data (3d) private readonly _volumeCache = new Map(); + // used to store the reverse lookup from imageIds to volumeId + private readonly _imageIdsToVolumeIdCache = new Map(); // Todo: contour for now, but will be used for surface, etc. private readonly _geometryCache = new Map(); @@ -40,6 +43,36 @@ class Cache { private _maxCacheSize = 3 * ONE_GB; private _geometryCacheSize = 0; + /** + * Generates a deterministic volume ID from a list of image IDs + * @param imageIds - Array of image IDs + * @returns A deterministic volume ID + */ + public generateVolumeId(imageIds: string[]): string { + const imageURIs = imageIds.map(imageIdToURI).sort(); + + let combinedHash = 0x811c9dc5; + for (const id of imageURIs) { + const idHash = fnv1aHash(id); + for (let i = 0; i < idHash.length; i++) { + combinedHash ^= idHash.charCodeAt(i); + combinedHash += + (combinedHash << 1) + + (combinedHash << 4) + + (combinedHash << 7) + + (combinedHash << 8) + + (combinedHash << 24); + } + } + return `volume-${(combinedHash >>> 0).toString(36)}`; + } + + public getImageIdsForVolumeId(volumeId: string): string[] { + return Array.from(this._imageIdsToVolumeIdCache.entries()) + .filter(([_, id]) => id === volumeId) + .map(([key]) => key); + } + /** * Set the maximum cache Size * diff --git a/packages/core/src/enums/Events.ts b/packages/core/src/enums/Events.ts index 1f7aadd32..d6ba3dacb 100644 --- a/packages/core/src/enums/Events.ts +++ b/packages/core/src/enums/Events.ts @@ -239,13 +239,8 @@ enum Events { /** * Triggers when the webworker has made progress * You should use it with a workerType to indicate the type of worker that is making progress - * Checkout the polySEG convertors in the cornerstone tools - * to lean how to use it */ WEB_WORKER_PROGRESS = 'CORNERSTONE_WEB_WORKER_PROGRESS', - // IMAGE_CACHE_FULL = 'CORNERSTONE_IMAGE_CACHE_FULL', - // PRE_RENDER = 'CORNERSTONE_PRE_RENDER', - // ELEMENT_RESIZED = 'CORNERSTONE_ELEMENT_RESIZED', /** * Triggers on the HTML element when viewport modifies its colormap diff --git a/packages/core/src/utilities/VoxelManager.ts b/packages/core/src/utilities/VoxelManager.ts index e805e5b4c..a6a6b0f14 100644 --- a/packages/core/src/utilities/VoxelManager.ts +++ b/packages/core/src/utilities/VoxelManager.ts @@ -1,4 +1,3 @@ -import { vec3 } from 'gl-matrix'; import cache from '../cache/cache'; import type { BoundsIJK, @@ -893,7 +892,20 @@ export default class VoxelManager { const sliceData = new SliceDataConstructor(sliceSize); // @ts-ignore sliceData.set(scalarData.subarray(sliceStart, sliceEnd)); - imageVoxelManager.scalarData = sliceData; + + // Instead of directly assigning scalarData, use TypedArray's set method + // previously here we were using imageVoxelManager.scalarData = sliceData + // which had some weird side effects + if (imageVoxelManager.scalarData) { + imageVoxelManager.scalarData.set(sliceData); + // Ensure the voxel manager knows about the changes + imageVoxelManager.modifiedSlices.add(sliceIndex); + } else { + // Fallback to individual updates if scalarData is not directly accessible + for (let i = 0; i < sliceSize; i++) { + imageVoxelManager.setAtIndex(i, sliceData[i]); + } + } // Update min/max values for this slice for (let i = 0; i < sliceData.length; i++) { @@ -939,7 +951,7 @@ export default class VoxelManager { public static createScalarVolumeVoxelManager({ dimensions, scalarData, - numberOfComponents = 1, + numberOfComponents, }: { dimensions: Point3; scalarData; diff --git a/packages/core/src/utilities/calculateSpacingBetweenImageIds.ts b/packages/core/src/utilities/calculateSpacingBetweenImageIds.ts new file mode 100644 index 000000000..de154ea96 --- /dev/null +++ b/packages/core/src/utilities/calculateSpacingBetweenImageIds.ts @@ -0,0 +1,150 @@ +import { vec3 } from 'gl-matrix'; +import * as metaData from '../metaData'; +import { getConfiguration } from '../init'; + +/** + * Calculates the spacing between images in a series based on their positions + * + * @param imageIds - array of imageIds + * @returns The calculated spacing value between images + */ +export default function calculateSpacingBetweenImageIds( + imageIds: string[] +): number { + const { + imagePositionPatient: referenceImagePositionPatient, + imageOrientationPatient, + } = metaData.get('imagePlaneModule', imageIds[0]); + + // Calculate scan axis normal from image orientation + const rowCosineVec = vec3.fromValues( + imageOrientationPatient[0], + imageOrientationPatient[1], + imageOrientationPatient[2] + ); + const colCosineVec = vec3.fromValues( + imageOrientationPatient[3], + imageOrientationPatient[4], + imageOrientationPatient[5] + ); + + const scanAxisNormal = vec3.create(); + vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec); + + // Convert referenceImagePositionPatient to vec3 + const refIppVec = vec3.fromValues( + referenceImagePositionPatient[0], + referenceImagePositionPatient[1], + referenceImagePositionPatient[2] + ); + + // Check if we are using wadouri scheme + const usingWadoUri = imageIds[0].split(':')[0] === 'wadouri'; + let spacing: number; + + function getDistance(imageId: string) { + const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId); + const positionVector = vec3.create(); + + // Convert imagePositionPatient to vec3 + const ippVec = vec3.fromValues( + imagePositionPatient[0], + imagePositionPatient[1], + imagePositionPatient[2] + ); + + vec3.sub(positionVector, refIppVec, ippVec); + return vec3.dot(positionVector, scanAxisNormal); + } + + if (!usingWadoUri) { + const distanceImagePairs = imageIds.map((imageId) => { + const distance = getDistance(imageId); + return { + distance, + imageId, + }; + }); + + distanceImagePairs.sort((a, b) => b.distance - a.distance); + const numImages = distanceImagePairs.length; + + // Calculated average spacing. + // We would need to resample if these are not similar. + // It should be up to the host app to do this if it needed to. + spacing = + Math.abs( + distanceImagePairs[numImages - 1].distance - + distanceImagePairs[0].distance + ) / + (numImages - 1); + } else { + // Using wadouri, so we have only prefetched the first, middle, and last + // images for metadata. Assume initial imageId array order is pre-sorted, + // but check orientation. + const prefetchedImageIds = [ + imageIds[0], + imageIds[Math.floor(imageIds.length / 2)], + ]; + + const firstImageDistance = getDistance(prefetchedImageIds[0]); + const middleImageDistance = getDistance(prefetchedImageIds[1]); + + const metadataForMiddleImage = metaData.get( + 'imagePlaneModule', + prefetchedImageIds[1] + ); + + if (!metadataForMiddleImage) { + throw new Error('Incomplete metadata required for volume construction.'); + } + + const positionVector = vec3.create(); + + // Convert metadataForMiddleImage.imagePositionPatient to vec3 + const middleIppVec = vec3.fromValues( + metadataForMiddleImage.imagePositionPatient[0], + metadataForMiddleImage.imagePositionPatient[1], + metadataForMiddleImage.imagePositionPatient[2] + ); + + vec3.sub(positionVector, refIppVec, middleIppVec); + const distanceBetweenFirstAndMiddleImages = vec3.dot( + positionVector, + scanAxisNormal + ); + spacing = + Math.abs(distanceBetweenFirstAndMiddleImages) / + Math.floor(imageIds.length / 2); + } + + const { sliceThickness, spacingBetweenSlices } = metaData.get( + 'imagePlaneModule', + imageIds[0] + ); + + const { strictZSpacingForVolumeViewport } = getConfiguration().rendering; + + // We implemented these lines for multiframe dicom files that does not have + // position for each frame, leading to incorrect calculation of spacing = 0 + // If possible, we use the sliceThickness, but we warn about this dicom file + // weirdness. If sliceThickness is not available, we set to 1 just to render + if (spacing === 0 && !strictZSpacingForVolumeViewport) { + if (spacingBetweenSlices) { + console.debug('Could not calculate spacing. Using spacingBetweenSlices'); + spacing = spacingBetweenSlices; + } else if (sliceThickness) { + console.debug( + 'Could not calculate spacing and no spacingBetweenSlices. Using sliceThickness' + ); + spacing = sliceThickness; + } else { + console.debug( + 'Could not calculate spacing. The VolumeViewport visualization is compromised. Setting spacing to 1 to render' + ); + spacing = 1; + } + } + + return spacing; +} diff --git a/packages/core/src/utilities/fnv1aHash.ts b/packages/core/src/utilities/fnv1aHash.ts new file mode 100644 index 000000000..713787a14 --- /dev/null +++ b/packages/core/src/utilities/fnv1aHash.ts @@ -0,0 +1,14 @@ +/** + * Generates a hash for a string using FNV-1a algorithm + * @param str - string to hash + * @returns the hashed string in base 36 + */ +export default function fnv1aHash(str: string): string { + let hash = 0x811c9dc5; + for (let i = 0; i < str.length; i++) { + hash ^= str.charCodeAt(i); + hash += + (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); + } + return (hash >>> 0).toString(36); +} diff --git a/packages/core/src/utilities/index.ts b/packages/core/src/utilities/index.ts index ca345f532..86db4f8cd 100644 --- a/packages/core/src/utilities/index.ts +++ b/packages/core/src/utilities/index.ts @@ -80,6 +80,7 @@ import * as color from './color'; import { deepEqual } from './deepEqual'; import type { IViewport } from '../types/IViewport'; import FrameRange from './FrameRange'; +import fnv1aHash from './fnv1aHash'; // solving the circular dependency issue import { _getViewportModality } from './getViewportModality'; @@ -94,7 +95,7 @@ import scroll from './scroll'; import clip from './clip'; import createSubVolume from './createSubVolume'; import getVolumeDirectionVectors from './getVolumeDirectionVectors'; - +import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds'; const getViewportModality = (viewport: IViewport, volumeId?: string) => _getViewportModality(viewport, volumeId, cache.getVolume); @@ -108,6 +109,7 @@ export { scaleRgbTransferFunction, triggerEvent, imageIdToURI, + fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, @@ -193,4 +195,5 @@ export { transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, + calculateSpacingBetweenImageIds, }; diff --git a/packages/core/src/utilities/pointInShapeCallback.ts b/packages/core/src/utilities/pointInShapeCallback.ts index 3ef5200d6..7851b2bda 100644 --- a/packages/core/src/utilities/pointInShapeCallback.ts +++ b/packages/core/src/utilities/pointInShapeCallback.ts @@ -73,10 +73,17 @@ export function pointInShapeCallback( if ((imageData as CPUImageData).getScalarData) { scalarData = (imageData as CPUImageData).getScalarData(); } else { - scalarData = (imageData as vtkImageData) - .getPointData() - .getScalars() - .getData(); + const scalars = (imageData as vtkImageData).getPointData().getScalars(); + + if (scalars) { + scalarData = scalars.getData(); + } else { + // @ts-ignore + const { voxelManager } = imageData.get('voxelManager') || {}; + if (voxelManager) { + scalarData = voxelManager.getCompleteScalarDataArray(); + } + } } const dimensions = imageData.getDimensions(); diff --git a/packages/core/src/utilities/sortImageIdsAndGetSpacing.ts b/packages/core/src/utilities/sortImageIdsAndGetSpacing.ts index ef5fba217..216ac1c78 100644 --- a/packages/core/src/utilities/sortImageIdsAndGetSpacing.ts +++ b/packages/core/src/utilities/sortImageIdsAndGetSpacing.ts @@ -1,6 +1,6 @@ import { vec3 } from 'gl-matrix'; import * as metaData from '../metaData'; -import { getConfiguration } from '../init'; +import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds'; import type { Point3 } from '../types'; interface SortedImageIdsItem { @@ -15,7 +15,7 @@ interface SortedImageIdsItem { * @param imageIds - array of imageIds * @param scanAxisNormal - [x, y, z] array or gl-matrix vec3 * - * @returns The sortedImageIds, zSpacing, and origin of the first image in the series. + * @returns The sortedImageIds, spacing, and origin of the first image in the series. */ export default function sortImageIdsAndGetSpacing( imageIds: string[], @@ -42,20 +42,12 @@ export default function sortImageIdsAndGetSpacing( vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec); } - const refIppVec = vec3.create(); - // Check if we are using wadouri scheme const usingWadoUri = imageIds[0].split(':')[0] === 'wadouri'; - vec3.set( - refIppVec, - referenceImagePositionPatient[0], - referenceImagePositionPatient[1], - referenceImagePositionPatient[2] - ); + const zSpacing = calculateSpacingBetweenImageIds(imageIds); let sortedImageIds: string[]; - let zSpacing: number; function getDistance(imageId: string) { const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId); @@ -89,19 +81,7 @@ export default function sortImageIdsAndGetSpacing( }); distanceImagePairs.sort((a, b) => b.distance - a.distance); - sortedImageIds = distanceImagePairs.map((a) => a.imageId); - const numImages = distanceImagePairs.length; - - // Calculated average spacing. - // We would need to resample if these are not similar. - // It should be up to the host app to do this if it needed to. - zSpacing = - Math.abs( - distanceImagePairs[numImages - 1].distance - - distanceImagePairs[0].distance - ) / - (numImages - 1); } else { // Using wadouri, so we have only prefetched the first, middle, and last // images for metadata. Assume initial imageId array order is pre-sorted, @@ -116,62 +96,13 @@ export default function sortImageIdsAndGetSpacing( if (firstImageDistance - middleImageDistance < 0) { sortedImageIds.reverse(); } - - // Calculate average spacing between the first and middle prefetched images, - // otherwise fall back to DICOM `spacingBetweenSlices` - const metadataForMiddleImage = metaData.get( - 'imagePlaneModule', - prefetchedImageIds[1] - ); - - if (!metadataForMiddleImage) { - throw new Error('Incomplete metadata required for volume construction.'); - } - - const positionVector = vec3.create(); - - vec3.sub( - positionVector, - referenceImagePositionPatient, - metadataForMiddleImage.imagePositionPatient - ); - const distanceBetweenFirstAndMiddleImages = vec3.dot( - positionVector, - scanAxisNormal - ); - zSpacing = - Math.abs(distanceBetweenFirstAndMiddleImages) / - Math.floor(imageIds.length / 2); } - const { - imagePositionPatient: origin, - sliceThickness, - spacingBetweenSlices, - } = metaData.get('imagePlaneModule', sortedImageIds[0]); - - const { strictZSpacingForVolumeViewport } = getConfiguration().rendering; - - // We implemented these lines for multiframe dicom files that does not have - // position for each frame, leading to incorrect calculation of zSpacing = 0 - // If possible, we use the sliceThickness, but we warn about this dicom file - // weirdness. If sliceThickness is not available, we set to 1 just to render - if (zSpacing === 0 && !strictZSpacingForVolumeViewport) { - if (spacingBetweenSlices) { - console.log('Could not calculate zSpacing. Using spacingBetweenSlices'); - zSpacing = spacingBetweenSlices; - } else if (sliceThickness) { - console.log( - 'Could not calculate zSpacing and no spacingBetweenSlices. Using sliceThickness' - ); - zSpacing = sliceThickness; - } else { - console.log( - 'Could not calculate zSpacing. The VolumeViewport visualization is compromised. Setting zSpacing to 1 to render' - ); - zSpacing = 1; - } - } + const { imagePositionPatient: origin } = metaData.get( + 'imagePlaneModule', + sortedImageIds[0] + ); + const result: SortedImageIdsItem = { zSpacing, origin, diff --git a/packages/core/src/webWorkerManager/webWorkerManager.js b/packages/core/src/webWorkerManager/webWorkerManager.js index 79c69864b..eb1286274 100644 --- a/packages/core/src/webWorkerManager/webWorkerManager.js +++ b/packages/core/src/webWorkerManager/webWorkerManager.js @@ -52,6 +52,7 @@ class CentralizedWorkerManager { autoTerminateOnIdle: autoTerminateOnIdle.enabled, idleCheckIntervalId: null, idleTimeThreshold: autoTerminateOnIdle.idleTimeThreshold, + options: options, }; workerProperties.loadCounters = Array(maxWorkerInstances).fill(0); @@ -156,6 +157,8 @@ class CentralizedWorkerManager { workerProperties.processing = true; + // augment args with options + args = { ...args, ...workerProperties.options }; const results = await api[methodName](args, ...finalCallbacks); workerProperties.processing = false; diff --git a/packages/core/test/stackViewport_node_render.jest.js b/packages/core/test/stackViewport_node_render.jest.js new file mode 100644 index 000000000..3175697d6 --- /dev/null +++ b/packages/core/test/stackViewport_node_render.jest.js @@ -0,0 +1,117 @@ +import * as cornerstone3D from '../src/index'; +import { + fakeImageLoader, + fakeMetaDataProvider, +} from '../../../utils/test/testUtilsImageLoader'; + +import { describe, it, expect } from '@jest/globals'; +import { render } from 'react-dom'; + +const { + utilities, + setUseCPURendering, + RenderingEngine, + Enums, + imageLoader, + metaData, + init, +} = cornerstone3D; +const { ViewportType, Events } = Enums; + +const renderingEngineId = utilities.uuidv4(); +const viewportId = 'VIEWPORT'; + +function encodeImageIdInfo(info) { + return `fakeImageLoader:${encodeURIComponent(JSON.stringify(info))}`; +} + +const imageInfo = { + loader: 'fakeImageLoader', + name: 'imageURI', + rows: 64, + columns: 64, + barStart: 20, + barWidth: 5, + xSpacing: 1, + ySpacing: 1, + sliceIndex: 0, +}; + +const imageId = encodeImageIdInfo(imageInfo); + +function setSize(element, width, height) { + Object.defineProperty(element, 'offsetWidth', { value: width }); + Object.defineProperty(element, 'offsetHeight', { value: height }); + Object.defineProperty(element, 'clientWidth', { value: width }); + Object.defineProperty(element, 'clientHeight', { value: height }); + Object.defineProperty(element, 'getBoundingClientRect', { + value: () => ({ width, height }), + }); +} + +function initCore() { + init({}); + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader); + + metaData.addProvider(utilities.calibratedPixelSpacingMetadataProvider.get); + metaData.addProvider(utilities.genericMetadataProvider.get); + metaData.addProvider(fakeMetaDataProvider, 10000); + + document.body.innerHTML = `

`; + const renderingEngine = new RenderingEngine(renderingEngineId); + const element = document.getElementById('elementId'); + setSize(element, 100, 100); + const viewportElement = document.getElementById('viewport-element'); + setSize(viewportElement, 100, 100); + const canvasElement = document.getElementById('cornerstone-canvas'); + setSize(canvasElement, 100, 100); + return { renderingEngine, element }; +} + +describe('stackViewport_node_render', function () { + let viewport, element, renderingEngine; + + beforeEach(() => { + setUseCPURendering(true); + window.devicePixelRatio = 1; + + const initData = initCore(); + element = initData.element; + renderingEngine = initData.renderingEngine; + + const viewportInput = { + viewportId, + type: ViewportType.STACK, + element, + defaultOptions: { + background: [0.2, 0, 0.2], + }, + }; + + renderingEngine.enableElement(viewportInput); + viewport = renderingEngine.getViewport(viewportId); + }); + + it('Basic Viewport Creation', () => { + expect(viewport).not.toBeUndefined(); + }); + + it('Should render simple stack', () => { + let promise = new Promise((resolve) => { + element.addEventListener(Events.IMAGE_RENDERED, () => { + const canvas = viewport.getCanvas(); + const image = canvas.toDataURL('image/png'); + // console.error('Rendered image', image); + expect(image).toBeTruthy(); + resolve(image); + }); + }); + viewport.setStack([imageId], 0); + viewport.render(); + return promise; + }); +}); diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index bcb7df111..6fea89d1a 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,14 +3,28 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader -## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + +# [3.0.0-beta.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([8bf65df](https://github.com/cornerstonejs/cornerstone3D/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index a96a6f23d..94b36c01c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.16", + "@cornerstonejs/core": "^3.0.0-beta.6", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/docs/getting-started/vue-angular-react-etc.md b/packages/docs/docs/getting-started/vue-angular-react-etc.md deleted file mode 100644 index e6d235fed..000000000 --- a/packages/docs/docs/getting-started/vue-angular-react-etc.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -id: vue-angular-react-etc -title: 'React, Vue, Angular, etc.' ---- - -Here are some examples of how to use cornerstone3D with React, Vue, Angular, etc. -We have made it easy to use cornerstone3D with your favorite framework. - -Follow the links below to see how to use cornerstone3D with your favorite framework. - -- [Cornerstone3D with React](https://github.com/cornerstonejs/vite-react-cornerstone3d) -- [Cornerstone3D with Vue](https://github.com/cornerstonejs/vue-cornerstone3d) -- [Cornerstone3D with Angular](https://github.com/cornerstonejs/angular-cornerstone3d) - - [Community maintained project](https://github.com/yanqzsu/ng-cornerstone) -- [Cornerstone3D with Next.js](https://github.com/cornerstonejs/nextjs-cornerstone3d) - -## Vite - -To update your Vite configuration, use the CommonJS plugin, exclude `dicom-image-loader` from optimization, and include `dicom-parser`. We plan to convert `dicom-image-loader` to an ES module, eliminating the need for exclusion in the future. - -```javascript -import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; - -export default defineConfig({ - plugins: [viteCommonjs()], - optimizeDeps: { - exclude: ['@cornerstonejs/dicom-image-loader'], - include: ['dicom-parser'], - }, -}); -``` - -## Troubleshooting - -### 1. Polyseg & Labelmap interpolation - -By default, we don't include the `@icr/polyseg-wasm`, `itk-wasm`, and `@itk-wasm/morphological-contour-interpolation` libraries in our bundle to keep the size pretty small. If you need these features, you'll need to install them separately and import them into your project. You can do this by running - -```bash -yarn install @icr/polyseg-wasm itk-wasm @itk-wasm/morphological-contour-interpolation -``` - -### 1. Build Issues - -If you're using 3D segmentation features and encounter issues with `@icr/polyseg-wasm`, add the following to your Vite configuration: - -```javascript -build: { - rollupOptions: { - external: ["@icr/polyseg-wasm"], - } -}, -``` - -:::note -You might need to add `external: ["itk-wasm", "@itk-wasm/morphological-contour-interpolation"],` to the rollupOptions as well -::: - -### 2. Path Resolution Issues with @cornerstonejs/core - -If you encounter the error "No known conditions for "./types" specifier in "@cornerstonejs/core" package" during build (while development works fine), add the following alias to your Vite configuration: - -```javascript -resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - '@root': fileURLToPath(new URL('./', import.meta.url)), - "@cornerstonejs/core": fileURLToPath(new URL('node_modules/@cornerstonejs/core/dist/esm', import.meta.url)), - }, -}, -``` - -### 3. Tool Name Minification Issues - -If you experience issues with tool names being minified (e.g., LengthTool being registered as "FE"), you can prevent minification by adding: - -```javascript -build: { - minify: false, -} -``` - -:::note -These solutions have been tested primarily on macOS but may also apply to other operating systems. If you're using Vuetify or other Vue frameworks, these configurations might need to be adjusted based on your specific setup. -::: - -### 4. Webpack - -For webpack, simply install the cornerstone3D library and import it into your project. - -If you previously used - -`noParse: [/(codec)/],` - -to avoid parsing codecs in your webpack module, remove that line. The cornerstone3D library now includes the codecs as an ES module. - -Also since we are using wasm, you will need to add the following to your webpack configuration in the `module.rules` section: - -```javascript -{ - test: /\.wasm/, - type: 'asset/resource', -}, -``` - -## Svelte + Vite - -Similar to the configuration above, use the CommonJS plugin converting commonjs to esm. Otherwise, it will be pending at `await viewport.setStack(stack);`, the image will not be rendered. - -```javascript -import { defineConfig } from 'vite'; -import { svelte } from '@sveltejs/vite-plugin-svelte'; -import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; - -export default defineConfig({ - plugins: [svelte(), viteCommonjs()], - optimizeDeps: { - exclude: ['@cornerstonejs/dicom-image-loader'], - include: ['dicom-parser'], - }, -}); -``` - -:::note Tip -If you are using `sveltekit`, and config like `plugins: [ sveltekit(), viteCommonjs() ]`, `viteCommonjs()` may not work. -Try replace `sveltekit` with `vite-plugin-svelte` and it will work. -::: diff --git a/packages/docs/docs/getting-started/vue-angular-react-vite.md b/packages/docs/docs/getting-started/vue-angular-react-vite.md new file mode 100644 index 000000000..9e9c61e50 --- /dev/null +++ b/packages/docs/docs/getting-started/vue-angular-react-vite.md @@ -0,0 +1,244 @@ +--- +id: vue-angular-react-etc +title: 'React, Vue, Angular, etc.' +--- + +Here are some examples of how to use cornerstone3D with React, Vue, Angular, vite-based frameworks, etc. +We have made it easy to use cornerstone3D with your favorite framework. + +Follow the links below to see how to use cornerstone3D with your favorite framework. + +- [Cornerstone3D with vite-based React](https://github.com/cornerstonejs/vite-react-cornerstone3d) +- [Cornerstone3D with vite-based Vue](https://github.com/cornerstonejs/vite-vue-cornerstone3d) +- [Cornerstone3D with Angular](https://github.com/cornerstonejs/angular-cornerstone3d) + - [Community maintained project](https://github.com/yanqzsu/ng-cornerstone) +- [Cornerstone3D with Next.js](https://github.com/cornerstonejs/nextjs-cornerstone3d) + +## Vite + +### Basic Setup + +The following is an example of a Vite configuration for a vite-based project that works with cornerstone3D. + +```javascript +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; + +export default defineConfig({ + plugins: [ + react(), + // for dicom-parser + viteCommonjs(), + ], + // seems like only required in dev mode + optimizeDeps: { + exclude: ['@cornerstonejs/dicom-image-loader'], + include: ['dicom-parser'], + }, + worker: { + format: 'es', + }, +}); +``` + +:::note +This configuration is for basic usage of cornerstone3D tools, no polySeg and no labelmap interpolation +::: + +### Advanced Setup + +#### PolySeg + +If you need to use polyseg to convert between segmentation representations, you can add the following as a dependency and initialize the cornerstoneTools with the following configuration: + +```bash +yarn add @cornerstonejs/polymorphic-segmentation +``` + +```js +import * as polySeg from '@cornerstonejs/polymorphic-segmentation'; +import { init } from '@cornerstonejs/tools'; + +initialize({ + addons: { + polySeg, + }, +}); +``` + +Next, you'll need to edit the Vite configuration to include the following. Keep in mind that we're including the WASM files in the build and excluding them from dependency optimization. There is an ongoing issue in vite with `import.meta.url` ([check their GitHub issue](https://github.com/vitejs/vite/issues/8427)), which force us to exclude the wasm files from optimization of dependencies. + +```js +export default defineConfig({ + assetsInclude: ['**/*.wasm'], + plugins: [ + react(), + // for dicom-parser + viteCommonjs(), + ], + // seems like only required in dev mode + optimizeDeps: { + exclude: [ + '@cornerstonejs/dicom-image-loader', + '@cornerstonejs/polymorphic-segmentation', + ], + include: ['dicom-parser'], + }, + worker: { + format: 'es', + }, +}); +``` + +#### Labelmap Interpolation + +you need to add the following to your vite config: + +```bash +yarn add @cornerstonejs/labelmap-interpolation +``` + +and then you need to edit the vite config to include the following: + +```js +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; + +export default defineConfig({ + assetsInclude: ['**/*.wasm'], + plugins: [ + react(), + // for dicom-parser + viteCommonjs(), + ], + // seems like only required in dev mode + optimizeDeps: { + exclude: [ + '@cornerstonejs/dicom-image-loader', + '@cornerstonejs/polymorphic-segmentation', + '@cornerstonejs/labelmap-interpolation', + ], + include: ['dicom-parser'], + }, + worker: { + format: 'es', + }, +}); +``` + +## Webpack + +### Basic Setup + +It should work out of the box with no configuration, so the following `nextjs.config.js` is the only thing you need to add. + +```js +/** @type {import('next').NextConfig} */ +const nextConfig = { + webpack: (config) => { + // resolve fs for one of the dependencies + config.resolve.fallback = { + fs: false, + }; + + return config; + }, +}; + +export default nextConfig; +``` + +### Advanced Setup (PolySeg & Labelmap Interpolation) + +You might need to add + +```js + +``` + +## Troubleshooting + +### 1. Rollup Options + +By default, we don't include the `@icr/polyseg-wasm`, `itk-wasm`, and `@itk-wasm/morphological-contour-interpolation` libraries in our bundle to keep the size pretty small. +Rollup **might** complain about these libraries, so you can add the following to the rollupOptions: + +```js +worker: { + format: "es", + rollupOptions: { + external: ["@icr/polyseg-wasm"], + }, + }, +``` + +### 2. Path Resolution Issues with @cornerstonejs/core + +If you encounter the error "No known conditions for "./types" specifier in "@cornerstonejs/core" package" during build (while development works fine), add the following alias to your Vite configuration: + +```javascript +resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@root': fileURLToPath(new URL('./', import.meta.url)), + "@cornerstonejs/core": fileURLToPath(new URL('node_modules/@cornerstonejs/core/dist/esm', import.meta.url)), + }, +}, +``` + +### 3. Tool Name Minification Issues + +If you experience issues with tool names being minified (e.g., LengthTool being registered as "FE"), you can prevent minification by adding: + +```javascript +build: { + minify: false, +} +``` + +:::note +These solutions have been tested primarily on macOS but may also apply to other operating systems. If you're using Vuetify or other Vue frameworks, these configurations might need to be adjusted based on your specific setup. +::: + +### 4. Webpack + +For webpack, simply install the cornerstone3D library and import it into your project. + +If you previously used + +`noParse: [/(codec)/],` + +to avoid parsing codecs in your webpack module, remove that line. The cornerstone3D library now includes the codecs as an ES module. + +Also since we are using wasm, you will need to add the following to your webpack configuration in the `module.rules` section: + +```javascript +{ + test: /\.wasm/, + type: 'asset/resource', +}, +``` + +### 5. Svelte + Vite + +Similar to the configuration above, use the CommonJS plugin converting commonjs to esm. Otherwise, it will be pending at `await viewport.setStack(stack);`, the image will not be rendered. + +```javascript +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; + +export default defineConfig({ + plugins: [svelte(), viteCommonjs()], + optimizeDeps: { + exclude: ['@cornerstonejs/dicom-image-loader'], + include: ['dicom-parser'], + }, +}); +``` + +:::note Tip +If you are using `sveltekit`, and config like `plugins: [ sveltekit(), viteCommonjs() ]`, `viteCommonjs()` may not work. +Try replace `sveltekit` with `vite-plugin-svelte` and it will work. diff --git a/packages/docs/docs/migration-guides/2x/1-general.md b/packages/docs/docs/migration-guides/2x/1-general.md index 6d85d265e..7ccbe7a9e 100644 --- a/packages/docs/docs/migration-guides/2x/1-general.md +++ b/packages/docs/docs/migration-guides/2x/1-general.md @@ -28,7 +28,7 @@ Watch this video guide for a [visual walkthrough](https://www.youtube.com/embed/ We have worked hard to enhance the developer experience when using Cornerstone3D with various frameworks like React, Vue, Angular, Vite, and Webpack. -For more information, please refer to the [frameworks](../../getting-started/vue-angular-react-etc.md) page. +For more information, please refer to the [frameworks](../../getting-started/vue-angular-react-vite.md) page. You need to modify your Vite and Webpack configurations to correctly import the Cornerstone3D library. Check each framework's repository for more details. @@ -39,7 +39,6 @@ We have streamlined the process of loading volumes without sacrificing speed by You can remove `Cross-Origin-Opener-Policy` and `Cross-Origin-Embedder-Policy` from your custom headers if you don't need them in other aspects of your app. - ## Typescript Version We have upgraded the typescript version from 4.6 to 5.5 in the 2.0 version of the cornerstone3D. @@ -76,10 +75,9 @@ Both Node.js and modern browsers now support ECMAScript Modules (ESM) by default :::note Tip -If you must use CJS, for example, if you are using `dicom-image-loader` and `dicom-parser`, you need to use `vite-plugin-commonjs` to convert CommonJS to ESM. For more information, please refer to the [Frameworks](../../getting-started/vue-angular-react-etc.md) page. +If you must use CJS, for example, if you are using `dicom-image-loader` and `dicom-parser`, you need to use `vite-plugin-commonjs` to convert CommonJS to ESM. For more information, please refer to the [Frameworks](../../getting-started/vue-angular-react-vite.md) page. ::: - ## Package Exports The Cornerstone libraries now utilize the `exports` field in their `package.json` files. This allows for more precise control over how modules are imported and ensures compatibility with different build systems. diff --git a/packages/docs/docs/migration-guides/3x/1-polyseg.md b/packages/docs/docs/migration-guides/3x/1-polyseg.md new file mode 100644 index 000000000..c8c174c41 --- /dev/null +++ b/packages/docs/docs/migration-guides/3x/1-polyseg.md @@ -0,0 +1,91 @@ +--- +id: general +title: 'General' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Externalized PolySeg + +PolySeg has been moved from the `cornerstoneTools` package and is now a standalone package called @cornerstonejs/polymorphic-segmentation. + +## Usage + +Now, it's not included in the `cornerstoneTools` package anymore. If you need to enable polymorphic conversions, you'll have to install it and initialize `cornerstoneTools` with it. + +```js +import * as polyseg from '@cornerstonejs/polymorphic-segmentation'; +import { init } from '@cornerstonejs/tools'; + +init({ + addons: { + polyseg, + }, +}); +``` + +:::note +This change was made because we weren't shipping the cornerstone tools with our `polyseg-wasm` dependencies. There were a few issues with bundlers complaining about the static assets included. Now, those who don't want to use it are fine, and those who do will need to install it and initialize `cornerstoneTools` themselves. +::: + +## Exports + +We weren't exposing any functions from the `tools` directory. If you need something, import it from `@cornerstonejs/polymorphic-segmentation`. +It exports the following: + +```js +import { + canComputeRequestedRepresentation, + // computes + computeContourData, + computeLabelmapData, + computeSurfaceData, + // updates + updateSurfaceData, + // init + init, +} from '@cornerstonejs/polymorphic-segmentation'; +``` + +### computeAndAddContourRepresentation, computeAndAddLabelmapRepresentation, computeAndAddSurfaceRepresentation + +have been removed from the `tools` directory. If you happen to need them (unlikely), you'll have to build them yourself. + +```js +import { utilities } from '@cornerstonejs/tools'; +import { computeLabelmapData } from '@cornerstonejs/polymorphic-segmentation'; + +const { computeAndAddRepresentation } = utilities.segmentation; + +// for labelmap +const labelmapData = await computeAndAddRepresentation( + segmentationId, + Representations.Labelmap, + () => computeLabelmapData(segmentationId, { viewport }), + () => null +); + +// for surface +import { + computeSurfaceData, + updateSurfaceData, +} from '@cornerstonejs/polymorphic-segmentation'; + +const SurfaceData = await computeAndAddRepresentation( + segmentationId, + Representations.Surface, + () => computeSurfaceData(segmentationId, { viewport }), + () => updateSurfaceData(segmentationId, { viewport }) +); + +// same for contour +import { computeContourData } from '@cornerstonejs/polymorphic-segmentation'; + +const contourData = await computeAndAddRepresentation( + segmentationId, + Representations.Contour, + () => computeContourData(segmentationId, { viewport }), + () => undefined +); +``` diff --git a/packages/docs/docs/migration-guides/3x/2-threshold-tools.md b/packages/docs/docs/migration-guides/3x/2-threshold-tools.md new file mode 100644 index 000000000..866d90714 --- /dev/null +++ b/packages/docs/docs/migration-guides/3x/2-threshold-tools.md @@ -0,0 +1,99 @@ +--- +id: threshold-tools +title: 'Labelmap Thresholding Tools' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Key Changes: + +* The nested `strategySpecificConfiguration` object has been removed completely +* Configuration properties have been moved to the root level of the configuration object +* Threshold configuration has been restructured: + * `threshold` array is now a `range` property inside a `threshold` object + * Additional threshold properties (`isDynamic`, `dynamicRadius`) are part of the same object +* `setBrushThresholdForToolGroup()` function signature has changed to accept a structured threshold object +* Strategy-specific properties like `useCenterSegmentIndex` have been moved to the root configuration level +* `activeStrategy` is now a standalone property in tool operations data, no longer inside a nested configuration + +## Migration Steps: + +### 1. Replace strategySpecificConfiguration with direct properties + +**Before:** +```diff +- configuration: { +- activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', +- strategySpecificConfiguration: { +- THRESHOLD: { +- threshold: [-150, -70], +- // other threshold properties +- }, +- useCenterSegmentIndex: true, +- }, +- } +``` + +**After:** +```diff ++ configuration: { ++ activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', ++ threshold: { ++ range: [-150, -70], ++ isDynamic: false, ++ // other threshold properties directly here ++ }, ++ useCenterSegmentIndex: true, ++ } +``` + +### 2. Update threshold configuration structure + +**Before:** +```diff +- strategySpecificConfiguration: { +- THRESHOLD: { +- threshold: [-150, -70], // Previous threshold array format +- isDynamic: false, +- dynamicRadius: 5 +- } +- } +``` + +**After:** +```diff ++ threshold: { ++ range: [-150, -70], // New 'range' property replaces 'threshold' ++ isDynamic: false, ++ dynamicRadius: 5 ++ } +``` + +### 3. Update setBrushThresholdForToolGroup calls + +**Before:** +```diff +- segmentationUtils.setBrushThresholdForToolGroup( +- toolGroupId, +- thresholdArgs.threshold, +- thresholdArgs +- ); +``` + +**After:** +```diff ++ segmentationUtils.setBrushThresholdForToolGroup( ++ toolGroupId, ++ fullThresholdArgs ++ ); +``` + +Note that `thresholdArgs` should now be an object with the structure: +```javascript +{ + range: [min, max], // Previously 'threshold' + isDynamic: boolean, + dynamicRadius: number +} +``` diff --git a/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md b/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md new file mode 100644 index 000000000..a37f8992c --- /dev/null +++ b/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md @@ -0,0 +1,71 @@ +--- +id: general +title: 'General' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Not a composition but a utility + +Previously, interpolation was a brush composition, restricting its use to tools inheriting from a brush. However, interpolation should really be a utility anyone can use, even without a tool. + +Before, you had to use this workaround for interpolation: + +```js +addButtonToToolbar({ + title: 'Run Overlapping Interpolation', + onClick: () => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + const activeName = toolGroup.getActivePrimaryMouseButtonTool(); + const brush = toolGroup.getToolInstance(activeName); + brush.interpolate?.(element1, { extendedConfig: false }); + }, +}); +``` + +Now it's as simple as this: + +```js +import * as labelmapInterpolation from '@cornerstonejs/labelmap-interpolation'; + +labelmapInterpolation.interpolate({ + segmentationId, + segmentIndex, +}); +``` + +:::note +We once again had to implement a workaround for `itk-wasm` as a dynamic dependency to prevent bundler problems in cornerstone3D 2.0. However, this caused numerous issues. Now, it's a separate, standalone utility package that doesn't need to be bundled with cornerstone3D. +::: + +## Migration + +Remove the `labelmap` interpolation from your custom tools composition. + +Before: + +```javascript +const RECTANGLE_STRATEGY = new BrushStrategy( + 'Rectangle', + compositions.regionFill, + compositions.setValue, + initializeRectangle, + compositions.determineSegmentIndex, + compositions.preview, + compositions.labelmapInterpolation +); +``` + +After: + +```javascript +const RECTANGLE_STRATEGY = new BrushStrategy( + 'Rectangle', + compositions.regionFill, + compositions.setValue, + initializeRectangle, + compositions.determineSegmentIndex, + compositions.preview +); +``` diff --git a/packages/docs/docs/migration-guides/3x/4-get-statistics.md b/packages/docs/docs/migration-guides/3x/4-get-statistics.md new file mode 100644 index 000000000..f3aed9181 --- /dev/null +++ b/packages/docs/docs/migration-guides/3x/4-get-statistics.md @@ -0,0 +1,40 @@ +--- +id: statistics +title: 'Segmentation Statistics API' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +## Key Changes: + +* Statistics calculation has been moved from brush tool methods to a dedicated utility function +* Statistics are now calculated asynchronously using web workers +* The function signature for getting statistics has changed completely +* Progress events are now emitted during statistics calculation + +## Migration Steps: + +### 1. Replace tool-based statistics methods with the standalone utility + +**Before:** +```diff +- const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); +- const activeName = toolGroup.getActivePrimaryMouseButtonTool(); +- const brush = toolGroup.getToolInstance(activeName); +- const stats = brush.getStatistics(viewport.element, { indices }); +``` + +**After:** +```diff ++ const stats = await segmentationUtils.getStatistics({ ++ segmentationId, ++ segmentIndices: indices, ++ viewportId: viewport.id, ++ }); +``` + +:::note +ViewportId is needed since some statistics calculations are performed regarding the base image in the viewport. +::: diff --git a/packages/docs/docs/migration-guides/3x/5-adapters.md b/packages/docs/docs/migration-guides/3x/5-adapters.md new file mode 100644 index 000000000..4160751e2 --- /dev/null +++ b/packages/docs/docs/migration-guides/3x/5-adapters.md @@ -0,0 +1,64 @@ +--- +id: adapters +title: 'Adapters API' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +## Key Changes: + +* MeasurementsReport has two maps instead of objects for setting the + adapter classes, mapping the tool type to adapter class and the + tracking id to adapter class. +* A new register additional tracking id method exists to allow adding + custom adapter methods. +* Adapter implementations now have a base class to handle some of the + definition. This allows calling into the base class to handle some of the + definition such as the is tracking handling. +* The MeasurementsReport class is now extensible to create a new class with + completely different default handling. To do this, the two map attributes + need to be redeclared, and the new instance registered for the handlers. +* There is now an init method to create tracking identifiers and register a new + handler. +* The annotation changed event no longer requires the viewport id/rendering id + * This change is done so that measurements can be updated when not visible + +## Migration Steps: + +### 1. Replace MeasurementsReports.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE + +**Before:** +```diff +- const toolClass = MeasurementReports.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[toolType]; +``` + +**After:** +```diff +- const toolClass = MeasurementReports.measurementAdapterByToolType.get(toolType); +``` + +### 2. Replace Tool instance adapter registration which is identical to existing registration + +**Before:** +```diff +- class MyNewToolAdapter { ... identical to eg Probe Adapter } +``` + +**After:** +```diff +- const MyNewToolAdapter = Probe.initCopy('MyNewTool'); +``` + +### 3. Replace old tool registration with registerTrackingIdentifier + +**Before:** +```diff +- class OldToolAdapter { ... identical to eg Length v1.0 except has :v1.0 at end of tracking identifier } +``` + +**After:** +```diff +- MeasurementReport.registerTrackingIdentifier(Length, `${Length.trackingIdentifierTextValue}:v1.0`); +``` diff --git a/packages/docs/package.json b/packages/docs/package.json index 5b2982194..e012097c6 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "2.1.10", + "version": "3.0.0-beta.5", "private": true, "repository": "https://github.com/cornerstonejs/cornerstone3D", "scripts": { @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^2.19.16", - "@cornerstonejs/core": "^2.19.16", - "@cornerstonejs/dicom-image-loader": "^2.19.16", - "@cornerstonejs/nifti-volume-loader": "^2.19.16", - "@cornerstonejs/tools": "^2.19.16", + "@cornerstonejs/adapters": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/dicom-image-loader": "^3.0.0-beta.6", + "@cornerstonejs/nifti-volume-loader": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md new file mode 100644 index 000000000..9fd8d1320 --- /dev/null +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -0,0 +1,22 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + +# Change Log diff --git a/packages/labelmap-interpolation/README.md b/packages/labelmap-interpolation/README.md new file mode 100644 index 000000000..568ed58f9 --- /dev/null +++ b/packages/labelmap-interpolation/README.md @@ -0,0 +1,60 @@ +# Cornerstone Segmentation Labelmap Interpolation + +This package provides a utility for interpolating labelmaps in 3D medical imaging. It leverages the power of `itk-wasm` and `@itk-wasm/morphological-contour-interpolation` to perform morphological contour interpolation between segmented slices. + +## Overview + +When creating segmentations in 3D medical imaging, it's often time-consuming to manually segment every slice. This package allows you to segment only a subset of slices and then automatically interpolate the segmentation between those slices, significantly reducing the time required for complete 3D segmentation. + +## Installation + +```bash +npm install @cornerstonejs/labelmap-interpolation +``` + +## Usage + +### Basic Usage + +```typescript +import { interpolate } from '@cornerstonejs/labelmap-interpolation'; + +// Run interpolation on a specific segment +interpolate({ + segmentationId: 'MY_SEGMENTATION_ID', + segmentIndex: 1, // The segment index to interpolate +}); +``` + +### With Configuration Options + +```typescript +import { interpolate } from '@cornerstonejs/labelmap-interpolation'; + +// Run interpolation with custom configuration +interpolate({ + segmentationId: 'MY_SEGMENTATION_ID', + segmentIndex: 1, + configuration: { + axis: 2, // Axis along which to perform interpolation (0=X, 1=Y, 2=Z) + noHeuristicAlignment: false, // Whether to disable heuristic alignment + noUseDistanceTransform: false, // Whether to disable distance transform + useCustomSlicePositions: false, // Whether to use custom slice positions + preview: false // Whether to preview the interpolation result + } +}); +``` + +## How It Works + +The interpolation process works by: + +1. Taking a segmentation volume with segments on non-adjacent slices +2. Using morphological contour interpolation to fill in the missing slices +3. Updating the segmentation volume with the interpolated data + +The package uses web workers to perform the interpolation in a background thread, preventing UI freezes during computation. + +## License + +MIT diff --git a/packages/labelmap-interpolation/api-extractor.json b/packages/labelmap-interpolation/api-extractor.json new file mode 100644 index 000000000..4ddb5f44d --- /dev/null +++ b/packages/labelmap-interpolation/api-extractor.json @@ -0,0 +1,9 @@ +{ + "extends": "../../api-extractor.json", + "projectFolder": ".", + "mainEntryPointFilePath": "/dist/esm/index.d.ts", + "apiReport": { + "reportFileName": ".api.md", + "reportFolder": "../../common/reviews/api" + } +} diff --git a/packages/labelmap-interpolation/examples/labelmapInterpolation/index.ts b/packages/labelmap-interpolation/examples/labelmapInterpolation/index.ts new file mode 100644 index 000000000..24307a33c --- /dev/null +++ b/packages/labelmap-interpolation/examples/labelmapInterpolation/index.ts @@ -0,0 +1,300 @@ +import { + RenderingEngine, + Enums, + imageLoader, + eventTarget, +} from '@cornerstonejs/core'; +import * as cornerstoneTools from '@cornerstonejs/tools'; +import { + createImageIdsAndCacheMetaData, + initDemo, + setTitleAndDescription, + addBrushSizeSlider, +} from '../../../../utils/demo/helpers'; + +// This is for debugging purposes +console.debug( + 'Click on index.ts to open source code for this example --------->' +); + +const { + ToolGroupManager, + ZoomTool, + StackScrollTool, + Enums: csToolsEnums, + RectangleScissorsTool, + CircleScissorsTool, + BrushTool, + PaintFillTool, + PanTool, + segmentation, + utilities: cstUtils, +} = cornerstoneTools; + +const { MouseBindings, KeyboardBindings, Events } = csToolsEnums; +const { ViewportType } = Enums; +const { segmentation: segmentationUtils, roundNumber } = cstUtils; + +// Define a unique id for the volume +let renderingEngine; +const renderingEngineId = 'myRenderingEngine'; +const viewportId = 'STACK_VIEWPORT'; +const toolGroupId = 'TOOL_GROUP_ID'; + +// ======== Set up page ======== // +setTitleAndDescription( + 'Stack Segmentation Statistics', + 'Here we demonstrate how to calculate statistics for a stack segmentation.' +); + +const size = '500px'; +const content = document.getElementById('content'); + +const statsGrid = document.createElement('div'); +statsGrid.style.display = 'flex'; +statsGrid.style.flexDirection = 'row'; +statsGrid.style.fontSize = 'smaller'; + +const statsIds = ['segment1', 'segment2', 'segmentCombined']; +const statsStyle = { + width: '20em', + height: '10em', +}; + +for (const statsId of statsIds) { + const statsDiv = document.createElement('div'); + statsDiv.id = statsId; + statsDiv.innerText = statsId; + Object.assign(statsDiv.style, statsStyle); + statsGrid.appendChild(statsDiv); +} + +content.appendChild(statsGrid); + +const viewportGrid = document.createElement('div'); +viewportGrid.style.display = 'flex'; +viewportGrid.style.flexDirection = 'row'; + +const element = document.createElement('div'); +element.style.width = size; +element.style.height = size; +element.oncontextmenu = () => false; + +viewportGrid.appendChild(element); +content.appendChild(viewportGrid); + +const instructions = document.createElement('p'); +instructions.innerText = ` + Left Click: Use selected Segmentation Tool. + Middle Click: Pan + Right Click: Zoom + Mouse wheel: Scroll Stack + `; + +content.append(instructions); + +// ============================= // + +function displayStat(stat) { + if (!stat) { + return; + } + return `${stat.label || stat.name}: ${roundNumber(stat.value)} ${ + stat.unit ? stat.unit : '' + }`; +} + +async function calculateStatistics(id, indices) { + const viewport = renderingEngine.getViewport(viewportId); + const stats = await segmentationUtils.getStatistics({ + segmentationId: 'SEGMENTATION_ID', + segmentIndices: indices, + viewportId: viewport.id, + }); + + if (!stats) { + return; + } + const items = [`Statistics on ${indices.join(', ')}`]; + stats.count.label = 'Voxels'; + + items.push( + displayStat(stats.volume), + displayStat(stats.count), + displayStat(stats.mean), + displayStat(stats.max), + displayStat(stats.min), + displayStat(stats.peakValue) + ); + const statsDiv = document.getElementById(id); + statsDiv.innerHTML = items.map((span) => `${span}
\n`).join('\n'); +} + +let timeoutId; + +function segmentationModifiedCallback(evt) { + const { detail } = evt; + if (!detail || !detail.segmentIndex || detail.segmentIndex === 255) { + return; + } + + const statsId = detail.segmentIndex === 1 ? statsIds[0] : statsIds[1]; + + const debounced = () => { + calculateStatistics(statsId, [detail.segmentIndex]); + // Also update combined stats + calculateStatistics(statsIds[2], [1, 2]); + }; + + if (timeoutId) { + window.clearTimeout(timeoutId); + } + + timeoutId = window.setTimeout(debounced, 1000); +} + +// ============================= // + +function setupTools() { + // Add tools to Cornerstone3D + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(ZoomTool); + cornerstoneTools.addTool(StackScrollTool); + cornerstoneTools.addTool(RectangleScissorsTool); + cornerstoneTools.addTool(CircleScissorsTool); + cornerstoneTools.addTool(PaintFillTool); + cornerstoneTools.addTool(BrushTool); + + // Define a tool group + const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); + + // Add tools to the group + toolGroup.addTool(PanTool.toolName); + toolGroup.addTool(ZoomTool.toolName); + toolGroup.addTool(StackScrollTool.toolName); + toolGroup.addTool(RectangleScissorsTool.toolName); + toolGroup.addTool(CircleScissorsTool.toolName); + toolGroup.addTool(PaintFillTool.toolName); + toolGroup.addTool(BrushTool.toolName); + + // Set tool modes + toolGroup.setToolActive(BrushTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + + toolGroup.setToolActive(PanTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Auxiliary, + }, + { + mouseButton: MouseBindings.Primary, + modifierKey: KeyboardBindings.Ctrl, + }, + ], + }); + + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Secondary, + }, + { + mouseButton: MouseBindings.Primary, + modifierKey: KeyboardBindings.Shift, + }, + ], + }); + + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + + return toolGroup; +} + +// ============================= // + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + const toolGroup = setupTools(); + + // Get Cornerstone imageIds and fetch metadata into RAM + const imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + // Create a stack of images + const imageIdsArray = imageIds.slice(0, 10); + // Create segmentation images for the stack + const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( + imageIdsArray + ); + + // Instantiate a rendering engine + renderingEngine = new RenderingEngine(renderingEngineId); + + // Create the viewport + const viewportInput = { + viewportId, + type: ViewportType.STACK, + element, + }; + + renderingEngine.setViewports([viewportInput]); + + // Set the stack of images + const viewport = renderingEngine.getViewport(viewportId); + await viewport.setStack(imageIdsArray, 0); + + // Add the viewport to the toolgroup + toolGroup.addViewport(viewportId, renderingEngineId); + + // Add segmentation + segmentation.addSegmentations([ + { + segmentationId: 'SEGMENTATION_ID', + representation: { + type: csToolsEnums.SegmentationRepresentations.Labelmap, + data: { + imageIds: segImages.map((it) => it.imageId), + }, + }, + }, + ]); + + // Add the segmentation representation to the viewport + await segmentation.addSegmentationRepresentations(viewportId, [ + { + segmentationId: 'SEGMENTATION_ID', + type: csToolsEnums.SegmentationRepresentations.Labelmap, + }, + ]); + + // Add brush size slider + addBrushSizeSlider({ + toolGroupId, + }); + + cornerstoneTools.utilities.stackContextPrefetch.enable(element); + + // Add segmentation modified callback + eventTarget.addEventListener( + Events.SEGMENTATION_DATA_MODIFIED, + segmentationModifiedCallback + ); + + // Render the image + renderingEngine.render(); +} + +run(); diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json new file mode 100644 index 000000000..4fa7590b9 --- /dev/null +++ b/packages/labelmap-interpolation/package.json @@ -0,0 +1,58 @@ +{ + "name": "@cornerstonejs/labelmap-interpolation", + "version": "3.0.0-beta.6", + "description": "Labelmap Interpolation utility for Cornerstone3D", + "files": [ + "dist" + ], + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "directories": { + "build": "dist" + }, + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" + } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "test": "jest --testTimeout 60000", + "clean": "rimraf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", + "build": "yarn run build:esm", + "build:esm": "tsc --project ./tsconfig.json", + "build:esm:watch": "tsc --project ./tsconfig.json --watch", + "dev": "tsc --project ./tsconfig.json --watch", + "build:all": "yarn run build:esm", + "start": "tsc --project ./tsconfig.json --watch", + "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", + "lint": "eslint --fix .", + "format-check": "npx eslint ./src --quiet", + "api-check": "api-extractor --debug run ", + "build:update-api": "yarn run build:esm && api-extractor run --local", + "prepublishOnly": "yarn clean && yarn build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" + }, + "author": "@cornerstonejs", + "license": "MIT", + "bugs": { + "url": "https://github.com/cornerstonejs/cornerstone3D/issues" + }, + "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/labelmap-interpolation/README.md", + "dependencies": { + "@itk-wasm/morphological-contour-interpolation": "1.1.0", + "itk-wasm": "1.0.0-b.165" + }, + "peerDependencies": { + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6", + "@kitware/vtk.js": "^32.9.0" + } +} diff --git a/packages/labelmap-interpolation/src/index.ts b/packages/labelmap-interpolation/src/index.ts new file mode 100644 index 000000000..d90f681bf --- /dev/null +++ b/packages/labelmap-interpolation/src/index.ts @@ -0,0 +1,3 @@ +import interpolate from './utilities/interpolateLabelmap'; + +export { interpolate }; diff --git a/packages/labelmap-interpolation/src/registerWorker.ts b/packages/labelmap-interpolation/src/registerWorker.ts new file mode 100644 index 000000000..f63326bdb --- /dev/null +++ b/packages/labelmap-interpolation/src/registerWorker.ts @@ -0,0 +1,34 @@ +import { getWebWorkerManager } from '@cornerstonejs/core'; +let registered = false; + +export function registerInterpolationWorker() { + if (registered) { + return; + } + + registered = true; + + const workerFn = () => { + // @ts-ignore + return new Worker( + // @ts-ignore + new URL('./workers/interpolationWorker.js', import.meta.url), + { + name: 'interpolation', + type: 'module', + } + ); + }; + + const workerManager = getWebWorkerManager(); + + const options = { + maxWorkerInstances: 1, + autoTerminateOnIdle: { + enabled: true, + idleTimeThreshold: 2000, + }, + }; + + workerManager.registerWorker('interpolation', workerFn, options); +} diff --git a/packages/labelmap-interpolation/src/utilities/interpolateLabelmap.ts b/packages/labelmap-interpolation/src/utilities/interpolateLabelmap.ts new file mode 100644 index 000000000..fe1245989 --- /dev/null +++ b/packages/labelmap-interpolation/src/utilities/interpolateLabelmap.ts @@ -0,0 +1,99 @@ +import { + getWebWorkerManager, + eventTarget, + Enums, + triggerEvent, +} from '@cornerstonejs/core'; +import { + segmentation, + Enums as csToolsEnums, + utilities, +} from '@cornerstonejs/tools'; +import { registerInterpolationWorker } from '../registerWorker'; + +type MorphologicalContourInterpolationOptions = { + label?: number; + axis?: number; + noHeuristicAlignment?: boolean; + noUseDistanceTransform?: boolean; + useCustomSlicePositions?: boolean; +}; + +const { triggerSegmentationEvents } = segmentation; +const { getOrCreateSegmentationVolume } = utilities.segmentation; + +const { triggerSegmentationDataModified } = triggerSegmentationEvents; +const { WorkerTypes } = csToolsEnums; + +const workerManager = getWebWorkerManager(); + +const triggerWorkerProgress = (eventTarget, progress) => { + triggerEvent(eventTarget, Enums.Events.WEB_WORKER_PROGRESS, { + progress, + type: WorkerTypes.INTERPOLATE_LABELMAP, + }); +}; + +async function interpolateLabelmap({ + segmentationId, + segmentIndex, + configuration = { preview: false }, +}: { + segmentationId: string; + segmentIndex: number; + configuration?: MorphologicalContourInterpolationOptions & { + preview: boolean; + }; +}) { + registerInterpolationWorker(); + + triggerWorkerProgress(eventTarget, 0); + + const segVolume = getOrCreateSegmentationVolume(segmentationId); + + const { + voxelManager: segmentationVoxelManager, + imageData: segmentationImageData, + } = segVolume; + + const segmentationInfo = { + scalarData: segmentationVoxelManager.getCompleteScalarDataArray(), + dimensions: segmentationImageData.getDimensions(), + spacing: segmentationImageData.getSpacing(), + origin: segmentationImageData.getOrigin(), + direction: segmentationImageData.getDirection(), + }; + + try { + const { data: outputScalarData } = await workerManager.executeTask( + 'interpolation', + 'interpolateLabelmap', + { + segmentationInfo, + configuration: { + ...configuration, + label: segmentIndex, + }, + } + ); + + // Update the segmentation with the modified data + segmentationVoxelManager.setCompleteScalarDataArray(outputScalarData); + + triggerSegmentationDataModified( + segmentationId, + segmentationVoxelManager.getArrayOfModifiedSlices(), + segmentIndex + ); + + triggerWorkerProgress(eventTarget, 100); + } catch (error) { + console.warn( + 'Warning: Failed to perform morphological contour interpolation', + error + ); + triggerWorkerProgress(eventTarget, 100); + } +} + +export default interpolateLabelmap; diff --git a/packages/labelmap-interpolation/src/workers/interpolationWorker.js b/packages/labelmap-interpolation/src/workers/interpolationWorker.js new file mode 100644 index 000000000..fba8d144d --- /dev/null +++ b/packages/labelmap-interpolation/src/workers/interpolationWorker.js @@ -0,0 +1,174 @@ +import { expose } from 'comlink'; +import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; +import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray'; + +/** + * Dynamically imports ITK WASM modules needed for labelmap interpolation + * @param moduleId - The module ID to import ('itk-wasm' or '@itk-wasm/morphological-contour-interpolation') + * @returns Promise that resolves to the imported module + */ +async function peerImport(moduleId) { + try { + switch (moduleId) { + case 'itk-wasm': + return import('itk-wasm'); + case '@itk-wasm/morphological-contour-interpolation': + return import('@itk-wasm/morphological-contour-interpolation'); + default: + throw new Error(`Unknown module ID: ${moduleId}`); + } + } catch (error) { + console.warn(`Error importing ${moduleId}:`, error); + return null; + } +} + +const computeWorker = { + getITKImage: async (args) => { + const { imageData, options } = args; + + const { imageName, scalarData } = options; + + let Image, ImageType, IntTypes, FloatTypes, PixelTypes; + + try { + const itkModule = await peerImport('itk-wasm'); + if (!itkModule) { + throw new Error('Module not found'); + } + ({ Image, ImageType, IntTypes, FloatTypes, PixelTypes } = itkModule); + } catch (error) { + console.warn( + "Warning: 'itk-wasm' module not found. Please install it separately." + ); + return null; + } + + const dataTypesMap = { + Int8: IntTypes.Int8, + UInt8: IntTypes.UInt8, + Int16: IntTypes.Int16, + UInt16: IntTypes.UInt16, + Int32: IntTypes.Int32, + UInt32: IntTypes.UInt32, + Int64: IntTypes.Int64, + UInt64: IntTypes.UInt64, + Float32: FloatTypes.Float32, + Float64: FloatTypes.Float64, + }; + + const { numberOfComponents } = imageData.get('numberOfComponents'); + + const dimensions = imageData.getDimensions(); + const origin = imageData.getOrigin(); + const spacing = imageData.getSpacing(); + const directionArray = imageData.getDirection(); + const direction = new Float64Array(directionArray); + const dataType = scalarData.constructor.name + .replace(/^Ui/, 'UI') + .replace(/Array$/, ''); + const metadata = undefined; + + const imageType = new ImageType( + dimensions.length, + dataTypesMap[dataType], + PixelTypes.Scalar, + numberOfComponents + ); + + const image = new Image(imageType); + image.name = imageName; + image.origin = origin; + image.spacing = spacing; + image.direction = direction; + image.size = dimensions; + image.metadata = metadata; + image.data = scalarData; + + return image; + }, + interpolateLabelmap: async (args) => { + const { segmentationInfo, configuration } = args; + const { scalarData, dimensions, spacing, origin, direction } = + segmentationInfo; + + let itkModule; + try { + itkModule = await peerImport( + '@itk-wasm/morphological-contour-interpolation' + ); + if (!itkModule) { + throw new Error('Module not found'); + } + } catch (error) { + console.warn( + "Warning: '@itk-wasm/morphological-contour-interpolation' module not found. Please install it separately." + ); + return { data: scalarData }; + } + + const imageData = vtkImageData.newInstance(); + imageData.setDimensions(dimensions); + imageData.setOrigin(origin); + imageData.setDirection(direction || [1, 0, 0, 0, 1, 0, 0, 0, 1]); + imageData.setSpacing(spacing); + + const scalarArray = vtkDataArray.newInstance({ + name: 'Pixels', + numberOfComponents: 1, + values: scalarData, + }); + + imageData.getPointData().setScalars(scalarArray); + imageData.modified(); + + try { + const inputImage = await computeWorker.getITKImage({ + imageData, + options: { + imageName: 'interpolation', + scalarData: scalarData, + }, + }); + + if (!inputImage) { + throw new Error('Failed to get ITK image'); + } + + const { outputImage } = await itkModule.morphologicalContourInterpolation( + inputImage, + { + ...configuration, + // since we already have a web worker, we don't need to create another one + webWorker: false, + } + ); + + const outputScalarData = outputImage.data; + const modifiedScalarData = new Uint16Array(scalarData.length); + + // Copy the original data first + modifiedScalarData.set(scalarData); + + // Only update values that are different + for (let i = 0; i < outputScalarData.length; i++) { + const newValue = outputScalarData[i]; + const originalValue = scalarData[i]; + + if (newValue !== originalValue) { + modifiedScalarData[i] = newValue; + } + } + + return { data: modifiedScalarData }; + } catch (error) { + console.error(error); + console.warn( + 'Warning: Failed to perform morphological contour interpolation' + ); + return { data: scalarData }; + } + }, +}; + +expose(computeWorker); diff --git a/packages/labelmap-interpolation/tsconfig.json b/packages/labelmap-interpolation/tsconfig.json new file mode 100644 index 000000000..bc915f1e6 --- /dev/null +++ b/packages/labelmap-interpolation/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist/esm", + "rootDir": "./src" + }, + "include": ["./src/**/*"] +} diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 1a6f8599a..d3254e72a 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,14 +3,28 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader -## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + +# [3.0.0-beta.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([8bf65df](https://github.com/cornerstonejs/cornerstone3D/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f436fc81f..c47c59b7c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.16" + "@cornerstonejs/core": "^3.0.0-beta.6" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md new file mode 100644 index 000000000..f92e20c60 --- /dev/null +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -0,0 +1,22 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + +# Change Log diff --git a/packages/polymorphic-segmentation/README.md b/packages/polymorphic-segmentation/README.md new file mode 100644 index 000000000..bdd71bfc3 --- /dev/null +++ b/packages/polymorphic-segmentation/README.md @@ -0,0 +1,40 @@ +# Cornerstone Segmentation Polymorphic Segmentation + +A powerful and flexible segmentation addon for Cornerstone3D that provides polymorphic segmentation capabilities. + +## Overview + +The Polymorphic Segmentation package extends Cornerstone3D's segmentation capabilities with advanced features for creating, manipulating, and visualizing segmentations across different modalities and use cases. + +## Installation + +```bash +npm install @cornerstonejs/polymorphic-segmentation +``` + +## Initialization + +To use the Polymorphic Segmentation package with Cornerstone Tools, you need to initialize it as an addon during the Cornerstone Tools initialization process. + +### Basic Initialization + +```js +import { init } from '@cornerstonejs/tools'; +import * as polySeg from '@cornerstonejs/polymorphic-segmentation'; + +// Initialize Cornerstone Tools with the Polymorphic Segmentation addon +await init({ + addons: { + polySeg, + }, +}); +``` + +:::note +If you don't initialize polySeg as an addon, you will not be able to use the polymorphic segmentation features. But the +rest of the Cornerstone3D components will work as expected. +::: + +## License + +MIT diff --git a/packages/polymorphic-segmentation/api-extractor.json b/packages/polymorphic-segmentation/api-extractor.json new file mode 100644 index 000000000..4ddb5f44d --- /dev/null +++ b/packages/polymorphic-segmentation/api-extractor.json @@ -0,0 +1,9 @@ +{ + "extends": "../../api-extractor.json", + "projectFolder": ".", + "mainEntryPointFilePath": "/dist/esm/index.d.ts", + "apiReport": { + "reportFileName": ".api.md", + "reportFolder": "../../common/reviews/api" + } +} diff --git a/packages/tools/examples/PolySegWasmContourToStackLabelmap/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmContourToStackLabelmap/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmContourToStackLabelmap/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmContourToStackLabelmap/index.ts diff --git a/packages/tools/examples/PolySegWasmContourToSurface/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmContourToSurface/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmContourToSurface/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmContourToSurface/index.ts diff --git a/packages/tools/examples/PolySegWasmContourToVolumeLabelmap/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmContourToVolumeLabelmap/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmContourToVolumeLabelmap/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmContourToVolumeLabelmap/index.ts diff --git a/packages/tools/examples/PolySegWasmStackLabelmapToSurface/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmStackLabelmapToSurface/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts diff --git a/packages/tools/examples/PolySegWasmSurfaceToContour/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToContour/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmSurfaceToContour/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToContour/index.ts diff --git a/packages/tools/examples/PolySegWasmSurfaceToStackLabelmap/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToStackLabelmap/index.ts similarity index 98% rename from packages/tools/examples/PolySegWasmSurfaceToStackLabelmap/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToStackLabelmap/index.ts index 844dae475..ccd731f73 100644 --- a/packages/tools/examples/PolySegWasmSurfaceToStackLabelmap/index.ts +++ b/packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToStackLabelmap/index.ts @@ -178,7 +178,7 @@ async function run() { const surfaces = await downloadSurfacesData(); - const geometriesInfo = createAndCacheGeometriesFromSurfaces(surfaces); + const geometriesInfo = await createAndCacheGeometriesFromSurfaces(surfaces); // Add the segmentations to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/PolySegWasmSurfaceToVolumeLabelmap/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToVolumeLabelmap/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmSurfaceToVolumeLabelmap/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmSurfaceToVolumeLabelmap/index.ts diff --git a/packages/tools/examples/PolySegWasmVolumeLabelmapToContour/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmVolumeLabelmapToContour/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmVolumeLabelmapToContour/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmVolumeLabelmapToContour/index.ts diff --git a/packages/tools/examples/PolySegWasmVolumeLabelmapToSurface/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmVolumeLabelmapToSurface/index.ts similarity index 100% rename from packages/tools/examples/PolySegWasmVolumeLabelmapToSurface/index.ts rename to packages/polymorphic-segmentation/examples/PolySegWasmVolumeLabelmapToSurface/index.ts diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json new file mode 100644 index 000000000..686f750cd --- /dev/null +++ b/packages/polymorphic-segmentation/package.json @@ -0,0 +1,56 @@ +{ + "name": "@cornerstonejs/polymorphic-segmentation", + "version": "3.0.0-beta.6", + "description": "Polymorphic Segmentation utility for Cornerstone3D", + "files": [ + "dist" + ], + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "directories": { + "build": "dist" + }, + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" + } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "test": "jest --testTimeout 60000", + "clean": "rimraf dist", + "build": "yarn run build:esm", + "build:esm": "tsc --project ./tsconfig.json", + "build:esm:watch": "tsc --project ./tsconfig.json --watch", + "dev": "tsc --project ./tsconfig.json --watch", + "build:all": "yarn run build:esm", + "start": "tsc --project ./tsconfig.json --watch", + "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", + "lint": "eslint --fix .", + "format-check": "npx eslint ./src --quiet", + "api-check": "api-extractor --debug run ", + "build:update-api": "yarn run build:esm && api-extractor run --local", + "prepublishOnly": "yarn clean && yarn build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" + }, + "author": "@cornerstonejs", + "license": "MIT", + "bugs": { + "url": "https://github.com/cornerstonejs/cornerstone3D/issues" + }, + "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/polymorphic-segmentation/README.md", + "dependencies": { + "@icr/polyseg-wasm": "0.4.0" + }, + "peerDependencies": { + "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/tools": "^3.0.0-beta.6", + "@kitware/vtk.js": "^32.9.0" + } +} diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/contourComputationStrategies.ts b/packages/polymorphic-segmentation/src/Contour/contourComputationStrategies.ts similarity index 90% rename from packages/tools/src/stateManagement/segmentation/polySeg/Contour/contourComputationStrategies.ts rename to packages/polymorphic-segmentation/src/Contour/contourComputationStrategies.ts index 390fa04fb..24357952c 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/contourComputationStrategies.ts +++ b/packages/polymorphic-segmentation/src/Contour/contourComputationStrategies.ts @@ -1,15 +1,18 @@ -import { cache } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; -import { getUniqueSegmentIndices } from '../../../../utilities/segmentation/getUniqueSegmentIndices'; -import type { PolySegConversionOptions } from '../../../../types'; -import { computeSurfaceFromLabelmapSegmentation } from '../Surface/surfaceComputationStrategies'; -import type { SurfaceClipResult } from '../../helpers/clipAndCacheSurfacesForViewport'; -import { clipAndCacheSurfacesForViewport } from '../../helpers/clipAndCacheSurfacesForViewport'; +import { cache } from '@cornerstonejs/core'; +import { Enums, segmentation, utilities } from '@cornerstonejs/tools'; import { extractContourData } from './utils/extractContourData'; + +import type { PolySegConversionOptions } from '../types'; +import { computeSurfaceFromLabelmapSegmentation } from '../Surface/surfaceComputationStrategies'; +import type { SurfaceClipResult } from '../utilities/clipAndCacheSurfacesForViewport'; +import { clipAndCacheSurfacesForViewport } from '../utilities/clipAndCacheSurfacesForViewport'; import { createAndAddContourSegmentationsFromClippedSurfaces } from './utils/createAndAddContourSegmentationsFromClippedSurfaces'; -import { getSegmentation } from '../../getSegmentation'; -import { segmentationStyle } from '../../SegmentationStyle'; -import { SegmentationRepresentations } from '../../../../enums'; + +const { getUniqueSegmentIndices } = utilities.segmentation; +const { getSegmentation } = segmentation.state; +const { segmentationStyle } = segmentation; +const { SegmentationRepresentations } = Enums; // the map between segment index and the intersection points and lines export type RawContourData = Map; diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts b/packages/polymorphic-segmentation/src/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts similarity index 93% rename from packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts rename to packages/polymorphic-segmentation/src/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts index 3c4f626bb..ee082d427 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts +++ b/packages/polymorphic-segmentation/src/Contour/utils/createAndAddContourSegmentationsFromClippedSurfaces.ts @@ -1,8 +1,11 @@ -import PlanarFreehandContourSegmentationTool from '../../../../../tools/annotation/PlanarFreehandContourSegmentationTool'; -import { addAnnotation } from '../../../../annotation/annotationState'; -import type { RawContourData } from '../contourComputationStrategies'; import { utilities, type Types } from '@cornerstonejs/core'; +import { + PlanarFreehandContourSegmentationTool, + annotation, +} from '@cornerstonejs/tools'; +import type { RawContourData } from '../contourComputationStrategies'; +const { addAnnotation } = annotation.state; /** * Creates and adds contour segmentations from a clipped surface. * diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/extractContourData.ts b/packages/polymorphic-segmentation/src/Contour/utils/extractContourData.ts similarity index 90% rename from packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/extractContourData.ts rename to packages/polymorphic-segmentation/src/Contour/utils/extractContourData.ts index 05a2b0e8d..7d41a4957 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/extractContourData.ts +++ b/packages/polymorphic-segmentation/src/Contour/utils/extractContourData.ts @@ -1,4 +1,4 @@ -import type { PolyDataClipCacheType } from '../../../helpers/clipAndCacheSurfacesForViewport'; +import type { PolyDataClipCacheType } from '../../utilities/clipAndCacheSurfacesForViewport'; import type { RawContourData } from '../contourComputationStrategies'; /** diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/updateContoursOnCameraModified.ts b/packages/polymorphic-segmentation/src/Contour/utils/updateContoursOnCameraModified.ts similarity index 94% rename from packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/updateContoursOnCameraModified.ts rename to packages/polymorphic-segmentation/src/Contour/utils/updateContoursOnCameraModified.ts index 20332071a..cdbf1cd13 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/utils/updateContoursOnCameraModified.ts +++ b/packages/polymorphic-segmentation/src/Contour/utils/updateContoursOnCameraModified.ts @@ -1,6 +1,6 @@ import { utilities, type Types, Enums } from '@cornerstonejs/core'; import { extractContourData } from './extractContourData'; -import { clipAndCacheSurfacesForViewport } from '../../../helpers/clipAndCacheSurfacesForViewport'; +import { clipAndCacheSurfacesForViewport } from '../../utilities'; import { createAndAddContourSegmentationsFromClippedSurfaces } from './createAndAddContourSegmentationsFromClippedSurfaces'; const currentViewportNormal = new Map(); diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertContourToLabelmap.ts b/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts similarity index 91% rename from packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertContourToLabelmap.ts rename to packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts index a678389f3..23311897c 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertContourToLabelmap.ts +++ b/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts @@ -11,14 +11,12 @@ import { triggerEvent, eventTarget, } from '@cornerstonejs/core'; -import type { - Annotation, - ContourAnnotation, - ContourSegmentationData, - PolySegConversionOptions, -} from '../../../../types'; -import { getAnnotation } from '../../../annotation/annotationState'; -import { WorkerTypes } from '../../../../enums'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; +import * as cornerstoneTools from '@cornerstonejs/tools'; +import type { PolySegConversionOptions } from '../types'; + +const { WorkerTypes } = cornerstoneTools.Enums; +const { getAnnotation } = cornerstoneTools.annotation.state; const workerManager = getWebWorkerManager(); @@ -30,7 +28,7 @@ const triggerWorkerProgress = (eventTarget, progress) => { }; export async function convertContourToVolumeLabelmap( - contourRepresentationData: ContourSegmentationData, + contourRepresentationData: ToolsTypes.ContourSegmentationData, options: PolySegConversionOptions = {} ) { const viewport = options.viewport as Types.IVolumeViewport; @@ -94,7 +92,7 @@ export async function convertContourToVolumeLabelmap( } export async function convertContourToStackLabelmap( - contourRepresentationData: ContourSegmentationData, + contourRepresentationData: ToolsTypes.ContourSegmentationData, options: PolySegConversionOptions = {} ) { if (!options.viewport) { @@ -236,7 +234,7 @@ export async function convertContourToStackLabelmap( } function _getAnnotationMapFromSegmentation( - contourRepresentationData: ContourSegmentationData, + contourRepresentationData: ToolsTypes.ContourSegmentationData, options: PolySegConversionOptions = {} ) { const annotationMap = contourRepresentationData.annotationUIDsMap; @@ -256,11 +254,12 @@ function _getAnnotationMapFromSegmentation( let uids = Array.from(annotationUIDsInSegment); uids = uids.filter( - (uid) => !(getAnnotation(uid) as Annotation).parentAnnotationUID + (uid) => + !(getAnnotation(uid) as ToolsTypes.Annotation).parentAnnotationUID ); const annotations = uids.map((uid) => { - const annotation = getAnnotation(uid) as ContourAnnotation; + const annotation = getAnnotation(uid) as ToolsTypes.ContourAnnotation; const hasChildAnnotations = annotation.childAnnotationUIDs?.length; return { @@ -271,7 +270,7 @@ function _getAnnotationMapFromSegmentation( annotation.childAnnotationUIDs.map((childUID) => { const childAnnotation = getAnnotation( childUID - ) as ContourAnnotation; + ) as ToolsTypes.ContourAnnotation; return childAnnotation.data.contour.polyline; }), }; diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertSurfaceToLabelmap.ts b/packages/polymorphic-segmentation/src/Labelmap/convertSurfaceToLabelmap.ts similarity index 88% rename from packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertSurfaceToLabelmap.ts rename to packages/polymorphic-segmentation/src/Labelmap/convertSurfaceToLabelmap.ts index 2ed19c6f9..08967fab8 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/convertSurfaceToLabelmap.ts +++ b/packages/polymorphic-segmentation/src/Labelmap/convertSurfaceToLabelmap.ts @@ -6,8 +6,10 @@ import { getWebWorkerManager, triggerEvent, } from '@cornerstonejs/core'; -import type { SurfaceSegmentationData } from '../../../../types/SurfaceTypes'; -import { WorkerTypes } from '../../../../enums'; +import * as cornerstoneTools from '@cornerstonejs/tools'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; + +const { WorkerTypes } = cornerstoneTools.Enums; const workerManager = getWebWorkerManager(); @@ -19,7 +21,7 @@ const triggerWorkerProgress = (eventTarget, progress) => { }; export async function convertSurfaceToVolumeLabelmap( - surfaceRepresentationData: SurfaceSegmentationData, + surfaceRepresentationData: ToolsTypes.SurfaceSegmentationData, segmentationVolume: Types.IImageVolume ) { const { geometryIds } = surfaceRepresentationData; diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/labelmapComputationStrategies.ts b/packages/polymorphic-segmentation/src/Labelmap/labelmapComputationStrategies.ts similarity index 85% rename from packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/labelmapComputationStrategies.ts rename to packages/polymorphic-segmentation/src/Labelmap/labelmapComputationStrategies.ts index a82fdc884..d5f0c7be6 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/labelmapComputationStrategies.ts +++ b/packages/polymorphic-segmentation/src/Labelmap/labelmapComputationStrategies.ts @@ -1,22 +1,22 @@ -import { VolumeViewport, volumeLoader, imageLoader } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; -import { getUniqueSegmentIndices } from '../../../../utilities/segmentation/getUniqueSegmentIndices'; -import { getSegmentation } from '../../getSegmentation'; -import type { - LabelmapSegmentationDataStack, - LabelmapSegmentationDataVolume, -} from '../../../../types/LabelmapTypes'; +import { volumeLoader, imageLoader, VolumeViewport } from '@cornerstonejs/core'; +import { utilities } from '@cornerstonejs/tools'; +import * as cornerstoneTools from '@cornerstonejs/tools'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; import { convertContourToStackLabelmap, convertContourToVolumeLabelmap, } from './convertContourToLabelmap'; import { convertSurfaceToVolumeLabelmap } from './convertSurfaceToLabelmap'; -import type { PolySegConversionOptions } from '../../../../types'; -import { computeStackLabelmapFromVolume } from '../../helpers/computeStackLabelmapFromVolume'; +import type { PolySegConversionOptions } from '../types'; + +const { computeStackLabelmapFromVolume, getUniqueSegmentIndices } = + utilities.segmentation; +const { getSegmentation } = cornerstoneTools.segmentation.state; export type RawLabelmapData = - | LabelmapSegmentationDataVolume - | LabelmapSegmentationDataStack; + | ToolsTypes.LabelmapSegmentationDataVolume + | ToolsTypes.LabelmapSegmentationDataStack; export async function computeLabelmapData( segmentationId: string, @@ -65,7 +65,10 @@ export async function computeLabelmapData( async function computeLabelmapFromContourSegmentation( segmentationId, options: PolySegConversionOptions = {} -): Promise { +): Promise< + | ToolsTypes.LabelmapSegmentationDataVolume + | ToolsTypes.LabelmapSegmentationDataStack +> { const isVolume = options.viewport ? options.viewport instanceof VolumeViewport : true; @@ -103,7 +106,10 @@ async function computeLabelmapFromContourSegmentation( async function computeLabelmapFromSurfaceSegmentation( segmentationId, options: PolySegConversionOptions = {} -): Promise { +): Promise< + | ToolsTypes.LabelmapSegmentationDataVolume + | ToolsTypes.LabelmapSegmentationDataStack +> { const { viewport } = options; const isVolume = viewport ? viewport instanceof VolumeViewport : true; @@ -161,7 +167,7 @@ async function computeLabelmapFromSurfaceSegmentation( // we need to convert the volume labelmap to a stack labelmap const stackData = (await computeStackLabelmapFromVolume({ volumeId: segmentationVolume.volumeId, - })) as LabelmapSegmentationDataStack; + })) as ToolsTypes.LabelmapSegmentationDataStack; return stackData; } diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertContourToSurface.ts b/packages/polymorphic-segmentation/src/Surface/convertContourToSurface.ts similarity index 80% rename from packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertContourToSurface.ts rename to packages/polymorphic-segmentation/src/Surface/convertContourToSurface.ts index 400de4652..6b2588035 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertContourToSurface.ts +++ b/packages/polymorphic-segmentation/src/Surface/convertContourToSurface.ts @@ -5,12 +5,11 @@ import { triggerEvent, getWebWorkerManager, } from '@cornerstonejs/core'; -import type { - ContourSegmentationAnnotation, - ContourSegmentationData, -} from '../../../../types'; -import { getAnnotation } from '../../../annotation/annotationState'; -import { WorkerTypes } from '../../../../enums'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + +const { WorkerTypes } = cornerstoneTools.Enums; +const { getAnnotation } = cornerstoneTools.annotation.state; const workerManager = getWebWorkerManager(); @@ -30,7 +29,7 @@ const triggerWorkerProgress = (eventTarget, progress, id) => { * @returns A promise that resolves to the surface data. */ export async function convertContourToSurface( - contourRepresentationData: ContourSegmentationData, + contourRepresentationData: ToolsTypes.ContourSegmentationData, segmentIndex: number ): Promise { const { annotationUIDsMap } = contourRepresentationData; @@ -42,8 +41,9 @@ export async function convertContourToSurface( for (const annotationUID of annotationUIDs) { const annotation = getAnnotation(annotationUID); - const { polyline } = (annotation as ContourSegmentationAnnotation).data - .contour; + const { polyline } = ( + annotation as ToolsTypes.ContourSegmentationAnnotation + ).data.contour; numPointsArray.push(polyline.length); polyline.forEach((polyline) => polylines.push(...polyline)); } diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertLabelmapToSurface.ts b/packages/polymorphic-segmentation/src/Surface/convertLabelmapToSurface.ts similarity index 73% rename from packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertLabelmapToSurface.ts rename to packages/polymorphic-segmentation/src/Surface/convertLabelmapToSurface.ts index 855ec9ad8..c8bfb6298 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/convertLabelmapToSurface.ts +++ b/packages/polymorphic-segmentation/src/Surface/convertLabelmapToSurface.ts @@ -6,13 +6,13 @@ import { triggerEvent, Enums, } from '@cornerstonejs/core'; -import type { - LabelmapSegmentationData, - LabelmapSegmentationDataStack, - LabelmapSegmentationDataVolume, -} from '../../../../types/LabelmapTypes'; -import { computeVolumeLabelmapFromStack } from '../../helpers/computeVolumeLabelmapFromStack'; -import { WorkerTypes } from '../../../../enums'; + +import * as cornerstoneTools from '@cornerstonejs/tools'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; + +const { WorkerTypes } = cornerstoneTools.Enums; +const { computeVolumeLabelmapFromStack } = + cornerstoneTools.utilities.segmentation; const workerManager = getWebWorkerManager(); @@ -33,17 +33,21 @@ const triggerWorkerProgress = (eventTarget, progress, id) => { * @returns A promise that resolves to the surface data. */ export async function convertLabelmapToSurface( - labelmapRepresentationData: LabelmapSegmentationData, + labelmapRepresentationData: ToolsTypes.LabelmapSegmentationData, segmentIndex: number ): Promise { let volumeId; - if ((labelmapRepresentationData as LabelmapSegmentationDataVolume).volumeId) { - volumeId = (labelmapRepresentationData as LabelmapSegmentationDataVolume) - .volumeId; + if ( + (labelmapRepresentationData as ToolsTypes.LabelmapSegmentationDataVolume) + .volumeId + ) { + volumeId = ( + labelmapRepresentationData as ToolsTypes.LabelmapSegmentationDataVolume + ).volumeId; } else { const { imageIds } = - labelmapRepresentationData as LabelmapSegmentationDataStack; + labelmapRepresentationData as ToolsTypes.LabelmapSegmentationDataStack; ({ volumeId } = await computeVolumeLabelmapFromStack({ imageIds, diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/createAndCacheSurfacesFromRaw.ts b/packages/polymorphic-segmentation/src/Surface/createAndCacheSurfacesFromRaw.ts similarity index 88% rename from packages/tools/src/stateManagement/segmentation/polySeg/Surface/createAndCacheSurfacesFromRaw.ts rename to packages/polymorphic-segmentation/src/Surface/createAndCacheSurfacesFromRaw.ts index 8d6b91c5a..e13ce49d6 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/createAndCacheSurfacesFromRaw.ts +++ b/packages/polymorphic-segmentation/src/Surface/createAndCacheSurfacesFromRaw.ts @@ -1,9 +1,11 @@ import type { Types } from '@cornerstonejs/core'; import { Enums, geometryLoader } from '@cornerstonejs/core'; -import { getSegmentIndexColor } from '../../config/segmentationColor'; import type { RawSurfacesData } from './surfaceComputationStrategies'; -import type { PolySegConversionOptions } from '../../../../types'; -import { getSegmentation } from '../../getSegmentation'; +import type { PolySegConversionOptions } from '../types'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + +const { getSegmentation } = cornerstoneTools.segmentation.state; +const { getSegmentIndexColor } = cornerstoneTools.segmentation.config.color; /** * Creates and caches surfaces from raw surface data. diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/surfaceComputationStrategies.ts b/packages/polymorphic-segmentation/src/Surface/surfaceComputationStrategies.ts similarity index 86% rename from packages/tools/src/stateManagement/segmentation/polySeg/Surface/surfaceComputationStrategies.ts rename to packages/polymorphic-segmentation/src/Surface/surfaceComputationStrategies.ts index b1f2d8d38..8e2a20a8a 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/surfaceComputationStrategies.ts +++ b/packages/polymorphic-segmentation/src/Surface/surfaceComputationStrategies.ts @@ -1,18 +1,14 @@ import type { Types } from '@cornerstonejs/core'; -import type { - ContourSegmentationData, - PolySegConversionOptions, -} from '../../../../types'; -import { getUniqueSegmentIndices } from '../../../../utilities/segmentation/getUniqueSegmentIndices'; -import { getSegmentation } from '../../getSegmentation'; +import type { PolySegConversionOptions } from '../types'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + import { convertContourToSurface } from './convertContourToSurface'; import { createAndCacheSurfacesFromRaw } from './createAndCacheSurfacesFromRaw'; -import type { - LabelmapSegmentationData, - LabelmapSegmentationDataStack, - LabelmapSegmentationDataVolume, -} from '../../../../types/LabelmapTypes'; import { convertLabelmapToSurface } from './convertLabelmapToSurface'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; + +const { getUniqueSegmentIndices } = cornerstoneTools.utilities.segmentation; +const { getSegmentation } = cornerstoneTools.segmentation.state; export type RawSurfacesData = { segmentIndex: number; @@ -47,7 +43,9 @@ export async function computeSurfaceData( ...options, } ); - } else if (representationData.Labelmap as LabelmapSegmentationData) { + } else if ( + representationData.Labelmap as ToolsTypes.LabelmapSegmentationData + ) { // convert volume labelmap to surface rawSurfacesData = await computeSurfaceFromLabelmapSegmentation( segmentation.segmentationId, @@ -97,8 +95,8 @@ async function computeSurfaceFromLabelmapSegmentation( const promises = segmentIndices.map((index) => { const surface = convertLabelmapToSurface( labelmapRepresentationData as - | LabelmapSegmentationDataVolume - | LabelmapSegmentationDataStack, + | ToolsTypes.LabelmapSegmentationDataVolume + | ToolsTypes.LabelmapSegmentationDataStack, index ); @@ -143,7 +141,7 @@ async function computeSurfaceFromContourSegmentation( const promises = segmentIndices.map(async (index) => { const surface = await convertContourToSurface( - contourRepresentationData as ContourSegmentationData, + contourRepresentationData as ToolsTypes.ContourSegmentationData, index ); diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/updateSurfaceData.ts b/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts similarity index 84% rename from packages/tools/src/stateManagement/segmentation/polySeg/Surface/updateSurfaceData.ts rename to packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts index 86b75f03c..5648331df 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/updateSurfaceData.ts +++ b/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts @@ -1,14 +1,25 @@ import type { Types } from '@cornerstonejs/core'; import { cache } from '@cornerstonejs/core'; -import { getUniqueSegmentIndices } from '../../../../utilities/segmentation/getUniqueSegmentIndices'; -import { getViewportIdsWithSegmentation } from '../../getViewportIdsWithSegmentation'; -import { getSegmentation } from '../../getSegmentation'; -import { triggerSegmentationModified } from '../../triggerSegmentationEvents'; -import { getSegmentationRepresentation } from '../../getSegmentationRepresentation'; -import { SegmentationRepresentations } from '../../../../enums'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + import { computeSurfaceFromLabelmapSegmentation } from './surfaceComputationStrategies'; import { createAndCacheSurfacesFromRaw } from './createAndCacheSurfacesFromRaw'; +const { + utilities: { + segmentation: { getUniqueSegmentIndices }, + }, + segmentation: { + state: { + getViewportIdsWithSegmentation, + getSegmentation, + getSegmentationRepresentation, + }, + triggerSegmentationEvents: { triggerSegmentationModified }, + }, + Enums: { SegmentationRepresentations }, +} = cornerstoneTools; + export async function updateSurfaceData(segmentationId) { const surfacesObj = await computeSurfaceFromLabelmapSegmentation( segmentationId diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/canComputeRequestedRepresentation.ts b/packages/polymorphic-segmentation/src/canComputeRequestedRepresentation.ts similarity index 86% rename from packages/tools/src/stateManagement/segmentation/polySeg/canComputeRequestedRepresentation.ts rename to packages/polymorphic-segmentation/src/canComputeRequestedRepresentation.ts index be7ce91e0..1c34b8365 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/canComputeRequestedRepresentation.ts +++ b/packages/polymorphic-segmentation/src/canComputeRequestedRepresentation.ts @@ -1,14 +1,15 @@ -import { SegmentationRepresentations } from '../../../enums'; -import type { RepresentationsData } from '../../../types'; -import { getSegmentation } from '../getSegmentation'; -import { validate as validateLabelmap } from '../../../tools/displayTools/Labelmap/validateLabelmap'; +import type { Types as ToolsTypes } from '@cornerstonejs/tools'; +import { Enums, segmentation, utilities } from '@cornerstonejs/tools'; + +type RepresentationsData = ToolsTypes.RepresentationsData; + +const { SegmentationRepresentations } = Enums; +const { getSegmentation } = segmentation.state; +const { validateLabelmap } = utilities.segmentation; // Map of conversion paths between source and target representations // You should read it as "source" -> "targets" -const conversionPaths = new Map< - SegmentationRepresentations, - Set ->([ +const conversionPaths = new Map([ [ SegmentationRepresentations.Labelmap, new Set([ @@ -43,7 +44,7 @@ const conversionPaths = new Map< */ function canComputeRequestedRepresentation( segmentationId: string, - type: SegmentationRepresentations + type: typeof SegmentationRepresentations ): boolean { const { representationData } = getSegmentation(segmentationId); @@ -73,7 +74,7 @@ function getExistingRepresentationTypes( let validateFn; switch (representationType) { case SegmentationRepresentations.Labelmap: - validateFn = validateLabelmap; + validateFn = validateLabelmap.validate; break; // Todo: add validation for other representation types } diff --git a/packages/polymorphic-segmentation/src/index.ts b/packages/polymorphic-segmentation/src/index.ts new file mode 100644 index 000000000..313f9c322 --- /dev/null +++ b/packages/polymorphic-segmentation/src/index.ts @@ -0,0 +1,25 @@ +import { computeContourData } from './Contour/contourComputationStrategies'; +import { computeLabelmapData } from './Labelmap/labelmapComputationStrategies'; +import { computeSurfaceData } from './Surface/surfaceComputationStrategies'; +import { canComputeRequestedRepresentation } from './canComputeRequestedRepresentation'; + +// updates +import { updateSurfaceData } from './Surface/updateSurfaceData'; +import { registerPolySegWorker } from './registerPolySegWorker'; + +function init() { + // register the worker if it hasn't been registered yet + registerPolySegWorker(); +} + +export { + canComputeRequestedRepresentation, + // computes + computeContourData, + computeLabelmapData, + computeSurfaceData, + // updates + updateSurfaceData, + // init + init, +}; diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/registerPolySegWorker.ts b/packages/polymorphic-segmentation/src/registerPolySegWorker.ts similarity index 81% rename from packages/tools/src/stateManagement/segmentation/polySeg/registerPolySegWorker.ts rename to packages/polymorphic-segmentation/src/registerPolySegWorker.ts index 400f6c954..dfbdaaa89 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/registerPolySegWorker.ts +++ b/packages/polymorphic-segmentation/src/registerPolySegWorker.ts @@ -13,7 +13,7 @@ export function registerPolySegWorker() { // @ts-ignore return new Worker( // @ts-ignore - new URL('../../../workers/polySegConverters', import.meta.url), + new URL('./workers/polySegConverters.js', import.meta.url), { name: 'polySeg', type: 'module', @@ -24,7 +24,7 @@ export function registerPolySegWorker() { const workerManager = getWebWorkerManager(); const options = { - maxWorkerInstances: 1, // Todo, make this configurable + maxWorkerInstances: 1, autoTerminateOnIdle: { enabled: true, idleTimeThreshold: 2000, diff --git a/packages/tools/src/types/PolySeg.ts b/packages/polymorphic-segmentation/src/types/PolySegConversionOptions.ts similarity index 100% rename from packages/tools/src/types/PolySeg.ts rename to packages/polymorphic-segmentation/src/types/PolySegConversionOptions.ts diff --git a/packages/polymorphic-segmentation/src/types/index.ts b/packages/polymorphic-segmentation/src/types/index.ts new file mode 100644 index 000000000..99b89a739 --- /dev/null +++ b/packages/polymorphic-segmentation/src/types/index.ts @@ -0,0 +1,3 @@ +import type { PolySegConversionOptions } from './PolySegConversionOptions'; + +export type { PolySegConversionOptions }; diff --git a/packages/tools/src/stateManagement/segmentation/helpers/clipAndCacheSurfacesForViewport.ts b/packages/polymorphic-segmentation/src/utilities/clipAndCacheSurfacesForViewport.ts similarity index 95% rename from packages/tools/src/stateManagement/segmentation/helpers/clipAndCacheSurfacesForViewport.ts rename to packages/polymorphic-segmentation/src/utilities/clipAndCacheSurfacesForViewport.ts index 40ca5ee18..265d5b7ec 100644 --- a/packages/tools/src/stateManagement/segmentation/helpers/clipAndCacheSurfacesForViewport.ts +++ b/packages/polymorphic-segmentation/src/utilities/clipAndCacheSurfacesForViewport.ts @@ -6,12 +6,14 @@ import { triggerEvent, } from '@cornerstonejs/core'; -import { WorkerTypes } from '../../../enums'; -import { pointToString } from '../../../utilities/pointToString'; -import { registerPolySegWorker } from '../polySeg/registerPolySegWorker'; -import { getSurfaceActorEntry } from './getSegmentationActor'; +import { Enums as ToolsEnums, utilities } from '@cornerstonejs/tools'; +import { registerPolySegWorker } from '../registerPolySegWorker'; + const workerManager = getWebWorkerManager(); +const { WorkerTypes } = ToolsEnums; +const { pointToString } = utilities; + /** * Surfaces info for clipping */ diff --git a/packages/polymorphic-segmentation/src/utilities/index.ts b/packages/polymorphic-segmentation/src/utilities/index.ts new file mode 100644 index 000000000..5823f559a --- /dev/null +++ b/packages/polymorphic-segmentation/src/utilities/index.ts @@ -0,0 +1,3 @@ +import { clipAndCacheSurfacesForViewport } from './clipAndCacheSurfacesForViewport'; + +export { clipAndCacheSurfacesForViewport }; diff --git a/packages/tools/src/workers/polySegConverters.js b/packages/polymorphic-segmentation/src/workers/polySegConverters.js similarity index 97% rename from packages/tools/src/workers/polySegConverters.js rename to packages/polymorphic-segmentation/src/workers/polySegConverters.js index a2d2b5370..fff909f58 100644 --- a/packages/tools/src/workers/polySegConverters.js +++ b/packages/polymorphic-segmentation/src/workers/polySegConverters.js @@ -1,5 +1,6 @@ import { expose } from 'comlink'; import { utilities } from '@cornerstonejs/core'; +import { utilities as ToolsUtilities } from '@cornerstonejs/tools'; import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray'; import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; @@ -7,14 +8,25 @@ import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData'; import vtkContourLoopExtraction from '@kitware/vtk.js/Filters/General/ContourLoopExtraction'; import vtkCutter from '@kitware/vtk.js/Filters/Core/Cutter'; -import { getBoundingBoxAroundShapeWorld } from '../utilities/boundingBox'; -import { - containsPoint, - getAABB, - projectTo2D, -} from '../utilities/math/polyline'; -import { isPlaneIntersectingAABB } from '../utilities/planar'; -import { checkStandardBasis, rotatePoints } from '../geometricSurfaceUtils'; +const { + math: { + polyline: { containsPoint, getAABB, projectTo2D }, + }, + geometricSurfaceUtils: { checkStandardBasis, rotatePoints }, + boundingBox: { getBoundingBoxAroundShapeWorld }, + planar: { isPlaneIntersectingAABB }, +} = ToolsUtilities; + +async function peerImport(moduleId) { + try { + if (moduleId === '@icr/polyseg-wasm') { + return import('@icr/polyseg-wasm'); + } + } catch (error) { + console.warn('Error importing module:', error); + return null; + } +} /** * Object containing methods for converting between different representations of @@ -43,7 +55,7 @@ const polySegConverters = { async initializePolySeg(progressCallback) { let ICRPolySeg; try { - ICRPolySeg = (await import('@icr/polyseg-wasm')).default; + ICRPolySeg = (await peerImport('@icr/polyseg-wasm')).default; } catch (error) { console.error(error); console.debug( diff --git a/packages/polymorphic-segmentation/tsconfig.json b/packages/polymorphic-segmentation/tsconfig.json new file mode 100644 index 000000000..bc915f1e6 --- /dev/null +++ b/packages/polymorphic-segmentation/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist/esm", + "rootDir": "./src" + }, + "include": ["./src/**/*"] +} diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index e07c3dd6c..eb548a42e 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,14 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [2.19.16](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.15...v2.19.16) (2025-02-26) +# [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) + +### Features + +- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) + +# [3.0.0-beta.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/tools -## [2.19.15](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v2.19.15) (2025-02-26) +# [3.0.0-beta.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.3...v3.0.0-beta.4) (2025-02-25) **Note:** Version bump only for package @cornerstonejs/tools +# [3.0.0-beta.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.2...v3.0.0-beta.3) (2025-02-25) + +**Note:** Version bump only for package @cornerstonejs/tools + +# [3.0.0-beta.2](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.14...v3.0.0-beta.2) (2025-02-24) + +### Bug Fixes + +- publish beta for 3.0 ([8bf65df](https://github.com/cornerstonejs/cornerstone3D/commit/8bf65df9bec5f52459de1c49c4834b316f680f1b)) + ## [2.19.14](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.13...v2.19.14) (2025-02-24) ### Bug Fixes diff --git a/packages/tools/examples/labelmapInterpolation/index.ts b/packages/tools/examples/labelmapInterpolation/index.ts deleted file mode 100644 index 1a477f080..000000000 --- a/packages/tools/examples/labelmapInterpolation/index.ts +++ /dev/null @@ -1,338 +0,0 @@ -import type { Types } from '@cornerstonejs/core'; -import { - RenderingEngine, - Enums, - setVolumesForViewports, - volumeLoader, -} from '@cornerstonejs/core'; -import { - initDemo, - createImageIdsAndCacheMetaData, - setTitleAndDescription, - addDropdownToToolbar, - addSliderToToolbar, - setCtTransferFunctionForVolumeActor, - addButtonToToolbar, - addManipulationBindings, -} from '../../../../utils/demo/helpers'; -import * as cornerstoneTools from '@cornerstonejs/tools'; - -// This is for debugging purposes -console.warn( - 'Click on index.ts to open source code for this example --------->' -); - -const { - ToolGroupManager, - Enums: csToolsEnums, - segmentation, - RectangleScissorsTool, - SphereScissorsTool, - CircleScissorsTool, - BrushTool, - PaintFillTool, - utilities: cstUtils, -} = cornerstoneTools; - -const { MouseBindings } = csToolsEnums; -const { ViewportType } = Enums; -const { segmentation: segmentationUtils } = cstUtils; - -// Define a unique id for the volume -const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix -const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use -const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id -const segmentationId = 'MY_SEGMENTATION_ID'; -const toolGroupId = 'MY_TOOLGROUP_ID'; - -// ======== Set up page ======== // -setTitleAndDescription( - 'Labelmap Interpolation', - 'Here we demonstrate interpolation between slices for labelmaps' -); - -const size = '500px'; -const content = document.getElementById('content'); -const viewportGrid = document.createElement('div'); - -viewportGrid.style.display = 'flex'; -viewportGrid.style.display = 'flex'; -viewportGrid.style.flexDirection = 'row'; - -const element1 = document.createElement('div'); -const element2 = document.createElement('div'); -const element3 = document.createElement('div'); -element1.style.width = size; -element1.style.height = size; -element2.style.width = size; -element2.style.height = size; -element3.style.width = size; -element3.style.height = size; - -// Disable right click context menu so we can have right click tools -element1.oncontextmenu = (e) => e.preventDefault(); -element2.oncontextmenu = (e) => e.preventDefault(); -element3.oncontextmenu = (e) => e.preventDefault(); - -viewportGrid.appendChild(element1); -viewportGrid.appendChild(element2); -viewportGrid.appendChild(element3); - -content.appendChild(viewportGrid); - -const instructions = document.createElement('p'); -instructions.innerText = ` - Use the labelmap tools in the normal way. Note preview is turned off for those - tools to simplify initial segment creation. -
Segments are interpolated BETWEEN slices, so you need to create two or more - segments of the same segment index on slices in a viewport separated by at least - one empty segment.
- Use "Extended Interpolation" button to interpolate segments which don't - overlap (assuming the segments were drawn on the same slice). - Use "Overlapping Interpolation" button to interpolate overlapping segments - that is, the segment must - overlap if drawn on the same slice to interpolate between them. This is a good choice - for multiple segments. - Accept the interpolation by hitting enter, or use the "Reject Preview/Interpolation" button. - `; - -content.append(instructions); - -const interpolationTools = new Map(); - -const configuration = {}; - -interpolationTools.set('CircularBrush', { - baseTool: BrushTool.toolName, - configuration: { - ...configuration, - activeStrategy: 'FILL_INSIDE_CIRCLE', - }, -}); - -const optionsValues = [ - ...interpolationTools.keys(), - RectangleScissorsTool.toolName, - CircleScissorsTool.toolName, - SphereScissorsTool.toolName, - PaintFillTool.toolName, -]; - -// ============================= // -addDropdownToToolbar({ - options: { values: optionsValues, defaultValue: BrushTool.toolName }, - onSelectedValueChange: (nameAsStringOrNumber) => { - const name = String(nameAsStringOrNumber); - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - - // Set the currently active tool disabled - const toolName = toolGroup.getActivePrimaryMouseButtonTool(); - - if (toolName) { - toolGroup.setToolDisabled(toolName); - } - - toolGroup.setToolActive(name, { - bindings: [{ mouseButton: MouseBindings.Primary }], - }); - }, -}); - -addSliderToToolbar({ - title: 'Brush Size', - range: [5, 100], - defaultValue: 25, - onSelectedValueChange: (valueAsStringOrNumber) => { - const value = Number(valueAsStringOrNumber); - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, value); - }, -}); - -// ============================= // -addDropdownToToolbar({ - options: { values: ['1', '2', '3'], defaultValue: '1' }, - labelText: 'Segment', - onSelectedValueChange: (segmentIndex) => { - segmentation.segmentIndex.setActiveSegmentIndex( - segmentationId, - Number(segmentIndex) - ); - }, -}); - -addButtonToToolbar({ - title: 'Run Extended Interpolation', - onClick: () => { - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - const activeName = toolGroup.getActivePrimaryMouseButtonTool(); - const brush = toolGroup.getToolInstance(activeName); - brush.interpolate?.(element1, { extendedConfig: true }); - }, -}); - -addButtonToToolbar({ - title: 'Run Overlapping Interpolation', - onClick: () => { - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - const activeName = toolGroup.getActivePrimaryMouseButtonTool(); - const brush = toolGroup.getToolInstance(activeName); - brush.interpolate?.(element1, { extendedConfig: false }); - }, -}); - -// ============================= // - -async function addSegmentationsToState() { - // Create a segmentation of the same resolution as the source data - await volumeLoader.createAndCacheDerivedLabelmapVolume(volumeId, { - volumeId: segmentationId, - }); - - // Add the segmentations to state - segmentation.addSegmentations([ - { - segmentationId, - representation: { - // The type of segmentation - type: csToolsEnums.SegmentationRepresentations.Labelmap, - // The actual segmentation data, in the case of labelmap this is a - // reference to the source volume of the segmentation. - data: { - volumeId: segmentationId, - }, - }, - }, - ]); -} - -/** - * Runs the demo - */ -async function run() { - // Init Cornerstone and related libraries - await initDemo(); - - // Add tools to Cornerstone3D - cornerstoneTools.addTool(RectangleScissorsTool); - cornerstoneTools.addTool(CircleScissorsTool); - cornerstoneTools.addTool(SphereScissorsTool); - cornerstoneTools.addTool(PaintFillTool); - cornerstoneTools.addTool(BrushTool); - - // Define tool groups to add the segmentation display tool to - const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); - - // Manipulation Tools - addManipulationBindings(toolGroup); - - // Segmentation Tools - toolGroup.addTool(RectangleScissorsTool.toolName); - toolGroup.addTool(CircleScissorsTool.toolName); - toolGroup.addTool(SphereScissorsTool.toolName); - toolGroup.addTool(PaintFillTool.toolName); - toolGroup.addTool(BrushTool.toolName); - - for (const [toolName, config] of interpolationTools.entries()) { - if (config.baseTool) { - toolGroup.addToolInstance( - toolName, - config.baseTool, - config.configuration - ); - } else { - toolGroup.addTool(toolName, config.configuration); - } - if (config.passive) { - // This can be applied during add/remove contours - toolGroup.setToolPassive(toolName); - } - } - - toolGroup.setToolActive(interpolationTools.keys().next().value, { - bindings: [{ mouseButton: MouseBindings.Primary }], - }); - - // Get Cornerstone imageIds for the source data and fetch metadata into RAM - const imageIds = await createImageIdsAndCacheMetaData({ - StudyInstanceUID: - '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', - SeriesInstanceUID: - '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', - wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', - }); - - // Define a volume in memory - const volume = await volumeLoader.createAndCacheVolume(volumeId, { - imageIds, - }); - - // Add some segmentations based on the source data volume - await addSegmentationsToState(); - - // Instantiate a rendering engine - const renderingEngineId = 'myRenderingEngine'; - const renderingEngine = new RenderingEngine(renderingEngineId); - - // Create the viewports - const viewportId1 = 'CT_AXIAL'; - const viewportId2 = 'CT_SAGITTAL'; - const viewportId3 = 'CT_CORONAL'; - - const viewportInputArray = [ - { - viewportId: viewportId1, - type: ViewportType.ORTHOGRAPHIC, - element: element1, - defaultOptions: { - orientation: Enums.OrientationAxis.AXIAL, - background: [0, 0, 0], - }, - }, - { - viewportId: viewportId2, - type: ViewportType.ORTHOGRAPHIC, - element: element2, - defaultOptions: { - orientation: Enums.OrientationAxis.SAGITTAL, - background: [0, 0, 0], - }, - }, - { - viewportId: viewportId3, - type: ViewportType.ORTHOGRAPHIC, - element: element3, - defaultOptions: { - orientation: Enums.OrientationAxis.CORONAL, - background: [0, 0, 0], - }, - }, - ]; - - renderingEngine.setViewports(viewportInputArray); - - toolGroup.addViewport(viewportId1, renderingEngineId); - toolGroup.addViewport(viewportId2, renderingEngineId); - toolGroup.addViewport(viewportId3, renderingEngineId); - - // Set the volume to load - volume.load(); - - // Set volumes on the viewports - await setVolumesForViewports( - renderingEngine, - [{ volumeId, callback: setCtTransferFunctionForVolumeActor }], - [viewportId1, viewportId2, viewportId3] - ); - - // Add the segmentation representation to the toolgroup - const segMap = { - [viewportId1]: [{ segmentationId }], - [viewportId2]: [{ segmentationId }], - [viewportId3]: [{ segmentationId }], - }; - await segmentation.addLabelmapRepresentationToViewportMap(segMap); - - // Render the image - renderingEngine.render(); -} - -run(); diff --git a/packages/tools/examples/labelmapSegmentationDynamicThreshold/index.ts b/packages/tools/examples/labelmapSegmentationDynamicThreshold/index.ts index b96a75170..234cf1947 100644 --- a/packages/tools/examples/labelmapSegmentationDynamicThreshold/index.ts +++ b/packages/tools/examples/labelmapSegmentationDynamicThreshold/index.ts @@ -109,7 +109,7 @@ const viewportId1 = viewportIds[0]; const viewportId2 = viewportIds[1]; const viewportId3 = viewportIds[2]; -const defaultThresholdOption = [...labelmapTools.thresholdOptions.keys()][2]; +const defaultThresholdOption = [...labelmapTools.thresholdOptions.keys()][5]; const thresholdArgs = labelmapTools.thresholdOptions.get( defaultThresholdOption ); @@ -119,9 +119,7 @@ interpolationTools.set('ThresholdSphereIsland', { configuration: { ...configuration, activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', - strategySpecificConfiguration: { - THRESHOLD: { ...thresholdArgs }, - }, + threshold: thresholdArgs, }, }); @@ -130,9 +128,7 @@ interpolationTools.set('ThresholdCircle', { configuration: { ...configuration, activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', - strategySpecificConfiguration: { - THRESHOLD: { ...thresholdArgs }, - }, + threshold: thresholdArgs, }, }); @@ -141,9 +137,7 @@ interpolationTools.set('ThresholdSphere', { configuration: { ...configuration, activeStrategy: 'THRESHOLD_INSIDE_SPHERE', - strategySpecificConfiguration: { - THRESHOLD: { ...thresholdArgs }, - }, + threshold: thresholdArgs, }, }); @@ -174,11 +168,7 @@ addDropdownToToolbar({ map: labelmapTools.thresholdOptions, }, onSelectedValueChange: (name, thresholdArgs) => { - segmentationUtils.setBrushThresholdForToolGroup( - toolGroupId, - thresholdArgs.threshold, - thresholdArgs - ); + segmentationUtils.setBrushThresholdForToolGroup(toolGroupId, thresholdArgs); }, }); diff --git a/packages/tools/examples/labelmapStatistics/index.ts b/packages/tools/examples/labelmapStatistics/index.ts index 082fc530d..5b8f9d9da 100644 --- a/packages/tools/examples/labelmapStatistics/index.ts +++ b/packages/tools/examples/labelmapStatistics/index.ts @@ -1,58 +1,52 @@ -import type { Types } from '@cornerstonejs/core'; import { RenderingEngine, Enums, - setVolumesForViewports, - volumeLoader, + imageLoader, eventTarget, } from '@cornerstonejs/core'; +import * as cornerstoneTools from '@cornerstonejs/tools'; import { - initDemo, createImageIdsAndCacheMetaData, - setTitleAndDescription, + initDemo, addDropdownToToolbar, - addSliderToToolbar, - setCtTransferFunctionForVolumeActor, - getLocalUrl, - addManipulationBindings, + setTitleAndDescription, + addButtonToToolbar, + addBrushSizeSlider, } from '../../../../utils/demo/helpers'; -import * as cornerstoneTools from '@cornerstonejs/tools'; // This is for debugging purposes -console.warn( +console.debug( 'Click on index.ts to open source code for this example --------->' ); const { ToolGroupManager, + ZoomTool, + StackScrollTool, Enums: csToolsEnums, - segmentation, RectangleScissorsTool, - SphereScissorsTool, CircleScissorsTool, BrushTool, PaintFillTool, + PanTool, + segmentation, utilities: cstUtils, } = cornerstoneTools; -const { MouseBindings, Events } = csToolsEnums; +const { MouseBindings, KeyboardBindings, Events } = csToolsEnums; const { ViewportType } = Enums; const { segmentation: segmentationUtils, roundNumber } = cstUtils; // Define a unique id for the volume -const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix -const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use -const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id -const segmentationId = 'MY_SEGMENTATION_ID'; -const toolGroupId = 'MY_TOOLGROUP_ID'; -const viewports = []; - -const DEFAULT_BRUSH_SIZE = 20; +let renderingEngine; +const renderingEngineId = 'myRenderingEngine'; +const viewportId = 'STACK_VIEWPORT'; +const toolGroupId = 'TOOL_GROUP_ID'; // ======== Set up page ======== // setTitleAndDescription( - 'Labelmap Segmentation Statistics', - 'Here we demonstrate calculating labelmap statistics' + 'Stack Segmentation Statistics', + 'Here we demonstrate how to calculate statistics for a stack segmentation.' ); const size = '500px'; @@ -60,7 +54,6 @@ const content = document.getElementById('content'); const statsGrid = document.createElement('div'); statsGrid.style.display = 'flex'; -statsGrid.style.display = 'flex'; statsGrid.style.flexDirection = 'row'; statsGrid.style.fontSize = 'smaller'; @@ -81,179 +74,29 @@ for (const statsId of statsIds) { content.appendChild(statsGrid); const viewportGrid = document.createElement('div'); - -viewportGrid.style.display = 'flex'; viewportGrid.style.display = 'flex'; viewportGrid.style.flexDirection = 'row'; -const element1 = document.createElement('div'); -const element2 = document.createElement('div'); -const element3 = document.createElement('div'); -element1.style.width = size; -element1.style.height = size; -element2.style.width = size; -element2.style.height = size; -element3.style.width = size; -element3.style.height = size; - -// Disable right click context menu so we can have right click tools -element1.oncontextmenu = (e) => e.preventDefault(); -element2.oncontextmenu = (e) => e.preventDefault(); -element3.oncontextmenu = (e) => e.preventDefault(); - -viewportGrid.appendChild(element1); -viewportGrid.appendChild(element2); -viewportGrid.appendChild(element3); +const element = document.createElement('div'); +element.style.width = size; +element.style.height = size; +element.oncontextmenu = () => false; +viewportGrid.appendChild(element); content.appendChild(viewportGrid); const instructions = document.createElement('p'); instructions.innerText = ` - Hover - show preview of segmentation tool - Left drag to extend preview - Left Click (or enter) to accept preview - Reject preview by button (or esc) - Hover outside of region to reset to hovered over segment index - Shift Left - zoom, Ctrl Left - Pan, Alt Left - Stack Scroll + Left Click: Use selected Segmentation Tool. + Middle Click: Pan + Right Click: Zoom + Mouse wheel: Scroll Stack `; content.append(instructions); -const interpolationTools = new Map(); -const configuration = { - preview: { - enabled: true, - }, -}; - -const thresholdOptions = new Map(); -thresholdOptions.set('Dynamic Radius 0', { isDynamic: true, dynamicRadius: 0 }); -thresholdOptions.set('Dynamic Radius 1', { isDynamic: true, dynamicRadius: 1 }); -thresholdOptions.set('Dynamic Radius 3', { isDynamic: true, dynamicRadius: 3 }); -thresholdOptions.set('Dynamic Radius 5', { isDynamic: true, dynamicRadius: 5 }); -thresholdOptions.set('Use Existing Threshold', { - isDynamic: false, - dynamicRadius: 5, -}); -thresholdOptions.set('CT Fat: (-150, -70)', { - threshold: [-150, -70], - isDynamic: false, -}); -thresholdOptions.set('CT Bone: (200, 1000)', { - threshold: [200, 1000], - isDynamic: false, -}); -const defaultThresholdOption = [...thresholdOptions.keys()][2]; -const thresholdArgs = thresholdOptions.get(defaultThresholdOption); - -interpolationTools.set('ThresholdSphere', { - baseTool: BrushTool.toolName, - configuration: { - ...configuration, - activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', - strategySpecificConfiguration: { - useCenterSegmentIndex: true, - THRESHOLD: { ...thresholdArgs }, - }, - }, -}); - -interpolationTools.set('SphereBrush', { - baseTool: BrushTool.toolName, - configuration: { - ...configuration, - activeStrategy: 'FILL_INSIDE_SPHERE', - strategySpecificConfiguration: { - useCenterSegmentIndex: true, - }, - }, -}); - -const optionsValues = [...interpolationTools.keys()]; - // ============================= // -// Create a reference to the threshold dropdown element -const thresholdDropdownElement = null; - -addDropdownToToolbar({ - options: { values: optionsValues, defaultValue: BrushTool.toolName }, - onSelectedValueChange: (nameAsStringOrNumber) => { - const name = String(nameAsStringOrNumber); - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - - // Set the currently active tool disabled - const toolName = toolGroup.getActivePrimaryMouseButtonTool(); - - if (toolName) { - toolGroup.setToolDisabled(toolName); - } - - toolGroup.setToolActive(name, { - bindings: [{ mouseButton: MouseBindings.Primary }], - }); - - // Show/hide threshold dropdown based on selected tool - if (thresholdDropdownElement) { - thresholdDropdownElement.style.display = name - .toLowerCase() - .includes('threshold') - ? 'inline-block' - : 'none'; - } - }, -}); - -// Store reference to threshold dropdown element -thresholdDropdownElement = addDropdownToToolbar({ - options: { - values: Array.from(thresholdOptions.keys()), - defaultValue: defaultThresholdOption, - }, - onSelectedValueChange: (nameAsStringOrNumber) => { - const name = String(nameAsStringOrNumber); - const thresholdArgs = thresholdOptions.get(name); - - segmentationUtils.setBrushThresholdForToolGroup( - toolGroupId, - thresholdArgs.threshold, - thresholdArgs - ); - }, -}); - -// Initially hide threshold dropdown if first tool doesn't include 'threshold' -if (thresholdDropdownElement) { - const initialTool = optionsValues[0]; - thresholdDropdownElement.style.display = initialTool - .toLowerCase() - .includes('threshold') - ? 'inline-block' - : 'none'; -} - -addSliderToToolbar({ - title: 'Brush Size', - range: [5, 100], - defaultValue: DEFAULT_BRUSH_SIZE, - onSelectedValueChange: (valueAsStringOrNumber) => { - const value = Number(valueAsStringOrNumber); - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, value); - }, -}); - -// ============================= // -addDropdownToToolbar({ - options: { values: ['1', '2'], defaultValue: '1' }, - labelText: 'Segment', - onSelectedValueChange: (segmentIndex) => { - segmentation.segmentIndex.setActiveSegmentIndex( - segmentationId, - Number(segmentIndex) - ); - }, -}); - function displayStat(stat) { if (!stat) { return; @@ -263,30 +106,26 @@ function displayStat(stat) { }`; } -function calculateStatistics(id, indices) { - const [viewport] = viewports; - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - const activeName = toolGroup.getActivePrimaryMouseButtonTool(); - const brush = toolGroup.getToolInstance(activeName); - const stats = brush.getStatistics(viewport.element, { indices }); +async function calculateStatistics(id, indices) { + const viewport = renderingEngine.getViewport(viewportId); + const stats = await segmentationUtils.getStatistics({ + segmentationId: 'SEGMENTATION_ID', + segmentIndices: indices, + }); if (!stats) { return; } const items = [`Statistics on ${indices.join(', ')}`]; stats.count.label = 'Voxels'; - // const lesionGlycolysis = { - // name: 'Lesion Glycolysis', - // value: stats.volume.value * stats.stdDev.value, - // unit: 'HU \xB7 mm \xb3', - // }; + items.push( displayStat(stats.volume), displayStat(stats.count), - // displayStat(lesionGlycolysis), displayStat(stats.mean), displayStat(stats.max), - displayStat(stats.min) + displayStat(stats.min), + displayStat(stats.peakValue) ); const statsDiv = document.getElementById(id); statsDiv.innerHTML = items.map((span) => `${span}
\n`).join('\n'); @@ -317,170 +156,161 @@ function segmentationModifiedCallback(evt) { // ============================= // -async function addSegmentationsToState() { - // Create a segmentation of the same resolution as the source data - volumeLoader.createAndCacheDerivedLabelmapVolume(volumeId, { - volumeId: segmentationId, - }); - - // Add the segmentations to state - segmentation.addSegmentations([ - { - segmentationId, - representation: { - // The type of segmentation - type: csToolsEnums.SegmentationRepresentations.Labelmap, - // The actual segmentation data, in the case of labelmap this is a - // reference to the source volume of the segmentation. - data: { - volumeId: segmentationId, - }, - }, - }, - ]); - - eventTarget.addEventListener( - Events.SEGMENTATION_DATA_MODIFIED, - segmentationModifiedCallback - ); -} - -/** - * Runs the demo - */ -async function run() { - // Init Cornerstone and related libraries - await initDemo(); - +function setupTools() { // Add tools to Cornerstone3D + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(ZoomTool); + cornerstoneTools.addTool(StackScrollTool); cornerstoneTools.addTool(RectangleScissorsTool); cornerstoneTools.addTool(CircleScissorsTool); - cornerstoneTools.addTool(SphereScissorsTool); cornerstoneTools.addTool(PaintFillTool); cornerstoneTools.addTool(BrushTool); - // Define tool groups to add the segmentation display tool to + // Define a tool group const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); - // Manipulation Tools - addManipulationBindings(toolGroup); - - // Segmentation Tools + // Add tools to the group + toolGroup.addTool(PanTool.toolName); + toolGroup.addTool(ZoomTool.toolName); + toolGroup.addTool(StackScrollTool.toolName); toolGroup.addTool(RectangleScissorsTool.toolName); toolGroup.addTool(CircleScissorsTool.toolName); - toolGroup.addTool(SphereScissorsTool.toolName); toolGroup.addTool(PaintFillTool.toolName); toolGroup.addTool(BrushTool.toolName); - for (const [toolName, config] of interpolationTools.entries()) { - if (config.baseTool) { - toolGroup.addToolInstance( - toolName, - config.baseTool, - config.configuration - ); - } else { - toolGroup.addTool(toolName, config.configuration); - } - if (config.passive) { - // This can be applied during add/remove contours - toolGroup.setToolPassive(toolName); - } - } - - toolGroup.setToolActive(interpolationTools.keys().next().value, { + // Set tool modes + toolGroup.setToolActive(BrushTool.toolName, { bindings: [{ mouseButton: MouseBindings.Primary }], }); - // Get Cornerstone imageIds for the source data and fetch metadata into RAM + toolGroup.setToolActive(PanTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Auxiliary, + }, + { + mouseButton: MouseBindings.Primary, + modifierKey: KeyboardBindings.Ctrl, + }, + ], + }); + + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Secondary, + }, + { + mouseButton: MouseBindings.Primary, + modifierKey: KeyboardBindings.Shift, + }, + ], + }); + + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + + return toolGroup; +} + +// ============================= // + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + const toolGroup = setupTools(); + + // Get Cornerstone imageIds and fetch metadata into RAM + // const imageIds = await createImageIdsAndCacheMetaData({ + // StudyInstanceUID: + // '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + // SeriesInstanceUID: + // '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + // wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + // }); + // Get Cornerstone imageIds and fetch metadata into RAM const imageIds = await createImageIdsAndCacheMetaData({ StudyInstanceUID: - '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + '1.3.6.1.4.1.14519.5.2.1.1188.2803.137585363493444318569098508293', SeriesInstanceUID: - '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', - wadoRsRoot: - getLocalUrl() || 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + '1.3.6.1.4.1.14519.5.2.1.1188.2803.699272945123913604672897602509', + SOPInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.1188.2803.295285318555680716246271899544', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', }); - - // Define a volume in memory - const volume = await volumeLoader.createAndCacheVolume(volumeId, { - imageIds, + const imageIds2 = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: '1.2.840.113663.1500.1.248223208.1.1.20110323.105903.687', + SeriesInstanceUID: + '1.2.840.113663.1500.1.248223208.2.1.20110323.105903.687', + SOPInstanceUID: '1.2.840.113663.1500.1.248223208.3.10.20110323.110423.875', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', }); - // Add some segmentations based on the source data volume - await addSegmentationsToState(); + // Create a stack of images + const imageIdsArray = imageIds.slice(0, 10); + // Create segmentation images for the stack + const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( + imageIdsArray + ); // Instantiate a rendering engine - const renderingEngineId = 'myRenderingEngine'; - const renderingEngine = new RenderingEngine(renderingEngineId); + renderingEngine = new RenderingEngine(renderingEngineId); + + // Create the viewport + const viewportInput = { + viewportId, + type: ViewportType.STACK, + element, + }; - // Create the viewports - const viewportId1 = 'CT_AXIAL'; - const viewportId2 = 'CT_SAGITTAL'; - const viewportId3 = 'CT_CORONAL'; + renderingEngine.setViewports([viewportInput]); - const viewportInputArray = [ - { - viewportId: viewportId1, - type: ViewportType.ORTHOGRAPHIC, - element: element1, - defaultOptions: { - orientation: Enums.OrientationAxis.AXIAL, - background: [0, 0, 0], - }, - }, + // Set the stack of images + const viewport = renderingEngine.getViewport(viewportId); + await viewport.setStack(imageIdsArray, 0); + + // Add the viewport to the toolgroup + toolGroup.addViewport(viewportId, renderingEngineId); + + // Add segmentation + segmentation.addSegmentations([ { - viewportId: viewportId2, - type: ViewportType.ORTHOGRAPHIC, - element: element2, - defaultOptions: { - orientation: Enums.OrientationAxis.SAGITTAL, - background: [0, 0, 0], + segmentationId: 'SEGMENTATION_ID', + representation: { + type: csToolsEnums.SegmentationRepresentations.Labelmap, + data: { + imageIds: segImages.map((it) => it.imageId), + }, }, }, + ]); + + // Add the segmentation representation to the viewport + await segmentation.addSegmentationRepresentations(viewportId, [ { - viewportId: viewportId3, - type: ViewportType.ORTHOGRAPHIC, - element: element3, - defaultOptions: { - orientation: Enums.OrientationAxis.CORONAL, - background: [0, 0, 0], - }, + segmentationId: 'SEGMENTATION_ID', + type: csToolsEnums.SegmentationRepresentations.Labelmap, }, - ]; - - renderingEngine.setViewports(viewportInputArray); - - toolGroup.addViewport(viewportId1, renderingEngineId); - toolGroup.addViewport(viewportId2, renderingEngineId); - toolGroup.addViewport(viewportId3, renderingEngineId); + ]); - viewports.push(...renderingEngine.getViewports()); + // Add brush size slider + addBrushSizeSlider({ + toolGroupId, + }); - // Set the volume to load - volume.load(); + cornerstoneTools.utilities.stackContextPrefetch.enable(element); - // Set volumes on the viewports - await setVolumesForViewports( - renderingEngine, - [{ volumeId, callback: setCtTransferFunctionForVolumeActor }], - [viewportId1, viewportId2, viewportId3] + // Add segmentation modified callback + eventTarget.addEventListener( + Events.SEGMENTATION_DATA_MODIFIED, + segmentationModifiedCallback ); - const segmentationRepresentation = [ - { - segmentationId, - }, - ]; - // Add the segmentation representation to the toolgroup - await segmentation.addLabelmapRepresentationToViewportMap({ - [viewportId1]: segmentationRepresentation, - [viewportId2]: segmentationRepresentation, - [viewportId3]: segmentationRepresentation, - }); - - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, DEFAULT_BRUSH_SIZE); - // Render the image renderingEngine.render(); } diff --git a/packages/tools/examples/stackLabelmapSegmentation/index.ts b/packages/tools/examples/stackLabelmapSegmentation/index.ts index 739c3b7f5..1b89cbbdc 100644 --- a/packages/tools/examples/stackLabelmapSegmentation/index.ts +++ b/packages/tools/examples/stackLabelmapSegmentation/index.ts @@ -84,7 +84,8 @@ const brushInstanceNames = { CircularBrush: 'CircularBrush', SphereBrush: 'SphereBrush', CircularEraser: 'CircularEraser', - ThresholdBrush: 'ThresholdBrush', + ThresholdBrushCircle: 'ThresholdBrushCircle', + ThresholdBrushSphere: 'ThresholdBrushSphere', DynamicThreshold: 'DynamicThreshold', }; @@ -92,7 +93,8 @@ const brushStrategies = { [brushInstanceNames.CircularBrush]: 'FILL_INSIDE_CIRCLE', [brushInstanceNames.SphereBrush]: 'FILL_INSIDE_SPHERE', [brushInstanceNames.CircularEraser]: 'ERASE_INSIDE_CIRCLE', - [brushInstanceNames.ThresholdBrush]: 'THRESHOLD_INSIDE_CIRCLE', + [brushInstanceNames.ThresholdBrushCircle]: 'THRESHOLD_INSIDE_CIRCLE', + [brushInstanceNames.ThresholdBrushSphere]: 'THRESHOLD_INSIDE_SPHERE', [brushInstanceNames.DynamicThreshold]: 'THRESHOLD_INSIDE_CIRCLE', }; @@ -100,7 +102,14 @@ const brushValues = [ brushInstanceNames.CircularBrush, brushInstanceNames.SphereBrush, brushInstanceNames.CircularEraser, - brushInstanceNames.ThresholdBrush, + brushInstanceNames.ThresholdBrushCircle, + brushInstanceNames.ThresholdBrushSphere, + brushInstanceNames.DynamicThreshold, +]; + +const thresholdBrushValues = [ + brushInstanceNames.ThresholdBrushCircle, + brushInstanceNames.ThresholdBrushSphere, brushInstanceNames.DynamicThreshold, ]; @@ -155,19 +164,24 @@ addDropdownToToolbar({ // Set the currently active tool disabled const toolName = toolGroup.getActivePrimaryMouseButtonTool(); - if (toolName) { toolGroup.setToolDisabled(toolName); } + // Show/hide threshold dropdown based on selected tool + const thresholdDropdown = document.getElementById('thresholdDropdown'); + if (thresholdDropdown) { + thresholdDropdown.style.display = thresholdBrushValues.includes(name) + ? 'block' + : 'none'; + } + if (brushValues.includes(name)) { toolGroup.setToolActive(name, { bindings: [{ mouseButton: MouseBindings.Primary }], }); } else { - const toolName = name; - - toolGroup.setToolActive(toolName, { + toolGroup.setToolActive(name, { bindings: [{ mouseButton: MouseBindings.Primary }], }); } @@ -194,7 +208,7 @@ addDropdownToToolbar({ segmentationUtils.setBrushThresholdForToolGroup(toolGroupId, threshold); }, -}); +}).style.display = 'none'; addButtonToToolbar({ title: 'Create New Segmentation on Current Image', @@ -244,7 +258,6 @@ addDropdownToToolbar({ options: { values: segmentationIds, defaultValue: '' }, onSelectedValueChange: (nameAsStringOrNumber) => { const name = String(nameAsStringOrNumber); - const index = segmentationIds.indexOf(name); segmentation.activeSegmentation.setActiveSegmentation(viewportId, name); // Update the dropdown @@ -298,25 +311,20 @@ function setupTools(toolGroupId) { activeStrategy: brushStrategies.CircularEraser, } ); + toolGroup.addToolInstance( - brushInstanceNames.ThresholdBrush, + brushInstanceNames.ThresholdBrushCircle, BrushTool.toolName, { - activeStrategy: brushStrategies.ThresholdBrush, + activeStrategy: brushStrategies.ThresholdBrushCircle, } ); + toolGroup.addToolInstance( - brushInstanceNames.DynamicThreshold, + brushInstanceNames.ThresholdBrushSphere, BrushTool.toolName, { - activeStrategy: brushStrategies.DynamicThreshold, - preview: { - enabled: true, - }, - strategySpecificConfiguration: { - useCenterSegmentIndex: true, - THRESHOLD: { isDynamic: true, dynamicRadius: 3 }, - }, + activeStrategy: brushStrategies.ThresholdBrushSphere, } ); diff --git a/packages/tools/examples/stackRange/index.ts b/packages/tools/examples/stackRange/index.ts index bb6e5dfe1..02b7be9c2 100644 --- a/packages/tools/examples/stackRange/index.ts +++ b/packages/tools/examples/stackRange/index.ts @@ -180,6 +180,17 @@ addButtonToToolbar({ }, }); +addButtonToToolbar({ + id: 'Toggle Point', + title: 'Toggle Point', + onClick() { + const annotation = getActiveAnnotation(); + if (annotation) { + KeyImageTool.setPoint(annotation); + } + }, +}); + function annotationModifiedListener(evt) { updateAnnotationDiv( evt.detail.annotation?.annotationUID || diff --git a/packages/tools/examples/videoSegmentation/index.ts b/packages/tools/examples/videoSegmentation/index.ts index 08839726f..a8dceb0e1 100644 --- a/packages/tools/examples/videoSegmentation/index.ts +++ b/packages/tools/examples/videoSegmentation/index.ts @@ -165,9 +165,10 @@ function setupTools(toolGroupId) { preview: { enabled: true, }, - strategySpecificConfiguration: { - useCenterSegmentIndex: true, - THRESHOLD: { isDynamic: true, dynamicRadius: 3 }, + useCenterSegmentIndex: true, + threshold: { + isDynamic: true, + dynamicRadius: 3, }, } ); diff --git a/packages/tools/package.json b/packages/tools/package.json index f801d60a9..9b5a8b39e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "2.19.16", + "version": "3.0.0-beta.6", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^2.19.16", + "@cornerstonejs/core": "^3.0.0-beta.6", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/packages/tools/src/config.ts b/packages/tools/src/config.ts new file mode 100644 index 000000000..778b2fbda --- /dev/null +++ b/packages/tools/src/config.ts @@ -0,0 +1,106 @@ +import type { ContourSegmentationData } from './types'; +import type { Types } from '@cornerstonejs/core'; +import type { LabelmapSegmentationData } from './types/LabelmapTypes'; +import type { SurfaceSegmentationData } from './types/SurfaceTypes'; +import type SegmentationRepresentations from './enums/SegmentationRepresentations'; + +/** + * Options for converting between segmentation representations using PolySeg + * set + */ +export type PolySegConversionOptions = { + /** Optional array of segment indices to convert */ + segmentIndices?: number[]; + /** ID of the segmentation to convert */ + segmentationId?: string; + /** Viewport to use for conversion */ + viewport?: Types.IStackViewport | Types.IVolumeViewport; +}; + +/** + * Interface for the PolySeg add-on that handles segmentation representation conversions + */ +type ComputeRepresentationFn = ( + segmentationId: string, + options: PolySegConversionOptions +) => Promise; + +type PolySegAddOn = { + /** Checks if a representation type can be computed for a segmentation */ + canComputeRequestedRepresentation: ( + segmentationId: string, + representationType: SegmentationRepresentations + ) => boolean; + + /** Initializes the PolySeg add-on */ + init: () => void; + + /** Computes different segmentation representation data */ + computeContourData: ComputeRepresentationFn; + computeLabelmapData: ComputeRepresentationFn; + computeSurfaceData: ComputeRepresentationFn; + + /** Updates different segmentation representation data */ + updateSurfaceData: ComputeRepresentationFn; +}; + +/** + * Available add-ons that can be configured + */ +type AddOns = { + polySeg: PolySegAddOn; +}; + +/** + * Configuration type containing add-ons + */ +export type Config = { + addons: AddOns; +}; + +let config = {} as Config; + +/** + * Gets the current configuration + */ +export function getConfig(): Config { + return config; +} + +/** + * Sets a new configuration + */ +export function setConfig(newConfig: Config): void { + config = newConfig; +} + +/** + * Gets configured add-ons + */ +export function getAddOns(): AddOns { + return config.addons; +} + +let polysegInitialized = false; + +/** + * Gets the PolySeg add-on, initializing it if needed + * @returns The PolySeg add-on instance or null if not configured + */ +export function getPolySeg() { + if (!config.addons?.polySeg) { + console.warn( + 'PolySeg add-on not configured. This will prevent automatic conversion between segmentation representations (labelmap, contour, surface). To enable these features, install @cornerstonejs/polymorphic-segmentation and register it during initialization: cornerstoneTools.init({ addons: { polySeg } }).' + ); + + return null; + } + + const polyseg = config.addons.polySeg; + if (!polysegInitialized) { + polyseg.init(); + polysegInitialized = true; + } + + return polyseg; +} diff --git a/packages/tools/src/enums/StrategyCallbacks.ts b/packages/tools/src/enums/StrategyCallbacks.ts index 36ad22d14..dc43217ec 100644 --- a/packages/tools/src/enums/StrategyCallbacks.ts +++ b/packages/tools/src/enums/StrategyCallbacks.ts @@ -63,6 +63,12 @@ enum StrategyCallbacks { /** Compute statistics on this instance */ GetStatistics = 'getStatistics', + + /** Handle stack viewport sphere brush overrides */ + EnsureImageVolumeFor3DManipulation = 'ensureImageVolumeFor3DManipulation', + + /** Handle stack image reference for 3D manipulation */ + EnsureSegmentationVolumeFor3DManipulation = 'ensureSegmentationVolumeFor3DManipulation', } export default StrategyCallbacks; diff --git a/packages/tools/src/enums/WorkerTypes.ts b/packages/tools/src/enums/WorkerTypes.ts index bf1660f92..9afc93ac0 100644 --- a/packages/tools/src/enums/WorkerTypes.ts +++ b/packages/tools/src/enums/WorkerTypes.ts @@ -11,6 +11,10 @@ enum ChangeTypes { POLYSEG_LABELMAP_TO_SURFACE = 'Converting Labelmap to Surface', SURFACE_CLIPPING = 'Clipping Surfaces', + + COMPUTE_STATISTICS = 'Computing Statistics', + + INTERPOLATE_LABELMAP = 'Interpolating Labelmap', } export default ChangeTypes; diff --git a/packages/tools/src/init.ts b/packages/tools/src/init.ts index ecd942684..77f0de492 100644 --- a/packages/tools/src/init.ts +++ b/packages/tools/src/init.ts @@ -16,6 +16,8 @@ import { annotationInterpolationEventDispatcher } from './eventDispatchers'; import * as ToolGroupManager from './store/ToolGroupManager'; import { defaultSegmentationStateManager } from './stateManagement/segmentation/SegmentationStateManager'; import segmentationRepresentationModifiedListener from './eventListeners/segmentation/segmentationRepresentationModifiedListener'; +import { setConfig } from './config'; +import type { Config } from './config'; let csToolsInitialized = false; @@ -25,11 +27,13 @@ let csToolsInitialized = false; * @param defaultConfiguration - A configuration object that will be used to * initialize the tool. */ -export function init(defaultConfiguration = {}): void { +export function init(defaultConfiguration = {} as Config): void { if (csToolsInitialized) { return; } + setConfig(defaultConfiguration); + _addCornerstoneEventListeners(); _addCornerstoneToolsEventListeners(); diff --git a/packages/tools/src/stateManagement/annotation/helpers/state.ts b/packages/tools/src/stateManagement/annotation/helpers/state.ts index ce96dd711..4347c5182 100644 --- a/packages/tools/src/stateManagement/annotation/helpers/state.ts +++ b/packages/tools/src/stateManagement/annotation/helpers/state.ts @@ -95,14 +95,16 @@ function triggerAnnotationRemoved( /** * Triggers an annotation modified event. + * Note this no longer requires the element, which should be handled by testing + * to see which viewports this element is shown on. */ function triggerAnnotationModified( annotation: Annotation, - element: HTMLDivElement, + element?: HTMLDivElement, changeType = ChangeTypes.HandlesUpdated ): void { - const enabledElement = getEnabledElement(element); - const { viewportId, renderingEngineId } = enabledElement; + const enabledElement = element && getEnabledElement(element); + const { viewportId, renderingEngineId } = enabledElement || {}; const eventType = Events.ANNOTATION_MODIFIED; const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts b/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts index a3186393b..845ca14d2 100644 --- a/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +++ b/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts @@ -102,7 +102,7 @@ function normalizeSurfaceSegments( surfaceData: SurfaceSegmentationData ): void { const { geometryIds } = surfaceData; - geometryIds.forEach((geometryId) => { + geometryIds?.forEach((geometryId) => { const geometry = cache.getGeometry(geometryId); if (geometry?.data) { const { segmentIndex } = geometry.data; diff --git a/packages/tools/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts b/packages/tools/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts index d7b733f63..5dcfc67b3 100644 --- a/packages/tools/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +++ b/packages/tools/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts @@ -1,6 +1,6 @@ import * as Enums from '../../../enums'; import type { SegmentationPublicInput } from '../../../types/SegmentationStateTypes'; -import { validatePublic as validatePublicLabelmap } from '../../../tools/displayTools/Labelmap/validateLabelmap'; +import { validatePublic as validatePublicLabelmap } from '../../../utilities/segmentation/validateLabelmap'; /** * Validates the given segmentationInputArray to ensure it contains diff --git a/packages/tools/src/stateManagement/segmentation/index.ts b/packages/tools/src/stateManagement/segmentation/index.ts index 6542417cb..1c5e879ef 100644 --- a/packages/tools/src/stateManagement/segmentation/index.ts +++ b/packages/tools/src/stateManagement/segmentation/index.ts @@ -28,17 +28,17 @@ import * as segmentIndex from './segmentIndex'; import * as triggerSegmentationEvents from './triggerSegmentationEvents'; import { convertStackToVolumeLabelmap } from './helpers/convertStackToVolumeLabelmap'; import { computeVolumeLabelmapFromStack } from './helpers/computeVolumeLabelmapFromStack'; -import * as polySegManager from './polySeg'; import { clearSegmentValue } from './helpers/clearSegmentValue'; import { convertVolumeToStackLabelmap } from './helpers/computeStackLabelmapFromVolume'; import { removeSegment } from './removeSegment'; import { getLabelmapImageIds } from './getLabelmapImageIds'; import * as strategies from './../../tools/segmentation/strategies'; - import { removeAllSegmentations, removeSegmentation, } from './removeSegmentation'; +import { segmentationStyle } from './SegmentationStyle'; +import { defaultSegmentationStateManager } from './SegmentationStateManager'; const helpers = { clearSegmentValue, @@ -74,9 +74,10 @@ export { segmentIndex, triggerSegmentationEvents, helpers, - polySegManager as polySeg, removeSegment, getLabelmapImageIds, addRepresentationData, strategies, + segmentationStyle, + defaultSegmentationStateManager, }; diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/computeAndAddContourRepresentation.ts b/packages/tools/src/stateManagement/segmentation/polySeg/Contour/computeAndAddContourRepresentation.ts deleted file mode 100644 index 513f8a8a8..000000000 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Contour/computeAndAddContourRepresentation.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { SegmentationRepresentations } from '../../../../enums'; -import type { PolySegConversionOptions } from '../../../../types'; -import { computeAndAddRepresentation } from '../computeAndAddRepresentation'; -import { computeContourData } from './contourComputationStrategies'; - -/** - * Computes and adds the contour representation for a given segmentation. - * - * @param segmentationId - The id of the segmentation - * @param options - Optional parameters for computing the contour representation - * @returns A promise that resolves when the contour representation is computed and added - */ -export function computeAndAddContourRepresentation( - segmentationId: string, - options: PolySegConversionOptions = {} -) { - return computeAndAddRepresentation( - segmentationId, - SegmentationRepresentations.Contour, - () => computeContourData(segmentationId, options), - () => undefined - ); -} diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/computeAndAddLabelmapRepresentation.ts b/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/computeAndAddLabelmapRepresentation.ts deleted file mode 100644 index e38c9bf94..000000000 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Labelmap/computeAndAddLabelmapRepresentation.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { SegmentationRepresentations } from '../../../../enums'; -import { computeAndAddRepresentation } from '../computeAndAddRepresentation'; -import { computeLabelmapData } from './labelmapComputationStrategies'; -import type { PolySegConversionOptions } from '../../../../types'; -import { defaultSegmentationStateManager } from '../../SegmentationStateManager'; -import { triggerSegmentationDataModified } from '../../triggerSegmentationEvents'; - -/** - * Computes and adds the labelmap representation for a given segmentation. - * - * @param segmentationId - The id of the segmentation - * @param options - Optional parameters for computing the labelmap representation - * @returns A promise that resolves when the labelmap representation is computed and added - */ -export async function computeAndAddLabelmapRepresentation( - segmentationId: string, - options: PolySegConversionOptions = {} -) { - return computeAndAddRepresentation( - segmentationId, - SegmentationRepresentations.Labelmap, - () => computeLabelmapData(segmentationId, options), - () => null, - () => { - defaultSegmentationStateManager.processLabelmapRepresentationAddition( - options.viewport.id, - segmentationId - ); - - /// need to figure out how to trigger the labelmap update properly - setTimeout(() => { - triggerSegmentationDataModified(segmentationId); - }, 0); - } - ); -} diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/computeAndAddSurfaceRepresentation.ts b/packages/tools/src/stateManagement/segmentation/polySeg/Surface/computeAndAddSurfaceRepresentation.ts deleted file mode 100644 index 63d413ae4..000000000 --- a/packages/tools/src/stateManagement/segmentation/polySeg/Surface/computeAndAddSurfaceRepresentation.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { SegmentationRepresentations } from '../../../../enums'; -import type { PolySegConversionOptions } from '../../../../types'; -import { computeAndAddRepresentation } from '../computeAndAddRepresentation'; -import { computeSurfaceData } from './surfaceComputationStrategies'; -import { updateSurfaceData } from './updateSurfaceData'; - -/** - * Computes and adds a surface representation for a given segmentation. - * - * @param segmentationId - The id of the segmentation - * @param options - Optional parameters for computing the surface representation - * @returns A promise that resolves when the surface representation is computed and added - */ -export function computeAndAddSurfaceRepresentation( - segmentationId: string, - options: PolySegConversionOptions = {} -) { - return computeAndAddRepresentation( - segmentationId, - SegmentationRepresentations.Surface, - () => computeSurfaceData(segmentationId, options), - () => updateSurfaceData(segmentationId) - ); -} diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/index.ts b/packages/tools/src/stateManagement/segmentation/polySeg/index.ts deleted file mode 100644 index bbcdcdd63..000000000 --- a/packages/tools/src/stateManagement/segmentation/polySeg/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { computeAndAddSurfaceRepresentation } from './Surface/computeAndAddSurfaceRepresentation'; -import { computeAndAddLabelmapRepresentation } from './Labelmap/computeAndAddLabelmapRepresentation'; -import { computeAndAddContourRepresentation } from './Contour/computeAndAddContourRepresentation'; -import { canComputeRequestedRepresentation } from './canComputeRequestedRepresentation'; - -export { - canComputeRequestedRepresentation, - // computed representations - computeAndAddSurfaceRepresentation, - computeAndAddLabelmapRepresentation, - computeAndAddContourRepresentation, -}; diff --git a/packages/tools/src/tools/CrosshairsTool.ts b/packages/tools/src/tools/CrosshairsTool.ts index ed2244c8a..869dabb0d 100644 --- a/packages/tools/src/tools/CrosshairsTool.ts +++ b/packages/tools/src/tools/CrosshairsTool.ts @@ -109,9 +109,6 @@ class CrosshairsTool extends AnnotationTool { _getReferenceLineControllable?: (viewportId: string) => boolean; _getReferenceLineDraggableRotatable?: (viewportId: string) => boolean; _getReferenceLineSlabThicknessControlsOn?: (viewportId: string) => boolean; - editData: { - annotation: Annotation; - } | null; constructor( toolProps: PublicToolProps = {}, diff --git a/packages/tools/src/tools/annotation/KeyImageTool.ts b/packages/tools/src/tools/annotation/KeyImageTool.ts index 61dbd7982..8705f3adc 100644 --- a/packages/tools/src/tools/annotation/KeyImageTool.ts +++ b/packages/tools/src/tools/annotation/KeyImageTool.ts @@ -13,21 +13,27 @@ import { triggerAnnotationCompleted, triggerAnnotationModified, } from '../../stateManagement/annotation/helpers/state'; -import { drawArrow as drawArrowSvg } from '../../drawingSvg'; +import { + drawArrow as drawArrowSvg, + drawHandles as drawHandlesSvg, +} from '../../drawingSvg'; import { state } from '../../store/state'; import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters'; import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds'; -import { resetElementCursor } from '../../cursors/elementCursor'; +import { + resetElementCursor, + hideElementCursor, +} from '../../cursors/elementCursor'; import type { EventTypes, - ToolHandle, PublicToolProps, ToolProps, SVGDrawingHelper, Annotation, } from '../../types'; +import type { KeyImageAnnotation } from '../../types/ToolSpecificAnnotationTypes'; import type { StyleSpecifier } from '../../types/AnnotationStyle'; type Point2 = Types.Point2; @@ -35,17 +41,23 @@ type Point2 = Types.Point2; class KeyImageTool extends AnnotationTool { static toolName = 'KeyImage'; + /** A mix in data element to set the series level annotation */ + public static dataSeries = { + data: { + seriesLevel: true, + }, + }; + + /** A mix in data element to set the point to be true. That renders as a point + * on the image rather than just selecting the image itself + */ + public static dataPoint = { + data: { + isPoint: true, + }, + }; + _throttledCalculateCachedStats: Function; - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - isDrawing: boolean; - isHandleOutsideImage: boolean; constructor( toolProps: PublicToolProps = {}, @@ -56,6 +68,11 @@ class KeyImageTool extends AnnotationTool { changeTextCallback, canvasPosition: [10, 10], canvasSize: 10, + handleRadius: '6', + /** If true, this selects the entire series/display set */ + seriesLevel: false, + /** If true, shows the point selected */ + isPoint: false, }, } ) { @@ -72,13 +89,20 @@ class KeyImageTool extends AnnotationTool { */ addNewAnnotation = (evt: EventTypes.InteractionEventType) => { const eventDetail = evt.detail; - const { element } = eventDetail; + const { element, currentPoints } = eventDetail; const enabledElement = getEnabledElement(element); const { viewport } = enabledElement; + const worldPos = currentPoints.world; const annotation = (( this.constructor - )).createAnnotationForViewport(viewport); + )).createAnnotationForViewport(viewport, { + data: { + handles: { points: [[...worldPos]] }, + seriesLevel: this.configuration.seriesLevel, + isPoint: this.configuration.isPoint, + }, + }); addAnnotation(annotation, element); @@ -110,10 +134,6 @@ class KeyImageTool extends AnnotationTool { return annotation; }; - public cancel() { - // No op - the annotation can't be in a partial state - } - /** * It returns if the canvas point is near the provided length annotation in the provided * element or not. A proximity is passed to the function to determine the @@ -135,6 +155,10 @@ class KeyImageTool extends AnnotationTool { const { viewport } = enabledElement; const { data } = annotation; + if (!data?.isPoint) { + return false; + } + const { canvasPosition, canvasSize } = this.configuration; if (!canvasPosition?.length) { return false; @@ -161,20 +185,79 @@ class KeyImageTool extends AnnotationTool { handleSelectedCallback( evt: EventTypes.InteractionEventType, - annotation: Annotation, - handle: ToolHandle + annotation: KeyImageAnnotation ): void { - // Nothing special to do here. + const eventDetail = evt.detail; + const { element } = eventDetail; + + annotation.highlighted = true; + + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + + // Find viewports to render on drag. + + this.editData = { + //handle, // This would be useful for other tools with more than one handle + annotation, + viewportIdsToRender, + }; + this._activateModify(element); + + hideElementCursor(element); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + evt.preventDefault(); + } + + public static setPoint( + annotation, + isPoint: boolean = !annotation.data.isPoint, + element? + ) { + annotation.data.isPoint = isPoint; + triggerAnnotationModified(annotation, element); } _endCallback = (evt: EventTypes.InteractionEventType): void => { const eventDetail = evt.detail; const { element } = eventDetail; - this.doneEditMemo(); + const { annotation, viewportIdsToRender, newAnnotation } = this.editData; + + const { viewportId, renderingEngine } = getEnabledElement(element); + this.eventDispatchDetail = { + viewportId, + renderingEngineId: renderingEngine.id, + }; this._deactivateModify(element); + resetElementCursor(element); + + if (newAnnotation) { + this.createMemo(element, annotation, { newAnnotation }); + } + + this.editData = null; + this.isDrawing = false; + this.doneEditMemo(); + + if ( + this.isHandleOutsideImage && + this.configuration.preventHandleOutsideImage + ) { + removeAnnotation(annotation.annotationUID); + } + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + if (newAnnotation) { + triggerAnnotationCompleted(annotation); + } }; doubleClickCallback = (evt: EventTypes.TouchTapEventType): void => { @@ -226,9 +309,6 @@ class KeyImageTool extends AnnotationTool { _doneChangingTextCallback(element, annotation, updatedText): void { annotation.data.text = updatedText; - const enabledElement = getEnabledElement(element); - const { renderingEngine } = enabledElement; - const viewportIdsToRender = getViewportIdsWithToolToRender( element, this.getToolName() @@ -239,48 +319,69 @@ class KeyImageTool extends AnnotationTool { triggerAnnotationModified(annotation, element); } - _activateModify = (element: HTMLDivElement) => { + _dragCallback = (evt) => { + this.isDrawing = true; + const eventDetail = evt.detail; + const { currentPoints, element } = eventDetail; + const worldPos = currentPoints.world; + + const { annotation, viewportIdsToRender, newAnnotation } = this.editData; + const { data } = annotation; + + this.createMemo(element, annotation, { newAnnotation }); + + data.handles.points[0] = [...worldPos] as Types.Point3; + annotation.invalidated = true; + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + }; + + public cancel(element: HTMLDivElement) { + // If it is mid-draw or mid-modify + if (this.isDrawing) { + this.isDrawing = false; + this._deactivateModify(element); + resetElementCursor(element); + + const { annotation, viewportIdsToRender, newAnnotation } = this.editData; + const { data } = annotation; + + annotation.highlighted = false; + data.handles.activeHandleIndex = null; + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + if (newAnnotation) { + triggerAnnotationCompleted(annotation); + } + + this.editData = null; + return annotation.annotationUID; + } + } + + _activateModify = (element) => { state.isInteractingWithTool = true; - element.addEventListener( - Events.MOUSE_UP, - this._endCallback as EventListener - ); - element.addEventListener( - Events.MOUSE_CLICK, - this._endCallback as EventListener - ); + element.addEventListener(Events.MOUSE_UP, this._endCallback); + element.addEventListener(Events.MOUSE_DRAG, this._dragCallback); + element.addEventListener(Events.MOUSE_CLICK, this._endCallback); - element.addEventListener( - Events.TOUCH_TAP, - this._endCallback as EventListener - ); - element.addEventListener( - Events.TOUCH_END, - this._endCallback as EventListener - ); + element.addEventListener(Events.TOUCH_END, this._endCallback); + element.addEventListener(Events.TOUCH_DRAG, this._dragCallback); + element.addEventListener(Events.TOUCH_TAP, this._endCallback); }; - _deactivateModify = (element: HTMLDivElement) => { + _deactivateModify = (element) => { state.isInteractingWithTool = false; - element.removeEventListener( - Events.MOUSE_UP, - this._endCallback as EventListener - ); - element.removeEventListener( - Events.MOUSE_CLICK, - this._endCallback as EventListener - ); + element.removeEventListener(Events.MOUSE_UP, this._endCallback); + element.removeEventListener(Events.MOUSE_DRAG, this._dragCallback); + element.removeEventListener(Events.MOUSE_CLICK, this._endCallback); - element.removeEventListener( - Events.TOUCH_TAP, - this._endCallback as EventListener - ); - element.removeEventListener( - Events.TOUCH_END, - this._endCallback as EventListener - ); + element.removeEventListener(Events.TOUCH_END, this._endCallback); + element.removeEventListener(Events.TOUCH_DRAG, this._dragCallback); + element.removeEventListener(Events.TOUCH_TAP, this._endCallback); }; /** @@ -324,18 +425,33 @@ class KeyImageTool extends AnnotationTool { // Draw SVG for (let i = 0; i < annotations.length; i++) { const annotation = annotations[i]; - const { annotationUID } = annotation; + const { annotationUID, data } = annotation; styleSpecifier.annotationUID = annotationUID; - const { color } = this.getAnnotationStyle({ + const { color, lineWidth } = this.getAnnotationStyle({ annotation, styleSpecifier, }); const { canvasPosition, canvasSize } = this.configuration; - if (canvasPosition?.length) { - const arrowUID = '1'; + const arrowUID = '1'; + if (data?.isPoint) { + const point = data.handles.points[0]; + const canvasCoordinates = viewport.worldToCanvas(point); + + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + arrowUID, + [canvasCoordinates], + { + color, + lineWidth, + handleRadius: this.configuration.handleRadius, + } + ); + } else if (canvasPosition?.length) { drawArrowSvg( svgDrawingHelper, annotationUID, diff --git a/packages/tools/src/tools/annotation/ProbeTool.ts b/packages/tools/src/tools/annotation/ProbeTool.ts index 013ea23c6..fdf047b1e 100644 --- a/packages/tools/src/tools/annotation/ProbeTool.ts +++ b/packages/tools/src/tools/annotation/ProbeTool.ts @@ -39,7 +39,6 @@ import type { ToolHandle, PublicToolProps, SVGDrawingHelper, - Annotation, } from '../../types'; import type { ProbeAnnotation } from '../../types/ToolSpecificAnnotationTypes'; import type { StyleSpecifier } from '../../types/AnnotationStyle'; @@ -94,18 +93,6 @@ const { transformWorldToIndex } = csUtils; class ProbeTool extends AnnotationTool { static toolName = 'Probe'; - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - newAnnotation?: boolean; - } | null; - eventDispatchDetail: { - viewportId: string; - renderingEngineId: string; - }; - isDrawing: boolean; - isHandleOutsideImage: boolean; - public static probeDefaults = { supportedInteractionTypes: ['Mouse', 'Touch'], configuration: { diff --git a/packages/tools/src/tools/base/AnnotationTool.ts b/packages/tools/src/tools/base/AnnotationTool.ts index 12e82f77e..db9d22a61 100644 --- a/packages/tools/src/tools/base/AnnotationTool.ts +++ b/packages/tools/src/tools/base/AnnotationTool.ts @@ -51,6 +51,21 @@ const { PointsManager } = csUtils; * abstract methods. */ abstract class AnnotationTool extends AnnotationDisplayTool { + protected eventDispatchDetail: { + viewportId: string; + renderingEngineId: string; + }; + isDrawing: boolean; + isHandleOutsideImage: boolean; + editData: { + annotation: Annotation; + viewportIdsToRender?: string[]; + newAnnotation?: boolean; + handleIndex?: number; + movingTextBox?: boolean; + hasMoved?: boolean; + } | null; + /** * Creates a base annotation object, adding in any annotation base data provided */ diff --git a/packages/tools/src/tools/displayTools/Contour/contourDisplay.ts b/packages/tools/src/tools/displayTools/Contour/contourDisplay.ts index 8545f30a3..4f2fd5cd3 100644 --- a/packages/tools/src/tools/displayTools/Contour/contourDisplay.ts +++ b/packages/tools/src/tools/displayTools/Contour/contourDisplay.ts @@ -4,10 +4,10 @@ import { getEnabledElementByViewportId } from '@cornerstonejs/core'; import Representations from '../../../enums/SegmentationRepresentations'; import { handleContourSegmentation } from './contourHandler/handleContourSegmentation'; import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation'; -import { canComputeRequestedRepresentation } from '../../../stateManagement/segmentation/polySeg/canComputeRequestedRepresentation'; -import { computeAndAddContourRepresentation } from '../../../stateManagement/segmentation/polySeg/Contour/computeAndAddContourRepresentation'; import type { ContourRepresentation } from '../../../types/SegmentationStateTypes'; import removeContourFromElement from './removeContourFromElement'; +import { getPolySeg } from '../../../config'; +import { computeAndAddRepresentation } from '../../../utilities/segmentation/computeAndAddRepresentation'; let polySegConversionInProgress = false; @@ -71,7 +71,7 @@ async function render( if ( !contourData && - canComputeRequestedRepresentation( + getPolySeg()?.canComputeRequestedRepresentation( segmentationId, Representations.Contour ) && @@ -79,11 +79,20 @@ async function render( ) { polySegConversionInProgress = true; - contourData = await computeAndAddContourRepresentation(segmentationId, { - viewport, - }); + const polySeg = getPolySeg(); + + contourData = await computeAndAddRepresentation( + segmentationId, + Representations.Contour, + () => polySeg.computeContourData(segmentationId, { viewport }), + () => undefined + ); polySegConversionInProgress = false; + } else if (!contourData && !getPolySeg()) { + console.debug( + `No contour data found for segmentationId ${segmentationId} and PolySeg add-on is not configured. Unable to convert from other representations to contour. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.` + ); } if (!contourData) { diff --git a/packages/tools/src/tools/displayTools/Labelmap/index.ts b/packages/tools/src/tools/displayTools/Labelmap/index.ts index 071711dad..755409555 100644 --- a/packages/tools/src/tools/displayTools/Labelmap/index.ts +++ b/packages/tools/src/tools/displayTools/Labelmap/index.ts @@ -3,7 +3,7 @@ import labelmapConfig from './labelmapConfig'; import { validate as validateLabelmap, validatePublic as validateLabelmapPublic, -} from './validateLabelmap'; +} from '../../../utilities/segmentation/validateLabelmap'; export { labelmapDisplay, diff --git a/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts b/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts index 6e4e1ad96..43643c751 100644 --- a/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts +++ b/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts @@ -20,8 +20,6 @@ import { getActiveSegmentation } from '../../../stateManagement/segmentation/act import { getColorLUT } from '../../../stateManagement/segmentation/getColorLUT'; import { getCurrentLabelmapImageIdForViewport } from '../../../stateManagement/segmentation/getCurrentLabelmapImageIdForViewport'; import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation'; -import { canComputeRequestedRepresentation } from '../../../stateManagement/segmentation/polySeg/canComputeRequestedRepresentation'; -import { computeAndAddLabelmapRepresentation } from '../../../stateManagement/segmentation/polySeg/Labelmap/computeAndAddLabelmapRepresentation'; import type vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; import type vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction'; import { segmentationStyle } from '../../../stateManagement/segmentation/SegmentationStyle'; @@ -30,6 +28,10 @@ import { internalGetHiddenSegmentIndices } from '../../../stateManagement/segmen import { getActiveSegmentIndex } from '../../../stateManagement/segmentation/getActiveSegmentIndex'; import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; import { getLabelmapActorEntry } from '../../../stateManagement/segmentation/helpers/getSegmentationActor'; +import { getPolySeg } from '../../../config'; +import { computeAndAddRepresentation } from '../../../utilities/segmentation/computeAndAddRepresentation'; +import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents'; +import { defaultSegmentationStateManager } from '../../../stateManagement/segmentation/SegmentationStateManager'; // 255 itself is used as preview color, so basically // we have 254 colors to use for the segments if we are using the preview. @@ -102,7 +104,7 @@ async function render( if ( !labelmapData && - canComputeRequestedRepresentation( + getPolySeg()?.canComputeRequestedRepresentation( segmentationId, SegmentationRepresentations.Labelmap ) && @@ -115,9 +117,25 @@ async function render( // underlying representations to Surface polySegConversionInProgress = true; - labelmapData = await computeAndAddLabelmapRepresentation(segmentationId, { - viewport, - }); + const polySeg = getPolySeg(); + + labelmapData = await computeAndAddRepresentation( + segmentationId, + SegmentationRepresentations.Labelmap, + () => polySeg.computeLabelmapData(segmentationId, { viewport }), + () => null, + () => { + defaultSegmentationStateManager.processLabelmapRepresentationAddition( + viewport.id, + segmentationId + ); + + /// need to figure out how to trigger the labelmap update properly + setTimeout(() => { + triggerSegmentationDataModified(segmentationId); + }, 0); + } + ); if (!labelmapData) { throw new Error( @@ -126,6 +144,10 @@ async function render( } polySegConversionInProgress = false; + } else if (!labelmapData && !getPolySeg()) { + console.debug( + `No labelmap data found for segmentationId ${segmentationId} and PolySeg add-on is not configured. Unable to convert from other representations to labelmap. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.` + ); } if (!labelmapData) { diff --git a/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts b/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts index b258d0557..de06cfb33 100644 --- a/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts +++ b/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts @@ -11,10 +11,9 @@ import removeSurfaceFromElement from './removeSurfaceFromElement'; import addOrUpdateSurfaceToElement from './addOrUpdateSurfaceToElement'; import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation'; import { getColorLUT } from '../../../stateManagement/segmentation/getColorLUT'; -import { canComputeRequestedRepresentation } from '../../../stateManagement/segmentation/polySeg/canComputeRequestedRepresentation'; -import { computeAndAddSurfaceRepresentation } from '../../../stateManagement/segmentation/polySeg/Surface/computeAndAddSurfaceRepresentation'; +import { getPolySeg } from '../../../config'; +import { computeAndAddRepresentation } from '../../../utilities/segmentation/computeAndAddRepresentation'; -const { ViewportType } = Enums; /** * It removes a segmentation representation from the tool group's viewports and * from the segmentation state @@ -68,19 +67,38 @@ async function render( if ( !SurfaceData && - canComputeRequestedRepresentation(segmentationId, Representations.Surface) + getPolySeg()?.canComputeRequestedRepresentation( + segmentationId, + Representations.Surface + ) ) { // we need to check if we can request polySEG to convert the other // underlying representations to Surface - SurfaceData = await computeAndAddSurfaceRepresentation(segmentationId, { - viewport, - }); + const polySeg = getPolySeg(); + + SurfaceData = await computeAndAddRepresentation( + segmentationId, + Representations.Surface, + () => polySeg.computeSurfaceData(segmentationId, { viewport }), + () => polySeg.updateSurfaceData(segmentationId, { viewport }) + ); if (!SurfaceData) { throw new Error( - `No Surface data found for segmentationId ${segmentationId}.` + `No Surface data found for segmentationId ${segmentationId} even we tried to compute it` ); } + } else if (!SurfaceData && !getPolySeg()) { + console.debug( + `No surface data found for segmentationId ${segmentationId} and PolySeg add-on is not configured. Unable to convert from other representations to surface. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.` + ); + } + + if (!SurfaceData) { + console.warn( + `No Surface data found for segmentationId ${segmentationId}. Skipping render.` + ); + return; } const { geometryIds } = SurfaceData; diff --git a/packages/tools/src/tools/segmentation/BrushTool.ts b/packages/tools/src/tools/segmentation/BrushTool.ts index 2482a991b..4723f1ee5 100644 --- a/packages/tools/src/tools/segmentation/BrushTool.ts +++ b/packages/tools/src/tools/segmentation/BrushTool.ts @@ -71,15 +71,8 @@ class BrushTool extends LabelmapBaseTool { THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL: thresholdInsideSphereIsland, }, - - strategySpecificConfiguration: { - THRESHOLD: { - threshold: [-150, -70], // E.g. CT Fat // Only used during threshold strategies. - }, - }, defaultStrategy: 'FILL_INSIDE_CIRCLE', activeStrategy: 'FILL_INSIDE_CIRCLE', - thresholdVolumeId: null, brushSize: 25, preview: { // Have to enable the preview to use this @@ -640,9 +633,7 @@ class BrushTool extends LabelmapBaseTool { } ); - const activeStrategy = this.configuration.activeStrategy; - const { dynamicRadiusInCanvas } = this.configuration - .strategySpecificConfiguration[activeStrategy] || { + const { dynamicRadiusInCanvas } = this.configuration?.threshold || { dynamicRadiusInCanvas: 0, }; diff --git a/packages/tools/src/tools/segmentation/CircleScissorsTool.ts b/packages/tools/src/tools/segmentation/CircleScissorsTool.ts index 7c1fa1bab..45c5cc85a 100644 --- a/packages/tools/src/tools/segmentation/CircleScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/CircleScissorsTool.ts @@ -297,7 +297,6 @@ class CircleScissorsTool extends LabelmapBaseTool { points: data.handles.points, viewPlaneNormal, viewUp, - strategySpecificConfiguration: {}, createMemo: this.createMemo.bind(this), }; diff --git a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts index 32542b19d..8154c209c 100644 --- a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts +++ b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts @@ -5,15 +5,11 @@ import { Enums, eventTarget, BaseVolumeViewport, - volumeLoader, } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; import { BaseTool } from '../base'; -import type { - LabelmapSegmentationDataStack, - LabelmapSegmentationDataVolume, -} from '../../types/LabelmapTypes'; +import type { LabelmapSegmentationDataVolume } from '../../types/LabelmapTypes'; import SegmentationRepresentations from '../../enums/SegmentationRepresentations'; import type vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import { getActiveSegmentation } from '../../stateManagement/segmentation/getActiveSegmentation'; @@ -21,7 +17,6 @@ import { getLockedSegmentIndices } from '../../stateManagement/segmentation/segm import { getSegmentation } from '../../stateManagement/segmentation/getSegmentation'; import { getClosestImageIdForStackViewport } from '../../utilities/annotationHydration'; import { getCurrentLabelmapImageIdForViewport } from '../../stateManagement/segmentation/getCurrentLabelmapImageIdForViewport'; -import { getStackSegmentationImageIdsForViewport } from '../../stateManagement/segmentation/getStackSegmentationImageIdsForViewport'; import { getSegmentIndexColor } from '../../stateManagement/segmentation/config/segmentationColor'; import { getActiveSegmentIndex } from '../../stateManagement/segmentation/getActiveSegmentIndex'; import { StrategyCallbacks } from '../../enums'; @@ -189,7 +184,6 @@ export default class LabelmapBaseTool extends BaseTool { representationData, segmentsLocked, segmentationId, - volumeOperation = false, }): EditDataReturnType { if (viewport instanceof BaseVolumeViewport) { const { volumeId } = representationData[ @@ -228,7 +222,8 @@ export default class LabelmapBaseTool extends BaseTool { return { volumeId, referencedVolumeId: - this.configuration.thresholdVolumeId ?? referencedVolumeIdToThreshold, + this.configuration.threshold?.volumeId ?? + referencedVolumeIdToThreshold, segmentsLocked, }; } else { @@ -243,67 +238,10 @@ export default class LabelmapBaseTool extends BaseTool { return; } - // I hate this, but what can you do sometimes - if ( - this.configuration.activeStrategy.includes('SPHERE') || - volumeOperation - ) { - const referencedImageIds = viewport.getImageIds(); - const isValidVolumeForSphere = - csUtils.isValidVolume(referencedImageIds); - - if (!isValidVolumeForSphere) { - throw new Error( - 'Volume is not reconstructable for sphere manipulation' - ); - } - - const volumeId = `${segmentationId}_${viewport.id}`; - const volume = cache.getVolume(volumeId); - if (volume) { - return { - imageId: segmentationImageId, - segmentsLocked, - override: { - voxelManager: volume.voxelManager, - imageData: volume.imageData, - }, - }; - } else { - // We don't need to call `getStackSegmentationImageIdsForViewport` here - // because we've already ensured the stack constructs a volume, - // making the scenario for multi-image non-consistent metadata is not likely. - const { imageIds: labelmapImageIds } = - representationData.Labelmap as LabelmapSegmentationDataStack; - - if (!labelmapImageIds || labelmapImageIds.length === 1) { - return { - imageId: segmentationImageId, - segmentsLocked, - }; - } - - // it will return the cached volume if it already exists - const volume = volumeLoader.createAndCacheVolumeFromImagesSync( - volumeId, - labelmapImageIds - ); - - return { - imageId: segmentationImageId, - segmentsLocked, - override: { - voxelManager: volume.voxelManager, - imageData: volume.imageData, - }, - }; - } - } else { - return { - imageId: segmentationImageId, - segmentsLocked, - }; - } + return { + imageId: segmentationImageId, + segmentsLocked, + }; } } @@ -389,8 +327,8 @@ export default class LabelmapBaseTool extends BaseTool { toolGroupId: this.toolGroupId, segmentationId, viewUp, - strategySpecificConfiguration: - this.configuration.strategySpecificConfiguration, + activeStrategy: this.configuration.activeStrategy, + configuration: this.configuration, // Provide the preview information so that data can be used directly preview: this._previewData?.preview, createMemo: this.createMemo.bind(this), diff --git a/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts b/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts index fa75ce983..87f2ffc8c 100644 --- a/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts @@ -318,7 +318,6 @@ class RectangleScissorsTool extends LabelmapBaseTool { const operationData = { ...this.editData, points: data.handles.points, - strategySpecificConfiguration: {}, createMemo: this.createMemo.bind(this), }; diff --git a/packages/tools/src/tools/segmentation/SphereScissorsTool.ts b/packages/tools/src/tools/segmentation/SphereScissorsTool.ts index 6bf7a82cf..d004d4eb6 100644 --- a/packages/tools/src/tools/segmentation/SphereScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/SphereScissorsTool.ts @@ -184,7 +184,6 @@ class SphereScissorsTool extends LabelmapBaseTool { representationData, segmentsLocked, segmentationId, - volumeOperation: true, }); this.editData = { diff --git a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts index 663dee7a0..f7f953a0f 100644 --- a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts +++ b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts @@ -33,8 +33,20 @@ export type InitializedOperationData = LabelmapToolOperationDataAny & { previewSegmentIndex?: number; brushStrategy: BrushStrategy; + activeStrategy: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any - configuration?: Record; + configuration?: { + [key: string]: unknown; + centerSegmentIndex?: { + segmentIndex: number; + }; + threshold?: { + range?: number[]; + isDynamic: boolean; + dynamicRadius: number; + dynamicRadiusInCanvas?: number; + }; + }; memo?: LabelmapMemo; }; @@ -66,13 +78,13 @@ export type Composition = CompositionFunction | CompositionInstance; * * These combine to form an actual brush: * - * Circle - convexFill, defaultSetValue, inEllipse/boundingbox ellipse, empty threshold - * Rectangle - - convexFill, defaultSetValue, inRectangle/boundingbox rectangle, empty threshold + * Circle - convexFill, defaultSetValue, inEllipse/bounding box ellipse, empty threshold + * Rectangle - - convexFill, defaultSetValue, inRectangle/bounding box rectangle, empty threshold * might also get parameter values from input, init for setup of convexFill * * The pieces are combined to generate a strategyFunction, which performs * the actual strategy operation, as well as various callbacks for the strategy - * to allow more control over behaviour in the specific strategy (such as displaying + * to allow more control over behavior in the specific strategy (such as displaying * preview) */ @@ -119,6 +131,13 @@ export default class BrushStrategy { [StrategyCallbacks.ComputeInnerCircleRadius]: addListMethod( StrategyCallbacks.ComputeInnerCircleRadius ), + [StrategyCallbacks.EnsureSegmentationVolumeFor3DManipulation]: + addListMethod( + StrategyCallbacks.EnsureSegmentationVolumeFor3DManipulation + ), + [StrategyCallbacks.EnsureImageVolumeFor3DManipulation]: addListMethod( + StrategyCallbacks.EnsureImageVolumeFor3DManipulation + ), [StrategyCallbacks.AddPreview]: addListMethod(StrategyCallbacks.AddPreview), [StrategyCallbacks.GetStatistics]: addSingletonMethod( StrategyCallbacks.GetStatistics @@ -182,13 +201,13 @@ export default class BrushStrategy { return; } - const { strategySpecificConfiguration = {}, centerIJK } = initializedData; + const { configuration = {}, centerIJK } = initializedData; // Store the center IJK location so that we can skip an immediate same-point update // TODO - move this to the BrushTool - if (csUtils.isEqual(centerIJK, strategySpecificConfiguration.centerIJK)) { + if (csUtils.isEqual(centerIJK, configuration.centerIJK)) { return operationData.preview; } else { - strategySpecificConfiguration.centerIJK = centerIJK; + configuration.centerIJK = centerIJK; } this._fill.forEach((func) => func(initializedData)); @@ -227,7 +246,9 @@ export default class BrushStrategy { operationName?: string ): InitializedOperationData { const { viewport } = enabledElement; - const data = getStrategyData({ operationData, viewport }); + + // pass in the strategy to getStrategyData + const data = getStrategyData({ operationData, viewport, strategy: this }); if (!data) { console.warn('No data found for BrushStrategy'); @@ -240,14 +261,10 @@ export default class BrushStrategy { segmentationImageData, } = data; - const segmentationVoxelManagerToUse = - operationData.override?.voxelManager || segmentationVoxelManager; - const segmentationImageDataToUse = - operationData.override?.imageData || segmentationImageData; - const previewVoxelManager = operationData.preview?.previewVoxelManager || VoxelManager.createRLEHistoryVoxelManager(segmentationVoxelManager); + const previewEnabled = !!operationData.previewColors; const previewSegmentIndex = previewEnabled ? 255 : undefined; @@ -257,8 +274,8 @@ export default class BrushStrategy { ...operationData, enabledElement, imageVoxelManager, - segmentationVoxelManager: segmentationVoxelManagerToUse, - segmentationImageData: segmentationImageDataToUse, + segmentationVoxelManager, + segmentationImageData, previewVoxelManager, viewport, centerWorld: null, @@ -268,7 +285,6 @@ export default class BrushStrategy { }; this._initialize.forEach((func) => func(initializedData)); - return initializedData; } diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts b/packages/tools/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts index 148181e62..feff8e3ad 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts @@ -20,14 +20,13 @@ import type { Types } from '@cornerstonejs/core'; */ export default { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { - const { strategySpecificConfiguration } = operationData; - if (!strategySpecificConfiguration) { + const { centerSegmentIndex } = operationData.configuration || {}; + + if (!centerSegmentIndex) { return; } - const { centerSegmentIndex } = strategySpecificConfiguration; - if (centerSegmentIndex) { - operationData.segmentIndex = centerSegmentIndex.segmentIndex; - } + + operationData.segmentIndex = centerSegmentIndex.segmentIndex; }, [StrategyCallbacks.OnInteractionStart]: ( @@ -38,16 +37,17 @@ export default { previewSegmentIndex, segmentationVoxelManager, centerIJK, - strategySpecificConfiguration, viewPlaneNormal, segmentationImageData, preview, + configuration, } = operationData; - if (!strategySpecificConfiguration?.useCenterSegmentIndex) { + + if (!configuration?.useCenterSegmentIndex) { return; } // Get rid of the previous data - delete strategySpecificConfiguration.centerSegmentIndex; + delete configuration.centerSegmentIndex; let hasSegmentIndex = false; let hasPreviewIndex = false; @@ -91,7 +91,7 @@ export default { existingValue = null; } operationData.segmentIndex = existingValue; - strategySpecificConfiguration.centerSegmentIndex = { + configuration.centerSegmentIndex = { segmentIndex: existingValue, }; }, diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts b/packages/tools/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts index 1a801a9f7..57c5706c6 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts @@ -17,15 +17,14 @@ export default { const { operationName, centerIJK, - strategySpecificConfiguration, segmentationVoxelManager, imageVoxelManager, + configuration, segmentIndex, viewport, } = operationData; - const { THRESHOLD } = strategySpecificConfiguration; - if (!THRESHOLD?.isDynamic || !centerIJK || !segmentIndex) { + if (!configuration?.threshold?.isDynamic || !centerIJK || !segmentIndex) { return; } if ( @@ -36,7 +35,7 @@ export default { } const boundsIJK = segmentationVoxelManager.getBoundsIJK(); - const { threshold: oldThreshold, dynamicRadius = 0 } = THRESHOLD; + const { range: oldThreshold, dynamicRadius = 0 } = configuration.threshold; const useDelta = oldThreshold ? 0 : dynamicRadius; const { viewPlaneNormal } = viewport.getCamera(); @@ -73,35 +72,39 @@ export default { }; imageVoxelManager.forEach(callback, { boundsIJK: nestedBounds }); - operationData.strategySpecificConfiguration.THRESHOLD.threshold = threshold; + configuration.threshold.range = threshold; }, // Setup a clear threshold value on mouse/touch down [StrategyCallbacks.OnInteractionStart]: ( operationData: InitializedOperationData ) => { - const { strategySpecificConfiguration, preview } = operationData; - if (!strategySpecificConfiguration?.THRESHOLD?.isDynamic && !preview) { + const { configuration } = operationData; + + if (!configuration?.threshold?.isDynamic) { return; } - strategySpecificConfiguration.THRESHOLD.threshold = null; + + configuration.threshold.range = null; }, /** * It computes the inner circle radius in canvas coordinates and stores it - * in the strategySpecificConfiguration. This is used to show the user - * the area that is used to compute the threshold. + * This is used to show the user the area that is used to compute the threshold. */ [StrategyCallbacks.ComputeInnerCircleRadius]: ( operationData: InitializedOperationData ) => { const { configuration, viewport } = operationData; - const { THRESHOLD: { dynamicRadius = 0 } = {} } = - configuration.strategySpecificConfiguration || {}; + const { dynamicRadius = 0, isDynamic } = configuration.threshold; + + if (!isDynamic) { + configuration.threshold.dynamicRadiusInCanvas = 0; + return; + } if (dynamicRadius === 0) { return; } - // @ts-ignore const imageData = viewport.getImageData(); if (!imageData) { @@ -125,18 +128,12 @@ export default { centerCanvas[0] - offSetCenterCanvas[0] ); - // this is a bit of a hack, since we have switched to using THRESHOLD - // as strategy but really strategy names are CIRCLE_THRESHOLD and SPHERE_THRESHOLD - // and we can't really change the name of the strategy in the configuration - const { strategySpecificConfiguration, activeStrategy } = configuration; - - if (!strategySpecificConfiguration[activeStrategy]) { - strategySpecificConfiguration[activeStrategy] = {}; + if (!configuration.threshold.dynamicRadiusInCanvas) { + configuration.threshold.dynamicRadiusInCanvas = 0; } // Add a couple of pixels to the radius to make it more obvious what is // included. - strategySpecificConfiguration[activeStrategy].dynamicRadiusInCanvas = - 3 + dynamicRadiusInCanvas; + configuration.threshold.dynamicRadiusInCanvas = 3 + dynamicRadiusInCanvas; }, }; diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts b/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts new file mode 100644 index 000000000..83324c41f --- /dev/null +++ b/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts @@ -0,0 +1,50 @@ +import { cache, utilities as csUtils, volumeLoader } from '@cornerstonejs/core'; +import StrategyCallbacks from '../../../../enums/StrategyCallbacks'; +import { getSegmentation } from '../../../../stateManagement/segmentation/getSegmentation'; +import type { LabelmapSegmentationDataStack } from '../../../../types'; + +export default { + [StrategyCallbacks.EnsureImageVolumeFor3DManipulation]: (data) => { + const { operationData, viewport } = data; + + let referencedImageIds; + if (viewport) { + const referencedImageIds = viewport.getImageIds(); + const isValidVolumeForSphere = csUtils.isValidVolume(referencedImageIds); + if (!isValidVolumeForSphere) { + throw new Error( + 'Volume is not reconstructable for sphere manipulation' + ); + } + } else { + const segmentation = getSegmentation(operationData.segmentationId); + const imageIds = ( + segmentation.representationData + .Labelmap as LabelmapSegmentationDataStack + ).imageIds; + + referencedImageIds = imageIds.map((imageId) => { + const image = cache.getImage(imageId); + return image.referencedImageId; + }); + } + + const volumeId = cache.generateVolumeId(referencedImageIds); + + let imageVolume = cache.getVolume(volumeId); + if (imageVolume) { + operationData.imageVoxelManager = imageVolume.voxelManager; + operationData.imageData = imageVolume.imageData; + return; + } + + // it will return the cached volume if it already exists + imageVolume = volumeLoader.createAndCacheVolumeFromImagesSync( + volumeId, + referencedImageIds + ); + + operationData.imageVoxelManager = imageVolume.voxelManager; + operationData.imageData = imageVolume.imageData; + }, +}; diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/ensureSegmentationVolume.ts b/packages/tools/src/tools/segmentation/strategies/compositions/ensureSegmentationVolume.ts new file mode 100644 index 000000000..03f6ec93c --- /dev/null +++ b/packages/tools/src/tools/segmentation/strategies/compositions/ensureSegmentationVolume.ts @@ -0,0 +1,26 @@ +import { utilities, cache } from '@cornerstonejs/core'; +import StrategyCallbacks from '../../../../enums/StrategyCallbacks'; +import getOrCreateSegmentationVolume from '../../../../utilities/segmentation/getOrCreateSegmentationVolume'; + +export default { + [StrategyCallbacks.EnsureSegmentationVolumeFor3DManipulation]: (data) => { + const { operationData, viewport } = data; + const { segmentationId, imageIds: segImageIds } = operationData; + + // Get referenced image IDs from viewport or from segmentation image IDs + const referencedImageIds = viewport + ? viewport.getImageIds() + : segImageIds.map((imageId) => cache.getImage(imageId).referencedImageId); + + const isValidVolumeForSphere = utilities.isValidVolume(referencedImageIds); + if (!isValidVolumeForSphere) { + throw new Error('Volume is not reconstructable for sphere manipulation'); + } + + const segVolume = getOrCreateSegmentationVolume(segmentationId); + + operationData.segmentationVoxelManager = segVolume.voxelManager; + operationData.segmentationImageData = segVolume.imageData; + return; + }, +}; diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/index.ts b/packages/tools/src/tools/segmentation/strategies/compositions/index.ts index d809b2c8f..a1fdf3c89 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/index.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/index.ts @@ -7,7 +7,8 @@ import regionFill from './regionFill'; import setValue from './setValue'; import threshold from './threshold'; import labelmapStatistics from './labelmapStatistics'; -import labelmapInterpolation from './labelmapInterpolation'; +import ensureSegmentationVolumeFor3DManipulation from './ensureSegmentationVolume'; +import ensureImageVolumeFor3DManipulation from './ensureImageVolume'; export default { determineSegmentIndex, @@ -19,5 +20,6 @@ export default { setValue, threshold, labelmapStatistics, - labelmapInterpolation, + ensureSegmentationVolumeFor3DManipulation, + ensureImageVolumeFor3DManipulation, }; diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/islandRemovalComposition.ts b/packages/tools/src/tools/segmentation/strategies/compositions/islandRemovalComposition.ts index a3a7cf90a..8c6821122 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/islandRemovalComposition.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/islandRemovalComposition.ts @@ -15,15 +15,18 @@ export default { operationData: InitializedOperationData ) => { const { - strategySpecificConfiguration, previewSegmentIndex, segmentIndex, viewport, previewVoxelManager, segmentationVoxelManager, + activeStrategy, } = operationData; - if (!strategySpecificConfiguration.THRESHOLD || segmentIndex === null) { + if ( + activeStrategy !== 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL' || + segmentIndex === null + ) { return; } diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/labelmapInterpolation.ts b/packages/tools/src/tools/segmentation/strategies/compositions/labelmapInterpolation.ts deleted file mode 100644 index 6fc650fce..000000000 --- a/packages/tools/src/tools/segmentation/strategies/compositions/labelmapInterpolation.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { utilities, peerImport } from '@cornerstonejs/core'; -import type { InitializedOperationData } from '../BrushStrategy'; -import StrategyCallbacks from '../../../../enums/StrategyCallbacks'; -import getItkImage from '../utils/getItkImage'; -import { triggerSegmentationDataModified } from '../../../../stateManagement/segmentation/triggerSegmentationEvents'; -import PreviewMethods from './preview'; - -type MorphologicalContourInterpolationOptions = { - label?: number; - axis?: number; - noHeuristicAlignment?: boolean; - noUseDistanceTransform?: boolean; - useCustomSlicePositions?: boolean; -}; - -/** - * Adds an isWithinThreshold to the operation data that checks that the - * image value is within threshold[0]...threshold[1] - * No-op if threshold not defined. - */ -export default { - [StrategyCallbacks.Interpolate]: async ( - operationData: InitializedOperationData, - configuration: MorphologicalContourInterpolationOptions - ) => { - const { - segmentationImageData, - segmentIndex, - preview, - segmentationVoxelManager, - previewSegmentIndex, - previewVoxelManager, - } = operationData; - - if (preview) { - // Mark everything as segment index value so the interpolation works - const callback = ({ index }) => { - segmentationVoxelManager.setAtIndex(index, segmentIndex); - }; - previewVoxelManager.forEach(callback); - } - - let itkModule; - try { - // Use peerImport instead of dynamic import - itkModule = await peerImport( - '@itk-wasm/morphological-contour-interpolation' - ); - if (!itkModule) { - throw new Error('Module not found'); - } - } catch (error) { - console.warn( - "Warning: '@itk-wasm/morphological-contour-interpolation' module not found. Please install it separately." - ); - return operationData; - } - - let inputImage; - try { - inputImage = await getItkImage(segmentationImageData, 'interpolation'); - if (!inputImage) { - throw new Error('Failed to get ITK image'); - } - } catch (error) { - console.warn('Warning: Failed to get ITK image for interpolation'); - return operationData; - } - - const outputPromise = itkModule.morphologicalContourInterpolation( - inputImage, - { - ...configuration, - label: segmentIndex, - webWorker: false, - } - ); - outputPromise.then((value) => { - const { outputImage } = value; - - const previewColors = operationData.configuration?.preview?.previewColors; - const assignIndex = - previewSegmentIndex ?? (previewColors ? 255 : segmentIndex); - // Reset the colors - needs operation data set to do this - operationData.previewColors ||= previewColors; - operationData.previewSegmentIndex ||= previewColors ? 255 : undefined; - PreviewMethods[StrategyCallbacks.Initialize](operationData); - - segmentationVoxelManager.forEach(({ value: originalValue, index }) => { - const newValue = outputImage.data[index]; - if (newValue === originalValue) { - return; - } - previewVoxelManager.setAtIndex(index, assignIndex); - }); - - triggerSegmentationDataModified( - operationData.segmentationId, - previewVoxelManager.getArrayOfModifiedSlices(), - assignIndex - ); - }); - return operationData; - }, -}; diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/labelmapStatistics.ts b/packages/tools/src/tools/segmentation/strategies/compositions/labelmapStatistics.ts index 49ee1514c..ad3868196 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/labelmapStatistics.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/labelmapStatistics.ts @@ -1,15 +1,6 @@ import StrategyCallbacks from '../../../../enums/StrategyCallbacks'; import type { InitializedOperationData } from '../BrushStrategy'; -import VolumetricCalculator from '../../../../utilities/segmentation/VolumetricCalculator'; -import { getActiveSegmentIndex } from '../../../../stateManagement/segmentation/getActiveSegmentIndex'; -import { getStrategyData } from '../utils/getStrategyData'; -import { utilities, type Types } from '@cornerstonejs/core'; -import { getPixelValueUnits } from '../../../../utilities/getPixelValueUnits'; -import { AnnotationTool } from '../../../base'; -import { isViewportPreScaled } from '../../../../utilities/viewport/isViewportPreScaled'; - -// Radius for a volume of 10, eg 1 cm^3 = 1000 mm^3 -const radiusForVol1 = Math.pow((3 * 1000) / (4 * Math.PI), 1 / 3); +import getStatistics from '../../../../utilities/segmentation/getStatistics'; /** * Compute basic labelmap segmentation statistics. @@ -20,139 +11,11 @@ export default { operationData: InitializedOperationData, options?: { indices?: number | number[] } ) { - const { viewport } = enabledElement; - let { indices } = options; - const { segmentationId } = operationData; - if (!indices) { - indices = [getActiveSegmentIndex(segmentationId)]; - } else if (!Array.isArray(indices)) { - // Include the preview index - indices = [indices, 255]; - } - const indicesArr = indices as number[]; - - const { - segmentationVoxelManager, - imageVoxelManager, - segmentationImageData, - } = getStrategyData({ - operationData, - viewport, + const { indices } = options; + const { segmentationId, viewport } = operationData; + getStatistics({ + segmentationId, + segmentIndices: indices, }); - - const spacing = segmentationImageData.getSpacing(); - - const { boundsIJK: boundsOrig } = segmentationVoxelManager; - if (!boundsOrig) { - return VolumetricCalculator.getStatistics({ spacing }); - } - - segmentationVoxelManager.forEach((voxel) => { - const { value, pointIJK } = voxel; - if (indicesArr.indexOf(value) === -1) { - return; - } - const imageValue = imageVoxelManager.getAtIJKPoint(pointIJK); - VolumetricCalculator.statsCallback({ value: imageValue, pointIJK }); - }); - const targetId = viewport.getViewReferenceId(); - const modalityUnitOptions = { - isPreScaled: isViewportPreScaled(viewport, targetId), - isSuvScaled: AnnotationTool.isSuvScaled( - viewport, - targetId, - viewport.getCurrentImageId() - ), - }; - - const imageData = (viewport as Types.IVolumeViewport).getImageData(); - const unit = getPixelValueUnits( - imageData.metadata.Modality, - viewport.getCurrentImageId(), - modalityUnitOptions - ); - - const stats = VolumetricCalculator.getStatistics({ spacing, unit }); - const { maxIJKs } = stats; - if (!maxIJKs?.length) { - return stats; - } - - // The calculation isn't very good at setting units - stats.mean.unit = unit; - stats.max.unit = unit; - stats.min.unit = unit; - - if (unit !== 'SUV') { - return stats; - } - - // Get the IJK rounded radius, not using less than 1, and using the - // radius for the spacing given the desired mm spacing of 10 - // Add 10% to the radius to account for whole pixel in/out issues - const radiusIJK = spacing.map((s) => - Math.max(1, Math.round((1.1 * radiusForVol1) / s)) - ); - for (const testMax of maxIJKs) { - const testStats = getSphereStats( - testMax, - radiusIJK, - segmentationImageData, - imageVoxelManager, - spacing - ); - if (!testStats) { - continue; - } - const { mean } = testStats; - // @ts-expect-error - TODO: fix this - if (!stats.peakValue || stats.peakValue.value <= mean.value) { - // @ts-expect-error - TODO: fix this - stats.peakValue = { - name: 'peakValue', - label: 'Peak Value', - value: mean.value, - unit, - }; - } - } - - return stats; }, }; - -/** - * Gets the statistics for a 1 cm^3 sphere centered on radiusIJK. - * Assumes the segmentation and pixel data are co-incident. - */ -function getSphereStats(testMax, radiusIJK, segData, imageVoxels, spacing) { - const { pointIJK: centerIJK } = testMax; - const boundsIJK = centerIJK.map((ijk, idx) => [ - ijk - radiusIJK[idx], - ijk + radiusIJK[idx], - ]); - const testFunction = (_pointLPS, pointIJK) => { - const i = (pointIJK[0] - centerIJK[0]) / radiusIJK[0]; - const j = (pointIJK[1] - centerIJK[1]) / radiusIJK[1]; - const k = (pointIJK[2] - centerIJK[2]) / radiusIJK[2]; - const radius = i * i + j * j + k * k; - return radius <= 1; - }; - const statsFunction = ({ pointIJK, pointLPS }) => { - const value = imageVoxels.getAtIJKPoint(pointIJK); - if (value === undefined) { - return; - } - VolumetricCalculator.statsCallback({ value, pointLPS, pointIJK }); - }; - VolumetricCalculator.statsInit({ storePointData: false }); - // pointInShapeCallback(segData, testFunction, statsFunction, boundsIJK); - - utilities.pointInShapeCallback(segData, { - pointInShapeFn: testFunction, - callback: statsFunction, - boundsIJK, - }); - - return VolumetricCalculator.getStatistics({ spacing }); -} diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts b/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts index 8c36fd84e..8e402b9f8 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts @@ -28,9 +28,9 @@ export default { [StrategyCallbacks.Preview]: function ( operationData: InitializedOperationData ) { - const { previewColors, strategySpecificConfiguration, enabledElement } = - operationData; - if (!previewColors || !strategySpecificConfiguration) { + const { previewColors, configuration, enabledElement } = operationData; + + if (!previewColors || !configuration) { return; } @@ -38,16 +38,19 @@ export default { if (operationData.preview) { delete operationData.preview; } - delete strategySpecificConfiguration.centerSegmentIndex; + + delete configuration.centerSegmentIndex; // Now generate a normal preview as though the user had clicked, filled, released this.onInteractionStart?.(enabledElement, operationData); + const preview = this.fill(enabledElement, operationData); if (preview) { preview.isPreviewFromHover = true; operationData.preview = preview; this.onInteractionEnd?.(enabledElement, operationData); } + return preview; }, @@ -125,6 +128,7 @@ export default { if (previewSegmentIndex === undefined) { return; } + const segmentIndex = preview?.segmentIndex ?? operationData.segmentIndex; if (!previewVoxelManager || previewVoxelManager.modifiedSlices.size === 0) { return; @@ -175,7 +179,7 @@ export default { previewVoxelManager.forEach(callback); // Primarily rejects back to zero, so use 0 as the segment index - even - // if somtimes it modifies the data to other values on reject. + // if sometimes it modifies the data to other values on reject. triggerSegmentationDataModified( operationData.segmentationId, previewVoxelManager.getArrayOfModifiedSlices(), diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/threshold.ts b/packages/tools/src/tools/segmentation/strategies/compositions/threshold.ts index f4fb26c09..254e33460 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/threshold.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/threshold.ts @@ -12,26 +12,24 @@ export default { [StrategyCallbacks.CreateIsInThreshold]: ( operationData: InitializedOperationData ) => { - const { imageVoxelManager, strategySpecificConfiguration, segmentIndex } = - operationData; - if (!strategySpecificConfiguration || !segmentIndex) { + const { imageVoxelManager, segmentIndex, configuration } = operationData; + + if (!configuration || !segmentIndex) { return; } - return (index) => { - const { THRESHOLD, THRESHOLD_INSIDE_CIRCLE } = - strategySpecificConfiguration; + return (index) => { const voxelValue = imageVoxelManager.getAtIndex(index); const gray = Array.isArray(voxelValue) ? vec3.length(voxelValue as Types.Point3) : voxelValue; - // Prefer the generic version of the THRESHOLD configuration, but fallback - // to the older THRESHOLD_INSIDE_CIRCLE version. - const { threshold } = THRESHOLD || THRESHOLD_INSIDE_CIRCLE || {}; - if (!threshold?.length) { + + const { threshold } = configuration || {}; + + if (!threshold?.range?.length) { return true; } - return threshold[0] <= gray && gray <= threshold[1]; + return threshold.range[0] <= gray && gray <= threshold.range[1]; }; }, }; diff --git a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts index eb66bf44c..cc6e39f5d 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts @@ -126,8 +126,7 @@ const CIRCLE_STRATEGY = new BrushStrategy( initializeCircle, compositions.determineSegmentIndex, compositions.preview, - compositions.labelmapStatistics, - compositions.labelmapInterpolation + compositions.labelmapStatistics ); const CIRCLE_THRESHOLD_STRATEGY = new BrushStrategy( @@ -140,8 +139,7 @@ const CIRCLE_THRESHOLD_STRATEGY = new BrushStrategy( compositions.threshold, compositions.preview, compositions.islandRemoval, - compositions.labelmapStatistics, - compositions.labelmapInterpolation + compositions.labelmapStatistics ); /** diff --git a/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts b/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts index a5d03973f..4513f1884 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts @@ -145,7 +145,6 @@ const RECTANGLE_STRATEGY = new BrushStrategy( compositions.determineSegmentIndex, compositions.preview, compositions.labelmapStatistics - // compositions.labelmapInterpolation ); const RECTANGLE_THRESHOLD_STRATEGY = new BrushStrategy( @@ -159,7 +158,6 @@ const RECTANGLE_THRESHOLD_STRATEGY = new BrushStrategy( compositions.preview, compositions.islandRemoval, compositions.labelmapStatistics - // compositions.labelmapInterpolation ); /** diff --git a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts index 34886098a..31b3327c8 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts @@ -58,7 +58,8 @@ const SPHERE_STRATEGY = new BrushStrategy( sphereComposition, compositions.determineSegmentIndex, compositions.preview, - compositions.labelmapStatistics + compositions.labelmapStatistics, + compositions.ensureSegmentationVolumeFor3DManipulation ); /** @@ -73,7 +74,9 @@ const SPHERE_THRESHOLD_STRATEGY = new BrushStrategy( 'SphereThreshold', ...SPHERE_STRATEGY.compositions, compositions.dynamicThreshold, - compositions.threshold + compositions.threshold, + compositions.ensureSegmentationVolumeFor3DManipulation, + compositions.ensureImageVolumeFor3DManipulation ); const SPHERE_THRESHOLD_STRATEGY_ISLAND = new BrushStrategy( @@ -81,7 +84,9 @@ const SPHERE_THRESHOLD_STRATEGY_ISLAND = new BrushStrategy( ...SPHERE_STRATEGY.compositions, compositions.dynamicThreshold, compositions.threshold, - compositions.islandRemoval + compositions.islandRemoval, + compositions.ensureSegmentationVolumeFor3DManipulation, + compositions.ensureImageVolumeFor3DManipulation ); /** diff --git a/packages/tools/src/tools/segmentation/strategies/utils/getItkImage.ts b/packages/tools/src/tools/segmentation/strategies/utils/getItkImage.ts deleted file mode 100644 index 5c2d4cda6..000000000 --- a/packages/tools/src/tools/segmentation/strategies/utils/getItkImage.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { peerImport } from '@cornerstonejs/core'; - -/** - * Get the ITK Image from the image data - * - * @param viewportId - Viewport Id - * @param imageName - Any random name that shall be set in the image - * @returns An ITK Image that can be used as fixed or moving image - */ -export default async function getItkImage( - imageData, - imageName?: string -): Promise { - let Image, ImageType, IntTypes, FloatTypes, PixelTypes; - - try { - const itkModule = await peerImport('itk-wasm'); - if (!itkModule) { - throw new Error('Module not found'); - } - ({ Image, ImageType, IntTypes, FloatTypes, PixelTypes } = itkModule); - } catch (error) { - console.warn( - "Warning: 'itk-wasm' module not found. Please install it separately." - ); - return null; - } - - const dataTypesMap = { - Int8: IntTypes.Int8, - UInt8: IntTypes.UInt8, - Int16: IntTypes.Int16, - UInt16: IntTypes.UInt16, - Int32: IntTypes.Int32, - UInt32: IntTypes.UInt32, - Int64: IntTypes.Int64, - UInt64: IntTypes.UInt64, - Float32: FloatTypes.Float32, - Float64: FloatTypes.Float64, - }; - - const { voxelManager } = imageData.get('voxelManager'); - const { numberOfComponents } = imageData.get('numberOfComponents'); - const scalarData = voxelManager.getCompleteScalarDataArray(); - - const dimensions = imageData.getDimensions(); - const origin = imageData.getOrigin(); - const spacing = imageData.getSpacing(); - const directionArray = imageData.getDirection(); - const direction = new Float64Array(directionArray); - const dataType = scalarData.constructor.name - .replace(/^Ui/, 'UI') - .replace(/Array$/, ''); - const metadata = undefined; - const imageType = new ImageType( - dimensions.length, - dataTypesMap[dataType], - PixelTypes.Scalar, - numberOfComponents - ); - - const image = new Image(imageType); - image.name = imageName; - image.origin = origin; - image.spacing = spacing; - image.direction = direction; - image.size = dimensions; - image.metadata = metadata; - image.data = scalarData; - - // image.data = new scalarData.constructor(scalarData.length); - // image.data.set(scalarData, 0); - - return image; -} diff --git a/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts b/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts index 31ffb3c39..faf8d2c6b 100644 --- a/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts +++ b/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts @@ -3,82 +3,140 @@ import { cache, Enums, eventTarget, + type Types, } from '@cornerstonejs/core'; -import type { LabelmapToolOperationDataStack } from '../../../../types'; +import type { + LabelmapToolOperationDataStack, + LabelmapToolOperationDataVolume, +} from '../../../../types'; import { getCurrentLabelmapImageIdForViewport } from '../../../../stateManagement/segmentation/segmentationState'; import { getLabelmapActorEntry } from '../../../../stateManagement/segmentation/helpers'; -function getStrategyData({ operationData, viewport }) { - let segmentationImageData, segmentationScalarData, imageScalarData; - let imageVoxelManager; - let segmentationVoxelManager; +/** + * Get strategy data for volume viewport + * @param operationData - The operation data containing volumeId and referencedVolumeId + * @returns The strategy data for volume viewport or null if error + */ +function getStrategyDataForVolumeViewport({ operationData }) { + const { volumeId } = operationData; + + if (!volumeId) { + const event = new CustomEvent(Enums.Events.ERROR_EVENT, { + detail: { + type: 'Segmentation', + message: 'No volume id found for the segmentation', + }, + cancelable: true, + }); + eventTarget.dispatchEvent(event); + return null; + } - if (viewport instanceof BaseVolumeViewport) { - const { volumeId, referencedVolumeId } = operationData; - - if (!volumeId) { - const event = new CustomEvent(Enums.Events.ERROR_EVENT, { - detail: { - type: 'Segmentation', - message: 'No volume id found for the segmentation', - }, - cancelable: true, - }); - eventTarget.dispatchEvent(event); - return null; - } + const segmentationVolume = cache.getVolume(volumeId); - const segmentationVolume = cache.getVolume(volumeId); + if (!segmentationVolume) { + return null; + } - if (!segmentationVolume) { - return; - } - segmentationVoxelManager = segmentationVolume.voxelManager; + const referencedVolumeId = segmentationVolume.referencedVolumeId; - // we only need the referenceVolumeId if we do thresholding - // but for other operations we don't need it so make it optional - if (referencedVolumeId) { - const imageVolume = cache.getVolume(referencedVolumeId); - imageVoxelManager = imageVolume.voxelManager; - } + const segmentationVoxelManager = segmentationVolume.voxelManager; + let imageVoxelManager; + let imageData; + + // we only need the referenceVolumeId if we do thresholding + // but for other operations we don't need it so make it optional + if (referencedVolumeId) { + const imageVolume = cache.getVolume(referencedVolumeId); + imageVoxelManager = imageVolume.voxelManager; + imageData = imageVolume.imageData; + } - ({ imageData: segmentationImageData } = segmentationVolume); - // segmentationDimensions = segmentationVolume.dimensions; - } else { - const { segmentationId } = operationData as LabelmapToolOperationDataStack; + const { imageData: segmentationImageData } = segmentationVolume; + return { + segmentationImageData, + segmentationVoxelManager, + segmentationScalarData: null, + imageScalarData: null, + imageVoxelManager, + imageData, + }; +} + +/** + * Get strategy data for stack viewport + * @param operationData - The operation data containing segmentationId and imageId + * @param viewport - The viewport instance + * @returns The strategy data for stack viewport or null if error + */ +function getStrategyDataForStackViewport({ + operationData, + viewport, + strategy, +}) { + const { segmentationId } = operationData as LabelmapToolOperationDataStack; + + let segmentationImageData; + let segmentationVoxelManager; + let segmentationScalarData; + let imageScalarData; + let imageVoxelManager; + let imageData; + if (strategy.ensureSegmentationVolumeFor3DManipulation) { + // Todo: I don't know how to handle this, seems like strategies cannot return anything + // and just manipulate the operationData? + strategy.ensureSegmentationVolumeFor3DManipulation({ + operationData, + viewport, + }); + + segmentationVoxelManager = operationData.segmentationVoxelManager; + segmentationImageData = operationData.segmentationImageData; + segmentationScalarData = null; + } else { const labelmapImageId = getCurrentLabelmapImageIdForViewport( viewport.id, segmentationId ); if (!labelmapImageId) { - return; - } - - const currentImageId = viewport.getCurrentImageId(); - if (!currentImageId) { - return; + return null; } - const actorEntry = getLabelmapActorEntry(viewport.id, segmentationId); if (!actorEntry) { - return; + return null; } - const currentSegImage = cache.getImage(labelmapImageId); segmentationImageData = actorEntry.actor.getMapper().getInputData(); segmentationVoxelManager = currentSegImage.voxelManager; + const currentSegmentationImageId = operationData.imageId; const segmentationImage = cache.getImage(currentSegmentationImageId); if (!segmentationImage) { - return; + return null; } segmentationScalarData = segmentationImage.getPixelData?.(); + } + + if (strategy.ensureImageVolumeFor3DManipulation) { + strategy.ensureImageVolumeFor3DManipulation({ + operationData, + viewport, + }); + + imageVoxelManager = operationData.imageVoxelManager; + imageScalarData = operationData.imageScalarData; + imageData = operationData.imageData; + } else { + const currentImageId = viewport.getCurrentImageId(); + if (!currentImageId) { + return null; + } const image = cache.getImage(currentImageId); - const imageData = image ? null : viewport.getImageData(); + imageData = image ? null : viewport.getImageData(); // VERY IMPORTANT // This is the pixel data of the image that is being segmented in the cache @@ -88,15 +146,40 @@ function getStrategyData({ operationData, viewport }) { } return { - // image data segmentationImageData, - // scalar data segmentationScalarData, imageScalarData, - // voxel managers segmentationVoxelManager, imageVoxelManager, + imageData, }; } +/** + * Get strategy data based on viewport type + * @param params - Object containing operationData and viewport + * @returns The strategy data or null if error + */ +function getStrategyData({ + operationData, + viewport, + strategy, +}: { + operationData: + | LabelmapToolOperationDataStack + | LabelmapToolOperationDataVolume; + viewport?: Types.IStackViewport | Types.IVolumeViewport; + strategy: unknown; +}) { + if ( + ('volumeId' in operationData && operationData.volumeId !== undefined) || + ('referencedVolumeId' in operationData && + operationData.referencedVolumeId !== undefined) + ) { + return getStrategyDataForVolumeViewport({ operationData }); + } + + return getStrategyDataForStackViewport({ operationData, viewport, strategy }); +} + export { getStrategyData }; diff --git a/packages/tools/src/tools/segmentation/strategies/utils/isWithinThreshold.ts b/packages/tools/src/tools/segmentation/strategies/utils/isWithinThreshold.ts index 37564d779..27646b2aa 100644 --- a/packages/tools/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +++ b/packages/tools/src/tools/segmentation/strategies/utils/isWithinThreshold.ts @@ -3,18 +3,16 @@ import type { Types } from '@cornerstonejs/core'; function isWithinThreshold( index: number, imageScalarData: Types.PixelDataTypedArray, - strategySpecificConfiguration: { - THRESHOLD?: { threshold: number[] }; - THRESHOLD_INSIDE_CIRCLE?: { threshold: number[] }; + threshold: { + range: number[]; } ) { - const { THRESHOLD, THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration; + if (!threshold) { + return true; + } const voxelValue = imageScalarData[index]; - // Prefer the generic version of the THRESHOLD configuration, but fallback - // to the older THRESHOLD_INSIDE_CIRCLE version. - const { threshold } = THRESHOLD || THRESHOLD_INSIDE_CIRCLE; - return threshold[0] <= voxelValue && voxelValue <= threshold[1]; + return threshold.range[0] <= voxelValue && voxelValue <= threshold.range[1]; } export default isWithinThreshold; diff --git a/packages/tools/src/types/CalculatorTypes.ts b/packages/tools/src/types/CalculatorTypes.ts index e78be7057..b68dfc566 100644 --- a/packages/tools/src/types/CalculatorTypes.ts +++ b/packages/tools/src/types/CalculatorTypes.ts @@ -5,6 +5,8 @@ type Statistics = { label?: string; value: number | number[]; unit: null | string; + pointIJK?: Types.Point3; + pointLPS?: Types.Point3; }; type NamedStatistics = { diff --git a/packages/tools/src/types/EventTypes.ts b/packages/tools/src/types/EventTypes.ts index c5d893a8b..8850f5038 100644 --- a/packages/tools/src/types/EventTypes.ts +++ b/packages/tools/src/types/EventTypes.ts @@ -128,14 +128,17 @@ type AnnotationCompletedEventDetail = { * The data that is passed to the event handler when an annotation is modified. */ type AnnotationModifiedEventDetail = { - /** unique id of the viewport */ - viewportId: string; - /** unique id of the rendering engine */ - renderingEngineId: string; /** The annotation that is being added to the annotations manager. */ annotation: Annotation; /** The type of this change */ changeType?: ChangeTypes; + /** + * unique id of the viewport. Note this is optional and only included if the + * element is known/being modified on a given viewport + */ + viewportId?: string; + /** unique id of the rendering engine */ + renderingEngineId?: string; }; /** diff --git a/packages/tools/src/types/LabelmapToolOperationData.ts b/packages/tools/src/types/LabelmapToolOperationData.ts index 52e7c9acd..544846689 100644 --- a/packages/tools/src/types/LabelmapToolOperationData.ts +++ b/packages/tools/src/types/LabelmapToolOperationData.ts @@ -17,9 +17,7 @@ type LabelmapToolOperationData = { segmentsLocked: number[]; viewPlaneNormal: number[]; viewUp: number[]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - strategySpecificConfiguration: any; - // constraintFn: (pointIJK: number) => boolean; + activeStrategy: string; points: Types.Point3[]; voxelManager; override: { diff --git a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts index c8a73f2d9..c8b5d1e6d 100644 --- a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts +++ b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts @@ -56,6 +56,15 @@ export interface ProbeAnnotation extends Annotation { }; } +export type KeyImageAnnotation = ProbeAnnotation & { + data: { + /** Indicates that the point selected is relevant rather than just the image */ + isPoint: boolean; + /** Indicates that this key image selects the entire stack/volume (series) */ + seriesLevel: boolean; + }; +}; + export interface LengthAnnotation extends Annotation { data: { handles: { diff --git a/packages/tools/src/types/index.ts b/packages/tools/src/types/index.ts index 9b05c6170..a43d199e9 100644 --- a/packages/tools/src/types/index.ts +++ b/packages/tools/src/types/index.ts @@ -82,11 +82,21 @@ import type { SplineCurveSegment } from './SplineCurveSegment'; import type { SplineLineSegment } from './SplineLineSegment'; import type { SplineProps } from './SplineProps'; import type { BidirectionalData } from '../utilities/segmentation/createBidirectionalToolData'; -import type { PolySegConversionOptions } from './PolySeg'; import type { IBaseTool } from './IBaseTool'; import type { RepresentationStyle } from './../stateManagement/segmentation/SegmentationStyle'; -import type { LabelmapStyle } from './LabelmapTypes'; -import type { SurfaceStyle } from './SurfaceTypes'; +import type { + LabelmapStyle, + LabelmapSegmentationData, + LabelmapSegmentationDataStack, + LabelmapSegmentationDataVolume, + BaseLabelmapStyle, + InactiveLabelmapStyle, +} from './LabelmapTypes'; +import type { + SurfaceStyle, + SurfaceSegmentationData, + SurfaceStateStyles, +} from './SurfaceTypes'; export type { // AnnotationState @@ -171,7 +181,6 @@ export type { SplineLineSegment, SplineProps, // polySeg - PolySegConversionOptions, IBaseTool, RepresentationStyle, Segment, @@ -179,4 +188,11 @@ export type { LabelmapStyle, ContourStyle, SurfaceStyle, + SurfaceSegmentationData, + SurfaceStateStyles, + LabelmapSegmentationData, + LabelmapSegmentationDataStack, + LabelmapSegmentationDataVolume, + BaseLabelmapStyle, + InactiveLabelmapStyle, }; diff --git a/packages/tools/src/geometricSurfaceUtils.ts b/packages/tools/src/utilities/geometricSurfaceUtils.ts similarity index 100% rename from packages/tools/src/geometricSurfaceUtils.ts rename to packages/tools/src/utilities/geometricSurfaceUtils.ts diff --git a/packages/tools/src/utilities/getPixelValueUnits.ts b/packages/tools/src/utilities/getPixelValueUnits.ts index 31563602b..a56457ccf 100644 --- a/packages/tools/src/utilities/getPixelValueUnits.ts +++ b/packages/tools/src/utilities/getPixelValueUnits.ts @@ -5,6 +5,14 @@ type pixelUnitsOptions = { isSuvScaled: boolean; }; +function getPixelValueUnitsImageId( + imageId: string, + options: pixelUnitsOptions +): string { + const generalSeriesModule = metaData.get('generalSeriesModule', imageId); + return getPixelValueUnits(generalSeriesModule.modality, imageId, options); +} + /** * Determines the appropriate pixel value units based on the image modality and options. * @param modality - The modality of the image (e.g., 'CT', 'PT'). @@ -57,4 +65,4 @@ function _handlePTModality( } export type { pixelUnitsOptions }; -export { getPixelValueUnits }; +export { getPixelValueUnits, getPixelValueUnitsImageId }; diff --git a/packages/tools/src/utilities/index.ts b/packages/tools/src/utilities/index.ts index fca1df2d2..110c0d13e 100644 --- a/packages/tools/src/utilities/index.ts +++ b/packages/tools/src/utilities/index.ts @@ -50,7 +50,11 @@ import { pointInSurroundingSphereCallback } from './pointInSurroundingSphereCall const roundNumber = utilities.roundNumber; import normalizeViewportPlane from './normalizeViewportPlane'; import IslandRemoval from './segmentation/islandRemoval'; -import { getPixelValueUnits } from './getPixelValueUnits'; +import { + getPixelValueUnits, + getPixelValueUnitsImageId, +} from './getPixelValueUnits'; +import * as geometricSurfaceUtils from './geometricSurfaceUtils'; export { math, @@ -69,6 +73,7 @@ export { getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, + getPixelValueUnitsImageId, segmentation, contours, triggerAnnotationRenderForViewportIds, @@ -96,4 +101,5 @@ export { pointInSurroundingSphereCallback, normalizeViewportPlane, IslandRemoval, + geometricSurfaceUtils, }; diff --git a/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts b/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts index ab8255df0..460d405c3 100644 --- a/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts +++ b/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts @@ -9,6 +9,10 @@ export default class BasicStatsCalculator extends Calculator { private static min = [Infinity]; private static sum = [0]; private static count = 0; + private static maxIJK = null; + private static maxLPS = null; + private static minIJK = null; + private static minLPS = null; // Values for Welford's algorithm private static runMean = [0]; @@ -27,7 +31,11 @@ export default class BasicStatsCalculator extends Calculator { * This callback is used when we verify if the point is in the annotation drawn * so we can get every point in the shape to calculate the statistics */ - static statsCallback = ({ value: newValue, pointLPS = null }): void => { + static statsCallback = ({ + value: newValue, + pointLPS = null, + pointIJK = null, + }): void => { if ( Array.isArray(newValue) && newValue.length > 1 && @@ -56,7 +64,21 @@ export default class BasicStatsCalculator extends Calculator { this.m2[idx] += delta * delta2; this.min[idx] = Math.min(this.min[idx], value); - this.max[idx] = Math.max(it, value); + if (value < this.min[idx]) { + this.min[idx] = value; + if (idx === 0) { + this.minIJK = pointIJK; + this.minLPS = pointLPS; + } + } + + if (value > this.max[idx]) { + this.max[idx] = value; + if (idx === 0) { + this.maxIJK = pointIJK; + this.maxLPS = pointLPS; + } + } }); }; @@ -83,12 +105,16 @@ export default class BasicStatsCalculator extends Calculator { label: 'Max Pixel', value: singleArrayAsNumber(this.max), unit, + pointIJK: this.maxIJK, + pointLPS: this.maxLPS, }, min: { name: 'min', label: 'Min Pixel', value: singleArrayAsNumber(this.min), unit, + pointIJK: this.minIJK, + pointLPS: this.minLPS, }, mean: { name: 'mean', @@ -124,10 +150,13 @@ export default class BasicStatsCalculator extends Calculator { this.max = [-Infinity]; this.min = [Infinity]; this.sum = [0]; - // this.sumSquares = [0]; this.m2 = [0]; this.runMean = [0]; this.count = 0; + this.maxIJK = null; + this.maxLPS = null; + this.minIJK = null; + this.minLPS = null; this.pointsInShape = PointsManager.create3(1024); return named; diff --git a/packages/tools/src/utilities/registerComputeWorker.ts b/packages/tools/src/utilities/registerComputeWorker.ts new file mode 100644 index 000000000..fa3f447ee --- /dev/null +++ b/packages/tools/src/utilities/registerComputeWorker.ts @@ -0,0 +1,34 @@ +import { getWebWorkerManager } from '@cornerstonejs/core'; +let registered = false; + +export function registerComputeWorker() { + if (registered) { + return; + } + + registered = true; + + const workerFn = () => { + // @ts-ignore + return new Worker( + // @ts-ignore + new URL('../workers/computeWorker.js', import.meta.url), + { + name: 'compute', + type: 'module', + } + ); + }; + + const workerManager = getWebWorkerManager(); + + const options = { + maxWorkerInstances: 1, + autoTerminateOnIdle: { + enabled: true, + idleTimeThreshold: 2000, + }, + }; + + workerManager.registerWorker('compute', workerFn, options); +} diff --git a/packages/tools/src/utilities/segmentation/brushThresholdForToolGroup.ts b/packages/tools/src/utilities/segmentation/brushThresholdForToolGroup.ts index 53cb5df29..06f8fc0a2 100644 --- a/packages/tools/src/utilities/segmentation/brushThresholdForToolGroup.ts +++ b/packages/tools/src/utilities/segmentation/brushThresholdForToolGroup.ts @@ -1,13 +1,15 @@ import type { Types } from '@cornerstonejs/core'; import { getToolGroup } from '../../store/ToolGroupManager'; import triggerAnnotationRenderForViewportIds from '../triggerAnnotationRenderForViewportIds'; -import { getRenderingEngine } from '@cornerstonejs/core'; import { getBrushToolInstances } from './getBrushToolInstances'; export function setBrushThresholdForToolGroup( toolGroupId: string, - threshold: Types.Point2, - otherArgs: Record = { isDynamic: false } + threshold: { + range: Types.Point2; + isDynamic: boolean; + dynamicRadius: number; + } ) { const toolGroup = getToolGroup(toolGroupId); @@ -16,15 +18,20 @@ export function setBrushThresholdForToolGroup( } const brushBasedToolInstances = getBrushToolInstances(toolGroupId); - const configuration = { - ...otherArgs, - ...(threshold !== undefined && { threshold }), - }; brushBasedToolInstances.forEach((tool) => { - tool.configuration.strategySpecificConfiguration.THRESHOLD = { - ...tool.configuration.strategySpecificConfiguration.THRESHOLD, - ...configuration, + const activeStrategy = tool.configuration.activeStrategy; + + if (!activeStrategy.toLowerCase().includes('threshold')) { + return; + } + + tool.configuration = { + ...tool.configuration, + threshold: { + ...tool.configuration.threshold, + ...threshold, + }, }; }); @@ -35,14 +42,10 @@ export function setBrushThresholdForToolGroup( return; } - const { renderingEngineId } = viewportsInfo[0]; - // Use helper to get array of viewportIds, or we just end up doing this mapping // ourselves here. const viewportIds = toolGroup.getViewportIds(); - const renderingEngine = getRenderingEngine(renderingEngineId); - triggerAnnotationRenderForViewportIds(viewportIds); } @@ -66,7 +69,5 @@ export function getBrushThresholdForToolGroup(toolGroupId: string) { return; } - // TODO -> Assumes the - return brushToolInstance.configuration.strategySpecificConfiguration.THRESHOLD - .threshold; + return brushToolInstance.configuration.threshold.range; } diff --git a/packages/tools/src/stateManagement/segmentation/polySeg/computeAndAddRepresentation.ts b/packages/tools/src/utilities/segmentation/computeAndAddRepresentation.ts similarity index 86% rename from packages/tools/src/stateManagement/segmentation/polySeg/computeAndAddRepresentation.ts rename to packages/tools/src/utilities/segmentation/computeAndAddRepresentation.ts index 9c79db119..63904629d 100644 --- a/packages/tools/src/stateManagement/segmentation/polySeg/computeAndAddRepresentation.ts +++ b/packages/tools/src/utilities/segmentation/computeAndAddRepresentation.ts @@ -1,10 +1,9 @@ import { eventTarget } from '@cornerstonejs/core'; -import type { SegmentationRepresentations } from '../../../enums'; -import { Events } from '../../../enums'; -import addRepresentationData from '../internalAddRepresentationData'; -import { triggerSegmentationModified } from '../triggerSegmentationEvents'; -import debounce from '../../../utilities/debounce'; -import { registerPolySegWorker } from './registerPolySegWorker'; +import type { SegmentationRepresentations } from '../../enums'; +import { Events } from '../../enums'; +import addRepresentationData from '../../stateManagement/segmentation/internalAddRepresentationData'; +import { triggerSegmentationModified } from '../../stateManagement/segmentation/triggerSegmentationEvents'; +import debounce from '../debounce'; const computedRepresentations = new Map< string, @@ -28,9 +27,6 @@ async function computeAndAddRepresentation( updateFunction?: () => void, onComputationComplete?: () => void ): Promise { - // register the worker if it hasn't been registered yet - registerPolySegWorker(); - // Compute the specific representation data const data = await computeFunction(); // Add the computed data to the system diff --git a/packages/tools/src/utilities/segmentation/getOrCreateSegmentationVolume.ts b/packages/tools/src/utilities/segmentation/getOrCreateSegmentationVolume.ts new file mode 100644 index 000000000..07aba66ce --- /dev/null +++ b/packages/tools/src/utilities/segmentation/getOrCreateSegmentationVolume.ts @@ -0,0 +1,44 @@ +import { cache, volumeLoader } from '@cornerstonejs/core'; +import { getSegmentation } from '../../stateManagement/segmentation/getSegmentation'; +import type { + LabelmapSegmentationDataStack, + LabelmapSegmentationDataVolume, +} from '../../types/LabelmapTypes'; + +function getOrCreateSegmentationVolume(segmentationId) { + const { representationData } = getSegmentation(segmentationId); + let { volumeId } = + representationData.Labelmap as LabelmapSegmentationDataVolume; + + let segVolume; + if (volumeId) { + segVolume = cache.getVolume(volumeId); + + if (segVolume) { + return segVolume; + } + } + + const { imageIds: labelmapImageIds } = + representationData.Labelmap as LabelmapSegmentationDataStack; + + volumeId = cache.generateVolumeId(labelmapImageIds); + + // We don't need to call `getStackSegmentationImageIdsForViewport` here + // because we've already ensured the stack constructs a volume, + // making the scenario for multi-image non-consistent metadata is not likely. + + if (!labelmapImageIds || labelmapImageIds.length === 1) { + return; + } + + // it will return the cached volume if it already exists + segVolume = volumeLoader.createAndCacheVolumeFromImagesSync( + volumeId, + labelmapImageIds + ); + + return segVolume; +} + +export default getOrCreateSegmentationVolume; diff --git a/packages/tools/src/utilities/segmentation/getStatistics.ts b/packages/tools/src/utilities/segmentation/getStatistics.ts new file mode 100644 index 000000000..f5c213b11 --- /dev/null +++ b/packages/tools/src/utilities/segmentation/getStatistics.ts @@ -0,0 +1,330 @@ +import { + cache, + utilities, + getWebWorkerManager, + eventTarget, + Enums, + triggerEvent, + metaData, +} from '@cornerstonejs/core'; +import { getActiveSegmentIndex } from '../../stateManagement/segmentation/getActiveSegmentIndex'; +import VolumetricCalculator from './VolumetricCalculator'; +import { getStrategyData } from '../../tools/segmentation/strategies/utils/getStrategyData'; +import { getPixelValueUnitsImageId } from '../getPixelValueUnits'; +import ensureSegmentationVolume from '../../tools/segmentation/strategies/compositions/ensureSegmentationVolume'; +import ensureImageVolume from '../../tools/segmentation/strategies/compositions/ensureImageVolume'; +import { getSegmentation } from '../../stateManagement/segmentation/getSegmentation'; +import { registerComputeWorker } from '../registerComputeWorker'; +import { WorkerTypes } from '../../enums'; +import type { + LabelmapSegmentationDataStack, + LabelmapSegmentationDataVolume, +} from '../../types/LabelmapTypes'; +// Radius for a volume of 10, eg 1 cm^3 = 1000 mm^3 +const radiusForVol1 = Math.pow((3 * 1000) / (4 * Math.PI), 1 / 3); + +const workerManager = getWebWorkerManager(); + +const triggerWorkerProgress = (eventTarget, progress) => { + triggerEvent(eventTarget, Enums.Events.WEB_WORKER_PROGRESS, { + progress, + type: WorkerTypes.COMPUTE_STATISTICS, + }); +}; + +async function getStatistics({ + segmentationId, + segmentIndices, +}: { + segmentationId: string; + segmentIndices: number[] | number; +}) { + registerComputeWorker(); + + triggerWorkerProgress(eventTarget, 0); + + const segmentation = getSegmentation(segmentationId); + const { representationData } = segmentation; + + const { Labelmap } = representationData; + + if (!Labelmap) { + console.debug('No labelmap found for segmentation', segmentationId); + return; + } + + const segVolumeId = (Labelmap as LabelmapSegmentationDataVolume).volumeId; + const segImageIds = (Labelmap as LabelmapSegmentationDataStack).imageIds; + + // Create a minimal operationData object + const operationData = { + segmentationId, + volumeId: segVolumeId, + imageIds: segImageIds, + }; + + let reconstructableVolume = false; + if (segImageIds) { + const refImageIds = segImageIds.map((imageId) => { + const image = cache.getImage(imageId); + return image.referencedImageId; + }); + reconstructableVolume = utilities.isValidVolume(refImageIds); + } + + let indices = segmentIndices; + + if (!indices) { + indices = [getActiveSegmentIndex(segmentationId)]; + } else if (!Array.isArray(indices)) { + // Include the preview index + indices = [indices, 255]; + } + + // Get reference image ID and modality unit options + const { refImageId, modalityUnitOptions } = getImageReferenceInfo( + segVolumeId, + segImageIds + ); + + const unit = getPixelValueUnitsImageId(refImageId, modalityUnitOptions); + + const stats = reconstructableVolume + ? await calculateVolumeStatistics(operationData, indices, unit) + : await calculateStackStatistics(segImageIds, indices, unit); + + return stats; +} + +/** + * Calculate statistics for a reconstructable volume + */ +async function calculateVolumeStatistics(operationData, indices, unit) { + // Get the strategy data + const strategyData = getStrategyData({ + operationData, + strategy: { + ensureSegmentationVolumeFor3DManipulation: + ensureSegmentationVolume.ensureSegmentationVolumeFor3DManipulation, + ensureImageVolumeFor3DManipulation: + ensureImageVolume.ensureImageVolumeFor3DManipulation, + }, + }); + + const { + segmentationVoxelManager, + imageVoxelManager, + segmentationImageData, + imageData, + } = strategyData; + + const spacing = segmentationImageData.getSpacing(); + + const { boundsIJK: boundsOrig } = segmentationVoxelManager; + if (!boundsOrig) { + return VolumetricCalculator.getStatistics({ spacing }); + } + + const segmentationScalarData = + segmentationVoxelManager.getCompleteScalarDataArray(); + + const imageScalarData = imageVoxelManager.getCompleteScalarDataArray(); + + const segmentationInfo = { + scalarData: segmentationScalarData, + dimensions: segmentationImageData.getDimensions(), + spacing: segmentationImageData.getSpacing(), + origin: segmentationImageData.getOrigin(), + }; + + const imageInfo = { + scalarData: imageScalarData, + dimensions: imageData.getDimensions(), + spacing: imageData.getSpacing(), + origin: imageData.getOrigin(), + }; + + const stats = await workerManager.executeTask( + 'compute', + 'calculateSegmentsStatisticsVolume', + { + segmentationInfo, + imageInfo, + indices, + } + ); + + triggerWorkerProgress(eventTarget, 100); + + // Update units + stats.mean.unit = unit; + stats.max.unit = unit; + stats.min.unit = unit; + + if (unit !== 'SUV') { + return stats; + } + + // Get the IJK rounded radius, not using less than 1, and using the + // radius for the spacing given the desired mm spacing of 10 + // Add 10% to the radius to account for whole pixel in/out issues + const radiusIJK = spacing.map((s) => + Math.max(1, Math.round((1.1 * radiusForVol1) / s)) + ); + + for (const testMax of stats.maxIJKs) { + const testStats = getSphereStats( + testMax, + radiusIJK, + segmentationImageData, + imageVoxelManager, + spacing + ); + if (!testStats) { + continue; + } + const { mean } = testStats; + if (!stats.peakValue || stats.peakValue.value <= mean.value) { + stats.peakValue = { + name: 'peakValue', + label: 'Peak Value', + value: mean.value, + unit, + }; + } + } + + return stats; +} + +/** + * Calculate statistics for a stack of images + */ +async function calculateStackStatistics(segImageIds, indices, unit) { + triggerWorkerProgress(eventTarget, 0); + // we need to loop over each seg image separately and calculate the stats + const segmentationInfo = []; + const imageInfo = []; + for (const segImageId of segImageIds) { + const segImage = cache.getImage(segImageId); + const segPixelData = segImage.getPixelData(); + const segVoxelManager = segImage.voxelManager; + const segSpacing = [segImage.rowPixelSpacing, segImage.columnPixelSpacing]; + + const refImageId = segImage.referencedImageId; + const refImage = cache.getImage(refImageId); + const refPixelData = refImage.getPixelData(); + const refVoxelManager = refImage.voxelManager; + const refSpacing = [refImage.rowPixelSpacing, refImage.columnPixelSpacing]; + + segmentationInfo.push({ + scalarData: segPixelData, + dimensions: segVoxelManager.dimensions, + spacing: segSpacing, + }); + + imageInfo.push({ + scalarData: refPixelData, + dimensions: refVoxelManager.dimensions, + spacing: refSpacing, + }); + } + + const stats = await workerManager.executeTask( + 'compute', + 'calculateSegmentsStatisticsStack', + { + segmentationInfo, + imageInfo, + indices, + } + ); + + triggerWorkerProgress(eventTarget, 100); + + stats.mean.unit = unit; + stats.max.unit = unit; + stats.min.unit = unit; + + return stats; +} + +/** + * Gets the statistics for a 1 cm^3 sphere centered on radiusIJK. + * Assumes the segmentation and pixel data are co-incident. + */ +function getSphereStats(testMax, radiusIJK, segData, imageVoxels, spacing) { + const { pointIJK: centerIJK } = testMax; + + if (!centerIJK) { + return; + } + + const boundsIJK = centerIJK.map((ijk, idx) => [ + ijk - radiusIJK[idx], + ijk + radiusIJK[idx], + ]); + const testFunction = (_pointLPS, pointIJK) => { + const i = (pointIJK[0] - centerIJK[0]) / radiusIJK[0]; + const j = (pointIJK[1] - centerIJK[1]) / radiusIJK[1]; + const k = (pointIJK[2] - centerIJK[2]) / radiusIJK[2]; + const radius = i * i + j * j + k * k; + return radius <= 1; + }; + const statsFunction = ({ pointIJK, pointLPS }) => { + const value = imageVoxels.getAtIJKPoint(pointIJK); + if (value === undefined) { + return; + } + VolumetricCalculator.statsCallback({ value, pointLPS, pointIJK }); + }; + VolumetricCalculator.statsInit({ storePointData: false }); + + utilities.pointInShapeCallback(segData, { + pointInShapeFn: testFunction, + callback: statsFunction, + boundsIJK, + }); + + return VolumetricCalculator.getStatistics({ spacing }); +} + +/** + * Gets the reference image ID and modality unit options based on segmentation data + * @param segVolumeId - The segmentation volume ID + * @param segImageIds - The segmentation image IDs + * @returns Object containing reference image ID and modality unit options + */ +function getImageReferenceInfo(segVolumeId, segImageIds) { + let refImageId; + let modalityUnitOptions; + + if (segVolumeId) { + const segmentationVolume = cache.getVolume(segVolumeId); + const referencedVolumeId = segmentationVolume.referencedVolumeId; + const volume = cache.getVolume(referencedVolumeId); + + if (volume?.imageIds?.length > 0) { + refImageId = volume.imageIds[0]; + } + + modalityUnitOptions = { + isPreScaled: Object.keys(volume.scaling || {}).length > 0, + isSuvScaled: Boolean(volume.scaling?.PT), + }; + } else if (segImageIds?.length) { + const segImage = cache.getImage(segImageIds[0]); + refImageId = segImage.referencedImageId; + const refImage = cache.getImage(refImageId); + const scalingModule = metaData.get('scalingModule', refImageId); + + modalityUnitOptions = { + isPreScaled: Boolean(refImage.preScale?.scaled), + isSuvScaled: typeof scalingModule?.preScale?.scaled === 'number', + }; + } + + return { refImageId, modalityUnitOptions }; +} + +export default getStatistics; diff --git a/packages/tools/src/utilities/segmentation/index.ts b/packages/tools/src/utilities/segmentation/index.ts index 1352a952a..356d6c380 100644 --- a/packages/tools/src/utilities/segmentation/index.ts +++ b/packages/tools/src/utilities/segmentation/index.ts @@ -29,6 +29,11 @@ import { getBrushToolInstances } from './getBrushToolInstances'; import * as growCut from './growCut'; import * as LabelmapMemo from './createLabelmapMemo'; import IslandRemoval from './islandRemoval'; +import getOrCreateSegmentationVolume from './getOrCreateSegmentationVolume'; +import getStatistics from './getStatistics'; +import * as validateLabelmap from './validateLabelmap'; +import { computeStackLabelmapFromVolume } from '../../stateManagement/segmentation/helpers/computeStackLabelmapFromVolume'; +import { computeVolumeLabelmapFromStack } from '../../stateManagement/segmentation/helpers/computeVolumeLabelmapFromStack'; export { thresholdVolumeByRange, @@ -56,4 +61,9 @@ export { growCut, LabelmapMemo, IslandRemoval, + getOrCreateSegmentationVolume, + getStatistics, + validateLabelmap, + computeStackLabelmapFromVolume, + computeVolumeLabelmapFromStack, }; diff --git a/packages/tools/src/tools/displayTools/Labelmap/validateLabelmap.ts b/packages/tools/src/utilities/segmentation/validateLabelmap.ts similarity index 94% rename from packages/tools/src/tools/displayTools/Labelmap/validateLabelmap.ts rename to packages/tools/src/utilities/segmentation/validateLabelmap.ts index 96fba0154..7887a9a11 100644 --- a/packages/tools/src/tools/displayTools/Labelmap/validateLabelmap.ts +++ b/packages/tools/src/utilities/segmentation/validateLabelmap.ts @@ -1,10 +1,10 @@ import { cache } from '@cornerstonejs/core'; -import type { SegmentationPublicInput } from '../../../types/SegmentationStateTypes'; +import type { SegmentationPublicInput } from '../../types/SegmentationStateTypes'; import type { LabelmapSegmentationData, LabelmapSegmentationDataStack, LabelmapSegmentationDataVolume, -} from '../../../types/LabelmapTypes'; +} from '../../types/LabelmapTypes'; function validateRepresentationData( segmentationRepresentationData: LabelmapSegmentationData diff --git a/packages/tools/src/workers/computeWorker.js b/packages/tools/src/workers/computeWorker.js new file mode 100644 index 000000000..8664a9e19 --- /dev/null +++ b/packages/tools/src/workers/computeWorker.js @@ -0,0 +1,129 @@ +import { expose } from 'comlink'; +import { utilities } from '@cornerstonejs/core'; +import VolumetricCalculator from '../utilities/segmentation/VolumetricCalculator'; + +const { VoxelManager } = utilities; + +const computeWorker = { + calculateSegmentsStatisticsVolume: (args) => { + const { segmentationInfo, imageInfo, indices } = args; + + const { + scalarData: segmentationScalarData, + dimensions: segmentationDimensions, + spacing: segmentationSpacing, + } = segmentationInfo; + const { scalarData: imageScalarData, dimensions: imageDimensions } = + imageInfo; + + // if dimensions are not the same, for now just throw an error + if ( + segmentationDimensions[0] !== imageDimensions[0] || + segmentationDimensions[1] !== imageDimensions[1] || + segmentationDimensions[2] !== imageDimensions[2] + ) { + throw new Error( + 'Dimensions do not match to calculate statistics, different dimensions not supported yet' + ); + } + + // Create VoxelManagers for both segmentation and image data + const segVoxelManager = VoxelManager.createScalarVolumeVoxelManager({ + dimensions: segmentationDimensions, + scalarData: segmentationScalarData, + }); + + const imageVoxelManager = VoxelManager.createScalarVolumeVoxelManager({ + dimensions: imageDimensions, + scalarData: imageScalarData, + }); + + // Use forEach to iterate over all voxels and call statsCallback for those in the segmentation + segVoxelManager.forEach( + ({ value, pointIJK, index }) => { + if (indices.indexOf(value) === -1) { + return; + } + + // get the value from the image voxel manager + const imageValue = imageVoxelManager.getAtIndex(index); + + // Todo: later add the isInObject check based on lps for the different dimensions + // for now just assume the pointIJK is within the bounds + VolumetricCalculator.statsCallback({ + value: imageValue, + pointIJK, + }); + }, + { + boundsIJK: imageVoxelManager.getDefaultBounds(), + } + ); + + const stats = VolumetricCalculator.getStatistics({ + spacing: segmentationSpacing, + unit: 'mm', + }); + + return stats; + }, + + calculateSegmentsStatisticsStack: (args) => { + const { segmentationInfo, imageInfo, indices } = args; + + // Create voxel managers for each pair of segmentation and image info + for (let i = 0; i < segmentationInfo.length; i++) { + const segInfo = segmentationInfo[i]; + const imgInfo = imageInfo[i]; + + const segDimensions = [ + segInfo.dimensions[0], + segInfo.dimensions[1], + 1, // For a single slice + ]; + + const segVoxelManager = VoxelManager.createScalarVolumeVoxelManager({ + dimensions: segDimensions, + scalarData: segInfo.scalarData, + }); + + const imageVoxelManager = VoxelManager.createScalarVolumeVoxelManager({ + dimensions: segDimensions, + scalarData: imgInfo.scalarData, + }); + + // Use forEach to iterate and call statsCallback + segVoxelManager.forEach( + ({ value, pointIJK, index }) => { + // Todo: later add the isInObject check based on lps for the different dimensions + // for now just assume the pointIJK is within the bounds + + if (indices.indexOf(value) === -1) { + return; + } + + // get the value from the image voxel manager + const imageValue = imageVoxelManager.getAtIndex(index); + + VolumetricCalculator.statsCallback({ + value: imageValue, + }); + }, + { + boundsIJK: imageVoxelManager.getDefaultBounds(), + } + ); + } + + // Pick first one for spacing + const spacing = segmentationInfo[0].spacing; + + const stats = VolumetricCalculator.getStatistics({ + spacing, + }); + + return stats; + }, +}; + +expose(computeWorker); diff --git a/tsconfig.json b/tsconfig.json index 93c8a099e..21596cd2c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,8 @@ "@cornerstonejs/dicomImageLoader": ["dicomImageLoader/src"], "@cornerstonejs/nifti-volume-loader": ["nifti-volume-loader/src"], "@cornerstonejs/ai": ["ai/src"], + "@cornerstonejs/labelmap-interpolation": ["labelmap-interpolation/src"], + "@cornerstonejs/polymorphic-segmentation": ["polymorphic-segmentation/src"], "@cornerstonejs/adapters": ["adapters/src"] } } diff --git a/utils/ExampleRunner/build-all-examples-cli.js b/utils/ExampleRunner/build-all-examples-cli.js index 977b7b87e..80e6e4378 100644 --- a/utils/ExampleRunner/build-all-examples-cli.js +++ b/utils/ExampleRunner/build-all-examples-cli.js @@ -56,6 +56,11 @@ if (options.fromRoot === true) { { path: 'packages/core/examples', regexp: 'index.ts' }, { path: 'packages/tools/examples', regexp: 'index.ts' }, { path: 'packages/ai/examples', regexp: 'index.ts' }, + { path: 'packages/labelmap-interpolation/examples', regexp: 'index.ts' }, + { + path: 'packages/polymorphic-segmentation/examples', + regexp: 'index.ts', + }, { path: 'packages/dicomImageLoader/examples', regexp: 'index.ts', diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index 95ddd4897..83a1d1a7b 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -175,6 +175,10 @@ "name": "Stack Annotation Tools", "description": "Demonstrates usage of various annotation tools (Probe, Rectangle ROI, Elliptical ROI, Bidirectional measurements) on a Stack Viewport." }, + "stackRange": { + "name": "Stack Range", + "description": "Demonstrates use of a selection range for key image and other tools" + }, "calibrationTools": { "name": "Calibration Tools", "description": "Demonstrates usage of calibration tools on a Stack Viewport." @@ -258,10 +262,6 @@ "livewireContour": { "name": "Livewire", "description": "Demonstrates how to use the livewire tool to create ROIs" - }, - "stackRange": { - "name": "Stack Range", - "description": "Demonstrates use of a selection range for key image and other tools" } }, "viewports": { diff --git a/utils/ExampleRunner/example-runner-cli.js b/utils/ExampleRunner/example-runner-cli.js index ea86e83d1..7e22654c9 100755 --- a/utils/ExampleRunner/example-runner-cli.js +++ b/utils/ExampleRunner/example-runner-cli.js @@ -111,6 +111,11 @@ const configuration = { { path: 'packages/core/examples', regexp: 'index.ts' }, { path: 'packages/tools/examples', regexp: 'index.ts' }, { path: 'packages/ai/examples', regexp: 'index.ts' }, + { path: 'packages/labelmap-interpolation/examples', regexp: 'index.ts' }, + { + path: 'packages/polymorphic-segmentation/examples', + regexp: 'index.ts', + }, { path: 'packages/dicomImageLoader/examples', regexp: 'index.ts', diff --git a/utils/ExampleRunner/template-config.js b/utils/ExampleRunner/template-config.js index 057c2daa2..a9db1dba7 100644 --- a/utils/ExampleRunner/template-config.js +++ b/utils/ExampleRunner/template-config.js @@ -3,6 +3,12 @@ const path = require('path'); const csRenderBasePath = path.resolve('packages/core/src/index'); const csToolsBasePath = path.resolve('packages/tools/src/index'); const csAiBasePath = path.resolve('packages/ai/src/index'); +const csLabelmapInterpolationBasePath = path.resolve( + 'packages/labelmap-interpolation/src/index' +); +const csPolymorphicSegmentationBasePath = path.resolve( + 'packages/polymorphic-segmentation/src/index' +); const csAdapters = path.resolve('packages/adapters/src/index'); const csDICOMImageLoaderDistPath = path.resolve( 'packages/dicomImageLoader/src/index' @@ -67,6 +73,14 @@ module.exports = { '@cornerstonejs/core': '${csRenderBasePath.replace(/\\/g, '/')}', '@cornerstonejs/tools': '${csToolsBasePath.replace(/\\/g, '/')}', '@cornerstonejs/ai': '${csAiBasePath.replace(/\\/g, '/')}', + '@cornerstonejs/polymorphic-segmentation': '${csPolymorphicSegmentationBasePath.replace( + /\\/g, + '/' + )}', + '@cornerstonejs/labelmap-interpolation': '${csLabelmapInterpolationBasePath.replace( + /\\/g, + '/' + )}', '@cornerstonejs/nifti-volume-loader': '${csNiftiPath.replace( /\\/g, '/' diff --git a/utils/ExampleRunner/template-multiexample-config.js b/utils/ExampleRunner/template-multiexample-config.js index 7f84f0028..e1695100e 100644 --- a/utils/ExampleRunner/template-multiexample-config.js +++ b/utils/ExampleRunner/template-multiexample-config.js @@ -3,6 +3,12 @@ const path = require('path'); const csRenderBasePath = path.resolve('./packages/core/src/index'); const csToolsBasePath = path.resolve('./packages/tools/src/index'); const csAiBasePath = path.resolve('./packages/ai/src/index'); +const csLabelmapInterpolationBasePath = path.resolve( + './packages/labelmap-interpolation/src/index' +); +const csPolymorphicSegmentationBasePath = path.resolve( + 'packages/polymorphic-segmentation/src/index' +); const csAdaptersBasePath = path.resolve('./packages/adapters/src/index'); const csDICOMImageLoaderDistPath = path.resolve( 'packages/dicomImageLoader/src/index' @@ -102,6 +108,14 @@ module.exports = { '@cornerstonejs/core': '${csRenderBasePath.replace(/\\/g, '/')}', '@cornerstonejs/tools': '${csToolsBasePath.replace(/\\/g, '/')}', '@cornerstonejs/ai': '${csAiBasePath.replace(/\\/g, '/')}', + '@cornerstonejs/polymorphic-segmentation': '${csPolymorphicSegmentationBasePath.replace( + /\\/g, + '/' + )}', + '@cornerstonejs/labelmap-interpolation': '${csLabelmapInterpolationBasePath.replace( + /\\/g, + '/' + )}', '@cornerstonejs/adapters': '${csAdaptersBasePath.replace(/\\/g, '/')}', '@cornerstonejs/dicom-image-loader': '${csDICOMImageLoaderDistPath.replace( /\\/g, diff --git a/utils/demo/helpers/initDemo.js b/utils/demo/helpers/initDemo.ts similarity index 84% rename from utils/demo/helpers/initDemo.js rename to utils/demo/helpers/initDemo.ts index 59959148b..de0677b09 100644 --- a/utils/demo/helpers/initDemo.js +++ b/utils/demo/helpers/initDemo.ts @@ -15,6 +15,7 @@ import { fakeMetaDataProvider, } from '../../test/testUtilsImageLoader'; import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'; +import * as polySeg from '@cornerstonejs/polymorphic-segmentation'; window.cornerstone = cornerstone; window.cornerstoneTools = cornerstoneTools; @@ -27,7 +28,11 @@ export default async function initDemo(config) { peerImport, ...(config?.core ? config.core : {}), }); - await csToolsInit(); + await csToolsInit({ + addons: { + polySeg, + }, + }); // for testings, you don't need any of these volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader); @@ -47,18 +52,6 @@ export async function peerImport(moduleId) { 'dicomMicroscopyViewer' ); } - - if (moduleId === '@icr/polyseg-wasm') { - return import('@icr/polyseg-wasm'); - } - - if (moduleId === 'itk-wasm') { - return import('itk-wasm'); - } - - if (moduleId === '@itk-wasm/morphological-contour-interpolation') { - return import('@itk-wasm/morphological-contour-interpolation'); - } } async function importGlobal(path, globalName) { diff --git a/utils/demo/helpers/labelmapTools.ts b/utils/demo/helpers/labelmapTools.ts index 287bd431f..c2333c426 100644 --- a/utils/demo/helpers/labelmapTools.ts +++ b/utils/demo/helpers/labelmapTools.ts @@ -19,16 +19,12 @@ const preview = { const configuration = { preview, - strategySpecificConfiguration: { - useCenterSegmentIndex: false, - }, + useCenterSegmentIndex: false, }; const configurationNoPreview = { preview: { enabled: false, previewColors }, - strategySpecificConfiguration: { - useCenterSegmentIndex: false, - }, + useCenterSegmentIndex: false, }; const thresholdOptions = new Map(); @@ -41,11 +37,11 @@ thresholdOptions.set('Use Existing Threshold', { dynamicRadius: 5, }); thresholdOptions.set('CT Fat: (-150, -70)', { - threshold: [-150, -70], + range: [-150, -70], isDynamic: false, }); thresholdOptions.set('CT Bone: (200, 1000)', { - threshold: [200, 1000], + range: [200, 1000], isDynamic: false, }); @@ -59,10 +55,7 @@ toolMap.set('ThresholdCircle', { configuration: { ...configuration, activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', - strategySpecificConfiguration: { - ...configuration.strategySpecificConfiguration, - THRESHOLD: { ...thresholdArgs }, - }, + threshold: thresholdArgs, }, }); @@ -71,10 +64,7 @@ toolMap.set('ThresholdSphere', { configuration: { ...configuration, activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', - strategySpecificConfiguration: { - ...configuration.strategySpecificConfiguration, - THRESHOLD: { ...thresholdArgs }, - }, + threshold: thresholdArgs, }, }); diff --git a/version.json b/version.json index e6e156b27..ddbebdfc1 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.19.16", - "commit": "0dc51241392451a581de0372760ff6d5acf398c3" -} \ No newline at end of file + "version": "3.0.0-beta.6", + "commit": "a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5" +} diff --git a/version.txt b/version.txt index 464a55bd2..40f5e16e9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.19.16 \ No newline at end of file +3.0.0-beta.6 diff --git a/yarn.lock b/yarn.lock index aaa0d1b38..539058be4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -444,6 +444,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-plugin-utils@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + "@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" @@ -1607,14 +1612,14 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.21.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" - integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz#ea8be19ef134668e98f7b54daf7c4f853859dc44" + integrity sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" @@ -2011,14 +2016,22 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs2@^7.17.8": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.25.0.tgz#c1e677774a618f48caff129a8e2a066f1ecd0384" - integrity sha512-aoYVE3tm+vgAoezmXFWmVcp+NlSdsUqQMPL7c6zRxq8KDHCf570pamC7005Q/UkSlTuoL6oeE16zIw/9J3YFyw== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.26.9.tgz#1936c9847aa09faaa941e06f48d3e391e5ca5e1b" + integrity sha512-DHEUkm9RD4RfIThlLTemmHNFVTj9Z/augVFMuyheFjwoFv1jFjauncHrcSW6Kv1TpzTupB01zFk2iRFAh2iE9A== dependencies: core-js "^2.6.12" regenerator-runtime "^0.14.0" -"@babel/runtime-corejs3@^7.15.4", "@babel/runtime-corejs3@^7.22.5": +"@babel/runtime-corejs3@^7.15.4": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.26.9.tgz#8b73bae47453aa3dd2839ac52598581a7dd8332f" + integrity sha512-5EVjbTegqN7RSJle6hMWYxO4voo4rI+9krITk+DWR+diJgGrjZjrIBnJhjrHYYQsFgI7j1w1QnrvV7YSKBfYGg== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + +"@babel/runtime-corejs3@^7.22.5": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz#0a318b66dfc765ad10562d829fea372ed7e1eb7d" integrity sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg== @@ -3777,7 +3790,7 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@icr/polyseg-wasm@^0.4.0": +"@icr/polyseg-wasm@0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz#755e23d07c3d8d8fca1113278c803c1ef0185da0" integrity sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ== @@ -3878,12 +3891,12 @@ ipfs-car "^1.0.0" tar "^6.1.13" -"@itk-wasm/morphological-contour-interpolation@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@itk-wasm/morphological-contour-interpolation/-/morphological-contour-interpolation-1.0.1.tgz#c2fcfdc593df85001276918e8ef684ba0b73a3c9" - integrity sha512-wxLB4nX6CiWpNQyTWC7oeFXogiZbtmSuLhyAtY66sM0SEnMoOcAuSX2+osPcOo13rfYnHLA02uQiICp8hvUGwA== +"@itk-wasm/morphological-contour-interpolation@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@itk-wasm/morphological-contour-interpolation/-/morphological-contour-interpolation-1.1.0.tgz#a2982dc27cdcc27026b61e12f76e7687c88cad7e" + integrity sha512-n6JIyDcSCCjlpfCW8mnTTzwPTE8U1QT87hNmyAknxdpGR4dfAzIutuKNrwgvr9UiKEBcit0X3HNx9dkzDwcIcw== dependencies: - itk-wasm "1.0.0-b.165" + itk-wasm "1.0.0-b.173" "@jest/console@^29.7.0": version "29.7.0" @@ -8115,7 +8128,7 @@ babel-plugin-polyfill-corejs2@^0.4.10: "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4, babel-plugin-polyfill-corejs3@^0.10.6: +babel-plugin-polyfill-corejs3@^0.10.4, babel-plugin-polyfill-corejs3@^0.10.6: version "0.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== @@ -8130,6 +8143,14 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" +babel-plugin-transform-import-meta@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-import-meta/-/babel-plugin-transform-import-meta-2.3.2.tgz#320bd0cd878fe38f39e136edb198c535391bf156" + integrity sha512-902o4GiQqI1GqAXfD5rEoz0PJamUfJ3VllpdWaNsFTwdaNjFSFHawvBO+cp5K2j+g2h3bZ4lnM1Xb6yFYGihtA== + dependencies: + "@babel/template" "^7.25.9" + tslib "^2.8.1" + babel-preset-current-node-syntax@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" @@ -8737,15 +8758,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646: - version "1.0.30001651" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" - integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== - -caniuse-lite@^1.0.30001616, caniuse-lite@^1.0.30001669: - version "1.0.30001673" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz#5aa291557af1c71340e809987367410aab7a5a9e" - integrity sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001616, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: + version "1.0.30001699" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== canvas@2.11.2, canvas@^2.11.2: version "2.11.2" @@ -9684,7 +9700,12 @@ core-js@^2.6.12: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.26.1, core-js@^3.31.1: +core-js@^3.26.1: + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" + integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== + +core-js@^3.31.1: version "3.38.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.0.tgz#8acb7c050bf2ccbb35f938c0d040132f6110f636" integrity sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug== @@ -14922,6 +14943,24 @@ itk-wasm@1.0.0-b.165: mime-types "^2.1.35" wasm-feature-detect "^1.6.1" +itk-wasm@1.0.0-b.173: + version "1.0.0-b.173" + resolved "https://registry.yarnpkg.com/itk-wasm/-/itk-wasm-1.0.0-b.173.tgz#e484e1765f4205a5704f8fac205d2ecf74e726a2" + integrity sha512-SV2lfZ1mClWuSK/noaZgGj9jhroY4MZu19ci9pIucuyhoGdXrVSmWlPH/JYMDi9RP3BogmQwe9wfFc3X1dcEPg== + dependencies: + "@itk-wasm/dam" "^1.1.1" + "@thewtex/zstddec" "^0.2.0" + "@types/emscripten" "^1.39.10" + axios "^1.6.2" + chalk "^5.3.0" + comlink "^4.4.1" + commander "^11.1.0" + fs-extra "^11.2.0" + glob "^8.1.0" + markdown-table "^3.0.3" + mime-types "^2.1.35" + wasm-feature-detect "^1.6.1" + jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" @@ -23707,7 +23746,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0: +tslib@^2.0.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== From 1ae2130b4d14c7e04da87998d3b6653cefa96f6a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 27 Feb 2025 20:15:34 +0000 Subject: [PATCH 29/48] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 6 +++--- version.txt | 2 +- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/commit.txt b/commit.txt index 11312f83d..1d1a2e20b 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5 +fe654590d16414e76361e1b2826fd64c3734ae87 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4da66ce6b..655bf9de0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6" + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3367358f1..2cdf1e3e9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -57,7 +57,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6" + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 94b36c01c..92784c5b4 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index e012097c6..98b15d934 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.0-beta.6", - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/dicom-image-loader": "^3.0.0-beta.6", - "@cornerstonejs/nifti-volume-loader": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6", + "@cornerstonejs/adapters": "^3.0.0", + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/dicom-image-loader": "^3.0.0", + "@cornerstonejs/nifti-volume-loader": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 4fa7590b9..c0f903115 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -51,8 +51,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c47c59b7c..3c81801e9 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6" + "@cornerstonejs/core": "^3.0.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 686f750cd..13e6092ed 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -49,8 +49,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 9b5a8b39e..7175249d2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index ddbebdfc1..501575280 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.0-beta.6", - "commit": "a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5" -} + "version": "3.0.0", + "commit": "fe654590d16414e76361e1b2826fd64c3734ae87" +} \ No newline at end of file diff --git a/version.txt b/version.txt index 40f5e16e9..56fea8a08 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.0-beta.6 +3.0.0 \ No newline at end of file From 8d0c264b0c0c5a3cf339dc986b5c524159def522 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 27 Feb 2025 20:15:52 +0000 Subject: [PATCH 30/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 6 ++++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 6 ++++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 6 ++++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 6 ++++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 6 ++++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 63 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 445da08d4..cf4f082fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) ### Features diff --git a/lerna.json b/lerna.json index de063874c..93859a115 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.0-beta.6", + "version": "3.0.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 87910754d..a78c0f4f3 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) ### Features diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 655bf9de0..ced30a436 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 9d830f4bb..104d98c60 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 2cdf1e3e9..09a1ed7dd 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 922faa1d3..d87cbb601 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index 95f90bee2..a430c0c85 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 6fea89d1a..c5224219b 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 92784c5b4..e596c2df5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 9fd8d1320..84b594ce2 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index c0f903115..0092289de 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d3254e72a..b5bba9788 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 3c81801e9..f9eb98a0e 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index f92e20c60..46d52bbe2 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 13e6092ed..4dce5cfbc 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index eb548a42e..673ace229 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) + +### Features + +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) + # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index 7175249d2..dfbfa69f3 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.0-beta.6", + "version": "3.0.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 86dc516b70ed695174f6ad3a99762af11d3af931 Mon Sep 17 00:00:00 2001 From: Alireza Date: Thu, 27 Feb 2025 16:08:19 -0500 Subject: [PATCH 31/48] docs: archive the old docs (#1866) --- bun.lock | 38 +- packages/dicomImageLoader/README.md | 172 +-------- .../docs/migration-guides/3x/1-polyseg.md | 4 +- .../3x/3-labelmap-interpolation.md | 4 +- packages/docs/docusaurus.config.js | 11 +- packages/docs/sidebars.js | 10 + packages/docs/src/pages/index.js | 19 - yarn.lock | 352 ++++++++++++------ 8 files changed, 272 insertions(+), 338 deletions(-) diff --git a/bun.lock b/bun.lock index 041dc8520..8d6161262 100644 --- a/bun.lock +++ b/bun.lock @@ -131,7 +131,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -140,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -164,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -173,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -185,7 +185,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", "dicom-parser": "^1.8.9", }, }, @@ -193,11 +193,11 @@ "name": "docs", "version": "3.0.0-beta.5", "dependencies": { - "@cornerstonejs/adapters": "^3.0.0-beta.6", - "@cornerstonejs/core": "^3.0.0-beta.6", - "@cornerstonejs/dicom-image-loader": "^3.0.0-beta.6", - "@cornerstonejs/nifti-volume-loader": "^3.0.0-beta.6", - "@cornerstonejs/tools": "^3.0.0-beta.6", + "@cornerstonejs/adapters": "^3.0.0", + "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/dicom-image-loader": "^3.0.0", + "@cornerstonejs/nifti-volume-loader": "^3.0.0", + "@cornerstonejs/tools": "^3.0.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -235,7 +235,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -248,17 +248,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -270,7 +270,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.0.0-beta.6", + "version": "3.0.0", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -280,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0-beta.6", + "@cornerstonejs/core": "^3.0.0", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", @@ -5489,8 +5489,6 @@ "@docusaurus/mdx-loader/webpack": ["webpack@5.97.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg=="], - "@docusaurus/module-type-aliases/react-helmet-async": ["react-helmet-async@2.0.5", "", { "dependencies": { "invariant": "^2.2.4", "react-fast-compare": "^3.2.2", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg=="], - "@docusaurus/plugin-content-blog/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], "@docusaurus/plugin-content-blog/webpack": ["webpack@5.97.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg=="], diff --git a/packages/dicomImageLoader/README.md b/packages/dicomImageLoader/README.md index 02ae65436..67e06e98d 100644 --- a/packages/dicomImageLoader/README.md +++ b/packages/dicomImageLoader/README.md @@ -1,173 +1,3 @@ # DICOM Image Loader -This package provides a DICOM image loader for the Cornerstone library. -This is the successor to the [cornerstoneDICOMImageLoader] which provides the following -added features: - -- Typescript support (and type definitions) -- Better developer experience (e.g. mono repo, linting, etc) - - - -A [cornerstone](https://github.com/cornerstonejs/cornerstone) Image Loader for -DICOM P10 instances over HTTP (WADO-URI) or DICOMWeb (WADO-RS) and Local filedisk. This can be used -to integrate cornerstone with WADO-URI servers, DICOMWeb servers or any other -HTTP based server that returns DICOM P10 instances (e.g. -[Orthanc](http://www.orthanc-server.com/) or custom servers) - -## Key Features - -- Implements a - [cornerstone ImageLoader](https://www.cornerstonejs.org/docs/concepts/cornerstone-core/imageLoader) - for DICOM P10 Instances via a HTTP get request. - - Can be used with a WADO-URI server - - Can be used with Orthanc's file endpoint - - Can be used with any server that returns DICOM P10 instances via HTTP GET -- Implements a - [cornerstone ImageLoader](https://www.cornerstonejs.org/docs/concepts/cornerstone-core/imageLoader) - for WADO-RS (DICOMWeb) -- Supports many popular transfer syntaxes and photometric interpretations - [see full list](docs/TransferSyntaxes.md) - and [codec](docs/Codecs.md) for more information. -- Dynamicly Utilizes WebAssembly (WASM) builds of each codec which sgnificantly improves image decoding performance and enables us to load codec at runtime when needed dynamically, which reduces the build time and complexity. -- Framework to execute CPU intensive tasks in [web workers](docs/WebWorkers.md) - - Used for image decoding - - Can be used for your own CPU intensive tasks (e.g. image processing) - - -## Install - -### NPM - -```bash -yarn add @cornerstonejs/dicom-image-loader -``` - - - -## Usage - -Specify the cornerstone instance you want to register the loader with. - -```javascript -cornerstoneDICOMImageLoader.external.cornerstone = cornerstone; -``` - -Have your code configure the web worker framework: - -```javascript -var config = { - maxWebWorkers: navigator.hardwareConcurrency || 1, - startWebWorkersOnDemand: true, -}; -cornerstoneDICOMImageLoader.webWorkerManager.initialize(config); -``` - -See the [web workers](docs/WebWorkers.md) documentation for more details on -configuring. - - - -#### Dynamic Import - -To be able to use the dynamic import feature for CDIL, instead of - -```js -import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'; -``` - -you need to do: - -```js -import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js'; -``` - -This way, codecs are loaded dynamically when needed. You have another option to -create an alias in the webpack config file: - -```js -resolve: { - alias: { - '@cornerstonejs/dicom-image-loader': - '@cornerstonejs/dicom-image-loader/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js', - }, -}, -``` - -In addition WASM builds of the codec files should be made available in the build -folder. You can use `CopyWebpackPlugin` to copy the WASM files to the build folder. - - -```js - plugins: [ - new CopyWebpackPlugin([ - { - from: - '../../../node_modules/@cornerstonejs/dicom-image-loader/dist/dynamic-import', - to: DIST_DIR, - }, - ]), -``` - -Note 1: You need to give the correct path in the `CopyWebpackPlugin`, the above -path is relative to the `node_modules` folder in the OHIF Viewer. - -Note 2: For other http servers like IIS, you need to configure it to serve WASM -files with the correct MIME type. - -## Loading - -![Alt text](assets/load.png) - -## Backlog - -- ESM build for the library -- Make the examples work again -- Free up DICOM P10 instance after decoding to reduce memory consumption -- Look at using EMSCRIPTEN based build of IJG for JPEG -- Add support for bulk data items to WADO-RS Loader -- WebWorker Manager - - Better handling of web worker loading - - Add events to webWorkerManager so its activity can be monitored - - Add support for issuing progress events from web worker tasks - -# FAQ - -_Why is this a separate library from cornerstone?_ - -Mainly to avoid adding a dependency to cornerstone for the DICOM parsing -library. While cornerstone is intended to be used to display medical images that -are stored in DICOM, cornerstone aims to simplify the use of medical imaging and -therefore tries to hide some of the complexity that exists within DICOM. It is -also desirable to support display of non DICOM images so a DICOM independent -image model makes sense. - -_How do I build this library myself?_ - -See the documentation [here](docs/Building.md) - -_How do I add my own custom web worker tasks?_ - -See the documentation [here](docs/WebWorkers.md) - -_How do I create imageIds that work with this image loader?_ - -See the documentation [here](docs/ImageIds.md) - -# What Transfer Syntaxes are supported? - -See [transfer syntaxes](docs/TransferSyntaxes.md) - - -[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat -[license-url]: LICENSE - -[npm-url]: https://npmjs.org/package/@cornerstonejs/dicom-image-loader -[npm-version-image]: http://img.shields.io/npm/v/@cornerstonejs/dicom-image-loader.svg?style=flat -[npm-downloads-image]: http://img.shields.io/npm/dm/@cornerstonejs/dicom-image-loader.svg?style=flat - -[travis-url]: http://travis-ci.org/cornerstonejs/cornerstoneDICOMImageLoader -[travis-image]: https://travis-ci.org/cornerstonejs/cornerstoneDICOMImageLoader.svg?branch=master - -[coverage-url]: https://coveralls.io/github/cornerstonejs/cornerstoneDICOMImageLoader?branch=master -[coverage-image]: https://coveralls.io/repos/github/cornerstonejs/cornerstoneDICOMImageLoader/badge.svg?branch=master +See full guide on [cornerstonejs.org](https://cornerstonejs.org/) diff --git a/packages/docs/docs/migration-guides/3x/1-polyseg.md b/packages/docs/docs/migration-guides/3x/1-polyseg.md index c8c174c41..381f078d8 100644 --- a/packages/docs/docs/migration-guides/3x/1-polyseg.md +++ b/packages/docs/docs/migration-guides/3x/1-polyseg.md @@ -1,6 +1,6 @@ --- -id: general -title: 'General' +id: polyseg +title: 'PolySeg' --- import Tabs from '@theme/Tabs'; diff --git a/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md b/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md index a37f8992c..461c90ef2 100644 --- a/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md +++ b/packages/docs/docs/migration-guides/3x/3-labelmap-interpolation.md @@ -1,6 +1,6 @@ --- -id: general -title: 'General' +id: labelmap-interpolation +title: 'Labelmap Interpolation' --- import Tabs from '@theme/Tabs'; diff --git a/packages/docs/docusaurus.config.js b/packages/docs/docusaurus.config.js index 0fe47fb29..744f789db 100644 --- a/packages/docs/docusaurus.config.js +++ b/packages/docs/docusaurus.config.js @@ -1,4 +1,3 @@ -const path = require('path'); const lightCodeTheme = require('prism-react-renderer').themes.github; const darkCodeTheme = require('prism-react-renderer').themes.dracula; @@ -74,8 +73,8 @@ module.exports = { ], }, { - to: '/docs/migration-guides/2x/general', - label: '2.0 Migration Guides', + to: '/docs/migration-guides/3x/polyseg', + label: '3.0 Migration Guides', position: 'left', className: 'new-badge', }, @@ -87,6 +86,10 @@ module.exports = { type: 'html', value: '', }, + { + href: 'https://v2.cornerstonejs.org/', + label: '2.0', + }, { href: 'https://v1.cornerstonejs.org/', label: '1.0', @@ -216,7 +219,7 @@ module.exports = { onlyIncludeVersions: ['current'], versions: { current: { - label: `2.0 (Latest)`, + label: `3.0 (Latest)`, }, }, }, diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index d86738ec1..1ae328840 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -269,6 +269,16 @@ module.exports = { }, collapsed: true, items: [ + { + type: 'category', + label: '2.x -> 3.x', + collapsed: false, + link: { + type: 'doc', + id: 'migration-guides/3x/polyseg', + }, + items: [{ type: 'autogenerated', dirName: 'migration-guides/3x' }], + }, { type: 'category', label: '1.x -> 2.x', diff --git a/packages/docs/src/pages/index.js b/packages/docs/src/pages/index.js index 99e6be998..8eb111257 100644 --- a/packages/docs/src/pages/index.js +++ b/packages/docs/src/pages/index.js @@ -5,28 +5,9 @@ import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import styles from './index.module.css'; import HomepageFeatures from '../components/HomepageFeatures'; -function NewAnnouncementBar() { - return ( -
-
NEW
-
- {/* Cornerstone 3D is now available! */} - Major Release: Cornerstone3D 2.0 is now available! -
-
- 🎉 Major Release: Cornerstone3D 2.0 is now available! 🎉 - {/* Cornerstone3D, released as - public beta on April 1st, 2022, represents a major improvement to the - framework */} -
-
- ); -} - function HomepageHeader() { return (
- Date: Thu, 27 Feb 2025 21:12:33 +0000 Subject: [PATCH 32/48] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 1d1a2e20b..6686d0577 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -fe654590d16414e76361e1b2826fd64c3734ae87 \ No newline at end of file +86dc516b70ed695174f6ad3a99762af11d3af931 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ced30a436..d71844b8f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0" + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 09a1ed7dd..5bc8e2bc2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -57,7 +57,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0" + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e596c2df5..8003396d7 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 98b15d934..c336754b9 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.0", - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/dicom-image-loader": "^3.0.0", - "@cornerstonejs/nifti-volume-loader": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0", + "@cornerstonejs/adapters": "^3.0.1", + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/dicom-image-loader": "^3.0.1", + "@cornerstonejs/nifti-volume-loader": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0092289de..965957d9c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -51,8 +51,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f9eb98a0e..0457004c8 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -61,7 +61,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0" + "@cornerstonejs/core": "^3.0.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4dce5cfbc..a50051a8c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -49,8 +49,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index dfbfa69f3..eebe2f9c4 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -104,7 +104,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 501575280..626c2d013 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.0", - "commit": "fe654590d16414e76361e1b2826fd64c3734ae87" + "version": "3.0.1", + "commit": "86dc516b70ed695174f6ad3a99762af11d3af931" } \ No newline at end of file diff --git a/version.txt b/version.txt index 56fea8a08..13d683ccb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.0 \ No newline at end of file +3.0.1 \ No newline at end of file From ef8157e5e9c3135c34fe6194afde06b018c1655f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 27 Feb 2025 21:12:51 +0000 Subject: [PATCH 33/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf4f082fc..bf2f227eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package root + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/lerna.json b/lerna.json index 93859a115..578e8603e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.0", + "version": "3.0.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index a78c0f4f3..6cf8950df 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d71844b8f..47f74ba95 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.0", + "version": "3.0.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 104d98c60..8b3b6ca20 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/ai/package.json b/packages/ai/package.json index 5bc8e2bc2..7ecea9c0a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.0", + "version": "3.0.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d87cbb601..149722106 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/core + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index a430c0c85..80eec62b0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.0", + "version": "3.0.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index c5224219b..7d76b5930 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8003396d7..ec6a3c9c6 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.0", + "version": "3.0.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 84b594ce2..ea5efee80 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 965957d9c..50df07596 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.0", + "version": "3.0.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index b5bba9788..fa10b124b 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 0457004c8..4b38c4e9c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.0", + "version": "3.0.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 46d52bbe2..b7f556d13 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a50051a8c..a4a1632e3 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.0", + "version": "3.0.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 673ace229..5d4f93a9e 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) + +**Note:** Version bump only for package @cornerstonejs/tools + # [3.0.0](https://github.com/cornerstonejs/cornerstone3D/compare/v2.19.16...v3.0.0) (2025-02-27) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index eebe2f9c4..5f329dec4 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.0", + "version": "3.0.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 28ea428c2b90cdaf32391ef519e2a0564b4ac46c Mon Sep 17 00:00:00 2001 From: Yiannis Theocharakis <35450092+YiannisTheocharakis@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:08:55 +0200 Subject: [PATCH 34/48] fix(camera) - Fixes issue #4636 of OHIF related with infinite loop of setViewReference (#1847) * Fixes issue #4636 of OHIF related with infinite loop of setViewReference * Fix a typescript issue. --- packages/core/src/RenderingEngine/BaseVolumeViewport.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index fdf85b44f..6bfcccd8b 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -151,7 +151,8 @@ abstract class BaseVolumeViewport extends Viewport { this.initialViewUp = viewUp; if (resetCamera) { - this.resetCamera(); + const t = this as unknown as IVolumeViewport; + t.resetCamera({ resetOrientation: false, resetRotation: false }); } } From e1b5bc646f3997be88ec237f86406c310420379a Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:42:50 -0500 Subject: [PATCH 35/48] feat(surface-segmentation): add visibilty configuration for surface segmentation (#1846) --- .github/pull_request_template.md | 2 - api-extractor.json | 332 - common/reviews/api/ai.api.md | 196 - common/reviews/api/core.api.md | 5244 ------------ common/reviews/api/dicom-image-loader.api.md | 638 -- .../reviews/api/labelmap-interpolation.api.md | 18 - common/reviews/api/nifti-volume-loader.api.md | 68 - .../api/polymorphic-segmentation.api.md | 48 - common/reviews/api/tools.api.md | 7183 ----------------- package.json | 11 +- packages/adapters/api-extractor.json | 9 - packages/ai/api-extractor.json | 9 - packages/ai/package.json | 1 - packages/core/api-extractor.json | 9 - packages/core/package.json | 1 - packages/core/src/cache/classes/Surface.ts | 17 + packages/dicomImageLoader/api-extractor.json | 9 - packages/dicomImageLoader/package.json | 1 - packages/docs/docs/contribute/update-api.md | 16 - .../2x/8-deverloper-experience.md | 3 - packages/docs/package.json | 2 +- packages/docs/sidebars.js | 1 - .../labelmap-interpolation/api-extractor.json | 9 - packages/labelmap-interpolation/package.json | 1 - .../nifti-volume-loader/api-extractor.json | 9 - packages/nifti-volume-loader/package.json | 1 - .../api-extractor.json | 9 - .../polymorphic-segmentation/package.json | 1 - packages/tools/api-extractor.json | 9 - packages/tools/package.json | 1 - .../helpers/getSegmentationActor.ts | 9 +- .../Surface/addOrUpdateSurfaceToElement.ts | 7 + .../displayTools/Surface/surfaceDisplay.ts | 10 +- 33 files changed, 41 insertions(+), 13843 deletions(-) delete mode 100644 api-extractor.json delete mode 100644 common/reviews/api/ai.api.md delete mode 100644 common/reviews/api/core.api.md delete mode 100644 common/reviews/api/dicom-image-loader.api.md delete mode 100644 common/reviews/api/labelmap-interpolation.api.md delete mode 100644 common/reviews/api/nifti-volume-loader.api.md delete mode 100644 common/reviews/api/polymorphic-segmentation.api.md delete mode 100644 common/reviews/api/tools.api.md delete mode 100644 packages/adapters/api-extractor.json delete mode 100644 packages/ai/api-extractor.json delete mode 100644 packages/core/api-extractor.json delete mode 100644 packages/dicomImageLoader/api-extractor.json delete mode 100644 packages/docs/docs/contribute/update-api.md delete mode 100644 packages/labelmap-interpolation/api-extractor.json delete mode 100644 packages/nifti-volume-loader/api-extractor.json delete mode 100644 packages/polymorphic-segmentation/api-extractor.json delete mode 100644 packages/tools/api-extractor.json diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 77f84eb84..df00a4bbb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -72,8 +72,6 @@ after the commits are squashed. - [] My code has been well-documented (function documentation, inline comments, etc.) -- [] I have run the `yarn build:update-api` to update the API documentation, and have - committed the changes to this PR. (Read more here https://www.cornerstonejs.org/docs/contribute/update-api) #### Public Documentation Updates diff --git a/api-extractor.json b/api-extractor.json deleted file mode 100644 index 2fff11434..000000000 --- a/api-extractor.json +++ /dev/null @@ -1,332 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - - /** - * Determines the "" token that can be used with other config file settings. The project folder - * typically contains the tsconfig.json and package.json config files, but the path is user-defined. - * - * The path is resolved relative to the folder of the config file that contains the setting. - * - * The default value for "projectFolder" is the token "", which means the folder is determined by traversing - * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder - * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error - * will be reported. - * - * SUPPORTED TOKENS: - * DEFAULT VALUE: "" - */ - // "projectFolder": "..", - - /** - * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor - * analyzes the symbols exported by this module. - * - * The file extension must be ".d.ts" and not ".ts". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - */ - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - - /** - * A list of NPM package names whose exports should be treated as part of this package. - * - * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1", - * and another NPM package "library2" is embedded in this bundle. Some types from library2 may become part - * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly - * imports library2. To avoid this, we can specify: - * - * "bundledPackages": [ "library2" ], - * - * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been - * local files for library1. - */ - "bundledPackages": [ - "@cornerstonejs/core", - "@cornerstonejs/tools", - ], - - /** - * Determines how the TypeScript compiler engine will be invoked by API Extractor. - */ - "compiler": { - /** - * this is very important since We are overriding a TypeScript file since for development we use path - * to cross-reference the monorepor libraries. Here we should override it to not use for the API creation. - */ - "overrideTsconfig": { - "paths": {} - } - }, - - /** - * Configures how the API report file (*.api.md) will be generated. - */ - "apiReport": { - /** - * (REQUIRED) Whether to generate an API report. - */ - "enabled": true - - /** - * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce - * a full file path. - * - * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". - * - * SUPPORTED TOKENS: , - * DEFAULT VALUE: ".api.md" - */ - // "reportFileName": ".api.md", - - /** - * Specifies the folder where the API report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, - * e.g. for an API review. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/etc/" - */ - // "reportFolder": "/etc/", - - /** - * Specifies the folder where the temporary report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * After the temporary file is written to disk, it is compared with the file in the "reportFolder". - * If they are different, a production build will fail. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/" - */ - // "reportTempFolder": "/temp/" - }, - - /** - * Configures how the doc model file (*.api.json) will be generated. - */ - "docModel": { - /** - * (REQUIRED) Whether to generate a doc model file. - */ - "enabled": false - - /** - * The output path for the doc model file. The file extension should be ".api.json". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/.api.json" - */ - // "apiJsonFilePath": "/temp/.api.json" - }, - - /** - * Configures how the .d.ts rollup file will be generated. - */ - "dtsRollup": { - /** - * (REQUIRED) Whether to generate the .d.ts rollup file. - */ - "enabled": true - - /** - * Specifies the output path for a .d.ts rollup file to be generated without any trimming. - * This file will include all declarations that are exported by the main entry point. - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/dist/.d.ts" - */ - // "untrimmedFilePath": "/dist/.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. - * This file will include only declarations that are marked as "@public" or "@beta". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - // "betaTrimmedFilePath": "/dist/-beta.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. - * This file will include only declarations that are marked as "@public". - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - // "publicTrimmedFilePath": "/dist/-public.d.ts", - - /** - * When a declaration is trimmed, by default it will be replaced by a code comment such as - * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the - * declaration completely. - * - * DEFAULT VALUE: false - */ - // "omitTrimmingComments": true - }, - - /** - * Configures how the tsdoc-metadata.json file will be generated. - */ - "tsdocMetadata": { - /** - * Whether to generate the tsdoc-metadata.json file. - * - * DEFAULT VALUE: true - */ - "enabled": true - /** - * Specifies where the TSDoc metadata file should be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", - * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup - * falls back to "tsdoc-metadata.json" in the package folder. - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" - }, - - /** - * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files - * will be written with Windows-style newlines. To use POSIX-style newlines, specify "lf" instead. - * To use the OS's default newline kind, specify "os". - * - * DEFAULT VALUE: "crlf" - */ - // "newlineKind": "crlf", - - /** - * Configures how API Extractor reports error and warning messages produced during analysis. - * - * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. - */ - "messages": { - /** - * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing - * the input .d.ts files. - * - * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "compilerMessageReporting": { - /** - * Configures the default routing for messages that don't match an explicit rule in this table. - */ - "default": { - /** - * Specifies whether the message should be written to the the tool's output log. Note that - * the "addToApiReportFile" property may supersede this option. - * - * Possible values: "error", "warning", "none" - * - * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail - * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes - * the "--local" option), the warning is displayed but the build will not fail. - * - * DEFAULT VALUE: "warning" - */ - "logLevel": "none" - - /** - * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), - * then the message will be written inside that file; otherwise, the message is instead logged according to - * the "logLevel" option. - * - * DEFAULT VALUE: false - */ - // "addToApiReportFile": false - } - - // "TS2551": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by API Extractor during its analysis. - * - * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" - * - * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings - */ - "extractorMessageReporting": { - "default": { - "logLevel": "none" - // "addToApiReportFile": false - }, - - "ae-forgotten-export": { - "logLevel": "none", - "addToApiReportFile": false - }, - - "ae-missing-release-tag": { - "logLevel": "none", - "addToApiReportFile": false - } - // "ae-extra-release-tag": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by the TSDoc parser when analyzing code comments. - * - * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "tsdocMessageReporting": { - "default": { - "logLevel": "warning" - // "addToApiReportFile": false - } - - // "tsdoc-link-tag-unescaped-text": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - } - } -} diff --git a/common/reviews/api/ai.api.md b/common/reviews/api/ai.api.md deleted file mode 100644 index bbb180026..000000000 --- a/common/reviews/api/ai.api.md +++ /dev/null @@ -1,196 +0,0 @@ -## API Report File for "@cornerstonejs/ai" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import type ColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { Corners } from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget/Constants'; -import type { IColorMapPreset } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps'; -import type { mat3 } from 'gl-matrix'; -import { mat4 } from 'gl-matrix'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import { vec3 } from 'gl-matrix'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import vtkAnnotatedCubeActor from '@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkColorTransferFunction } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import type vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; - -// @public (undocumented) -export class ONNXSegmentationController { - constructor(options?: { - listeners: any; - getPromptAnnotations: any; - promptAnnotationTypes: any; - models: any; - modelName: any; - islandFillOptions: any; - }); - // (undocumented) - acceptPreview(element: any): void; - // (undocumented) - protected annotationModifiedListener: (_event?: any) => void; - // (undocumented) - protected annotationsNeedUpdating: boolean; - // (undocumented) - static BoxPrompt: string; - // (undocumented) - protected boxRadius: number; - // (undocumented) - cacheImageEncodings(current?: any, offset?: number, length?: number): any; - // (undocumented) - canvas: HTMLCanvasElement; - // (undocumented) - canvasMask: HTMLCanvasElement; - // (undocumented) - clear(viewport: any): void; - // (undocumented) - createLabelmap(mask: any, canvasPosition: any, _points: any, _labels: any): void; - // (undocumented) - protected currentImage: any; - // (undocumented) - decode(points: any, labels: any, useSession?: any): Promise; - // (undocumented) - protected desiredImage: { - imageId: any; - sampleImageId: any; - imageIndex: number; - decoder: any; - encoder: any; - }; - // (undocumented) - disconnectViewport(viewport: any): void; - // (undocumented) - protected excludeTool: string; - // (undocumented) - fetchAndCacheModel(url: any, name: any): Promise; - // (undocumented) - getConfig(modelName?: string): any; - // (undocumented) - getDirectoryForImageId(session: any, imageId: any): Promise; - // (undocumented) - getFileNameForImageId(imageId: any, extension: any): any; - // (undocumented) - protected getPromptAnnotations: (viewport?: any) => cornerstoneTools.Types.Annotations; - // (undocumented) - protected handleImage({ imageId, sampleImageId }: { - imageId: any; - sampleImageId: any; - }, imageSession: any): Promise; - // (undocumented) - protected imageEncodings: Map; - // (undocumented) - protected imageImageData: any; - // (undocumented) - initModel(): Promise; - // (undocumented) - initViewport(viewport: any): void; - // (undocumented) - interpolateScroll(viewport?: any, dir?: number): Promise; - // (undocumented) - protected isGpuInUse: boolean; - // (undocumented) - protected islandFillOptions: { - maxInternalRemove: number; - fillInternalEdge: boolean; - }; - // (undocumented) - protected load(): Promise; - // (undocumented) - loadModels(models: any, imageSession?: any): Promise; - // (undocumented) - loadStorageImageEncoding(session: any, imageId: any, index?: any): Promise; - // (undocumented) - protected log(logger: Loggers, ...args: any[]): void; - // (undocumented) - mapAnnotationPoint(worldPoint: any): number[]; - // (undocumented) - static MarkerExclude: string; - // (undocumented) - static MarkerInclude: string; - // (undocumented) - protected maskImageData: any; - // (undocumented) - maxHeight: number; - // (undocumented) - maxWidth: number; - // (undocumented) - modelHeight: number; - // (undocumented) - static MODELS: { - sam_l: ({ - name: string; - url: string; - size: number; - key: string; - feedType: string; - } | { - name: string; - url: string; - size: number; - key: string; - feedType?: undefined; - })[]; - sam_h: ({ - name: string; - url: string; - size: number; - key: string; - feedType: string; - } | { - name: string; - url: string; - size: number; - key: string; - feedType?: undefined; - })[]; - }; - // (undocumented) - modelWidth: number; - // (undocumented) - protected pCutoff: number; - // (undocumented) - protected promptAnnotationTypes: string[]; - // (undocumented) - rejectPreview(element: any): void; - // (undocumented) - restoreImageEncoding(session: any, imageId: any): Promise; - // (undocumented) - protected runDecode(): Promise; - // (undocumented) - setPCutoff(cutoff: number): void; - // (undocumented) - protected sharedImageEncoding: any; - // (undocumented) - storeImageEncoding(session: any, imageId: any, data: any): Promise; - // (undocumented) - tool: any; - // (undocumented) - tryLoad(options?: { - resetImage: boolean; - }): void; - // (undocumented) - updateAnnotations(): void; - // (undocumented) - protected viewport: any; - // (undocumented) - static viewportOptions: { - displayArea: Types.DisplayArea; - background: Types.Point3; - }; - // (undocumented) - protected viewportRenderedListener: (_event: any) => void; -} - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/core.api.md b/common/reviews/api/core.api.md deleted file mode 100644 index 8902b6d92..000000000 --- a/common/reviews/api/core.api.md +++ /dev/null @@ -1,5244 +0,0 @@ -## API Report File for "@cornerstonejs/core" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import type ColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import type { mat3 } from 'gl-matrix'; -import { mat4 } from 'gl-matrix'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import { vec3 } from 'gl-matrix'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkColorTransferFunction } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; -import vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper'; - -// @public (undocumented) -interface AABB2 { - // (undocumented) - maxX: number; - // (undocumented) - maxY: number; - // (undocumented) - minX: number; - // (undocumented) - minY: number; -} - -// @public (undocumented) -interface AABB3 { - // (undocumented) - maxX: number; - // (undocumented) - maxY: number; - // (undocumented) - maxZ: number; - // (undocumented) - minX: number; - // (undocumented) - minY: number; - // (undocumented) - minZ: number; -} - -// @public (undocumented) -type Actor = vtkActor; - -// @public (undocumented) -interface ActorEntry { - // (undocumented) - [key: string]: unknown; - // (undocumented) - actor: Actor | VolumeActor | ImageActor | ICanvasActor; - // (undocumented) - blendMode?: BlendModes; - // (undocumented) - callbacks?: ({ volumeActor, volumeId, }: { - volumeActor: VolumeActor; - volumeId: string; - }) => void; - // (undocumented) - clippingFilter?: any; - // (undocumented) - referencedId?: string; - // (undocumented) - slabThickness?: number; - // (undocumented) - uid: string; -} - -// @public (undocumented) -function actorIsA(actorEntry: Types.ActorEntry | Types.Actor, actorType: actorTypes): boolean; - -// @public (undocumented) -interface ActorSliceRange { - // (undocumented) - actor: VolumeActor; - // (undocumented) - current: number; - // (undocumented) - focalPoint: Point3; - // (undocumented) - max: number; - // (undocumented) - min: number; - // (undocumented) - viewPlaneNormal: Point3; -} - -// @public (undocumented) -export function addImageSlicesToViewports(renderingEngine: IRenderingEngine, stackInputs: IStackInput[], viewportIds: string[]): Promise; - -// @public (undocumented) -function addProvider(provider: (type: string, ...query: string[]) => unknown, priority?: number): void; - -// @public (undocumented) -export function addVolumesToViewports(renderingEngine: IRenderingEngine, volumeInputs: IVolumeInput[], viewportIds: string[], immediateRender?: boolean, suppressEvents?: boolean): Promise; - -// @public (undocumented) -type AffineMatrix = [ -[ -number, -number, -number, -number -], -[ -number, -number, -number, -number -], -[ -number, -number, -number, -number -], -[ -number, -number, -number, -number -] -]; - -// @public (undocumented) -function applyPreset(actor: VolumeActor, preset: ViewportPreset): void; - -// @public (undocumented) -const autoLoad: (volumeId: string) => void; - -// @public (undocumented) -const backgroundColors: { - slicer3D: number[]; -}; - -// @public (undocumented) -export abstract class BaseVolumeViewport extends Viewport { - constructor(props: ViewportInput); - // (undocumented) - addVolumes(volumeInputArray: IVolumeInput[], immediate?: boolean, suppressEvents?: boolean): Promise; - // (undocumented) - protected applyViewOrientation(orientation: OrientationAxis | OrientationVectors, resetCamera?: boolean): void; - // (undocumented) - canvasToWorld: (canvasPos: Point2) => Point3; - // (undocumented) - clearDefaultProperties(volumeId?: string): void; - // (undocumented) - flip(flipDirection: FlipDirection): void; - // (undocumented) - getAllVolumeIds(): string[]; - // (undocumented) - getBounds(): number[]; - // (undocumented) - abstract getCurrentImageId(): string | undefined; - // (undocumented) - getDefaultProperties: (volumeId?: string) => VolumeViewportProperties; - // (undocumented) - getFrameOfReferenceUID: () => string; - // (undocumented) - getImageData(volumeId?: string): IImageData | undefined; - // (undocumented) - getImageIds: (volumeId?: string) => string[]; - // (undocumented) - getIntensityFromWorld(point: Point3): number; - // (undocumented) - protected _getOrientationVectors(orientation: OrientationAxis | OrientationVectors): OrientationVectors; - // (undocumented) - getProperties: (volumeId?: string) => VolumeViewportProperties; - // (undocumented) - getRotation: () => number; - // (undocumented) - getSlabThickness(): number; - // (undocumented) - getSliceIndex(): number; - // (undocumented) - getSliceViewInfo(): { - width: number; - height: number; - sliceIndex: number; - slicePlane: number; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; - }; - // (undocumented) - getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference; - // (undocumented) - getViewReferenceId(specifier?: ViewReferenceSpecifier): string; - // (undocumented) - protected getVOIModifiedEventDetail(volumeId: string): VoiModifiedEventDetail; - // (undocumented) - getVolumeId(specifier?: ViewReferenceSpecifier): string; - // (undocumented) - hasImageURI: (imageURI: string) => boolean; - // (undocumented) - hasVolumeId(volumeId: string): boolean; - // (undocumented) - hasVolumeURI(volumeURI: string): boolean; - // (undocumented) - protected initialTransferFunctionNodes: TransferFunctionNodes; - // (undocumented) - protected initialViewUp: Point3; - // (undocumented) - isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean; - // (undocumented) - removeVolumeActors(actorUIDs: string[], immediate?: boolean): void; - // (undocumented) - abstract resetProperties(volumeId?: string): void; - // (undocumented) - abstract resetSlabThickness(): void; - // (undocumented) - resetToDefaultProperties(volumeId: string): void; - // (undocumented) - scroll(delta?: number): void; - // (undocumented) - abstract setBlendMode(blendMode: BlendModes, filterActorUIDs?: string[], immediate?: boolean): void; - // (undocumented) - setCamera(cameraInterface: ICamera, storeAsInitialCamera?: boolean): void; - // (undocumented) - protected setCameraClippingRange(): void; - // (undocumented) - setDefaultProperties(ViewportProperties: VolumeViewportProperties, volumeId?: string): void; - // (undocumented) - protected setInterpolationType(interpolationType: InterpolationType, volumeId?: string): void; - // (undocumented) - setOrientation(_orientation: OrientationAxis | OrientationVectors, _immediate?: boolean): void; - // (undocumented) - setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void; - // (undocumented) - protected setRotation: (rotation: number) => void; - // (undocumented) - abstract setSlabThickness(slabThickness: number, filterActorUIDs?: string[]): void; - // (undocumented) - setViewReference(viewRef: ViewReference): void; - // (undocumented) - setVolumes(volumeInputArray: IVolumeInput[], immediate?: boolean, suppressEvents?: boolean): Promise; - // (undocumented) - useCPURendering: boolean; - // (undocumented) - static get useCustomRenderingPipeline(): boolean; - // (undocumented) - protected viewportProperties: VolumeViewportProperties; - // (undocumented) - worldToCanvas: (worldPos: Point3) => Point2; -} - -// @public (undocumented) -enum BlendModes { - // (undocumented) - AVERAGE_INTENSITY_BLEND, - // (undocumented) - COMPOSITE, - // (undocumented) - LABELMAP_EDGE_PROJECTION_BLEND, - // (undocumented) - MAXIMUM_INTENSITY_BLEND, - // (undocumented) - MINIMUM_INTENSITY_BLEND -} - -// @public (undocumented) -type BoundsIJK = [Point2, Point2, Point2]; - -// @public (undocumented) -type BoundsLPS = [Point3, Point3, Point3]; - -// @public (undocumented) -export const cache: Cache_2; - -// @public (undocumented) -function calculateSpacingBetweenImageIds(imageIds: string[]): number; - -// @public (undocumented) -function calculateViewportsSpatialRegistration(viewport1: StackViewport | IVolumeViewport, viewport2: StackViewport | IVolumeViewport): void; - -// @public (undocumented) -enum CalibrationTypes { - // (undocumented) - ERMF = "ERMF", - // (undocumented) - ERROR = "Error", - // (undocumented) - NOT_APPLICABLE = "", - // (undocumented) - PROJECTION = "Proj", - // (undocumented) - REGION = "Region", - // (undocumented) - UNCALIBRATED = "Uncalibrated", - // (undocumented) - USER = "User" -} - -// @public (undocumented) -type CameraModifiedEvent = CustomEvent_2; - -// @public (undocumented) -interface CameraModifiedEventDetail { - // (undocumented) - camera: ICamera; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - previousCamera: ICamera; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type CameraResetEvent = CustomEvent_2; - -// @public (undocumented) -interface CameraResetEventDetail { - // (undocumented) - camera: ICamera; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -function cancelLoadAll(): void; - -// @public (undocumented) -function cancelLoadImage(imageId: string): void; - -// @public (undocumented) -function cancelLoadImages(imageIds: string[]): void; - -// @public (undocumented) -export function canRenderFloatTextures(): boolean; - -// @public (undocumented) -function clamp(value: number, min: number, max: number): number; - -// @public (undocumented) -function clip(val: number, low: number, high: number): number; - -// @public (undocumented) -type Color = [number, number, number, number]; - -declare namespace color { - export { - hexToRgb, - rgbToHex - } -} - -// @public (undocumented) -type ColorLUT = Color[]; - -declare namespace colormap { - export { - getColormap, - getColormapNames, - registerColormap, - findMatchingColormap - } -} - -// @public (undocumented) -type ColormapModifiedEvent = CustomEvent_2; - -// @public (undocumented) -interface ColormapModifiedEventDetail { - // (undocumented) - colormap: ColormapPublic; - // (undocumented) - viewportId: string; - // (undocumented) - volumeId?: string; -} - -// @public (undocumented) -interface ColormapPublic { - // (undocumented) - name?: string; - // (undocumented) - opacity?: OpacityMapping[] | number; -} - -// @public (undocumented) -interface ColormapRegistration { - // (undocumented) - ColorSpace: string; - // (undocumented) - Name: string; - // (undocumented) - RGBPoints: RGB[] | number[]; -} - -// @public (undocumented) -const colormapsData: CPUFallbackColormapsData; - -declare namespace CONSTANTS { - export { - colormapsData as CPU_COLORMAPS, - RENDERING_DEFAULTS, - mprCameraValues as MPR_CAMERA_VALUES, - EPSILON, - presets as VIEWPORT_PRESETS, - backgroundColors as BACKGROUND_COLORS - } -} -export { CONSTANTS } - -// @public (undocumented) -interface ContourData { - // (undocumented) - color: Point3; - // (undocumented) - points: Point3[]; - // (undocumented) - segmentIndex: number; - // (undocumented) - type: ContourType; -} - -// @public (undocumented) -interface ContourSetData { - // (undocumented) - color?: Point3; - // (undocumented) - data: ContourData[]; - // (undocumented) - frameOfReferenceUID: string; - // (undocumented) - id: string; - // (undocumented) - segmentIndex?: number; -} - -// @public (undocumented) -enum ContourType { - // (undocumented) - CLOSED_PLANAR = "CLOSED_PLANAR", - // (undocumented) - OPEN_PLANAR = "OPEN_PLANAR" -} - -// @public (undocumented) -export function convertMapperToNotSharedMapper(sharedMapper: vtkVolumeMapper): vtkVolumeMapper; - -// @public (undocumented) -function convertStackToVolumeViewport({ viewport, options, }: { - viewport: StackViewport; - options?: { - volumeId?: string; - viewportId?: string; - background?: Point3; - orientation?: OrientationAxis; - }; -}): Promise; - -// @public (undocumented) -function convertToGrayscale(scalarData: any, width: number, height: number): any; - -// @public (undocumented) -function convertVolumeToStackViewport({ viewport, options, }: { - viewport: Types.IVolumeViewport; - options: { - viewportId?: string; - background?: Types.Point3; - }; -}): Promise; - -// @public (undocumented) -interface Cornerstone3DConfig { - // (undocumented) - gpuTier: { - tier: number; - }; - // (undocumented) - isMobile: boolean; - // (undocumented) - peerImport?: (moduleId: string) => Promise; - // (undocumented) - rendering: { - preferSizeOverAccuracy: boolean; - useCPURendering: boolean; - strictZSpacingForVolumeViewport: boolean; - }; -} - -// @public (undocumented) -export function cornerstoneStreamingDynamicImageVolumeLoader(volumeId: string, options: { - imageIds: string[]; -}): IVolumeLoader_2; - -// @public (undocumented) -export function cornerstoneStreamingImageVolumeLoader(volumeId: string, options: { - imageIds: string[]; - progressiveRendering?: boolean | IRetrieveConfiguration; -}): IVolumeLoader; - -// @public (undocumented) -interface CPUFallbackColormap { - // (undocumented) - addColor: (rgba: Point4) => void; - // (undocumented) - buildLookupTable: (lut: CPUFallbackLookupTable) => void; - // (undocumented) - clearColors: () => void; - // (undocumented) - createLookupTable: () => CPUFallbackLookupTable; - // (undocumented) - getColor: (index: number) => Point4; - // (undocumented) - getColorRepeating: (index: number) => Point4; - // (undocumented) - getColorSchemeName: () => string; - // (undocumented) - getId: () => string; - // (undocumented) - getNumberOfColors: () => number; - // (undocumented) - insertColor: (index: number, rgba: Point4) => void; - // (undocumented) - isValidIndex: (index: number) => boolean; - // (undocumented) - removeColor: (index: number) => void; - // (undocumented) - setColor: (index: number, rgba: Point4) => void; - // (undocumented) - setColorSchemeName: (name: string) => void; - // (undocumented) - setNumberOfColors: (numColors: number) => void; -} - -// @public (undocumented) -interface CPUFallbackColormapData { - // (undocumented) - colors?: Point4[]; - // (undocumented) - gamma?: number; - // (undocumented) - name: string; - // (undocumented) - numColors?: number; - // (undocumented) - numOfColors?: number; - // (undocumented) - segmentedData?: unknown; -} - -// @public (undocumented) -type CPUFallbackColormapsData = Record; - -// @public (undocumented) -interface CPUFallbackEnabledElement { - // (undocumented) - canvas?: HTMLCanvasElement; - // (undocumented) - colormap?: CPUFallbackColormap; - // (undocumented) - image?: IImage; - // (undocumented) - invalid?: boolean; - // (undocumented) - metadata?: { - direction?: Mat3; - dimensions?: Point3; - spacing?: Point3; - origin?: Point3; - imagePlaneModule?: ImagePlaneModule; - imagePixelModule?: ImagePixelModule; - }; - // (undocumented) - needsRedraw?: boolean; - // (undocumented) - options?: { - [key: string]: unknown; - colormap?: CPUFallbackColormap; - }; - // (undocumented) - pan?: Point2; - // (undocumented) - renderingTools?: CPUFallbackRenderingTools; - // (undocumented) - rotation?: number; - // (undocumented) - scale?: number; - // (undocumented) - transform?: CPUFallbackTransform; - // (undocumented) - viewport?: CPUFallbackViewport; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; - // (undocumented) - zoom?: number; -} - -// @public (undocumented) -interface CPUFallbackLookupTable { - // (undocumented) - build: (force: boolean) => void; - // (undocumented) - getColor: (scalar: number) => Point4; - // (undocumented) - setAlphaRange: (start: number, end: number) => void; - // (undocumented) - setHueRange: (start: number, end: number) => void; - // (undocumented) - setNumberOfTableValues: (number: number) => void; - // (undocumented) - setRamp: (ramp: string) => void; - // (undocumented) - setRange: (start: number, end: number) => void; - // (undocumented) - setSaturationRange: (start: number, end: number) => void; - // (undocumented) - setTableRange: (start: number, end: number) => void; - // (undocumented) - setTableValue(index: number, rgba: Point4): any; - // (undocumented) - setValueRange: (start: number, end: number) => void; -} - -// @public (undocumented) -interface CPUFallbackLUT { - // (undocumented) - id?: string; - // (undocumented) - lut: number[]; -} - -// @public (undocumented) -interface CPUFallbackRenderingTools { - // (undocumented) - colorLUT?: CPUFallbackLookupTable; - // (undocumented) - colormapId?: string; - // (undocumented) - lastRenderedImageId?: string; - // (undocumented) - lastRenderedIsColor?: boolean; - // (undocumented) - lastRenderedViewport?: { - windowWidth: number | number[]; - windowCenter: number | number[]; - invert: boolean; - rotation: number; - hflip: boolean; - vflip: boolean; - modalityLUT: CPUFallbackLUT; - voiLUT: CPUFallbackLUT; - colormap: unknown; - }; - // (undocumented) - renderCanvas?: HTMLCanvasElement; - // (undocumented) - renderCanvasContext?: CanvasRenderingContext2D; - // (undocumented) - renderCanvasData?: ImageData; -} - -// @public (undocumented) -interface CPUFallbackTransform { - // (undocumented) - clone: () => CPUFallbackTransform; - // (undocumented) - getMatrix: () => TransformMatrix2D; - // (undocumented) - invert: () => void; - // (undocumented) - multiply: (matrix: TransformMatrix2D) => void; - // (undocumented) - reset: () => void; - // (undocumented) - rotate: (rad: number) => void; - // (undocumented) - scale: (sx: number, sy: number) => void; - // (undocumented) - transformPoint: (point: Point2) => Point2; - // (undocumented) - translate: (x: number, y: number) => void; -} - -// @public (undocumented) -interface CPUFallbackViewport { - // (undocumented) - colormap?: CPUFallbackColormap; - // (undocumented) - displayedArea?: CPUFallbackViewportDisplayedArea; - // (undocumented) - focalPoint?: number[]; - // (undocumented) - hflip?: boolean; - // (undocumented) - invert?: boolean; - // (undocumented) - modality?: string; - // (undocumented) - modalityLUT?: CPUFallbackLUT; - // (undocumented) - parallelScale?: number; - // (undocumented) - pixelReplication?: boolean; - // (undocumented) - rotation?: number; - // (undocumented) - scale?: number; - // (undocumented) - translation?: { - x: number; - y: number; - }; - // (undocumented) - vflip?: boolean; - // (undocumented) - voi?: { - windowWidth: number; - windowCenter: number; - voiLUTFunction: VOILUTFunctionType; - }; - // (undocumented) - voiLUT?: CPUFallbackLUT; -} - -// @public (undocumented) -interface CPUFallbackViewportDisplayedArea { - // (undocumented) - brhc: { - x: number; - y: number; - }; - // (undocumented) - columnPixelSpacing: number; - // (undocumented) - presentationSizeMode: string; - // (undocumented) - rowPixelSpacing: number; - // (undocumented) - tlhc: { - x: number; - y: number; - }; -} - -// @public (undocumented) -interface CPUIImageData { - // (undocumented) - calibration?: IImageCalibration; - // (undocumented) - dimensions: Point3; - // (undocumented) - direction: Mat3; - // (undocumented) - hasPixelSpacing?: boolean; - // (undocumented) - imageData: CPUImageData; - // (undocumented) - metadata: { - Modality: string; - FrameOfReferenceUID: string; - }; - // (undocumented) - numberOfComponents?: number; - // (undocumented) - origin: Point3; - // (undocumented) - preScale?: { - scaled?: boolean; - scalingParameters?: { - modality?: string; - rescaleSlope?: number; - rescaleIntercept?: number; - suvbw?: number; - }; - }; - // (undocumented) - scalarData: PixelDataTypedArray; - // (undocumented) - scaling?: Scaling; - // (undocumented) - spacing: Point3; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; -} - -// @public (undocumented) -interface CPUImageData { - // (undocumented) - getDimensions?: () => Point3; - // (undocumented) - getDirection?: () => Mat3; - // (undocumented) - getIndexToWorld?: () => Point3; - // (undocumented) - getRange?: () => [number, number]; - // (undocumented) - getScalarData?: () => PixelDataTypedArray; - // (undocumented) - getSpacing?: () => Point3; - // (undocumented) - getWorldToIndex?: () => Point3; - // (undocumented) - indexToWorld?: (point: Point3) => Point3; - // (undocumented) - worldToIndex?: (point: Point3) => Point3; -} - -// @public (undocumented) -function createAndCacheDerivedImage(referencedImageId: string, options?: DerivedImageOptions): IImage; - -// @public (undocumented) -function createAndCacheDerivedImages(referencedImageIds: string[], options?: DerivedImageOptions & { - getDerivedImageId?: (referencedImageId: string) => string; - targetBuffer?: { - type: PixelDataTypedArrayString; - }; - voxelRepresentation?: VoxelManagerEnum; -}): IImage[]; - -// @public (undocumented) -function createAndCacheDerivedLabelmapImage(referencedImageId: string, options?: DerivedImageOptions): IImage; - -// @public (undocumented) -function createAndCacheDerivedLabelmapImages(referencedImageIds: string[], options?: DerivedImageOptions): IImage[]; - -// @public (undocumented) -function createAndCacheDerivedLabelmapVolume(referencedVolumeId: string, options?: DerivedVolumeOptions): IImageVolume; - -// @public (undocumented) -function createAndCacheDerivedVolume(referencedVolumeId: string, options: DerivedVolumeOptions): IImageVolume; - -// @public (undocumented) -function createAndCacheGeometry(geometryId: string, options: GeometryOptions): IGeometry; - -// @public (undocumented) -function createAndCacheLocalImage(imageId: string, options: LocalImageOptions): IImage; - -// @public (undocumented) -function createAndCacheVolume(volumeId: string, options?: VolumeLoaderOptions): Promise; - -// @public (undocumented) -function createAndCacheVolumeFromImages(volumeId: string, imageIds: string[]): Promise; - -// @public (undocumented) -function createAndCacheVolumeFromImagesSync(volumeId: string, imageIds: string[]): IImageVolume; - -// @public (undocumented) -function createLinearRGBTransferFunction(voiRange: VOIRange): vtkColorTransferFunction; - -// @public (undocumented) -function createLocalLabelmapVolume(options: LocalVolumeOptions, volumeId: string, preventCache?: boolean): IImageVolume; - -// @public (undocumented) -function createLocalVolume(volumeId: string, options?: LocalVolumeOptions): IImageVolume; - -// @public (undocumented) -function createSigmoidRGBTransferFunction(voiRange: VOIRange, approximationNodes?: number): vtkColorTransferFunction; - -// @public (undocumented) -function createSubVolume(referencedVolumeId: string, boundsIJK: AABB3, options?: { - targetBuffer?: { - type: PixelDataTypedArrayString; - }; -}): ImageVolume; - -// @public (undocumented) -export function createVolumeActor(props: createVolumeActorInterface, element: HTMLDivElement, viewportId: string, suppressEvents?: boolean): Promise; - -// @public (undocumented) -export function createVolumeMapper(imageData: vtkImageData, vtkOpenGLTexture: vtkOpenGLTexture): vtkVolumeMapper; - -// @public (undocumented) -interface CustomEvent_2 extends Event { - // (undocumented) - readonly detail: T; - // (undocumented) - initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: T): void; -} - -// @public (undocumented) -type DataSetOptions = { - groupId?: string; - viewSelector?: ViewPresentationSelector; - viewReference?: ViewReferenceSpecifier; -}; - -// @public (undocumented) -function decimate(list: unknown[], interleave: number, offset?: number): number[]; - -// @public (undocumented) -function deepClone(obj: unknown): unknown; - -// @public (undocumented) -function deepEqual(obj1: unknown, obj2: unknown): boolean; - -// @public (undocumented) -const deepMerge: (target?: {}, source?: {}, optionsArgument?: any) => any; - -// @public (undocumented) -const DefaultHistoryMemo: HistoryMemo; - -// @public (undocumented) -interface DicomDateObject { - // (undocumented) - day: number; - // (undocumented) - month: number; - // (undocumented) - year: number; -} - -// @public (undocumented) -interface DicomTimeObject { - // (undocumented) - fractionalSeconds?: number; - // (undocumented) - hours: number; - // (undocumented) - minutes?: number; - // (undocumented) - seconds?: number; -} - -// @public (undocumented) -interface DisplayArea { - // (undocumented) - imageArea?: [number, number]; - // (undocumented) - imageCanvasPoint?: { - imagePoint: [number, number]; - canvasPoint?: [number, number]; - }; - // (undocumented) - interpolationType?: InterpolationType; - // (undocumented) - scale?: number; - // (undocumented) - storeAsInitialCamera?: boolean; - // (undocumented) - type?: 'SCALE' | 'FIT'; -} - -// @public (undocumented) -type DisplayAreaModifiedEvent = CustomEvent_2; - -// @public (undocumented) -interface DisplayAreaModifiedEventDetail { - // (undocumented) - displayArea: DisplayArea; - // (undocumented) - storeAsInitialCamera?: boolean; - // (undocumented) - viewportId: string; - // (undocumented) - volumeId?: string; -} - -// @public (undocumented) -enum DynamicOperatorType { - // (undocumented) - AVERAGE = "AVERAGE", - // (undocumented) - SUBTRACT = "SUBTRACT", - // (undocumented) - SUM = "SUM" -} - -// @public (undocumented) -type ElementDisabledEvent = CustomEvent_2; - -// @public (undocumented) -interface ElementDisabledEventDetail { - // (undocumented) - element: HTMLDivElement; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type ElementEnabledEvent = CustomEvent_2; - -// @public (undocumented) -interface ElementEnabledEventDetail { - // (undocumented) - element: HTMLDivElement; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -declare namespace Enums { - export { - EVENTS as Events, - BlendModes, - CalibrationTypes, - InterpolationType, - RequestType, - ViewportType, - OrientationAxis, - GeometryType, - ContourType, - VOILUTFunctionType, - DynamicOperatorType, - ViewportStatus, - VideoEnums, - MetadataModules, - ImageQualityStatus, - VoxelManagerEnum, - GenerateImageType - } -} -export { Enums } - -// @public (undocumented) -const EPSILON = 0.001; - -declare namespace eventListener { - export { - TargetEventListeners, - MultiTargetEventListenerManager - } -} - -// @public (undocumented) -export enum EVENTS { - // (undocumented) - CACHE_SIZE_EXCEEDED = "CACHE_SIZE_EXCEEDED", - // (undocumented) - CAMERA_MODIFIED = "CORNERSTONE_CAMERA_MODIFIED", - // (undocumented) - CAMERA_RESET = "CORNERSTONE_CAMERA_RESET", - // (undocumented) - CLIPPING_PLANES_UPDATED = "CORNERSTONE_CLIPPING_PLANES_UPDATED", - // (undocumented) - COLORMAP_MODIFIED = "CORNERSTONE_COLORMAP_MODIFIED", - // (undocumented) - DISPLAY_AREA_MODIFIED = "CORNERSTONE_DISPLAY_AREA_MODIFIED", - // (undocumented) - DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED = "DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED", - // (undocumented) - DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED = "DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED", - // (undocumented) - DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED = "DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED", - // (undocumented) - DYNAMIC_VOLUME_TIME_POINT_LOADED = "DYNAMIC_VOLUME_TIME_POINT_LOADED", - // (undocumented) - ELEMENT_DISABLED = "CORNERSTONE_ELEMENT_DISABLED", - // (undocumented) - ELEMENT_ENABLED = "CORNERSTONE_ELEMENT_ENABLED", - // (undocumented) - ERROR_EVENT = "CORNERSTONE_ERROR", - // (undocumented) - GEOMETRY_CACHE_GEOMETRY_ADDED = "CORNERSTONE_GEOMETRY_CACHE_GEOMETRY_ADDED", - // (undocumented) - GEOMETRY_CACHE_GEOMETRY_REMOVED = "CORNERSTONE_GEOMETRY_CACHE_GEOMETRY_REMOVED", - // (undocumented) - GEOMETRY_LOADED = "GEOMETRY_LOADED", - // (undocumented) - GEOMETRY_LOADED_FAILED = "GEOMETRY_LOADED_FAILED", - // (undocumented) - IMAGE_CACHE_IMAGE_ADDED = "CORNERSTONE_IMAGE_CACHE_IMAGE_ADDED", - // (undocumented) - IMAGE_CACHE_IMAGE_REMOVED = "CORNERSTONE_IMAGE_CACHE_IMAGE_REMOVED", - // (undocumented) - IMAGE_LOAD_ERROR = "IMAGE_LOAD_ERROR", - // (undocumented) - IMAGE_LOAD_FAILED = "CORNERSTONE_IMAGE_LOAD_FAILED", - // (undocumented) - IMAGE_LOADED = "CORNERSTONE_IMAGE_LOADED", - // (undocumented) - IMAGE_RENDERED = "CORNERSTONE_IMAGE_RENDERED", - // (undocumented) - IMAGE_RETRIEVAL_STAGE = "CORNERSTONE_IMAGE_RETRIEVAL_STAGE", - // (undocumented) - IMAGE_SPACING_CALIBRATED = "CORNERSTONE_IMAGE_SPACING_CALIBRATED", - // (undocumented) - IMAGE_VOLUME_LOADING_COMPLETED = "CORNERSTONE_IMAGE_VOLUME_LOADING_COMPLETED", - // (undocumented) - IMAGE_VOLUME_MODIFIED = "CORNERSTONE_IMAGE_VOLUME_MODIFIED", - // (undocumented) - PRE_STACK_NEW_IMAGE = "CORNERSTONE_PRE_STACK_NEW_IMAGE", - // (undocumented) - PRESET_MODIFIED = "CORNERSTONE_VIEWPORT_RENDERING_PRESET_MODIFIED", - // (undocumented) - STACK_NEW_IMAGE = "CORNERSTONE_STACK_NEW_IMAGE", - // (undocumented) - STACK_SCROLL_OUT_OF_BOUNDS = "STACK_SCROLL_OUT_OF_BOUNDS", - // (undocumented) - STACK_VIEWPORT_SCROLL = "CORNERSTONE_STACK_VIEWPORT_SCROLL", - // (undocumented) - VIEWPORT_NEW_IMAGE_SET = "CORNERSTONE_VIEWPORT_NEW_IMAGE_SET", - // (undocumented) - VOI_MODIFIED = "CORNERSTONE_VOI_MODIFIED", - // (undocumented) - VOLUME_CACHE_VOLUME_ADDED = "CORNERSTONE_VOLUME_CACHE_VOLUME_ADDED", - // (undocumented) - VOLUME_CACHE_VOLUME_REMOVED = "CORNERSTONE_VOLUME_CACHE_VOLUME_REMOVED", - // (undocumented) - VOLUME_LOADED = "CORNERSTONE_VOLUME_LOADED", - // (undocumented) - VOLUME_LOADED_FAILED = "CORNERSTONE_VOLUME_LOADED_FAILED", - // (undocumented) - VOLUME_NEW_IMAGE = "CORNERSTONE_VOLUME_NEW_IMAGE", - // (undocumented) - VOLUME_VIEWPORT_NEW_VOLUME = "CORNERSTONE_VOLUME_VIEWPORT_NEW_VOLUME", - // (undocumented) - VOLUME_VIEWPORT_SCROLL = "VOLUME_VIEWPORT_SCROLL", - // (undocumented) - VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS = "VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS", - // (undocumented) - WEB_WORKER_PROGRESS = "CORNERSTONE_WEB_WORKER_PROGRESS" -} - -// @public (undocumented) -export const eventTarget: CornerstoneEventTarget; - -declare namespace EventTypes { - export { - ImageLoadStageEventDetail, - VolumeScrollOutOfBoundsEventDetail, - VolumeScrollOutOfBoundsEvent, - CameraModifiedEventDetail, - CameraModifiedEvent, - VoiModifiedEvent, - VoiModifiedEventDetail, - ColormapModifiedEvent, - ColormapModifiedEventDetail, - DisplayAreaModifiedEvent, - DisplayAreaModifiedEventDetail, - ElementDisabledEvent, - ElementDisabledEventDetail, - ElementEnabledEvent, - ElementEnabledEventDetail, - ImageRenderedEventDetail, - ImageRenderedEvent, - ImageVolumeModifiedEvent, - ImageVolumeModifiedEventDetail, - ImageVolumeLoadingCompletedEvent, - ImageVolumeLoadingCompletedEventDetail, - ImageLoadedEvent, - ImageLoadedEventDetail, - ImageLoadedFailedEventDetail, - ImageLoadedFailedEvent, - VolumeLoadedEvent, - VolumeLoadedEventDetail, - VolumeLoadedFailedEvent, - VolumeLoadedFailedEventDetail, - ImageCacheImageAddedEvent, - ImageCacheImageAddedEventDetail, - ImageCacheImageRemovedEvent, - ImageCacheImageRemovedEventDetail, - VolumeCacheVolumeAddedEvent, - VolumeCacheVolumeAddedEventDetail, - VolumeCacheVolumeRemovedEvent, - VolumeCacheVolumeRemovedEventDetail, - StackNewImageEvent, - StackNewImageEventDetail, - PreStackNewImageEvent, - PreStackNewImageEventDetail, - ImageSpacingCalibratedEvent, - ImageSpacingCalibratedEventDetail, - VolumeNewImageEvent, - VolumeNewImageEventDetail, - StackViewportNewStackEvent, - StackViewportNewStackEventDetail, - StackViewportScrollEvent, - StackViewportScrollEventDetail, - StackScrollOutOfBoundsEvent, - StackScrollOutOfBoundsEventDetail, - CameraResetEvent, - CameraResetEventDetail - } -} - -// @public (undocumented) -function findMatchingColormap(rgbPoints: any, actor: any): ColormapPublic | null; - -// @public (undocumented) -interface FlipDirection { - // (undocumented) - flipHorizontal?: boolean; - // (undocumented) - flipVertical?: boolean; -} - -// @public (undocumented) -function fnv1aHash(str: string): string; - -// @public (undocumented) -class FrameRange { - // (undocumented) - protected static frameRangeExtractor: RegExp; - // (undocumented) - protected static framesToImageId(imageId: string, range: FramesRange | string): string; - // (undocumented) - static framesToString(range: any): string; - // (undocumented) - static imageIdToFrameEnd(imageId: string): number; - // (undocumented) - protected static imageIdToFrames(imageId: string): FramesRange; - // (undocumented) - static imageIdToFrameStart(imageId: string): number; -} - -// @public (undocumented) -interface GeneralSeriesModuleMetadata { - // (undocumented) - modality: string; - // (undocumented) - seriesDate: DicomDateObject; - // (undocumented) - seriesInstanceUID: string; - // (undocumented) - seriesNumber: number; - // (undocumented) - seriesTime: DicomTimeObject; - // (undocumented) - studyInstanceUID: string; -} - -// @public (undocumented) -enum GenerateImageType { - // (undocumented) - AVERAGE = "AVERAGE", - // (undocumented) - SUBTRACT = "SUBTRACT", - // (undocumented) - SUM = "SUM" -} - -// @public (undocumented) -function generateVolumePropsFromImageIds(imageIds: string[], volumeId: string): ImageVolumeProps; - -declare namespace geometryLoader { - export { - loadGeometry, - loadAndCacheGeometry, - createAndCacheGeometry, - registerGeometryLoader, - registerUnknownGeometryLoader - } -} -export { geometryLoader } - -// @public (undocumented) -type GeometryLoaderFn = (geometryId: string, options?: Record) => { - promise: Promise; - cancelFn?: () => void | undefined; - decache?: () => void | undefined; -}; - -// @public (undocumented) -enum GeometryType { - // (undocumented) - CONTOUR = "CONTOUR", - // (undocumented) - SURFACE = "SURFACE" -} - -// @public (undocumented) -function getBufferConfiguration(targetBufferType: PixelDataTypedArrayString, length: number, options?: { - isVolumeBuffer?: boolean; -}): { - numBytes: number; - TypedArrayConstructor: new (length: number) => PixelDataTypedArray; -}; - -// @public (undocumented) -function getClosestImageId(imageVolume: IImageVolume | { - direction: mat3; - spacing: Point3; - imageIds: string[]; -}, worldPos: Point3, viewPlaneNormal: Point3): string; - -// @public (undocumented) -function getClosestStackImageIndexForPoint(point: Point3, viewport: StackViewport): number | null; - -// @public (undocumented) -function getColormap(name: any): any; - -// @public (undocumented) -function getColormapNames(): any[]; - -// @public (undocumented) -export function getConfiguration(): Cornerstone3DConfig; - -// @public (undocumented) -function getCurrentVolumeViewportSlice(viewport: IVolumeViewport): { - width: number; - height: number; - scalarData: PixelDataTypedArray; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; -}; - -// @public (undocumented) -function getDynamicVolumeInfo(imageIds: any): { - isDynamicVolume: boolean; - timePoints: string[][]; - splittingTag: string; -}; - -// @public (undocumented) -export function getEnabledElement(element: HTMLDivElement | undefined): IEnabledElement | undefined; - -// @public (undocumented) -export function getEnabledElementByIds(viewportId: string, renderingEngineId: string): IEnabledElement; - -// @public (undocumented) -export function getEnabledElementByViewportId(viewportId: string): IEnabledElement; - -// @public (undocumented) -export function getEnabledElements(): IEnabledElement[]; - -// @public (undocumented) -function getImageLegacy(element: HTMLDivElement): Types.IImage | undefined; - -// @public (undocumented) -function getImageSliceDataForVolumeViewport(viewport: IVolumeViewport): ImageSliceData; - -// @public (undocumented) -function getMetaData(type: string, ...queries: any[]): any; - -// @public (undocumented) -function getMinMax(storedPixelData: PixelDataTypedArray): { - min: number; - max: number; -}; - -// @public (undocumented) -export function getOrCreateCanvas(element: HTMLDivElement): HTMLCanvasElement; - -// @public (undocumented) -function getRandomSampleFromArray(array: T[], size: number): T[]; - -// @public (undocumented) -export function getRenderingEngine(id: string): IRenderingEngine | undefined; - -// @public (undocumented) -export function getRenderingEngines(): IRenderingEngine[] | undefined; - -// @public (undocumented) -function getRuntimeId(context?: unknown, separator?: string, max?: number): string; - -// @public (undocumented) -function getScalingParameters(imageId: string): ScalingParameters; - -// @public (undocumented) -export function getShouldUseCPURendering(): boolean; - -// @public (undocumented) -function getSliceRange(volumeActor: VolumeActor, viewPlaneNormal: Point3, focalPoint: Point3): ActorSliceRange; - -// @public (undocumented) -function getSpacingInNormalDirection(imageVolume: IImageVolume | { - direction: mat3; - spacing: Point3; -}, viewPlaneNormal: Point3): number; - -// @public (undocumented) -function getTargetVolumeAndSpacingInNormalDir(viewport: IVolumeViewport, camera: ICamera, targetId?: string, useSlabThickness?: boolean): { - imageVolume: IImageVolume; - spacingInNormalDirection: number; - actorUID: string; -}; - -// @public (undocumented) -function getTransferFunctionNodes(transferFunction: any): any[]; - -// @public (undocumented) -function getUnknownVolumeLoaderSchema(): string; - -// @public (undocumented) -function getViewportImageCornersInWorld(viewport: StackViewport | IVolumeViewport): Point3[]; - -// @public (undocumented) -function getViewportImageIds(viewport: IViewport): string[]; - -// @public (undocumented) -const getViewportModality: (viewport: IViewport, volumeId?: string) => string; - -// @public (undocumented) -function getViewportsWithImageURI(imageURI: string): Viewport_2[]; - -// @public (undocumented) -function getViewportsWithVolumeId(volumeId: string): IVolumeViewport[]; - -// @public (undocumented) -function getVoiFromSigmoidRGBTransferFunction(cfun: vtkColorTransferFunction): [number, number]; - -// @public (undocumented) -function getVolumeActorCorners(volumeActor: any): Point3[]; - -// @public (undocumented) -function getVolumeDirectionVectors(imageData: any, camera: any): { - worldVecRowDir: vec3; - worldVecColDir: vec3; - worldVecSliceDir: vec3; - ijkVecRowDir: vec3; - ijkVecColDir: vec3; - ijkVecSliceDir: vec3; -}; - -// @public (undocumented) -const getVolumeId: (targetId: string) => string; - -// @public (undocumented) -function getVolumeLoaderSchemes(): string[]; - -// @public (undocumented) -function getVolumeSliceRangeInfo(viewport: IVolumeViewport, volumeId: string, useSlabThickness?: boolean): { - sliceRange: ActorSliceRange; - spacingInNormalDirection: number; - camera: ICamera; -}; - -// @public (undocumented) -function getVolumeViewportsContainingSameVolumes(targetViewport: IVolumeViewport, renderingEngineId?: string): IVolumeViewport[]; - -// @public (undocumented) -function getVolumeViewportScrollInfo(viewport: IVolumeViewport, volumeId: string, useSlabThickness?: boolean): { - numScrollSteps: number; - currentStepIndex: number; - sliceRangeInfo: { - sliceRange: ActorSliceRange; - spacingInNormalDirection: number; - camera: ICamera; - }; -}; - -// @public (undocumented) -export function getWebWorkerManager(): any; - -// @public (undocumented) -const hasFloatScalingParameters: (scalingParameters: ScalingParameters) => boolean; - -// @public (undocumented) -function hasNaNValues(input: number[] | number): boolean; - -// @public (undocumented) -function hexToRgb(hex: any): { - r: number; - g: number; - b: number; -}; - -// @public (undocumented) -class HistoryMemo { - constructor(label?: string, size?: number); - // (undocumented) - readonly label: any; - // (undocumented) - push(item: Memo | Memoable): Memo; - // (undocumented) - redo(items?: number): void; - // (undocumented) - get size(): number; - set size(newSize: number); - // (undocumented) - undo(items?: number): void; -} - -declare namespace HistoryMemo_2 { - export { - Memo, - Memoable, - HistoryMemo, - DefaultHistoryMemo - } -} - -// @public (undocumented) -type IBaseVolumeViewport = BaseVolumeViewport; - -// @public (undocumented) -interface ICache { - // (undocumented) - getCacheSize: () => number; - // (undocumented) - getImageLoadObject: (imageId: string) => IImageLoadObject | void; - // (undocumented) - getMaxCacheSize: () => number; - // (undocumented) - getVolumeLoadObject: (volumeId: string) => IVolumeLoadObject | void; - // (undocumented) - purgeCache: () => void; - // (undocumented) - putImageLoadObject: (imageId: string, imageLoadObject: IImageLoadObject, updateCache?: boolean) => Promise; - // (undocumented) - putVolumeLoadObject: (volumeId: string, volumeLoadObject: IVolumeLoadObject) => Promise; - // (undocumented) - setMaxCacheSize: (maxCacheSize: number) => void; -} - -// @public (undocumented) -interface ICachedGeometry { - // (undocumented) - geometry?: IGeometry; - // (undocumented) - geometryId: string; - // (undocumented) - geometryLoadObject: IGeometryLoadObject; - // (undocumented) - loaded: boolean; - // (undocumented) - sizeInBytes: number; - // (undocumented) - timeStamp: number; -} - -// @public (undocumented) -interface ICachedImage { - // (undocumented) - image?: IImage; - // (undocumented) - imageId: string; - // (undocumented) - imageLoadObject?: IImageLoadObject; - // (undocumented) - loaded: boolean; - // (undocumented) - sharedCacheKey?: string; - // (undocumented) - sizeInBytes: number; - // (undocumented) - timeStamp: number; -} - -// @public (undocumented) -interface ICachedVolume { - // (undocumented) - loaded: boolean; - // (undocumented) - sizeInBytes: number; - // (undocumented) - timeStamp: number; - // (undocumented) - volume?: IImageVolume; - // (undocumented) - volumeId: string; - // (undocumented) - volumeLoadObject: IVolumeLoadObject; -} - -// @public (undocumented) -interface ICamera { - // (undocumented) - clippingRange?: Point2; - // (undocumented) - flipHorizontal?: boolean; - // (undocumented) - flipVertical?: boolean; - // (undocumented) - focalPoint?: Point3; - // (undocumented) - parallelProjection?: boolean; - // (undocumented) - parallelScale?: number; - // (undocumented) - position?: Point3; - // (undocumented) - rotation?: number; - // (undocumented) - scale?: number; - // (undocumented) - viewAngle?: number; - // (undocumented) - viewPlaneNormal?: Point3; - // (undocumented) - viewUp?: Point3; -} - -// @public (undocumented) -type ICanvasActor = CanvasActor; - -// @public (undocumented) -type IContour = Contour; - -// @public (undocumented) -type IContourSet = ContourSet; - -// @public (undocumented) -interface IDynamicImageVolume extends IImageVolume { - // (undocumented) - get dimensionGroupNumber(): number; - set dimensionGroupNumber(dimensionGroupNumber: number); - // (undocumented) - get numDimensionGroups(): number; - // (undocumented) - get numTimePoints(): number; - // (undocumented) - scroll(delta: number): void; - // (undocumented) - get timePointIndex(): number; - set timePointIndex(timePointIndex: number); -} - -// @public (undocumented) -interface IEnabledElement { - // (undocumented) - FrameOfReferenceUID: string; - // (undocumented) - renderingEngine: IRenderingEngine; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewport: StackViewport | IVolumeViewport; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -interface IGeometry { - // (undocumented) - data: IContourSet | ISurface; - // (undocumented) - id: string; - // (undocumented) - sizeInBytes: number; - // (undocumented) - type: GeometryType; -} - -// @public (undocumented) -interface IGeometryLoadObject { - // (undocumented) - cancelFn?: () => void; - // (undocumented) - decache?: () => void; - // (undocumented) - promise: Promise; -} - -// @public (undocumented) -interface IImage { - // (undocumented) - bufferView?: { - buffer: ArrayBuffer; - offset: number; - }; - // (undocumented) - cachedLut?: { - windowWidth?: number | number[]; - windowCenter?: number | number[]; - invert?: boolean; - lutArray?: Uint8ClampedArray; - modalityLUT?: CPUFallbackLUT; - voiLUT?: CPUFallbackLUT; - }; - // (undocumented) - calibration?: IImageCalibration; - // (undocumented) - color: boolean; - // (undocumented) - colormap?: CPUFallbackColormap; - // (undocumented) - columnPixelSpacing: number; - // (undocumented) - columns: number; - // (undocumented) - dataType: PixelDataTypedArrayString; - // (undocumented) - decodeTimeInMS?: number; - // (undocumented) - FrameOfReferenceUID?: string; - // (undocumented) - getCanvas: () => HTMLCanvasElement; - // (undocumented) - getPixelData: () => PixelDataTypedArray; - // (undocumented) - height: number; - // (undocumented) - imageFrame?: ImageFrame; - // (undocumented) - imageId: string; - // (undocumented) - imageQualityStatus?: ImageQualityStatus; - // (undocumented) - intercept: number; - // (undocumented) - invert: boolean; - // (undocumented) - isPreScaled?: boolean; - // (undocumented) - loadTimeInMS?: number; - // (undocumented) - maxPixelValue: number; - // (undocumented) - minPixelValue: number; - // (undocumented) - modalityLUT?: CPUFallbackLUT; - // (undocumented) - numberOfComponents: number; - // (undocumented) - photometricInterpretation?: string; - // (undocumented) - preScale?: { - enabled: boolean; - scaled?: boolean; - scalingParameters?: { - modality?: string; - rescaleSlope?: number; - rescaleIntercept?: number; - suvbw?: number; - }; - }; - // (undocumented) - referencedImageId?: string; - // (undocumented) - render?: (enabledElement: CPUFallbackEnabledElement, invalidated: boolean) => unknown; - // (undocumented) - rgba: boolean; - // (undocumented) - rowPixelSpacing: number; - // (undocumented) - rows: number; - // (undocumented) - scaling?: { - PT?: { - SUVlbmFactor?: number; - SUVbsaFactor?: number; - suvbwToSuvlbm?: number; - suvbwToSuvbsa?: number; - }; - }; - // (undocumented) - sharedCacheKey?: string; - // (undocumented) - sizeInBytes: number; - // (undocumented) - sliceThickness?: number; - // (undocumented) - slope: number; - // (undocumented) - stats?: { - lastStoredPixelDataToCanvasImageDataTime?: number; - lastGetPixelDataTime?: number; - lastPutImageDataTime?: number; - lastLutGenerateTime?: number; - lastRenderedViewport?: unknown; - lastRenderTime?: number; - }; - // (undocumented) - voiLUT?: CPUFallbackLUT; - // (undocumented) - voiLUTFunction: VOILUTFunctionType; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; - // (undocumented) - width: number; - // (undocumented) - windowCenter: number[] | number; - // (undocumented) - windowWidth: number[] | number; -} - -// @public (undocumented) -interface IImageCalibration { - // (undocumented) - aspect?: number; - // (undocumented) - columnPixelSpacing?: number; - // (undocumented) - rowPixelSpacing?: number; - // (undocumented) - scale?: number; - // (undocumented) - sequenceOfUltrasoundRegions?: Record[]; - // (undocumented) - tooltip?: string; - // (undocumented) - type: CalibrationTypes; -} - -// @public (undocumented) -interface IImageData { - // (undocumented) - calibration?: IImageCalibration; - // (undocumented) - dimensions: Point3; - // (undocumented) - direction: Mat3; - // (undocumented) - hasPixelSpacing?: boolean; - // (undocumented) - imageData: vtkImageData; - // (undocumented) - metadata: { - Modality: string; - FrameOfReferenceUID: string; - }; - // (undocumented) - numberOfComponents?: number; - // (undocumented) - origin: Point3; - // (undocumented) - preScale?: { - scaled?: boolean; - scalingParameters?: { - modality?: string; - rescaleSlope?: number; - rescaleIntercept?: number; - suvbw?: number; - }; - }; - // (undocumented) - scalarData: PixelDataTypedArray; - // (undocumented) - scaling?: Scaling; - // (undocumented) - spacing: Point3; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; -} - -// @public (undocumented) -interface IImageLoadObject { - // (undocumented) - cancelFn?: () => void; - // (undocumented) - decache?: () => void; - // (undocumented) - promise: Promise; -} - -// @public (undocumented) -export interface IImagesLoader { - // (undocumented) - loadImages: (imageIds: string[], listener: ImageLoadListener) => Promise; -} - -// @public (undocumented) -type IImageVolume = ImageVolume; - -// @public (undocumented) -type ImageActor = vtkImageSlice; - -// @public (undocumented) -type ImageCacheImageAddedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageCacheImageAddedEventDetail { - // (undocumented) - image: ICachedImage; -} - -// @public (undocumented) -type ImageCacheImageRemovedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageCacheImageRemovedEventDetail { - // (undocumented) - imageId: string; -} - -// @public (undocumented) -interface ImageFrame { - // (undocumented) - bitsAllocated: number; - // (undocumented) - bitsStored: number; - // (undocumented) - bluePaletteColorLookupTableData: number[]; - // (undocumented) - bluePaletteColorLookupTableDescriptor: number[]; - // (undocumented) - columns: number; - // (undocumented) - decodeLevel?: unknown; - // (undocumented) - decodeTimeInMS?: number; - // (undocumented) - greenPaletteColorLookupTableData: number[]; - // (undocumented) - greenPaletteColorLookupTableDescriptor: number[]; - // (undocumented) - imageData?: ImageData; - // (undocumented) - imageId: string; - // (undocumented) - imageQualityStatus?: ImageQualityStatus; - // (undocumented) - largestPixelValue: number; - // (undocumented) - loadTimeInMS?: number; - // (undocumented) - photometricInterpretation: string; - // (undocumented) - pixelData: PixelDataTypedArray; - // (undocumented) - pixelDataLength?: number; - // (undocumented) - pixelRepresentation: number; - // (undocumented) - planarConfiguration: number; - // (undocumented) - preScale?: { - enabled: boolean; - scaled: boolean; - scalingParameters?: { - intercept?: number; - slope?: number; - rescaleSlope?: number; - rescaleIntercept?: number; - modality?: string; - suvbw?: number; - }; - }; - // (undocumented) - redPaletteColorLookupTableData: number[]; - // (undocumented) - redPaletteColorLookupTableDescriptor: number[]; - // (undocumented) - rows: number; - // (undocumented) - samplesPerPixel: number; - // (undocumented) - smallestPixelValue: number; - // (undocumented) - transferSyntax?: string; -} - -// @public (undocumented) -function imageIdToURI(imageId: string): string; - -// @public (undocumented) -type ImageLoadedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageLoadedEventDetail { - // (undocumented) - image: IImage; -} - -// @public (undocumented) -type ImageLoadedFailedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageLoadedFailedEventDetail { - // (undocumented) - error: unknown; - // (undocumented) - imageId: string; -} - -declare namespace imageLoader { - export { - loadImage, - loadAndCacheImage, - loadAndCacheImages, - createAndCacheDerivedImage, - createAndCacheDerivedImages, - createAndCacheLocalImage, - cancelLoadImage, - cancelLoadImages, - cancelLoadAll, - registerImageLoader, - registerUnknownImageLoader, - unregisterAllImageLoaders, - createAndCacheDerivedLabelmapImages, - createAndCacheDerivedLabelmapImage, - ImageLoaderOptions - } -} -export { imageLoader } - -// @public (undocumented) -type ImageLoaderFn = (imageId: string, options?: Record) => { - promise: Promise>; - cancelFn?: () => void | undefined; - decache?: () => void | undefined; -}; - -// @public (undocumented) -interface ImageLoaderOptions { - // (undocumented) - additionalDetails?: Record; - // (undocumented) - ignoreCache?: boolean; - // (undocumented) - priority: number; - // (undocumented) - requestType: string; -} - -// @public (undocumented) -export interface ImageLoadListener { - // (undocumented) - errorCallback: (imageId: any, permanent: any, reason: any) => void; - // (undocumented) - getLoaderImageOptions?: (imageId: any) => Record; - // (undocumented) - successCallback: (imageId: any, image: any) => void; -} - -// @public (undocumented) -const imageLoadPoolManager: RequestPoolManager; -export { imageLoadPoolManager } -export { imageLoadPoolManager as requestPoolManager } - -// @public (undocumented) -interface ImageLoadRequests { - // (undocumented) - additionalDetails: { - volumeId: string; - }; - // (undocumented) - callLoadImage: (imageId: string, imageIdIndex: number, options: unknown) => Promise; - // (undocumented) - imageId: string; - // (undocumented) - imageIdIndex: number; - // (undocumented) - options: { - targetBuffer: { - type: string; - rows: number; - columns: number; - }; - preScale: { - enabled: boolean; - scalingParameters: ScalingParameters; - }; - transferPixelData: boolean; - }; - // (undocumented) - priority: number; - // (undocumented) - requestType: RequestType; -} - -// @public (undocumented) -interface ImageLoadStageEventDetail { - // (undocumented) - numberOfFailures: number; - // (undocumented) - numberOfImages: number; - // (undocumented) - stageDurationInMS: number; - // (undocumented) - stageId: string; - // (undocumented) - startDurationInMS: number; -} - -// @public (undocumented) -interface ImagePixelModule { - // (undocumented) - bitsAllocated: number; - // (undocumented) - bitsStored: number; - // (undocumented) - highBit: number; - // (undocumented) - modality: string; - // (undocumented) - photometricInterpretation: string; - // (undocumented) - pixelRepresentation: string; - // (undocumented) - samplesPerPixel: number; - // (undocumented) - voiLUTFunction: VOILUTFunctionType; - // (undocumented) - windowCenter: number | number[]; - // (undocumented) - windowWidth: number | number[]; -} - -// @public (undocumented) -interface ImagePixelModuleMetadata { - // (undocumented) - bitsAllocated: number; - // (undocumented) - bitsStored: number; - // (undocumented) - bluePaletteColorLookupTableData: number[]; - // (undocumented) - bluePaletteColorLookupTableDescriptor: number[]; - // (undocumented) - columns: number; - // (undocumented) - greenPaletteColorLookupTableData: number[]; - // (undocumented) - greenPaletteColorLookupTableDescriptor: number[]; - // (undocumented) - highBit: number; - // (undocumented) - largestPixelValue?: number; - // (undocumented) - photometricInterpretation: string; - // (undocumented) - pixelAspectRatio: string; - // (undocumented) - pixelRepresentation: number; - // (undocumented) - planarConfiguration: number; - // (undocumented) - redPaletteColorLookupTableData: number[]; - // (undocumented) - redPaletteColorLookupTableDescriptor: number[]; - // (undocumented) - rows: number; - // (undocumented) - samplesPerPixel: number; - // (undocumented) - smallestPixelValue?: number; -} - -// @public (undocumented) -interface ImagePlaneModule { - // (undocumented) - columnCosines?: Point3; - // (undocumented) - columnPixelSpacing?: number; - // (undocumented) - columns: number; - // (undocumented) - frameOfReferenceUID: string; - // (undocumented) - imageOrientationPatient?: Float32Array; - // (undocumented) - imagePositionPatient?: Point3; - // (undocumented) - pixelSpacing?: Point2; - // (undocumented) - rowCosines?: Point3; - // (undocumented) - rowPixelSpacing?: number; - // (undocumented) - rows: number; - // (undocumented) - sliceLocation?: number; - // (undocumented) - sliceThickness?: number; -} - -// @public (undocumented) -interface ImagePlaneModuleMetadata { - // (undocumented) - columnCosines: number[]; - // (undocumented) - columnPixelSpacing: number | null; - // (undocumented) - columns: number; - // (undocumented) - frameOfReferenceUID: string; - // (undocumented) - imageOrientationPatient: number[]; - // (undocumented) - imagePositionPatient: number[]; - // (undocumented) - pixelSpacing: number[]; - // (undocumented) - rowCosines: number[]; - // (undocumented) - rowPixelSpacing: number | null; - // (undocumented) - rows: number; - // (undocumented) - sliceLocation: number; - // (undocumented) - sliceThickness: number; - // (undocumented) - usingDefaultValues: boolean; -} - -// @public (undocumented) -enum ImageQualityStatus { - // (undocumented) - ADJACENT_REPLICATE = 3, - // (undocumented) - FAR_REPLICATE = 1, - // (undocumented) - FULL_RESOLUTION = 8, - // (undocumented) - LOSSY = 7, - // (undocumented) - SUBRESOLUTION = 6 -} - -// @public (undocumented) -type ImageRenderedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageRenderedEventDetail { - // (undocumented) - element: HTMLDivElement; - // (undocumented) - renderingEngineId: string; - // (undocumented) - suppressEvents?: boolean; - // (undocumented) - viewportId: string; - // (undocumented) - viewportStatus: ViewportStatus; -} - -// @public (undocumented) -export const imageRetrievalPoolManager: RequestPoolManager; - -// @public (undocumented) -const imageRetrieveMetadataProvider: { - IMAGE_RETRIEVE_CONFIGURATION: string; - clear: () => void; - add: (key: string, payload: any) => void; - clone: () => Map; - restore: (state: Map) => void; - get: (type: string, ...queries: string[]) => unknown; -}; - -// @public (undocumented) -interface ImageSliceData { - // (undocumented) - imageIndex: number; - // (undocumented) - numberOfSlices: number; -} - -// @public (undocumented) -type ImageSpacingCalibratedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageSpacingCalibratedEventDetail { - // (undocumented) - calibration: IImageCalibration; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - imageData: vtkImageData; - // (undocumented) - imageId: string; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; - // (undocumented) - worldToIndex: mat4; -} - -// @public (undocumented) -function imageToWorldCoords(imageId: string, imageCoords: Point2): Point3 | undefined; - -// @public (undocumented) -export class ImageVolume { - constructor(props: ImageVolumeProps); - // (undocumented) - additionalDetails?: Record; - // (undocumented) - cancelLoading: () => void; - // (undocumented) - protected cornerstoneImageMetaData: any; - // (undocumented) - dataType?: PixelDataTypedArrayString; - // (undocumented) - destroy(): void; - // (undocumented) - dimensions: Point3; - // (undocumented) - direction: Mat3; - // (undocumented) - getCornerstoneImages(): IImage[]; - // (undocumented) - getImageIdByIndex(imageIdIndex: number): string; - // (undocumented) - getImageIdIndex(imageId: string): number; - // (undocumented) - getImageURIIndex(imageURI: string): number; - // (undocumented) - getScalarDataLength(): number; - // (undocumented) - hasPixelSpacing: boolean; - // (undocumented) - imageData?: vtkImageData; - // (undocumented) - protected imageIdIndexToFrameIndex(imageIdIndex: number): number; - // (undocumented) - get imageIds(): string[]; - set imageIds(newImageIds: string[]); - // (undocumented) - invalidate(): void; - // (undocumented) - isDynamicVolume(): boolean; - // (undocumented) - isPreScaled: boolean; - // (undocumented) - load(callback?: (...args: unknown[]) => void): void; - // (undocumented) - loadStatus?: Record; - // (undocumented) - metadata: Metadata; - // (undocumented) - modified(): void; - // (undocumented) - numFrames: number; - // (undocumented) - numTimePoints?: number; - // (undocumented) - numVoxels: number; - // (undocumented) - origin: Point3; - // (undocumented) - referencedImageIds?: string[]; - // (undocumented) - referencedVolumeId?: string; - // (undocumented) - removeFromCache(): void; - // (undocumented) - scaling?: { - PT?: { - SUVlbmFactor?: number; - SUVbsaFactor?: number; - suvbwToSuvlbm?: number; - suvbwToSuvbsa?: number; - }; - }; - // (undocumented) - get sizeInBytes(): number; - // (undocumented) - spacing: Point3; - // (undocumented) - protected totalNumFrames: number; - // (undocumented) - readonly volumeId: string; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; - // (undocumented) - vtkOpenGLTexture: vtkStreamingOpenGLTexture; -} - -// @public (undocumented) -type ImageVolumeLoadingCompletedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageVolumeLoadingCompletedEventDetail { - // (undocumented) - FrameOfReferenceUID: string; - // (undocumented) - volumeId: string; -} - -// @public (undocumented) -type ImageVolumeModifiedEvent = CustomEvent_2; - -// @public (undocumented) -interface ImageVolumeModifiedEventDetail { - // (undocumented) - FrameOfReferenceUID: string; - // (undocumented) - framesProcessed: number; - // (undocumented) - numberOfFrames: number; - // (undocumented) - volumeId: string; -} - -// @public (undocumented) -interface ImageVolumeProps extends VolumeProps { - // (undocumented) - imageIds: string[]; - // (undocumented) - referencedImageIds?: string[]; -} - -// @public (undocumented) -function indexWithinDimensions(index: Point3, dimensions: Point3): boolean; - -// @public (undocumented) -export function init(configuration?: Cornerstone3DConfig): boolean; - -// @public (undocumented) -interface InternalVideoCamera { - // (undocumented) - panWorld?: Point2; - // (undocumented) - parallelScale?: number; -} - -// @public (undocumented) -enum InterpolationType { - // (undocumented) - FAST_LINEAR = 2, - // (undocumented) - LINEAR = 1, - // (undocumented) - NEAREST = 0 -} - -// @public (undocumented) -function invertRgbTransferFunction(rgbTransferFunction: vtkColorTransferFunction): void; - -// @public (undocumented) -type IPointsManager = PointsManager; - -// @public (undocumented) -interface IRegisterImageLoader { - // (undocumented) - registerImageLoader: (scheme: string, imageLoader: ImageLoaderFn) => void; -} - -// @public (undocumented) -type IRenderingEngine = RenderingEngine; - -// @public (undocumented) -export interface IRetrieveConfiguration { - // (undocumented) - create?: (IRetrieveConfiguration: any) => IImagesLoader; - // (undocumented) - retrieveOptions?: Record; - // (undocumented) - stages?: RetrieveStage[]; -} - -// @public (undocumented) -type IRLEVoxelMap = RLEVoxelMap; - -// @public (undocumented) -export function isCornerstoneInitialized(): boolean; - -// @public (undocumented) -function isEqual(v1: ValueType, v2: ValueType, tolerance?: number): boolean; - -// @public (undocumented) -const isEqualAbs: (v1: ValueType, v2: ValueType, tolerance?: any) => boolean; - -// @public (undocumented) -const isEqualNegative: (v1: ValueType, v2: ValueType, tolerance?: any) => boolean; - -// @public (undocumented) -function isImageActor(actorEntry: Types.ActorEntry): boolean; - -// @public (undocumented) -function isOpposite(v1: Point3, v2: Point3, tolerance?: number): boolean; - -// @public (undocumented) -const isPTPrescaledWithSUV: (image: IImage) => number; - -// @public (undocumented) -interface IStackInput { - // (undocumented) - [key: string]: unknown; - // (undocumented) - actorUID?: string; - // (undocumented) - callback?: StackInputCallback; - // (undocumented) - imageId: string; - // (undocumented) - visibility?: boolean; -} - -// @public (undocumented) -interface IStreamingImageVolume extends IImageVolume { - // (undocumented) - clearLoadCallbacks(): void; - // (undocumented) - decache(completelyRemove?: boolean): void; - // (undocumented) - load(): void; -} - -// @public (undocumented) -interface IStreamingVolumeProperties { - // (undocumented) - imageIds: string[]; - // (undocumented) - loadStatus: { - loaded: boolean; - loading: boolean; - cancelled: boolean; - cachedFrames: ImageQualityStatus[]; - callbacks: (() => void)[]; - }; -} - -// @public (undocumented) -type ISurface = Surface; - -// @public (undocumented) -function isValidVolume(imageIds: string[]): boolean; - -// @public (undocumented) -function isVideoTransferSyntax(uidOrUids: string | string[]): string | false; - -// @public (undocumented) -type IVideoViewport = VideoViewport; - -// @public (undocumented) -type IViewport = Viewport; - -// @public (undocumented) -interface IViewportId { - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type IVolume = ImageVolumeProps; - -// @public (undocumented) -type IVolumeInput = { - volumeId: string; - actorUID?: string; - visibility?: boolean; - callback?: VolumeInputCallback; - blendMode?: BlendModes; - slabThickness?: number; - [key: string]: unknown; -}; - -// @public (undocumented) -interface IVolumeLoadObject { - // (undocumented) - cancelFn?: () => void; - // (undocumented) - decache?: () => void; - // (undocumented) - promise: Promise; -} - -// @public (undocumented) -type IVolumeViewport = VolumeViewport; - -// @public (undocumented) -type IVoxelManager = VoxelManager; - -// @public (undocumented) -type IWSIViewport = WSIViewport; - -// @public (undocumented) -function jumpToSlice(element: HTMLDivElement, options?: JumpToSliceOptions): Promise; - -// @public (undocumented) -type JumpToSliceOptions = { - imageIndex: number; - debounceLoading?: boolean; - volumeId?: string; -}; - -// @public (undocumented) -function linePlaneIntersection(p0: Point3, p1: Point3, plane: Plane): Point3; - -// @public (undocumented) -function loadAndCacheGeometry(geometryId: string, options?: GeometryOptions): Promise; - -// @public (undocumented) -function loadAndCacheImage(imageId: string, options?: ImageLoaderOptions): Promise; - -// @public (undocumented) -function loadAndCacheImages(imageIds: string[], options?: ImageLoaderOptions): Promise[]; - -// @public (undocumented) -function loadGeometry(geometryId: string, options?: GeometryOptions): Promise; - -// @public (undocumented) -function loadImage(imageId: string, options?: ImageLoaderOptions): Promise; - -// @public (undocumented) -function loadImageToCanvas(options: LoadImageOptions): Promise; - -// @public (undocumented) -function loadVolume(volumeId: string, options?: VolumeLoaderOptions): Promise; - -// @public (undocumented) -interface LocalVolumeOptions { - // (undocumented) - dimensions: Point3; - // (undocumented) - direction: Mat3; - // (undocumented) - imageIds?: string[]; - // (undocumented) - metadata: Metadata; - // (undocumented) - origin: Point3; - // (undocumented) - preventCache?: boolean; - // (undocumented) - referencedImageIds?: string[]; - // (undocumented) - referencedVolumeId?: string; - // (undocumented) - scalarData?: PixelDataTypedArray; - // (undocumented) - spacing: Point3; - // (undocumented) - targetBuffer?: { - type: PixelDataTypedArrayString; - }; -} - -// @public (undocumented) -function makeVolumeMetadata(imageIds: string[]): Metadata; - -// @public (undocumented) -type Mat3 = [number, number, number, number, number, number, number, number, number] | Float32Array; - -// @public (undocumented) -type Memo = { - restoreMemo: (undo?: boolean) => void; - commitMemo?: () => boolean; -}; - -// @public (undocumented) -type Memoable = { - createMemo: () => Memo; -}; - -// @public (undocumented) -interface Metadata { - // (undocumented) - BitsAllocated: number; - // (undocumented) - BitsStored: number; - // (undocumented) - Columns: number; - // (undocumented) - FrameOfReferenceUID: string; - // (undocumented) - HighBit: number; - // (undocumented) - ImageOrientationPatient: number[]; - // (undocumented) - Modality: string; - // (undocumented) - PhotometricInterpretation: string; - // (undocumented) - PixelRepresentation: number; - // (undocumented) - PixelSpacing: number[]; - // (undocumented) - Rows: number; - // (undocumented) - SamplesPerPixel: number; - // (undocumented) - SeriesInstanceUID?: string; - // (undocumented) - voiLut: VOI[]; - // (undocumented) - VOILUTFunction: string; -} - -declare namespace metaData { - export { - addProvider, - removeProvider, - removeAllProviders, - getMetaData as get - } -} -export { metaData } - -// @public (undocumented) -enum MetadataModules { - // (undocumented) - CALIBRATION = "calibrationModule", - // (undocumented) - CINE = "cineModule", - // (undocumented) - GENERAL_IMAGE = "generalImageModule", - // (undocumented) - GENERAL_SERIES = "generalSeriesModule", - // (undocumented) - GENERAL_STUDY = "generalStudyModule", - // (undocumented) - IMAGE_PIXEL = "imagePixelModule", - // (undocumented) - IMAGE_PLANE = "imagePlaneModule", - // (undocumented) - IMAGE_URL = "imageUrlModule", - // (undocumented) - MODALITY_LUT = "modalityLutModule", - // (undocumented) - MULTIFRAME = "multiframeModule", - // (undocumented) - NM_MULTIFRAME_GEOMETRY = "nmMultiframeGeometryModule", - // (undocumented) - OVERLAY_PLANE = "overlayPlaneModule", - // (undocumented) - PATIENT = "patientModule", - // (undocumented) - PATIENT_STUDY = "patientStudyModule", - // (undocumented) - PET_IMAGE = "petImageModule", - // (undocumented) - PET_ISOTOPE = "petIsotopeModule", - // (undocumented) - PET_SERIES = "petSeriesModule", - // (undocumented) - SOP_COMMON = "sopCommonModule", - // (undocumented) - ULTRASOUND_ENHANCED_REGION = "ultrasoundEnhancedRegionModule", - // (undocumented) - VOI_LUT = "voiLutModule", - // (undocumented) - WADO_WEB_CLIENT = "wadoWebClient" -} - -// @public (undocumented) -const metadataProvider: { - add: (imageId: string, payload: IImageCalibration) => void; - get: (type: string, imageId: string) => IImageCalibration; -}; - -// @public (undocumented) -const metadataProvider_2: { - add: (imageId: string, payload: { - metadata: unknown; - type: string; - }) => void; - addRaw: (imageId: string, payload: { - metadata: unknown; - type: string; - }) => void; - get: (type: string, imageId: string) => unknown; - clear: () => void; -}; - -// @public (undocumented) -const mprCameraValues: any; - -// @public (undocumented) -class MultiTargetEventListenerManager { - // (undocumented) - addEventListener(target: EventTarget, type: string, callback: EventListener, options?: AddEventListenerOptions): void; - // (undocumented) - removeEventListener(target: EventTarget, type: string, callback?: EventListener, options?: EventListenerOptions): void; - // (undocumented) - reset(): void; -} - -// @public (undocumented) -interface NearbyFrames { - // (undocumented) - imageQualityStatus?: ImageQualityStatus; - // (undocumented) - offset: number; -} - -// @public (undocumented) -enum OrientationAxis { - // (undocumented) - ACQUISITION = "acquisition", - // (undocumented) - AXIAL = "axial", - // (undocumented) - CORONAL = "coronal", - // (undocumented) - SAGITTAL = "sagittal" -} - -// @public (undocumented) -interface OrientationVectors { - // (undocumented) - viewPlaneNormal: Point3; - // (undocumented) - viewUp: Point3; -} - -// @public (undocumented) -interface PatientStudyModuleMetadata { - // (undocumented) - patientAge: number; - // (undocumented) - patientSize: number; - // (undocumented) - patientWeight: number; -} - -// @public (undocumented) -export function peerImport(moduleId: string): Promise; - -// @public (undocumented) -type PixelDataTypedArray = Float32Array | Int16Array | Uint16Array | Uint8Array | Int8Array | Uint8ClampedArray; - -// @public (undocumented) -type PixelDataTypedArrayString = 'Float32Array' | 'Int16Array' | 'Uint16Array' | 'Uint8Array' | 'Int8Array' | 'Uint8ClampedArray' | 'none'; - -declare namespace planar { - export { - linePlaneIntersection, - planeEquation, - threePlaneIntersection, - planeDistanceToPoint - } -} - -// @public (undocumented) -type Plane = [number, number, number, number]; - -// @public (undocumented) -function planeDistanceToPoint(plane: Plane, point: Point3, signed?: boolean): number; - -// @public (undocumented) -function planeEquation(normal: Point3, point: Point3 | vec3, normalized?: boolean): Plane; - -// @public (undocumented) -type Point2 = [number, number]; - -// @public (undocumented) -type Point3 = [number, number, number]; - -// @public (undocumented) -type Point4 = [number, number, number, number]; - -// @public (undocumented) -function pointInShapeCallback(imageData: vtkImageData | CPUImageData, options: PointInShapeOptions): Array | undefined; - -// @public (undocumented) -class PointsManager { - constructor(configuration?: PolyDataPointConfiguration); - // (undocumented) - array: ArrayBuffer; - // (undocumented) - _byteSize: number; - // (undocumented) - static create2(initialSize?: number): PointsManager; - // (undocumented) - static create3(initialSize?: number, points?: Point3[]): PointsManager; - // (undocumented) - data: Float32Array; - // (undocumented) - get dimensionLength(): number; - // (undocumented) - get dimensions(): number; - // (undocumented) - _dimensions: number; - // (undocumented) - forEach(func: (value: T, index: number) => void): void; - // (undocumented) - static fromXYZ({ x, y, z }: PointsXYZ): IPointsManager; - // (undocumented) - getPoint(index: number): T; - // (undocumented) - getPointArray(index: number): T; - // (undocumented) - getTypedArray(): Float32Array; - // (undocumented) - protected grow(additionalSize?: number, growSize?: number): void; - // (undocumented) - growSize: number; - // (undocumented) - kIndex: number; - // (undocumented) - get length(): number; - // (undocumented) - _length: number; - // (undocumented) - map(f: (value: any, index: number) => R): R[]; - // (undocumented) - get points(): T[]; - // (undocumented) - push(point: T): void; - // (undocumented) - reverse(): void; - // (undocumented) - sources: IPointsManager[]; - // (undocumented) - subselect(count?: number, offset?: number): IPointsManager; - // (undocumented) - toXYZ(): PointsXYZ; -} - -// @public (undocumented) -interface PointsXYZ { - // (undocumented) - x: number[]; - // (undocumented) - y: number[]; - // (undocumented) - z: number[]; -} - -// @public (undocumented) -interface PolyDataPointConfiguration { - // (undocumented) - dimensions?: number; - // (undocumented) - growSize?: number; - // (undocumented) - initialSize?: number; -} - -// @public (undocumented) -const presets: ViewportPreset[]; - -// @public (undocumented) -type PreStackNewImageEvent = CustomEvent_2; - -// @public (undocumented) -interface PreStackNewImageEventDetail { - // (undocumented) - imageId: string; - // (undocumented) - imageIdIndex: number; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -class ProgressiveIterator { - // (undocumented) - [Symbol.asyncIterator](): AsyncGenerator; - constructor(name?: any); - // (undocumented) - add(x: T, done?: boolean): void; - // (undocumented) - static as(promise: any): any; - // (undocumented) - done: any; - // (undocumented) - donePromise(): Promise; - // (undocumented) - forEach(callback: any, errorCallback: any): Promise; - // (undocumented) - generate(processFunction: any, errorCallback?: ErrorCallback_2): Promise; - // (undocumented) - getDonePromise(): PromiseIterator; - // (undocumented) - getNextPromise(): PromiseIterator; - // (undocumented) - getRecent(): T; - // (undocumented) - name?: string; - // (undocumented) - nextPromise(): Promise; - // (undocumented) - reject(reason: Error): void; - // (undocumented) - resolve(): void; -} - -// @public (undocumented) -export class ProgressiveRetrieveImages implements IImagesLoader, IRetrieveConfiguration { - constructor(imageRetrieveConfiguration: IRetrieveConfiguration); - // (undocumented) - static createProgressive: typeof createProgressive; - // (undocumented) - static interleavedRetrieveStages: { - stages: RetrieveStage[]; - }; - // (undocumented) - loadImages(imageIds: string[], listener: ImageLoadListener): Promise; - // (undocumented) - retrieveOptions: Record; - // (undocumented) - static sequentialRetrieveStages: { - stages: RetrieveStage[]; - }; - // (undocumented) - static singleRetrieveStages: { - stages: RetrieveStage[]; - }; - // (undocumented) - stages: RetrieveStage[]; -} - -// @public (undocumented) -interface PTScaling { - // (undocumented) - suvbsa?: number; - // (undocumented) - suvbw?: number; - // (undocumented) - suvbwToSuvbsa?: number; - // (undocumented) - suvbwToSuvlbm?: number; - // (undocumented) - suvlbm?: number; -} - -// @public (undocumented) -type PublicContourSetData = ContourSetData; - -// @public (undocumented) -type PublicSurfaceData = SurfaceData; - -// @public (undocumented) -interface PublicViewportInput { - // (undocumented) - defaultOptions?: ViewportInputOptions; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - type: ViewportType; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type RangeRetrieveOptions = BaseRetrieveOptions & { - rangeIndex: number; - chunkSize?: number | ((metadata: any) => number); -}; - -// @public (undocumented) -interface ReferenceCompatibleOptions { - // (undocumented) - asNearbyProjection?: boolean; - // (undocumented) - asOverlay?: boolean; - // (undocumented) - asVolume?: boolean; - // (undocumented) - imageURI?: string; - // (undocumented) - withNavigation?: boolean; - // (undocumented) - withOrientation?: boolean; -} - -// @public (undocumented) -function registerColormap(colormap: ColormapRegistration): void; - -// @public (undocumented) -function registerGeometryLoader(scheme: string, geometryLoader: GeometryLoaderFn): void; - -// @public (undocumented) -export function registerImageLoader(scheme: string, imageLoader: ImageLoaderFn): void; - -// @public (undocumented) -function registerUnknownGeometryLoader(geometryLoader: GeometryLoaderFn): GeometryLoaderFn | undefined; - -// @public (undocumented) -function registerUnknownImageLoader(imageLoader: ImageLoaderFn): ImageLoaderFn; - -// @public (undocumented) -function registerUnknownVolumeLoader(volumeLoader: VolumeLoaderFn): VolumeLoaderFn | undefined; - -// @public (undocumented) -function registerVolumeLoader(scheme: string, volumeLoader: VolumeLoaderFn): void; - -// @public (undocumented) -function removeAllProviders(): void; - -// @public (undocumented) -function removeProvider(provider: (type: string, query: unknown) => unknown): void; - -// @public (undocumented) -const RENDERING_DEFAULTS: { - MINIMUM_SLAB_THICKNESS: number; - MAXIMUM_RAY_DISTANCE: number; -}; - -// @public (undocumented) -export class RenderingEngine { - constructor(id?: string); - // (undocumented) - _debugRender(): void; - // (undocumented) - destroy(): void; - // (undocumented) - disableElement(viewportId: string): void; - // (undocumented) - _downloadOffScreenCanvas(): void; - // (undocumented) - enableElement(viewportInputEntry: PublicViewportInput): void; - // (undocumented) - fillCanvasWithBackgroundColor(canvas: HTMLCanvasElement, backgroundColor: [number, number, number]): void; - // (undocumented) - getStackViewport(viewportId: string): StackViewport; - // (undocumented) - getStackViewports(): StackViewport[]; - // (undocumented) - getViewport(viewportId: string): IViewport; - // (undocumented) - getViewports(): IViewport[]; - // (undocumented) - getVolumeViewports(): IVolumeViewport[]; - // (undocumented) - hasBeenDestroyed: boolean; - // (undocumented) - readonly id: string; - // (undocumented) - readonly offScreenCanvasContainer: HTMLDivElement; - // (undocumented) - offscreenMultiRenderWindow: any; - // (undocumented) - render(): void; - // (undocumented) - renderFrameOfReference: (FrameOfReferenceUID: string) => void; - // (undocumented) - renderViewport(viewportId: string): void; - // (undocumented) - renderViewports(viewportIds: string[]): void; - // (undocumented) - resize(immediate?: boolean, keepCamera?: boolean): void; - // (undocumented) - setViewports(publicViewportInputEntries: PublicViewportInput[]): void; -} - -// @public (undocumented) -function renderToCanvasCPU(canvas: HTMLCanvasElement, imageOrVolume: IImage | IVolume, modality?: string, _renderingEngineId?: string, _viewportOptions?: ViewportInputOptions): Promise; - -// @public (undocumented) -function renderToCanvasGPU(canvas: HTMLCanvasElement, imageOrVolume: IImage | IVolume, modality?: any, renderingEngineId?: string, viewportOptions?: ViewportInputOptions & { - viewReference?: ViewReference; -}): Promise; - -// @public (undocumented) -enum RequestType { - // (undocumented) - Compute = "compute", - // (undocumented) - Interaction = "interaction", - // (undocumented) - Prefetch = "prefetch", - // (undocumented) - Thumbnail = "thumbnail" -} - -// @public (undocumented) -export function resetInitialization(): void; - -// @public (undocumented) -export function resetUseCPURendering(): void; - -// @public (undocumented) -export type RetrieveOptions = BaseRetrieveOptions | StreamingRetrieveOptions | RangeRetrieveOptions; - -// @public (undocumented) -export interface RetrieveStage { - // (undocumented) - decimate?: number; - // (undocumented) - id: string; - // (undocumented) - nearbyFrames?: NearbyFrames[]; - // (undocumented) - offset?: number; - // (undocumented) - positions?: number[]; - // (undocumented) - priority?: number; - // (undocumented) - requestType?: RequestType; - // (undocumented) - retrieveType?: string; -} - -// @public (undocumented) -type RGB = [number, number, number]; - -// @public (undocumented) -function rgbToHex(r: any, g: any, b: any): string; - -// @public (undocumented) -interface RLERun_2 { - // (undocumented) - end: number; - // (undocumented) - start: number; - // (undocumented) - value: T; -} - -// @public (undocumented) -class RLEVoxelMap { - constructor(width: number, height: number, depth?: number); - // (undocumented) - clear(): void; - // (undocumented) - static copyMap(destination: RLEVoxelMap, source: RLEVoxelMap): void; - // (undocumented) - defaultValue: T; - // (undocumented) - delete(index: number): void; - // (undocumented) - depth: number; - // (undocumented) - fillFrom(getter: (i: number, j: number, k: number) => T, boundsIJK: BoundsIJK): void; - // (undocumented) - findAdjacents(item: [RLERun, number, number, Point3[]?], { diagonals, planar, singlePlane }: { - diagonals?: boolean; - planar?: boolean; - singlePlane?: boolean; - }): any[]; - // (undocumented) - protected findIndex(row: RLERun[], i: number): number; - // (undocumented) - floodFill(i: number, j: number, k: number, value: T, options?: { - planar?: boolean; - diagonals?: boolean; - singlePlane?: boolean; - }): number; - // (undocumented) - forEach(callback: any, options?: { - rowModified?: boolean; - }): void; - // (undocumented) - forEachRow(callback: any): void; - // (undocumented) - get: (index: number) => T; - // (undocumented) - getPixelData(k?: number, pixelData?: PixelDataTypedArray): PixelDataTypedArray; - // (undocumented) - protected getRLE(i: number, j: number, k?: number): RLERun; - // (undocumented) - getRun: (j: number, k: number) => RLERun[]; - // (undocumented) - static getScalarData: (ArrayType?: Uint8ClampedArrayConstructor) => Uint8ClampedArray; - // (undocumented) - has(index: number): boolean; - // (undocumented) - height: number; - // (undocumented) - protected jMultiple: number; - // (undocumented) - keys(): number[]; - // (undocumented) - protected kMultiple: number; - // (undocumented) - normalizer: PlaneNormalizer; - // (undocumented) - protected numComps: number; - // (undocumented) - pixelDataConstructor: Uint8ArrayConstructor; - // (undocumented) - protected rows: Map[]>; - // (undocumented) - set: (index: number, value: T) => void; - // (undocumented) - toIJK(index: number): Point3; - // (undocumented) - toIndex([i, j, k]: Point3): number; - // (undocumented) - updateScalarData: (scalarData: PixelDataTypedArray) => void; - // (undocumented) - width: number; -} - -// @public (undocumented) -function roundNumber(value: string | number | (string | number)[], precision?: number): string; - -// @public (undocumented) -function roundToPrecision(value: any): number; - -// @public (undocumented) -function scaleArray(array: Float32Array | Uint8Array | Uint16Array | Int16Array, scalingParameters: ScalingParameters): Float32Array | Uint8Array | Uint16Array | Int16Array; - -// @public (undocumented) -function scaleRGBTransferFunction(rgbTransferFunction: ColorTransferFunction, scalingFactor: number): void; - -// @public (undocumented) -interface Scaling { - // (undocumented) - PT?: PTScaling; -} - -// @public (undocumented) -interface ScalingParameters { - // (undocumented) - modality: string; - // (undocumented) - rescaleIntercept: number; - // (undocumented) - rescaleSlope: number; - // (undocumented) - suvbsa?: number; - // (undocumented) - suvbw?: number; - // (undocumented) - suvlbm?: number; -} - -// @public (undocumented) -function scroll_2(viewport: IViewport | IVideoViewport, options: ScrollOptions_2): void; - -// @public (undocumented) -type ScrollOptions_2 = { - delta: number; - volumeId?: string; - debounceLoading?: boolean; - loop?: boolean; - scrollSlabs?: boolean; -}; - -// @public (undocumented) -export function setConfiguration(c: Cornerstone3DConfig): void; - -// @public (undocumented) -export function setPreferSizeOverAccuracy(status: boolean): void; - -// @public (undocumented) -export class Settings { - constructor(base?: Settings); - // (undocumented) - static assert(subject: Settings): Settings; - // (undocumented) - dump(): Record; - // (undocumented) - extend(): Settings; - // (undocumented) - static extendRuntimeSettings(): Settings; - // (undocumented) - forEach(callback: (key: string, value: unknown) => void): void; - // (undocumented) - get(key: string): unknown; - // (undocumented) - static getDefaultSettings(subfield?: any): Settings | unknown; - // (undocumented) - static getObjectSettings(subject: unknown, from?: unknown): Settings; - // (undocumented) - static getRuntimeSettings(): Settings; - // (undocumented) - import(root: Record): void; - // (undocumented) - set(key: string, value: unknown): boolean; - // (undocumented) - unset(key: string): boolean; -} - -// @public (undocumented) -function setTransferFunctionNodes(transferFunction: any, nodes: any): void; - -// @public (undocumented) -export function setUseCPURendering(status: boolean, updateViewports?: boolean): void; - -// @public (undocumented) -export function setVolumesForViewports(renderingEngine: IRenderingEngine, volumeInputs: IVolumeInput[], viewportIds: string[], immediateRender?: boolean, suppressEvents?: boolean): Promise; - -// @public (undocumented) -function snapFocalPointToSlice(focalPoint: Point3, position: Point3, sliceRange: ActorSliceRange, viewPlaneNormal: Point3, spacingInNormalDirection: number, deltaFrames: number): { - newFocalPoint: Point3; - newPosition: Point3; -}; - -// @public (undocumented) -interface SopCommonModuleMetadata { - // (undocumented) - sopClassUID: string; - // (undocumented) - sopInstanceUID: string; -} - -// @public (undocumented) -function sortImageIdsAndGetSpacing(imageIds: string[], scanAxisNormal?: vec3): SortedImageIdsItem; - -// @public (undocumented) -const spatialRegistrationMetadataProvider: { - add: (query: string[], payload: mat4) => void; - get: (type: string, viewportId1: string, viewportId2: string) => mat4; -}; - -// @public (undocumented) -enum SpeedUnit { - // (undocumented) - FRAME = "f", - // (undocumented) - SECOND = "s" -} - -// @public (undocumented) -function splitImageIdsBy4DTags(imageIds: string[]): { - imageIdGroups: string[][]; - splittingTag: string | null; -}; - -// @public (undocumented) -type StackInputCallback = (params: { - imageActor: ImageActor; - imageId: string; -}) => unknown; - -// @public (undocumented) -type StackNewImageEvent = CustomEvent_2; - -// @public (undocumented) -interface StackNewImageEventDetail { - // (undocumented) - image: IImage; - // (undocumented) - imageId: string; - // (undocumented) - imageIdIndex: number; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type StackScrollOutOfBoundsEvent = CustomEvent_2; - -// @public (undocumented) -type StackScrollOutOfBoundsEventDetail = { - imageIdIndex: number; - direction: number; -}; - -// @public (undocumented) -export class StackViewport extends Viewport { - constructor(props: ViewportInput); - // (undocumented) - addActor: (actorEntry: ActorEntry) => void; - // (undocumented) - addActors: (actors: ActorEntry[]) => void; - // (undocumented) - addImages(stackInputs: IStackInput[]): void; - // (undocumented) - calibrateSpacing(imageId: string): void; - // (undocumented) - canvasToWorld: (canvasPos: Point2) => Point3; - // (undocumented) - clearDefaultProperties(imageId?: string): void; - // (undocumented) - createVTKImageData({ origin, direction, dimensions, spacing, numberOfComponents, pixelArray, }: { - origin: any; - direction: any; - dimensions: any; - spacing: any; - numberOfComponents: any; - pixelArray: any; - }): vtkImageData; - // (undocumented) - customRenderViewportToCanvas: () => { - canvas: HTMLCanvasElement; - element: HTMLDivElement; - viewportId: string; - renderingEngineId: string; - viewportStatus: ViewportStatus; - }; - // (undocumented) - errorCallback(imageId: any, permanent: any, error: any): void; - // (undocumented) - getActor: (actorUID: string) => ActorEntry; - // (undocumented) - getActors: () => ActorEntry[]; - // (undocumented) - getCamera: () => ICamera; - // (undocumented) - getCornerstoneImage: () => IImage; - // (undocumented) - getCurrentImageId: (index?: number) => string; - // (undocumented) - getCurrentImageIdIndex: () => number; - // (undocumented) - getDefaultActor: () => ActorEntry; - // (undocumented) - getDefaultProperties: (imageId?: string) => StackViewportProperties; - // (undocumented) - getFrameOfReferenceUID: (sliceIndex?: number) => string; - // (undocumented) - getImageData: () => IImageData | CPUIImageData; - // (undocumented) - getImageDataMetadata(image: IImage): ImageDataMetaData; - // (undocumented) - getImageIds: () => string[]; - // (undocumented) - getImagePlaneReferenceData(sliceIndex?: number): ViewReference; - // (undocumented) - getLoaderImageOptions(imageId: string): { - useRGBA: boolean; - transferSyntaxUID: any; - priority: number; - requestType: RequestType; - additionalDetails: { - imageId: string; - imageIdIndex: number; - }; - }; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getProperties: () => StackViewportProperties; - // (undocumented) - getRenderer: () => vtkRenderer; - // (undocumented) - getRotation: () => number; - // (undocumented) - getSliceIndex: () => number; - // (undocumented) - getSliceIndexForImage(reference: string | ViewReference): number; - // (undocumented) - getSliceInfo(): { - sliceIndex: number; - slicePlane: number; - width: number; - height: number; - }; - // (undocumented) - getSliceViewInfo(): { - width: number; - height: number; - sliceIndex: number; - slicePlane: number; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; - }; - // (undocumented) - getTargetImageIdIndex: () => number; - // (undocumented) - getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference; - // (undocumented) - getViewReferenceId(specifier?: ViewReferenceSpecifier): string; - // (undocumented) - hasImageId: (imageId: string) => boolean; - // (undocumented) - hasImageURI: (imageURI: string) => boolean; - // (undocumented) - protected imagesLoader: IImagesLoader; - // (undocumented) - isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean; - // (undocumented) - jumpToWorld(worldPos: Point3): boolean; - // (undocumented) - loadImages(imageIds: string[], listener: ImageLoadListener): Promise; - // (undocumented) - modality: string; - // (undocumented) - removeAllActors: () => void; - // (undocumented) - renderImageObject: (image: any) => void; - // (undocumented) - resetCamera: (options?: { - resetPan?: boolean; - resetZoom?: boolean; - resetToCenter?: boolean; - suppressEvents?: boolean; - }) => boolean; - // (undocumented) - resetCameraForResize: () => boolean; - // (undocumented) - resetProperties(): void; - // (undocumented) - resetToDefaultProperties(): void; - // (undocumented) - resize: () => void; - // (undocumented) - scaling: Scaling; - // (undocumented) - scroll(delta: number, debounce?: boolean, loop?: boolean): void; - // (undocumented) - setActors: (actors: ActorEntry[]) => void; - // (undocumented) - setCamera: (cameraInterface: ICamera, storeAsInitialCamera?: boolean) => void; - // (undocumented) - setDefaultProperties(ViewportProperties: StackViewportProperties, imageId?: string): void; - // (undocumented) - setImageIdIndex(imageIdIndex: number): Promise; - // (undocumented) - protected setInterpolationType: (interpolationType: InterpolationType) => void; - // (undocumented) - setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, }?: StackViewportProperties, suppressEvents?: boolean): void; - // (undocumented) - protected setRotation: (rotation: number) => void; - // (undocumented) - setStack(imageIds: string[], currentImageIdIndex?: number): Promise; - // (undocumented) - setUseCPURendering(value: boolean): void; - // (undocumented) - setViewReference(viewRef: ViewReference): void; - // (undocumented) - stackActorReInitialized: boolean; - // (undocumented) - successCallback(imageId: any, image: any): void; - // (undocumented) - unsetColormap: () => void; - // (undocumented) - updateRenderingPipeline: () => void; - // (undocumented) - static get useCustomRenderingPipeline(): boolean; - // (undocumented) - worldToCanvas: (worldPos: Point3) => Point2; -} - -// @public (undocumented) -type StackViewportNewStackEvent = CustomEvent_2; - -// @public (undocumented) -interface StackViewportNewStackEventDetail { - // (undocumented) - currentImageIdIndex: number; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - imageIds: string[]; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -type StackViewportProperties = ViewportProperties & { - interpolationType?: InterpolationType; - suppressEvents?: boolean; - isComputedVOI?: boolean; -}; - -// @public (undocumented) -type StackViewportScrollEvent = CustomEvent_2; - -// @public (undocumented) -interface StackViewportScrollEventDetail { - // (undocumented) - direction: number; - // (undocumented) - imageId: string; - // (undocumented) - newImageIdIndex: number; -} - -// @public (undocumented) -export class StreamingDynamicImageVolume extends BaseStreamingImageVolume implements IDynamicImageVolume { - constructor(imageVolumeProperties: ImageVolumeProps & { - splittingTag: string; - imageIdGroups: string[][]; - }, streamingProperties: IStreamingVolumeProperties); - // (undocumented) - protected checkDimensionGroupCompletion(imageIdIndex: number): void; - // (undocumented) - protected checkTimePointCompletion(imageIdIndex: number): void; - // (undocumented) - get dimensionGroupNumber(): number; - set dimensionGroupNumber(dimensionGroupNumber: number); - // (undocumented) - flatImageIdIndexToDimensionGroupNumber(flatImageIdIndex: number): number; - // (undocumented) - flatImageIdIndexToImageIdIndex(flatImageIdIndex: number): number; - // (undocumented) - flatImageIdIndexToTimePointIndex(flatImageIdIndex: number): number; - // (undocumented) - getCurrentDimensionGroupImageIds(): string[]; - // (undocumented) - getCurrentTimePointImageIds(): string[]; - // (undocumented) - getImageIdsToLoad(): string[]; - // (undocumented) - getImageLoadRequests: (priority: number) => { - callLoadImage: (imageId: any, imageIdIndex: any, options: any) => any; - imageId: string; - imageIdIndex: number; - options: { - targetBuffer: { - type: PixelDataTypedArrayString; - rows: any; - columns: any; - }; - allowFloatRendering: boolean; - preScale: { - enabled: boolean; - scalingParameters: ScalingParameters; - }; - transferPixelData: boolean; - requestType: RequestType; - transferSyntaxUID: any; - additionalDetails: { - imageId: string; - imageIdIndex: number; - volumeId: string; - }; - }; - priority: number; - requestType: RequestType; - additionalDetails: { - volumeId: string; - }; - }[]; - // (undocumented) - isDimensionGroupLoaded(dimensionGroupNumber: number): boolean; - // (undocumented) - isTimePointLoaded(timePointIndex: number): boolean; - // (undocumented) - numDimensionGroups: number; - // (undocumented) - numTimePoints: number; - // (undocumented) - scroll(delta: number): void; - // (undocumented) - get splittingTag(): string; - set timePointIndex(index: number); - // (undocumented) - get timePointIndex(): number; -} - -// @public (undocumented) -export class StreamingImageVolume extends BaseStreamingImageVolume { - constructor(imageVolumeProperties: ImageVolumeProps, streamingProperties: IStreamingVolumeProperties); - // (undocumented) - getImageIdsToLoad: () => string[]; - // (undocumented) - getImageLoadRequests(priority: number): ImageLoadRequests[]; - // (undocumented) - getScalarData(): PixelDataTypedArray; -} - -// @public (undocumented) -type StreamingRetrieveOptions = BaseRetrieveOptions & { - streaming: boolean; -}; - -// @public (undocumented) -export class Surface { - constructor(props: SurfaceProps); - // (undocumented) - get centroid(): Point3; - // (undocumented) - get color(): RGB; - set color(color: RGB); - // (undocumented) - get flatPointsArray(): number[]; - // (undocumented) - readonly frameOfReferenceUID: string; - // (undocumented) - readonly id: string; - // (undocumented) - get points(): number[]; - set points(points: number[]); - // (undocumented) - get polys(): number[]; - set polys(polys: number[]); - // (undocumented) - get segmentIndex(): number; - // (undocumented) - readonly sizeInBytes: number; - // (undocumented) - get totalNumberOfPoints(): number; -} - -// @public (undocumented) -interface SurfaceData { - // (undocumented) - color?: Point3; - // (undocumented) - frameOfReferenceUID: string; - // (undocumented) - id: string; - // (undocumented) - points: number[]; - // (undocumented) - polys: number[]; - // (undocumented) - segmentIndex?: number; -} - -// @public (undocumented) -class TargetEventListeners { - constructor(target: EventTarget); - // (undocumented) - addEventListener(type: string, callback: EventListener, options?: AddEventListenerOptions): void; - // (undocumented) - get isEmpty(): boolean; - // (undocumented) - removeEventListener(type: string, callback?: EventListener, options?: EventListenerOptions): void; - // (undocumented) - reset(): void; -} - -// @public (undocumented) -function threePlaneIntersection(firstPlane: Plane, secondPlane: Plane, thirdPlane: Plane): Point3; - -// @public (undocumented) -function toLowHighRange(windowWidth: number, windowCenter: number, voiLUTFunction?: VOILUTFunctionType): { - lower: number; - upper: number; -}; - -// @public (undocumented) -function toWindowLevel(low: number, high: number): { - windowWidth: number; - windowCenter: number; -}; - -declare namespace transferFunctionUtils { - export { - getTransferFunctionNodes, - setTransferFunctionNodes - } -} - -// @public (undocumented) -interface TransferSyntaxMetadata { - // (undocumented) - transferSyntaxUID: string; -} - -// @public (undocumented) -function transformIndexToWorld(imageData: any, voxelPos: Point3): any; - -// @public (undocumented) -type TransformMatrix2D = [number, number, number, number, number, number]; - -// @public (undocumented) -function transformWorldToIndex(imageData: any, worldPos: Point3): any; - -// @public (undocumented) -function transformWorldToIndexContinuous(imageData: any, worldPos: Point3): any; - -// @public (undocumented) -export function triggerEvent(el: EventTarget, type: string, detail?: unknown): boolean; - -declare namespace Types { - export { - RetrieveStage, - RetrieveOptions, - RangeRetrieveOptions, - StreamingRetrieveOptions, - NearbyFrames, - IRetrieveConfiguration, - IImagesLoader, - Cornerstone3DConfig, - ICamera, - StackViewport as 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, - CustomEvent_2 as 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, - ImageFrame as IImageFrame, - DicomDateObject, - DicomTimeObject, - GeneralSeriesModuleMetadata, - ImagePlaneModuleMetadata, - SopCommonModuleMetadata, - ImagePixelModuleMetadata, - PatientStudyModuleMetadata, - TransferSyntaxMetadata, - LocalVolumeOptions, - IVoxelManager, - IRLEVoxelMap, - RLERun_2 as RLERun, - ViewportInput, - ImageLoadRequests, - IBaseVolumeViewport, - GeometryLoaderFn, - ScrollOptions_2 as ScrollOptions, - JumpToSliceOptions, - Memo, - HistoryMemo, - VoxelManager, - RLEVoxelMap - } -} -export { Types } - -// @public (undocumented) -function unregisterAllImageLoaders(): void; - -// @public (undocumented) -function updateVTKImageDataWithCornerstoneImage(sourceImageData: vtkImageData, image: IImage): void; - -declare namespace utilities { - export { - FrameRange, - eventListener, - invertRgbTransferFunction, - createSigmoidRGBTransferFunction, - getVoiFromSigmoidRGBTransferFunction, - createLinearRGBTransferFunction, - scaleRGBTransferFunction as scaleRgbTransferFunction, - triggerEvent, - imageIdToURI, - fnv1aHash, - metadataProvider as calibratedPixelSpacingMetadataProvider, - clamp, - uuidv4, - planar, - getMinMax, - getRuntimeId, - isEqual, - isEqualAbs, - isEqualNegative, - isOpposite, - getViewportModality, - windowLevel, - convertToGrayscale, - getClosestImageId, - getSpacingInNormalDirection, - getTargetVolumeAndSpacingInNormalDir, - getVolumeActorCorners, - indexWithinDimensions, - getVolumeViewportsContainingSameVolumes, - getViewportsWithVolumeId, - transformWorldToIndex, - transformIndexToWorld, - loadImageToCanvas, - renderToCanvasCPU, - renderToCanvasGPU, - worldToImageCoords, - imageToWorldCoords, - getVolumeSliceRangeInfo, - getVolumeViewportScrollInfo, - getSliceRange, - snapFocalPointToSlice, - getImageSliceDataForVolumeViewport, - isImageActor, - isPTPrescaledWithSUV, - actorIsA, - getViewportsWithImageURI, - getClosestStackImageIndexForPoint, - getCurrentVolumeViewportSlice, - calculateViewportsSpatialRegistration, - spatialRegistrationMetadataProvider, - getViewportImageCornersInWorld, - hasNaNValues, - applyPreset, - deepMerge, - PointsManager, - getScalingParameters, - colormap, - getImageLegacy, - ProgressiveIterator, - decimate, - imageRetrieveMetadataProvider, - transferFunctionUtils, - updateVTKImageDataWithCornerstoneImage, - sortImageIdsAndGetSpacing, - makeVolumeMetadata, - isValidVolume, - metadataProvider_2 as genericMetadataProvider, - isVideoTransferSyntax, - HistoryMemo_2 as HistoryMemo, - generateVolumePropsFromImageIds, - getBufferConfiguration, - VoxelManager, - RLEVoxelMap, - convertStackToVolumeViewport, - convertVolumeToStackViewport, - roundNumber, - roundToPrecision, - getViewportImageIds, - getRandomSampleFromArray, - getVolumeId, - color, - hasFloatScalingParameters, - getDynamicVolumeInfo, - autoLoad, - scaleArray, - deepClone, - splitImageIdsBy4DTags, - pointInShapeCallback, - deepEqual, - jumpToSlice, - scroll_2 as scroll, - clip, - transformWorldToIndexContinuous, - createSubVolume, - getVolumeDirectionVectors, - calculateSpacingBetweenImageIds - } -} -export { utilities } - -// @public (undocumented) -function uuidv4(): string; - -declare namespace VideoEnums { - export { - SpeedUnit - } -} - -// @public (undocumented) -export class VideoViewport extends Viewport { - constructor(props: VideoViewportInput); - // (undocumented) - addImages(stackInputs: IStackInput[]): void; - // (undocumented) - readonly canvasContext: CanvasRenderingContext2D; - // (undocumented) - protected canvasToIndex: (canvasPos: Point2) => Point2; - // (undocumented) - canvasToWorld: (canvasPos: Point2, destPos?: Point3) => Point3; - // (undocumented) - protected createActorMapper(image: any): CanvasActor; - // (undocumented) - customRenderViewportToCanvas: () => void; - // (undocumented) - end(): Promise; - // (undocumented) - static frameRangeExtractor: RegExp; - // (undocumented) - getCamera(): ICamera; - // (undocumented) - getCurrentImageId(index?: number): string; - // (undocumented) - getCurrentImageIdIndex(): number; - // (undocumented) - getFrameNumber(): number; - // (undocumented) - getFrameOfReferenceUID: () => string; - // (undocumented) - getFrameRange(): [number, number]; - // (undocumented) - getFrameRate(): number; - // (undocumented) - getImageData(): IImageData | CPUIImageData; - // (undocumented) - getImageDataMetadata(image: IImage | string): { - bitsAllocated: number; - numberOfComponents: number; - origin: any; - rows: any; - columns: any; - direction: number[]; - dimensions: any[]; - spacing: any[]; - hasPixelSpacing: boolean; - numVoxels: number; - imagePlaneModule: any; - }; - // (undocumented) - getImageIds(): string[]; - // (undocumented) - getMiddleSliceData: () => never; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getPan(): Point2; - // (undocumented) - getProperties: () => VideoViewportProperties; - // (undocumented) - getRotation: () => number; - // (undocumented) - protected getScalarData(): CanvasScalarData; - // (undocumented) - getSliceIndex(): number; - // (undocumented) - getSliceIndexForImage(reference: string | ViewReference): number; - // (undocumented) - getSliceViewInfo(): { - width: number; - height: number; - sliceIndex: number; - slicePlane: number; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; - }; - // (undocumented) - protected getTransform(): Transform; - // (undocumented) - getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference; - // (undocumented) - getViewReferenceId(specifier?: ViewReferenceSpecifier): string; - // (undocumented) - hasImageURI(imageURI: string): boolean; - // (undocumented) - protected imageId: string; - // (undocumented) - protected indexToCanvas: (indexPos: Point2) => Point2; - // (undocumented) - isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean; - // (undocumented) - protected metadata: any; - // (undocumented) - modality: any; - // (undocumented) - pause(): void; - // (undocumented) - play(): Promise; - // (undocumented) - readonly renderingEngineId: string; - // (undocumented) - resetCamera: () => boolean; - // (undocumented) - resetProperties(): void; - // (undocumented) - resize: () => void; - // (undocumented) - scroll(delta?: number): Promise; - // (undocumented) - setAverageWhite(averageWhite: [number, number, number]): void; - // (undocumented) - setCamera(camera: ICamera): void; - // (undocumented) - protected setColorTransform(): void; - // (undocumented) - setDataIds(imageIds: string[], options?: DataSetOptions): void; - // (undocumented) - setFrameNumber(frame: number): Promise; - // (undocumented) - setFrameRange(frameRange: number[]): void; - // (undocumented) - setPlaybackRate(rate?: number): void; - // (undocumented) - setProperties(props: VideoViewportProperties): void; - // (undocumented) - setScrollSpeed(scrollSpeed?: number, unit?: VideoEnums.SpeedUnit): void; - // (undocumented) - setTime(timeInSeconds: number): Promise; - // (undocumented) - setVideo(imageId: string, frameNumber?: number): Promise; - // (undocumented) - setViewReference(viewRef: ViewReference): void; - // (undocumented) - setVOI(voiRange: VOIRange): void; - // (undocumented) - setWindowLevel(windowWidth?: number, windowCenter?: number): void; - // (undocumented) - start(): Promise; - // (undocumented) - togglePlayPause(): boolean; - // (undocumented) - readonly uid: any; - // (undocumented) - updateCameraClippingPlanesAndRange(): void; - // (undocumented) - static get useCustomRenderingPipeline(): boolean; - // (undocumented) - useCustomRenderingPipeline: boolean; - // (undocumented) - worldToCanvas: (worldPos: Point3) => Point2; -} - -// @public (undocumented) -interface VideoViewportInput { - // (undocumented) - canvas: HTMLCanvasElement; - // (undocumented) - defaultOptions: unknown; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - id: string; - // (undocumented) - renderingEngineId: string; - // (undocumented) - sHeight: number; - // (undocumented) - sWidth: number; - // (undocumented) - sx: number; - // (undocumented) - sy: number; - // (undocumented) - type: ViewportType; -} - -// @public (undocumented) -type VideoViewportProperties = ViewportProperties & { - loop?: boolean; - muted?: boolean; - pan?: Point2; - playbackRate?: number; - scrollSpeed?: number; -}; - -// @public (undocumented) -export class Viewport { - constructor(props: ViewportInput); - // (undocumented) - _actors: Map; - // (undocumented) - addActor(actorEntry: ActorEntry): void; - // (undocumented) - addActors(actors: ActorEntry[], options?: { - resetCamera?: boolean; - }): void; - // (undocumented) - addWidget: (widgetId: any, widget: any) => void; - // (undocumented) - static boundsRadius(bounds: number[]): number; - // (undocumented) - protected calibration: IImageCalibration; - // (undocumented) - static readonly CameraViewPresentation: ViewPresentationSelector; - // (undocumented) - readonly canvas: HTMLCanvasElement; - // (undocumented) - canvasToWorld: (canvasPos: Point2) => Point3; - // (undocumented) - customRenderViewportToCanvas: () => unknown; - // (undocumented) - readonly defaultOptions: ViewportInputOptions; - // (undocumented) - readonly element: HTMLDivElement; - // (undocumented) - protected fitToCanvasCamera: ICamera; - // (undocumented) - protected flip({ flipHorizontal, flipVertical }: FlipDirection): void; - // (undocumented) - protected flipHorizontal: boolean; - // (undocumented) - protected flipVertical: boolean; - // (undocumented) - getActor(actorUID: string): ActorEntry; - // (undocumented) - getActorByIndex(index: number): ActorEntry; - // (undocumented) - getActors(): ActorEntry[]; - // (undocumented) - getActorUIDByIndex(index: number): string; - // (undocumented) - getActorUIDs(): string[]; - // (undocumented) - getCamera(): ICamera; - // (undocumented) - protected getCameraNoRotation(): ICamera; - // (undocumented) - getCanvas(): HTMLCanvasElement; - // (undocumented) - getClippingPlanesForActor(actorEntry?: ActorEntry): vtkPlane[]; - // (undocumented) - _getCorners(bounds: number[]): number[][]; - // (undocumented) - getCurrentImageIdIndex(): number; - // (undocumented) - getDefaultActor(): ActorEntry; - // (undocumented) - getDisplayArea(): DisplayArea | undefined; - // (undocumented) - _getEdges(bounds: number[]): [number[], number[]][]; - // (undocumented) - _getFocalPointForResetCamera(centeredFocalPoint: Point3, previousCamera: ICamera, { resetPan, resetToCenter }: { - resetPan?: boolean; - resetToCenter?: boolean; - }): Point3; - // (undocumented) - getFrameOfReferenceUID: () => string; - // (undocumented) - getImageActor(volumeId?: string): ImageActor | null; - // (undocumented) - getImageData(): any; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getPan(initialCamera?: ICamera): Point2; - // (undocumented) - getProperties: () => ViewportProperties; - // (undocumented) - getRenderer(): vtkRenderer; - // (undocumented) - getRenderingEngine(): IRenderingEngine; - // (undocumented) - getRotation: () => number; - // (undocumented) - getSliceIndex(): number; - // (undocumented) - getSliceViewInfo(): { - width: number; - height: number; - sliceIndex: number; - slicePlane: number; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; - }; - // (undocumented) - getViewPresentation(viewPresSel?: ViewPresentationSelector): ViewPresentation; - // (undocumented) - getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference; - // (undocumented) - getViewReferenceId(_specifier?: ViewReferenceSpecifier): string; - // (undocumented) - protected getVtkActiveCamera(): vtkCamera | vtkSlabCamera; - // (undocumented) - getWidget: (id: any) => any; - // (undocumented) - getWidgets: () => any[]; - // (undocumented) - getZoom(compareCamera?: ICamera): number; - // (undocumented) - protected hasPixelSpacing: boolean; - // (undocumented) - readonly id: string; - // (undocumented) - protected initialCamera: ICamera; - // (undocumented) - protected insetImageMultiplier: number; - // (undocumented) - isDisabled: boolean; - // (undocumented) - _isInBounds(point: Point3, bounds: number[]): boolean; - // (undocumented) - isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean; - // (undocumented) - options: ViewportInputOptions; - // (undocumented) - _removeActor(actorUID: string): void; - // (undocumented) - removeActors(actorUIDs: string[]): void; - // (undocumented) - removeAllActors(): void; - // (undocumented) - removeWidgets: () => void; - // (undocumented) - render(): void; - // (undocumented) - readonly renderingEngineId: string; - // (undocumented) - reset(immediate?: boolean): void; - // (undocumented) - resetCamera(options?: { - resetPan?: boolean; - resetZoom?: boolean; - resetToCenter?: boolean; - storeAsInitialCamera?: boolean; - }): boolean; - // (undocumented) - protected resetCameraNoEvent(): void; - // (undocumented) - resize: () => void; - // (undocumented) - setActors(actors: ActorEntry[]): void; - // (undocumented) - setCamera(cameraInterface: ICamera, storeAsInitialCamera?: boolean): void; - // (undocumented) - protected setCameraNoEvent(camera: ICamera): void; - // (undocumented) - setDataIds(_imageIds: string[], _options?: DataSetOptions): void; - // (undocumented) - setDisplayArea(displayArea: DisplayArea, suppressEvents?: boolean): void; - // (undocumented) - protected setDisplayAreaFit(displayArea: DisplayArea): void; - // (undocumented) - protected setDisplayAreaScale(displayArea: DisplayArea): void; - // (undocumented) - protected setFitToCanvasCamera(camera: ICamera): void; - // (undocumented) - protected setInitialCamera(camera: ICamera): void; - // (undocumented) - protected setInterpolationType(_interpolationType: InterpolationType, _arg?: any): void; - // (undocumented) - setOptions(options: ViewportInputOptions, immediate?: boolean): void; - // (undocumented) - setOrientationOfClippingPlanes(vtkPlanes: vtkPlane[], slabThickness: number, viewPlaneNormal: Point3, focalPoint: Point3): void; - // (undocumented) - setPan(pan: Point2, storeAsInitialCamera?: boolean): void; - // (undocumented) - setRendered(): void; - // (undocumented) - protected setRotation: (_rotation: number) => void; - // (undocumented) - setViewPresentation(viewPres: ViewPresentation): void; - // (undocumented) - setViewReference(viewRef: ViewReference): void; - // (undocumented) - setZoom(value: number, storeAsInitialCamera?: boolean): void; - // (undocumented) - sHeight: number; - // (undocumented) - _suppressCameraModifiedEvents: boolean; - // (undocumented) - readonly suppressEvents: boolean; - // (undocumented) - sWidth: number; - // (undocumented) - sx: number; - // (undocumented) - sy: number; - // (undocumented) - static readonly TransferViewPresentation: ViewPresentationSelector; - // (undocumented) - triggerCameraModifiedEventIfNecessary(previousCamera: ICamera, updatedCamera: ICamera): void; - // (undocumented) - readonly type: ViewportType; - // (undocumented) - updateCameraClippingPlanesAndRange(): void; - // (undocumented) - protected updateClippingPlanesForActors(updatedCamera: ICamera): Promise; - // (undocumented) - updateRenderingPipeline: () => void; - // (undocumented) - static get useCustomRenderingPipeline(): boolean; - // (undocumented) - viewportStatus: ViewportStatus; - // (undocumented) - worldToCanvas: (worldPos: Point3) => Point2; -} - -// @public (undocumented) -interface ViewportInput { - // (undocumented) - canvas: HTMLCanvasElement; - // (undocumented) - defaultOptions: ViewportInputOptions; - // (undocumented) - element: HTMLDivElement; - // (undocumented) - id: string; - // (undocumented) - renderingEngineId: string; - // (undocumented) - sHeight: number; - // (undocumented) - sWidth: number; - // (undocumented) - sx: number; - // (undocumented) - sy: number; - // (undocumented) - type: ViewportType; -} - -// @public (undocumented) -interface ViewportInputOptions { - // (undocumented) - background?: RGB; - // (undocumented) - displayArea?: DisplayArea; - // (undocumented) - orientation?: OrientationAxis | OrientationVectors; - // (undocumented) - parallelProjection?: boolean; - // (undocumented) - suppressEvents?: boolean; -} - -// @public (undocumented) -interface ViewportPreset { - // (undocumented) - ambient: string; - // (undocumented) - colorTransfer: string; - // (undocumented) - diffuse: string; - // (undocumented) - gradientOpacity: string; - // (undocumented) - interpolation: string; - // (undocumented) - name: string; - // (undocumented) - scalarOpacity: string; - // (undocumented) - shade: string; - // (undocumented) - specular: string; - // (undocumented) - specularPower: string; -} - -// @public (undocumented) -interface ViewportProperties { - // (undocumented) - colormap?: ColormapPublic; - // (undocumented) - interpolationType?: InterpolationType; - // (undocumented) - invert?: boolean; - // (undocumented) - preset?: string; - // (undocumented) - VOILUTFunction?: VOILUTFunctionType; - // (undocumented) - voiRange?: VOIRange; -} - -// @public (undocumented) -enum ViewportStatus { - // (undocumented) - LOADING = "loading", - // (undocumented) - NO_DATA = "noData", - // (undocumented) - PRE_RENDER = "preRender", - // (undocumented) - RENDERED = "rendered", - // (undocumented) - RESIZE = "resize" -} - -// @public (undocumented) -enum ViewportType { - // (undocumented) - ORTHOGRAPHIC = "orthographic", - // (undocumented) - PERSPECTIVE = "perspective", - // (undocumented) - STACK = "stack", - // (undocumented) - VIDEO = "video", - // (undocumented) - VOLUME_3D = "volume3d", - // (undocumented) - WHOLE_SLIDE = "wholeSlide" -} - -// @public (undocumented) -interface ViewPresentation { - // (undocumented) - displayArea?: DisplayArea; - // (undocumented) - flipHorizontal?: boolean; - // (undocumented) - flipVertical?: boolean; - // (undocumented) - pan?: Point2; - // (undocumented) - rotation?: number; - // (undocumented) - slabThickness?: number; - // (undocumented) - zoom?: number; -} - -// @public (undocumented) -interface ViewPresentationSelector { - // (undocumented) - displayArea?: boolean; - // (undocumented) - flipHorizontal?: boolean; - // (undocumented) - flipVertical?: boolean; - // (undocumented) - paletteLut?: boolean; - // (undocumented) - pan?: boolean; - // (undocumented) - rotation?: boolean; - // (undocumented) - slabThickness?: number; - // (undocumented) - windowLevel?: boolean; - // (undocumented) - zoom?: boolean; -} - -// @public (undocumented) -type ViewReference = { - FrameOfReferenceUID?: string; - referencedImageId?: string; - referencedImageURI?: string; - multiSliceReference?: ReferencedImageRange; - cameraFocalPoint?: Point3; - viewPlaneNormal?: Point3; - viewUp?: Point3; - sliceIndex?: number; - volumeId?: string; - bounds?: BoundsLPS; -}; - -// @public (undocumented) -type ViewReferenceSpecifier = { - sliceIndex?: number; - rangeEndSliceIndex?: number; - frameNumber?: number; - forFrameOfReference?: boolean; - points?: Point3[]; - volumeId?: string; -}; - -// @public (undocumented) -interface VOI { - // (undocumented) - windowCenter: number; - // (undocumented) - windowWidth: number; -} - -// @public (undocumented) -enum VOILUTFunctionType { - // (undocumented) - LINEAR = "LINEAR", - // (undocumented) - LINEAR_EXACT = "LINEAR_EXACT", - // (undocumented) - SAMPLED_SIGMOID = "SIGMOID" -} - -// @public (undocumented) -type VoiModifiedEvent = CustomEvent_2; - -// @public (undocumented) -interface VoiModifiedEventDetail { - // (undocumented) - colormap?: ColormapPublic; - // (undocumented) - invert?: boolean; - // (undocumented) - invertStateChanged?: boolean; - // (undocumented) - range: VOIRange; - // (undocumented) - viewportId: string; - // (undocumented) - VOILUTFunction?: VOILUTFunctionType; - // (undocumented) - volumeId?: string; -} - -// @public (undocumented) -interface VOIRange { - // (undocumented) - lower: number; - // (undocumented) - upper: number; -} - -// @public (undocumented) -type VolumeActor = vtkVolume; - -// @public (undocumented) -type VolumeCacheVolumeAddedEvent = CustomEvent_2; - -// @public (undocumented) -interface VolumeCacheVolumeAddedEventDetail { - // (undocumented) - volume: ICachedVolume; -} - -// @public (undocumented) -type VolumeCacheVolumeRemovedEvent = CustomEvent_2; - -// @public (undocumented) -interface VolumeCacheVolumeRemovedEventDetail { - // (undocumented) - volumeId: string; -} - -// @public (undocumented) -type VolumeInputCallback = (params: { - volumeActor: VolumeActor; - volumeId: string; -}) => unknown; - -// @public (undocumented) -type VolumeLoadedEvent = CustomEvent_2; - -// @public (undocumented) -interface VolumeLoadedEventDetail { - // (undocumented) - volume: IImageVolume; -} - -// @public (undocumented) -type VolumeLoadedFailedEvent = CustomEvent_2; - -// @public (undocumented) -interface VolumeLoadedFailedEventDetail { - // (undocumented) - error: unknown; - // (undocumented) - volumeId: string; -} - -declare namespace volumeLoader { - export { - loadVolume, - createAndCacheVolume, - createAndCacheDerivedVolume, - createAndCacheVolumeFromImages, - createAndCacheVolumeFromImagesSync, - createLocalVolume, - registerVolumeLoader, - getVolumeLoaderSchemes, - registerUnknownVolumeLoader, - getUnknownVolumeLoaderSchema, - createAndCacheDerivedLabelmapVolume, - createLocalLabelmapVolume, - LocalVolumeOptions - } -} -export { volumeLoader } - -// @public (undocumented) -type VolumeLoaderFn = (volumeId: string, options?: Record) => { - promise: Promise; - cancelFn?: () => void | undefined; - decache?: () => void | undefined; -}; - -// @public (undocumented) -type VolumeNewImageEvent = CustomEvent_2; - -// @public (undocumented) -interface VolumeNewImageEventDetail { - // (undocumented) - imageIndex: number; - // (undocumented) - numberOfSlices: number; - // (undocumented) - renderingEngineId: string; - // (undocumented) - viewportId: string; -} - -// @public (undocumented) -interface VolumeProps { - // (undocumented) - additionalDetails?: Record; - // (undocumented) - dataType: PixelDataTypedArrayString; - // (undocumented) - dimensions: Point3; - // (undocumented) - direction: Mat3; - // (undocumented) - imageData?: vtkImageData; - // (undocumented) - metadata: Metadata; - // (undocumented) - numberOfComponents?: number; - // (undocumented) - origin: Point3; - // (undocumented) - referencedVolumeId?: string; - // (undocumented) - scalarData?: PixelDataTypedArray | PixelDataTypedArray[]; - // (undocumented) - scaling?: { - PT?: { - SUVlbmFactor?: number; - SUVbsaFactor?: number; - suvbwToSuvlbm?: number; - suvbwToSuvbsa?: number; - }; - }; - // (undocumented) - sizeInBytes?: number; - // (undocumented) - spacing: Point3; - // (undocumented) - volumeId: string; - // (undocumented) - voxelManager?: IVoxelManager | IVoxelManager; -} - -// @public (undocumented) -type VolumeScrollOutOfBoundsEvent = CustomEvent_2; - -// @public (undocumented) -type VolumeScrollOutOfBoundsEventDetail = { - volumeId: string; - viewport: IVolumeViewport; - desiredStepIndex: number; - currentStepIndex: number; - delta: number; - numScrollSteps: number; - currentImageId: string; -}; - -// @public (undocumented) -export class VolumeViewport extends BaseVolumeViewport { - constructor(props: ViewportInput); - // (undocumented) - addVolumes(volumeInputArray: IVolumeInput[], immediate?: boolean, suppressEvents?: boolean): Promise; - // (undocumented) - getBlendMode(filterActorUIDs?: string[]): BlendModes; - // (undocumented) - getCurrentImageId: () => string | undefined; - // (undocumented) - getCurrentImageIdIndex: (volumeId?: string, useSlabThickness?: boolean) => number; - // (undocumented) - getCurrentSlicePixelData(): PixelDataTypedArray; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getSliceIndex: () => number; - // (undocumented) - getSlicePlaneCoordinates: () => { - sliceIndex: number; - point: Point3; - }[]; - // (undocumented) - getSlicesClippingPlanes(): { - sliceIndex: number; - planes: { - normal: Point3; - origin: Point3; - }[]; - }[]; - // (undocumented) - getSliceViewInfo(): { - sliceIndex: number; - slicePlane: number; - width: number; - height: number; - sliceToIndexMatrix: mat4; - indexToSliceMatrix: mat4; - }; - // (undocumented) - getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference; - // (undocumented) - jumpToWorld(worldPos: Point3): boolean; - // (undocumented) - resetCamera(options?: any): boolean; - // (undocumented) - resetCameraForResize: () => boolean; - // (undocumented) - resetProperties(volumeId?: string): void; - // (undocumented) - resetSlabThickness(): void; - // (undocumented) - setBlendMode(blendMode: BlendModes, filterActorUIDs?: any[], immediate?: boolean): void; - // (undocumented) - protected setCameraClippingRange(): void; - // (undocumented) - setOrientation(orientation: OrientationAxis | OrientationVectors, immediate?: boolean): void; - // (undocumented) - setSlabThickness(slabThickness: number, filterActorUIDs?: any[]): void; - // (undocumented) - setVolumes(volumeInputArray: IVolumeInput[], immediate?: boolean, suppressEvents?: boolean): Promise; -} - -// @public (undocumented) -export class VolumeViewport3D extends BaseVolumeViewport { - constructor(props: ViewportInput); - // (undocumented) - getCurrentImageId: () => string; - // (undocumented) - getCurrentImageIdIndex: () => number; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getRotation: () => number; - // (undocumented) - getSliceIndex(): number; - // (undocumented) - resetCamera({ resetPan, resetZoom, resetToCenter, }?: { - resetPan?: boolean; - resetZoom?: boolean; - resetToCenter?: boolean; - }): boolean; - // (undocumented) - resetCameraForResize: () => boolean; - // (undocumented) - resetProperties(volumeId?: string): void; - // (undocumented) - resetSlabThickness(): void; - // (undocumented) - setBlendMode(blendMode: BlendModes, filterActorUIDs?: string[], immediate?: boolean): void; - // (undocumented) - setCamera(props: any): void; - // (undocumented) - protected setCameraClippingRange(): void; - // (undocumented) - setSlabThickness(slabThickness: number, filterActorUIDs?: string[]): void; -} - -// @public (undocumented) -type VolumeViewportProperties = ViewportProperties & { - preset?: string; - slabThickness?: number; - orientation?: OrientationAxis; -}; - -// @public (undocumented) -class VoxelManager { - constructor(dimensions: any, options: { - _get: (index: number) => T; - _set?: (index: number, v: T) => boolean; - _getScalarData?: () => ArrayLike; - _id?: string; - _updateScalarData?: (scalarData: ArrayLike) => PixelDataTypedArray; - numberOfComponents?: number; - scalarData?: ArrayLike; - _getConstructor?: () => new (length: number) => PixelDataTypedArray; - }); - // (undocumented) - static addBounds(bounds: BoundsIJK, point: Point3): void; - // (undocumented) - static addInstanceToImage(image: IImage): void; - // (undocumented) - addPoint(point: Point3 | number): void; - // (undocumented) - get bytePerVoxel(): number; - // (undocumented) - clear(): void; - // (undocumented) - static createHistoryVoxelManager({ sourceVoxelManager, }: { - sourceVoxelManager: VoxelManager; - }): VoxelManager; - // (undocumented) - static createImageVolumeVoxelManager({ dimensions, imageIds, numberOfComponents, }: { - dimensions: Point3; - imageIds: string[]; - numberOfComponents: number; - }): IVoxelManager | IVoxelManager; - // (undocumented) - static createImageVoxelManager({ width, height, scalarData, numberOfComponents, }: { - width: number; - height: number; - scalarData: PixelDataTypedArray; - numberOfComponents?: number; - }): IVoxelManager | IVoxelManager; - // (undocumented) - static createLazyVoxelManager({ dimensions, planeFactory, }: { - dimensions: Point3; - planeFactory: (width: number, height: number) => T; - }): VoxelManager; - // (undocumented) - static createMapVoxelManager({ dimension, }: { - dimension: Point3; - }): IVoxelManager; - // (undocumented) - static createRLEHistoryVoxelManager(sourceVoxelManager: VoxelManager): VoxelManager; - // (undocumented) - static createRLEImageVoxelManager({ dimensions, }: { - dimensions: Point2; - }): VoxelManager; - // (undocumented) - static createRLEVolumeVoxelManager({ dimensions, }: { - dimensions: Point3; - }): VoxelManager; - // (undocumented) - static createScalarDynamicVolumeVoxelManager({ imageIdGroups, dimensions, dimensionGroupNumber, timePoint, numberOfComponents, }: { - imageIdGroups: string[][]; - dimensions: Point3; - dimensionGroupNumber?: number; - timePoint?: number; - numberOfComponents?: number; - }): IVoxelManager | IVoxelManager; - // (undocumented) - static createScalarVolumeVoxelManager({ dimensions, scalarData, numberOfComponents, }: { - dimensions: Point3; - scalarData: any; - numberOfComponents?: number; - }): IVoxelManager | IVoxelManager; - // (undocumented) - readonly dimensions: Point3; - // (undocumented) - forEach: (callback: (args: { - value: unknown; - index: number; - pointIJK: Point3; - pointLPS: Point3; - }) => void, options?: { - boundsIJK?: BoundsIJK; - isInObject?: (pointLPS: any, pointIJK: any) => boolean; - returnPoints?: boolean; - imageData?: vtkImageData | CPUImageData; - }) => void | any[]; - // (undocumented) - frameSize: number; - // (undocumented) - readonly _get: (index: number) => T; - // (undocumented) - getArrayOfModifiedSlices(): number[]; - // (undocumented) - getAtIJK: (i: any, j: any, k: any) => T; - // (undocumented) - getAtIJKPoint: ([i, j, k]: [any, any, any]) => T; - // (undocumented) - getAtIndex: (index: any) => T; - // (undocumented) - getBoundsIJK(): BoundsIJK; - // (undocumented) - getCompleteScalarDataArray?: () => ArrayLike; - // (undocumented) - getConstructor(): new (length: number) => PixelDataTypedArray; - // (undocumented) - readonly _getConstructor?: () => new (length: number) => PixelDataTypedArray; - // (undocumented) - getDefaultBounds(): BoundsIJK; - // (undocumented) - getMiddleSliceData: () => PixelDataTypedArray; - // (undocumented) - getMinMax(): { - min: any; - max: any; - }; - // (undocumented) - getPoints(): Point3[]; - // (undocumented) - getRange: () => [number, number]; - // (undocumented) - getScalarData(storeScalarData?: boolean): PixelDataTypedArray; - // (undocumented) - _getScalarData?: () => ArrayLike; - // (undocumented) - getScalarDataLength(): number; - // (undocumented) - _getScalarDataLength?: () => number; - // (undocumented) - getSliceData: ({ sliceIndex, slicePlane, }: { - sliceIndex: number; - slicePlane: number; - }) => PixelDataTypedArray; - // (undocumented) - _getSliceData: (args: { - sliceIndex: number; - slicePlane: number; - }) => PixelDataTypedArray; - // (undocumented) - readonly _id: string; - // (undocumented) - isInObject: (pointLPS: any, pointIJK: any) => boolean; - // (undocumented) - map: Map | IRLEVoxelMap; - // (undocumented) - modifiedSlices: Set; - // (undocumented) - readonly numberOfComponents: any; - // (undocumented) - points: Set; - // (undocumented) - resetModifiedSlices(): void; - // (undocumented) - rleForEach(callback: any, options?: any): void; - // (undocumented) - readonly _set: (index: number, v: T) => boolean; - // (undocumented) - setAtIJK: (i: number, j: number, k: number, v: any) => boolean; - // (undocumented) - setAtIJKPoint: ([i, j, k]: Point3, v: any) => void; - // (undocumented) - setAtIndex: (index: any, v: any) => boolean; - // (undocumented) - setCompleteScalarDataArray?: (scalarData: ArrayLike) => void; - // (undocumented) - setScalarData(newScalarData: PixelDataTypedArray): void; - // (undocumented) - get sizeInBytes(): number; - // (undocumented) - sourceVoxelManager: IVoxelManager; - // (undocumented) - static: any; - // (undocumented) - toIJK(index: number): Point3; - // (undocumented) - toIndex(ijk: Point3): number; - // (undocumented) - _updateScalarData?: (scalarData: ArrayLike) => PixelDataTypedArray; - // (undocumented) - width: number; -} - -// @public (undocumented) -enum VoxelManagerEnum { - // (undocumented) - RLE = "RLE", - // (undocumented) - Volume = "Volume" -} - -declare namespace windowLevel { - export { - toWindowLevel, - toLowHighRange - } -} - -// @public (undocumented) -function worldToImageCoords(imageId: string, worldCoords: Point3): Point2 | undefined; - -// @public (undocumented) -export class WSIViewport extends Viewport { - constructor(props: ViewportInput); - // (undocumented) - static addMiniNavigationOverlayCss(): void; - // (undocumented) - protected canvasToIndex: (canvasPos: Point2) => Point2; - // (undocumented) - canvasToWorld: (canvasPos: Point2) => Point3; - // (undocumented) - customRenderViewportToCanvas: () => void; - // (undocumented) - getCamera(): ICamera; - // (undocumented) - getCurrentImageId(): string; - // (undocumented) - getCurrentImageIdIndex(): number; - // (undocumented) - static getDicomMicroscopyViewer: () => Promise; - // (undocumented) - getFrameNumber(): number; - // (undocumented) - getFrameOfReferenceUID: () => string; - // (undocumented) - getImageData(): CPUIImageData; - // (undocumented) - getImageIds: () => Array; - // (undocumented) - getNumberOfSlices: () => number; - // (undocumented) - getProperties: () => WSIViewportProperties; - // (undocumented) - getRotation: () => number; - // (undocumented) - protected getScalarData(): any; - // (undocumented) - getSliceIndex(): number; - // (undocumented) - protected getTransform(): Transform; - // (undocumented) - getView(): any; - // (undocumented) - getViewReferenceId(): string; - // (undocumented) - getZoom(): any; - // (undocumented) - hasImageURI(imageURI: string): boolean; - // (undocumented) - protected imageIds: string[]; - // (undocumented) - protected indexToCanvas: (indexPos: Point2) => Point2; - // (undocumented) - protected map: any; - // (undocumented) - protected metadata: any; - // (undocumented) - protected metadataDicomweb: any; - // (undocumented) - modality: any; - // (undocumented) - postrender: () => void; - // (undocumented) - readonly renderingEngineId: string; - // (undocumented) - resetCamera: () => boolean; - // (undocumented) - resetProperties(): void; - // (undocumented) - resize: () => void; - // (undocumented) - scroll(delta: number): void; - // (undocumented) - setCamera(camera: ICamera): void; - // (undocumented) - setDataIds(imageIds: string[], options?: DataSetOptions & { - miniNavigationOverlay?: boolean; - webClient: unknown; - }): Promise; - // (undocumented) - setFrameNumber(frame: number): Promise; - // (undocumented) - setProperties(props: WSIViewportProperties): void; - // (undocumented) - setWSI(imageIds: string[], client: any): Promise; - // (undocumented) - setZoom(zoom: number): void; - // (undocumented) - readonly uid: any; - // (undocumented) - static get useCustomRenderingPipeline(): boolean; - // (undocumented) - worldToCanvas: (worldPos: Point3) => Point2; -} - -// @public (undocumented) -type WSIViewportProperties = ViewportProperties; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/dicom-image-loader.api.md b/common/reviews/api/dicom-image-loader.api.md deleted file mode 100644 index 23c601c79..000000000 --- a/common/reviews/api/dicom-image-loader.api.md +++ /dev/null @@ -1,638 +0,0 @@ -## API Report File for "@cornerstonejs/dicom-image-loader" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import type { ByteArray } from 'dicom-parser'; -import { DataSet } from 'dicom-parser'; -import * as dicomParser from 'dicom-parser'; -import type { Element as Element_2 } from 'dicom-parser'; -import { ImageQualityStatus as ImageQualityStatus_2 } from 'packages/core/dist/esm/enums'; -import { mat4 } from 'gl-matrix'; -import { PromiseIterator } from 'packages/core/dist/esm/utilities/ProgressiveIterator'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; - -declare namespace constants { - export { - transferSyntaxes - } -} -export { constants } - -// @public (undocumented) -export function convertColorSpace(imageFrame: any, colorBuffer: any, useRGBA: any): void; - -// @public (undocumented) -export function (imageFrame: Types_2.IImageFrame, colorBuffer: ByteArray, useRGBA: boolean): void; - -// @public (undocumented) -export function (imageFrame: ByteArray, colorBuffer: ByteArray, useRGBA: boolean): void; - -// @public (undocumented) -export function (imageFrame: ByteArray, colorBuffer: ByteArray, useRGBA: boolean): void; - -// @public (undocumented) -export function (imageFrame: ByteArray, colorBuffer: ByteArray, useRGBA: boolean): void; - -// @public (undocumented) -export function (imageFrame: ByteArray, colorBuffer: ByteArray, useRGBA: boolean): void; - -// @public (undocumented) -const cornerstoneDICOMImageLoader: { - constants: typeof constants; - convertRGBColorByPixel: typeof convertRGBColorByPixel; - convertRGBColorByPlane: typeof convertRGBColorByPlane; - convertYBRFullByPixel: typeof convertYBRFullByPixel; - convertYBRFullByPlane: typeof convertYBRFullByPlane; - convertPALETTECOLOR: typeof convertPALETTECOLOR; - wadouri: { - metaData: { - getImagePixelModule: getImagePixelModule; - getLUTs: getLUTs; - getModalityLUTOutputPixelRepresentation: getModalityLUTOutputPixelRepresentation; - getNumberValues: getNumberValues; - metaDataProvider: metaDataProvider; - metadataForDataset: metadataForDataset; - }; - dataSetCacheManager: { - isLoaded: (uri: string) => boolean; - load: (uri: string, loadRequest: Types.LoadRequestFunction, imageId: string) => CornerstoneWadoLoaderCachedPromise; - unload: (uri: string) => void; - getInfo: getInfo; - purge: () => void; - get: (uri: string) => DataSet; - update: (uri: string, dataSet: DataSet) => void; - }; - fileManager: { - add: (file: Blob) => string; - get: (index: number) => Blob; - remove: (index: number) => void; - purge: () => void; - }; - getEncapsulatedImageFrame: getEncapsulatedImageFrame; - getUncompressedImageFrame: getUncompressedImageFrame; - loadFileRequest: loadFileRequest; - loadImageFromPromise: loadImageFromPromise; - getLoaderForScheme: getLoaderForScheme; - getPixelData: getPixelData_2; - loadImage: loadImage; - parseImageId: parseImageId; - unpackBinaryFrame: unpackBinaryFrame; - register: default_2; - }; - wadors: { - metaData: { - getNumberString: getNumberString; - getNumberValue: getNumberValue; - getNumberValues: getNumberValues_2; - getValue: getValue_2; - metaDataProvider: metaDataProvider_2; - }; - findIndexOfString: findIndexOfString; - getPixelData: typeof getPixelData; - loadImage: loadImage_2; - metaDataManager: { - add: (imageId: string, metadata: Types.WADORSMetaData) => void; - get: (imageId: string) => Types.WADORSMetaData; - remove: (imageId: any) => void; - purge: () => void; - }; - register: default_3; - }; - init: typeof init; - convertColorSpace: typeof convertColorSpace; - createImage: typeof createImage; - decodeJPEGBaseline8BitColor: typeof decodeJPEGBaseline8BitColor; - getImageFrame: typeof getImageFrame; - getPixelData: typeof getPixelData; - getMinMax: typeof getMinMax; - isColorImage: typeof isColorImage; - isJPEGBaseline8BitColor: typeof isJPEGBaseline8BitColor; - internal: { - xhrRequest: xhrRequest; - streamRequest: streamRequest; - setOptions: setOptions; - getOptions: getOptions; - }; - decodeImageFrame: typeof decodeImageFrame; -}; -export default cornerstoneDICOMImageLoader; - -// @public (undocumented) -export function createImage(imageId: string, pixelData: ByteArray, transferSyntax: string, options?: DICOMLoaderImageOptions): Promise; - -// @public (undocumented) -export function decodeImageFrame(imageFrame: any, transferSyntax: any, pixelData: any, decodeConfig: any, options: any, callbackFn: any): Promise; - -// @public (undocumented) -export function decodeJPEGBaseline8BitColor(imageFrame: Types_2.IImageFrame, pixelData: ByteArray, canvas: HTMLCanvasElement): Promise; - -// @public (undocumented) -interface DICOMLoaderDataSetWithFetchMore extends DataSet { - // (undocumented) - fetchMore?: (fetchOptions: { - uri: string; - imageId: string; - fetchedLength: number; - lengthToFetch: number; - }) => Promise; -} - -// @public (undocumented) -interface DICOMLoaderIImage extends Types_2.IImage { - // (undocumented) - data?: DataSet; - // (undocumented) - decodeTimeInMS: number; - // (undocumented) - floatPixelData?: ByteArray | Float32Array; - // (undocumented) - imageFrame?: Types_2.IImageFrame; - // (undocumented) - loadTimeInMS?: number; - // (undocumented) - totalTimeInMS?: number; - // (undocumented) - transferSyntaxUID?: string; -} - -// @public (undocumented) -interface DICOMLoaderImageOptions { - // (undocumented) - allowFloatRendering?: boolean; - // (undocumented) - decodeLevel?: number; - // (undocumented) - loader?: LoadRequestFunction; - // (undocumented) - preScale?: { - enabled: boolean; - scalingParameters?: Types_2.ScalingParameters; - }; - // (undocumented) - retrieveOptions?: Types_2.RetrieveOptions; - // (undocumented) - streamingData?: StreamingData; - // (undocumented) - targetBuffer?: { - type: Types_2.PixelDataTypedArrayString; - arrayBuffer: ArrayBufferLike; - length: number; - offset: number; - rows?: number; - columns?: number; - }; - // (undocumented) - useRGBA?: boolean; -} - -// @public (undocumented) -export function getImageFrame(imageId: string): Types_2.IImageFrame; - -// @public (undocumented) -export function getMinMax(storedPixelData: Types_2.PixelDataTypedArray): { - min: number; - max: number; -}; - -// @public (undocumented) -export function getPixelData(uri: string, imageId: string, mediaType?: string, options?: CornerstoneWadoRsLoaderOptions): PromiseIterator | LoaderXhrRequestPromise< { -contentType: string; -pixelData: Uint8Array; -imageQualityStatus: ImageQualityStatus_2; -percentComplete: number; -}> | Promise<{ - contentType: string; - imageQualityStatus: ImageQualityStatus_2; - pixelData: Uint8Array; - extractDone?: undefined; - tokenIndex?: undefined; - responseHeaders?: undefined; - boundary?: undefined; - multipartContentType?: undefined; -} | { - contentType: any; - extractDone: boolean; - tokenIndex: any; - responseHeaders: any; - boundary: any; - multipartContentType: any; - pixelData: any; - imageQualityStatus?: undefined; -}>; - -// @public (undocumented) -export function init(options?: LoaderOptions): void; - -// @public (undocumented) -export const internal: { - xhrRequest: typeof xhrRequest; - streamRequest: typeof streamRequest; - setOptions: typeof setOptions; - getOptions: typeof getOptions; -}; - -// @public (undocumented) -export function (photoMetricInterpretation: string): boolean; - -// @public (undocumented) -export function isJPEGBaseline8BitColor(imageFrame: Types_2.IImageFrame, transferSyntax: string): boolean; - -// @public (undocumented) -interface LoaderDecodeOptions { -} - -// @public (undocumented) -interface LoaderOptions { - // (undocumented) - beforeProcessing?: (xhr: XMLHttpRequest) => Promise; - // (undocumented) - beforeSend?: (xhr: XMLHttpRequest, imageId: string, defaultHeaders: Record, params: LoaderXhrRequestParams) => Record | void; - // (undocumented) - decodeConfig?: LoaderDecodeOptions; - // (undocumented) - errorInterceptor?: (error: LoaderXhrRequestError) => void; - // (undocumented) - imageCreated?: (imageObject: unknown) => void; - // (undocumented) - maxWebWorkers?: number; - // (undocumented) - onloadend?: (event: ProgressEvent, params: unknown) => void; - // (undocumented) - onloadstart?: (event: ProgressEvent, params: unknown) => void; - // (undocumented) - onprogress?: (event: ProgressEvent, params: unknown) => void; - // (undocumented) - onreadystatechange?: (event: Event, params: unknown) => void; - // (undocumented) - open?: (xhr: XMLHttpRequest, url: string, defaultHeaders: Record, params: LoaderXhrRequestParams) => void; - // (undocumented) - strict?: boolean; -} - -// @public (undocumented) -interface LoaderXhrRequestError extends Error { - // (undocumented) - request: XMLHttpRequest; - // (undocumented) - response: unknown; - // (undocumented) - status: number; -} - -// @public (undocumented) -interface LoaderXhrRequestParams { - // (undocumented) - deferred?: { - resolve: (value: ArrayBuffer | PromiseLike) => void; - reject: (reason: any) => void; - }; - // (undocumented) - imageId?: string; - // (undocumented) - url?: string; -} - -// @public (undocumented) -interface LoaderXhrRequestPromise extends Promise { - // (undocumented) - xhr?: XMLHttpRequest; -} - -// @public (undocumented) -type LoadRequestFunction = (url: string, imageId: string, ...args: unknown[]) => Promise; - -// @public (undocumented) -interface LutType { - // (undocumented) - firstValueMapped: number; - // (undocumented) - id: string; - // (undocumented) - lut: number[]; - // (undocumented) - numBitsPerEntry: number; -} - -// @public (undocumented) -namespace transferSyntaxes { - let // (undocumented) - IMPLICIT_VR_LITTLE_ENDIAN: string; - let // (undocumented) - EXPLICIT_VR_LITTLE_ENDIAN: string; - let // (undocumented) - DEFLATED_EXPLICIT_VR_LITTLE_ENDIAN: string; - let // (undocumented) - EXPLICIT_VR_BIG_ENDIAN: string; - let // (undocumented) - JPEG_BASELINE_PROCESS_1: string; - let // (undocumented) - JPEG_EXTENDED_PROCESS_2_4: string; - let // (undocumented) - JPEG_EXTENDED_PROCESSES_3_5: string; - let // (undocumented) - JPEG_SPECTRAL_SELECTION_NONHIERARCHICAL_PROCESSES_6_8: string; - let // (undocumented) - JPEG_SPECTRAL_SELECTION_NONHIERARCHICAL_PROCESSES_7_9: string; - let // (undocumented) - JPEG_FULL_PROGRESSION_NONHIERARCHICAL_PROCESSES_10_12: string; - let // (undocumented) - JPEG_FULL_PROGRESSION_NONHIERARCHICAL_PROCESSES_11_13: string; - let // (undocumented) - JPEG_LOSSLESS_NONHIERARCHICAL_PROCESS_14: string; - let // (undocumented) - JPEG_LOSSLESS_NONHIERARCHICAL_PROCESS_15: string; - let // (undocumented) - JPEG_EXTENDED_HIERARCHICAL_PROCESSES_16_18: string; - let // (undocumented) - JPEG_EXTENDED_HIERARCHICAL_PROCESSES_17_19: string; - let // (undocumented) - JPEG_SPECTRAL_SELECTION_HIERARCHICAL_PROCESSES_20_22: string; - let // (undocumented) - JPEG_SPECTRAL_SELECTION_HIERARCHICAL_PROCESSES_21_23: string; - let // (undocumented) - JPEG_FULL_PROGRESSION_HIERARCHICAL_PROCESSES_24_26: string; - let // (undocumented) - JPEG_FULL_PROGRESSION_HIERARCHICAL_PROCESSES_25_27: string; - let // (undocumented) - JPEG_LOSSLESS_NONHIERARCHICAL_PROCESS_28: string; - let // (undocumented) - JPEG_LOSSLESS_NONHIERARCHICAL_PROCESS_29: string; - let // (undocumented) - JPEG_LOSSLESS_NONHIERARCHICAL_FIRST_ORDER_PREDICTION_PROCESS_14: string; - let // (undocumented) - JPEG_LS_LOSSLESS_IMAGE_COMPRESSION: string; - let // (undocumented) - JPEG_LS_LOSSY_NEAR_LOSSLESS_IMAGE_COMPRESSION: string; - let // (undocumented) - JPEG_2000_IMAGE_COMPRESSION_LOSSLESS_ONLY: string; - let // (undocumented) - JPEG_2000_IMAGE_COMPRESSION: string; - let // (undocumented) - JPEG_2000_PART_2_MULTICOMPONENT_IMAGE_COMPRESSION_LOSSLESS_ONLY: string; - let // (undocumented) - JPEG_2000_PART_2_MULTICOMPONENT_IMAGE_COMPRESSION: string; - let // (undocumented) - JPIP_REFERENCED: string; - let // (undocumented) - JPIP_REFERENCED_DEFLATE: string; - let // (undocumented) - MPEG2_MAIN_PROFILE_MAIN_LEVEL: string; - let // (undocumented) - MPEG4_AVC_H264_HIGH_PROFILE_LEVEL_4_1: string; - let // (undocumented) - MPEG4_AVC_H264_BD_COMPATIBLE_HIGH_PROFILE_LEVEL_4_1: string; - let // (undocumented) - MPEG4_AVC_H264_HIGH_PROFILE_FOR_2D_VIDEO: string; - let // (undocumented) - MPEG4_AVC_H264_HIGH_PROFILE_FOR_3D_VIDEO: string; - let // (undocumented) - JPIP_LOSSLESS: string; - let // (undocumented) - JPIP_PART2_MULTICOMPONENT_IMAGE_COMPRESSION: string; - let // (undocumented) - RFC_2557_MIME_ENCAPSULATION: string; - let // (undocumented) - JPEG_XR_IMAGE_COMPRESSION: string; - let // (undocumented) - JPEG_2000_IMAGE_COMPRESSION_LOSSLESS_ONLY_RETIRED: string; - let // (undocumented) - JPEG_2000_IMAGE_COMPRESSION_RETIRED: string; - let // (undocumented) - JPEG_2000_PART_2_MULTICOMPONENT_IMAGE_COMPRESSION_LOSSLESS_ONLY_RETIRED: string; - let // (undocumented) - JPEG_2000_PART_2_MULTICOMPONENT_IMAGE_COMPRESSION_RETIRED: string; -} - -declare namespace Types { - export { - LoaderDecodeOptions, - LoaderOptions, - WADORSMetaData, - WADORSMetaDataElement, - LoaderXhrRequestError, - LoaderXhrRequestParams, - LoaderXhrRequestPromise, - DICOMLoaderIImage, - DICOMLoaderImageOptions, - LutType, - WebWorkerOptions, - WebWorkerDecodeConfig, - WebWorkerTaskOptions, - WorkerTaskTypes, - WorkerTask, - WebWorkerDecodeTaskData, - WebWorkerDecodeData, - WebWorkerLoadData, - WebWorkerInitializeData, - WebWorkerData, - WebWorkerResponse, - WebWorkerDeferredObject, - LoadRequestFunction, - DICOMLoaderDataSetWithFetchMore - } -} -export { Types } - -// @public (undocumented) -export const wadors: { - metaData: { - getNumberString: typeof getNumberString; - getNumberValue: typeof getNumberValue; - getNumberValues: typeof getNumberValues_2; - getValue: typeof getValue_2; - metaDataProvider: typeof metaDataProvider_2; - }; - findIndexOfString: typeof findIndexOfString; - getPixelData: typeof getPixelData; - loadImage: typeof loadImage_2; - metaDataManager: { - add: (imageId: string, metadata: WADORSMetaData) => void; - get: (imageId: string) => WADORSMetaData; - remove: (imageId: any) => void; - purge: () => void; - }; - register: typeof default_3; -}; - -// @public (undocumented) -type WADORSMetaData = Record; - -// @public (undocumented) -interface WADORSMetaDataElement { - // (undocumented) - Value: ValueType; -} - -// @public (undocumented) -export const wadouri: { - metaData: { - getImagePixelModule: typeof getImagePixelModule; - getLUTs: typeof getLUTs; - getModalityLUTOutputPixelRepresentation: typeof getModalityLUTOutputPixelRepresentation; - getNumberValues: typeof getNumberValues; - metaDataProvider: typeof metaDataProvider; - metadataForDataset: typeof metadataForDataset; - }; - dataSetCacheManager: { - isLoaded: (uri: string) => boolean; - load: (uri: string, loadRequest: LoadRequestFunction, imageId: string) => CornerstoneWadoLoaderCachedPromise; - unload: (uri: string) => void; - getInfo: getInfo; - purge: () => void; - get: (uri: string) => DataSet; - update: (uri: string, dataSet: DataSet) => void; - }; - fileManager: { - add: (file: Blob) => string; - get: (index: number) => Blob; - remove: (index: number) => void; - purge: () => void; - }; - getEncapsulatedImageFrame: typeof getEncapsulatedImageFrame; - getUncompressedImageFrame: typeof getUncompressedImageFrame; - loadFileRequest: typeof loadFileRequest; - loadImageFromPromise: typeof loadImageFromPromise; - getLoaderForScheme: typeof getLoaderForScheme; - getPixelData: typeof getPixelData_2; - loadImage: typeof loadImage; - parseImageId: typeof parseImageId; - unpackBinaryFrame: typeof unpackBinaryFrame; - register: typeof default_2; -}; - -// @public (undocumented) -type WebWorkerData = WebWorkerDecodeData | WebWorkerLoadData | WebWorkerInitializeData; - -// @public (undocumented) -interface WebWorkerDecodeConfig { - // (undocumented) - initializeCodecsOnStartup: boolean; - // (undocumented) - strict?: boolean; -} - -// @public (undocumented) -interface WebWorkerDecodeData { - // (undocumented) - data: WebWorkerDecodeTaskData; - // (undocumented) - taskType: 'decodeTask'; - // (undocumented) - workerIndex: number; -} - -// @public (undocumented) -interface WebWorkerDecodeTaskData { - // (undocumented) - decodeConfig: LoaderDecodeOptions; - // (undocumented) - imageFrame: Types_2.IImageFrame; - // (undocumented) - options: LoaderOptions; - // (undocumented) - pixelData: ByteArray; - // (undocumented) - transferSyntax: string; -} - -// @public (undocumented) -interface WebWorkerDeferredObject { - // (undocumented) - reject: (err: any) => void; - // (undocumented) - resolve: (arg: T | PromiseLike) => void; -} - -// @public (undocumented) -interface WebWorkerInitializeData { - // (undocumented) - config: WebWorkerOptions; - // (undocumented) - taskType: 'initialize'; - // (undocumented) - workerIndex: number; -} - -// @public (undocumented) -interface WebWorkerLoadData { - // (undocumented) - config: WebWorkerOptions; - // (undocumented) - sourcePath: string; - // (undocumented) - taskType: 'loadWebWorkerTask'; - // (undocumented) - workerIndex: number; -} - -// @public (undocumented) -interface WebWorkerOptions { - // (undocumented) - maxWebWorkers?: number; - // (undocumented) - startWebWorkersOnDemand?: boolean; - // (undocumented) - taskConfiguration?: WebWorkerTaskOptions; - // (undocumented) - webWorkerTaskPaths?: string[]; -} - -// @public (undocumented) -interface WebWorkerResponse { - // (undocumented) - data?: Types_2.IImageFrame; - // (undocumented) - result: string | Types_2.IImageFrame; - // (undocumented) - status: 'failed' | 'success'; - // (undocumented) - taskType: WorkerTaskTypes; - // (undocumented) - workerIndex: number; -} - -// @public (undocumented) -interface WebWorkerTaskOptions { - // (undocumented) - decodeTask: WebWorkerDecodeConfig; -} - -// @public (undocumented) -interface WorkerTask { - // (undocumented) - added: number; - // (undocumented) - data: WebWorkerDecodeTaskData; - // (undocumented) - deferred: WebWorkerDeferredObject; - // (undocumented) - priority: number; - // (undocumented) - start?: number; - // (undocumented) - status: 'ready' | 'success' | 'failed'; - // (undocumented) - taskId: number; - // (undocumented) - taskType: WorkerTaskTypes; - // (undocumented) - transferList: Transferable[]; -} - -// @public (undocumented) -type WorkerTaskTypes = 'decodeTask' | 'loadWebWorkerTask' | 'initialize'; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/labelmap-interpolation.api.md b/common/reviews/api/labelmap-interpolation.api.md deleted file mode 100644 index 272d39e37..000000000 --- a/common/reviews/api/labelmap-interpolation.api.md +++ /dev/null @@ -1,18 +0,0 @@ -## API Report File for "@cornerstonejs/labelmap-interpolation" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -// @public (undocumented) -export function interpolate({ segmentationId, segmentIndex, configuration, }: { - segmentationId: string; - segmentIndex: number; - configuration?: MorphologicalContourInterpolationOptions & { - preview: boolean; - }; -}): Promise; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/nifti-volume-loader.api.md b/common/reviews/api/nifti-volume-loader.api.md deleted file mode 100644 index a705125f6..000000000 --- a/common/reviews/api/nifti-volume-loader.api.md +++ /dev/null @@ -1,68 +0,0 @@ -## API Report File for "@cornerstonejs/nifti-volume-loader" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import { mat4 } from 'gl-matrix'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; - -// @public (undocumented) -export function cornerstoneNiftiImageLoader(imageId: string): Types.IImageLoadObject; - -// @public (undocumented) -export function createNiftiImageIdsAndCacheMetadata({ url }: { - url: any; -}): Promise; - -declare namespace Enums { - export { - Events - } -} -export { Enums } - -// @public (undocumented) -enum Events { - // (undocumented) - NIFTI_VOLUME_LOADED = "CORNERSTONE_NIFTI_VOLUME_LOADED", - // (undocumented) - NIFTI_VOLUME_PROGRESS = "CORNERSTONE_NIFTI_VOLUME_PROGRESS" -} - -declare namespace helpers { - export { - modalityScaleNifti, - makeVolumeMetadata - } -} -export { helpers } - -// @public (undocumented) -export function init(options?: LoaderOptions): void; - -// @public (undocumented) -function makeVolumeMetadata(niftiHeader: any, orientation: any, pixelRepresentation: any): { - volumeMetadata: Types.Metadata; - dimensions: Types.Point3; - direction: Types.Mat3; -}; - -// @public (undocumented) -function modalityScaleNifti(niftiHeader: any, niftiImageBuffer: any): { - scalarData: Types.PixelDataTypedArray; - pixelRepresentation: number; -}; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/polymorphic-segmentation.api.md b/common/reviews/api/polymorphic-segmentation.api.md deleted file mode 100644 index c2de14194..000000000 --- a/common/reviews/api/polymorphic-segmentation.api.md +++ /dev/null @@ -1,48 +0,0 @@ -## API Report File for "@cornerstonejs/polymorphic-segmentation" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import type ColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import type { mat3 } from 'gl-matrix'; -import { mat4 } from 'gl-matrix'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import { vec3 } from 'gl-matrix'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkColorTransferFunction } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import type vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; - -// @public (undocumented) -export function canComputeRequestedRepresentation(segmentationId: string, type: typeof SegmentationRepresentations): boolean; - -// @public (undocumented) -export function computeContourData(segmentationId: string, options?: PolySegConversionOptions): Promise<{ - annotationUIDsMap: Map>; -}>; - -// @public (undocumented) -export function computeLabelmapData(segmentationId: string, options?: PolySegConversionOptions): Promise; - -// @public (undocumented) -export function computeSurfaceData(segmentationId: string, options?: PolySegConversionOptions): Promise<{ - geometryIds: Map; -}>; - -// @public (undocumented) -export function init(): void; - -// @public (undocumented) -export function updateSurfaceData(segmentationId: any): Promise; - -// (No @packageDocumentation comment for this package) - -``` diff --git a/common/reviews/api/tools.api.md b/common/reviews/api/tools.api.md deleted file mode 100644 index 44e8aa903..000000000 --- a/common/reviews/api/tools.api.md +++ /dev/null @@ -1,7183 +0,0 @@ -## API Report File for "@cornerstonejs/tools" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import type ColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { Corners } from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget/Constants'; -import type { IColorMapPreset } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps'; -import type { mat3 } from 'gl-matrix'; -import { mat4 } from 'gl-matrix'; -import type { Range as Range_2 } from '@kitware/vtk.js/types'; -import { vec3 } from 'gl-matrix'; -import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; -import vtkAnnotatedCubeActor from '@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor'; -import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera'; -import { vtkColorTransferFunction } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'; -import { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; -import type { vtkObject } from '@kitware/vtk.js/interfaces'; -import type vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture'; -import type vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction'; -import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; -import type vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; -import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; - -declare namespace aabb { - export { - intersectAABB, - distanceToPoint, - distanceToPointSquared - } -} - -// @public (undocumented) -function acceptAutogeneratedInterpolations(annotationGroupSelector: AnnotationGroupSelector, selector: AcceptInterpolationSelector): void; - -declare namespace activeSegmentation { - export { - getActiveSegmentation, - setActiveSegmentation - } -} - -// @public (undocumented) -const addCanvasPointsToArray: (element: HTMLDivElement, canvasPoints: Types_2.Point2[], newCanvasPoint: Types_2.Point2, commonData: PlanarFreehandROICommonData) => number; - -// @public (undocumented) -function addColorLUT(colorLUT: Types_2.ColorLUT, index?: number): number; - -// @public (undocumented) -function addColorLUT_2(colorLUT: Types_2.ColorLUT, colorLUTIndex?: number): number; - -// @public (undocumented) -function addContourRepresentationToViewport(viewportId: string, contourInputArray: RepresentationPublicInput[]): void; - -// @public (undocumented) -function addContourRepresentationToViewportMap(viewportInputMap: { - [viewportId: string]: RepresentationPublicInput[]; -}): {}; - -// @public (undocumented) -function addContourSegmentationAnnotation(annotation: ContourSegmentationAnnotation): void; - -// @public (undocumented) -function addEnabledElement(evt: Types_2.EventTypes.ElementEnabledEvent): void; - -// @public (undocumented) -function addLabelmapRepresentationToViewport(viewportId: string, labelmapInputArray: RepresentationPublicInput[]): void; - -// @public (undocumented) -function addLabelmapRepresentationToViewportMap(viewportInputMap: { - [viewportId: string]: RepresentationPublicInput[]; -}): void; - -// @public (undocumented) -function addSegmentationRepresentations(viewportId: string, segmentationInputArray: RepresentationPublicInput[]): void; - -// @public (undocumented) -function addSegmentations(segmentationInputArray: SegmentationPublicInput[], suppressEvents?: boolean): void; - -// @public (undocumented) -function addSurfaceRepresentationToViewport(viewportId: string, surfaceInputArray: RepresentationPublicInput[]): void; - -// @public (undocumented) -function addSurfaceRepresentationToViewportMap(viewportInputMap: { - [viewportId: string]: RepresentationPublicInput[]; -}): {}; - -// @public (undocumented) -export function addTool(ToolClass: any): void; - -// @public (undocumented) -function addToolState(element: HTMLDivElement, data: CINETypes.ToolData): void; - -// @public (undocumented) -interface AdvancedMagnifyAnnotation extends Annotation { - // (undocumented) - data: { - zoomFactor: number; - sourceViewportId: string; - magnifyViewportId: string; - isCanvasAnnotation: boolean; - handles: { - points: [Types_2.Point3, Types_2.Point3, Types_2.Point3, Types_2.Point3]; - activeHandleIndex: number | null; - }; - }; -} - -// @public (undocumented) -export class AdvancedMagnifyTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - static Actions: typeof AdvancedMagnifyToolActions; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => AdvancedMagnifyAnnotation; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragDrawCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragHandle: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: Array; - handleIndex?: number; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: AdvancedMagnifyAnnotation, handle: ToolHandle) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: AdvancedMagnifyAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - magnifyViewportManager: MagnifyViewportManager; - // (undocumented) - onSetToolDisabled: () => void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - showZoomFactorsList(evt: EventTypes_2.InteractionEventType, annotation: AdvancedMagnifyAnnotation): void; - // (undocumented) - static toolName: any; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: AdvancedMagnifyAnnotation) => void; -} - -declare namespace angle { - export { - angleBetweenLines - } -} - -// @public (undocumented) -interface AngleAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats: { - [targetId: string]: { - angle: number; - }; - }; - }; -} - -// @public (undocumented) -function angleBetweenLines(line1: Line, line2: Line): number; - -// @public (undocumented) -export class AngleTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => AngleAnnotation; - // (undocumented) - angleStartedNotYetCompleted: boolean; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: AngleAnnotation, handle: ToolHandle): void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => AngleAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: AngleAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: AngleAnnotation) => void; -} - -// @public (undocumented) -type Annotation = { - annotationUID?: string; - parentAnnotationUID?: string; - interpolationUID?: string; - childAnnotationUIDs?: string[]; - highlighted?: boolean; - isLocked?: boolean; - isVisible?: boolean; - invalidated?: boolean; - isSelected?: boolean; - autoGenerated?: boolean; - metadata: Types_2.ViewReference & { - toolName: string; - cameraPosition?: Types_2.Point3; - viewUp?: Types_2.Point3; - }; - data: { - handles?: { - points?: Types_2.Point3[]; - activeHandleIndex?: number | null; - textBox?: { - hasMoved?: boolean; - worldPosition?: Types_2.Point3; - worldBoundingBox?: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - [key: string]: unknown; - }; - [key: string]: unknown; - cachedStats?: Record; - }; -}; - -declare namespace annotation { - export { - config, - locking, - selection, - state_2 as state, - visibility, - FrameOfReferenceSpecificAnnotationManager, - AnnotationGroup - } -} -export { annotation } - -// @public (undocumented) -type AnnotationAddedEventDetail = { - viewportId?: string; - renderingEngineId?: string; - annotation: Annotation; -}; - -// @public (undocumented) -type AnnotationAddedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationCompletedEventDetail = { - annotation: Annotation; - changeType?: ChangeTypes.Completed; -}; - -// @public (undocumented) -type AnnotationCompletedEventType = Types_2.CustomEventType; - -// @public (undocumented) -export abstract class AnnotationDisplayTool extends BaseTool { - // (undocumented) - protected createAnnotation(evt: EventTypes_2.InteractionEventType): Annotation; - // (undocumented) - filterInteractableAnnotationsForElement(element: HTMLDivElement, annotations: Annotations): Annotations; - // (undocumented) - protected getReferencedImageId(viewport: Types_2.IViewport, worldPos: Types_2.Point3, viewPlaneNormal: Types_2.Point3, viewUp?: Types_2.Point3): string; - // (undocumented) - getStyle(property: string, specifications: StyleSpecifier, annotation?: Annotation): unknown; - // (undocumented) - onImageSpacingCalibrated: (evt: Types_2.EventTypes.ImageSpacingCalibratedEvent) => void; - // (undocumented) - abstract renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): any; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -class AnnotationGroup { - constructor(); - // (undocumented) - add(...annotationUIDs: string[]): void; - // (undocumented) - clear(): void; - // (undocumented) - findNearby(uid: string, direction: 1): string; - // (undocumented) - has(uid: string): boolean; - // (undocumented) - get isVisible(): boolean; - // (undocumented) - remove(...annotationUIDs: string[]): void; - // (undocumented) - setVisible(isVisible: boolean, baseEvent: BaseEventDetail, filter?: (annotationUID: string) => boolean): void; - // (undocumented) - protected unboundVisibleFilter(uid: string): boolean; - // (undocumented) - visibleFilter: (uid: string) => boolean; -} - -// @public (undocumented) -type AnnotationGroupSelector = HTMLDivElement | string; - -// @public (undocumented) -type AnnotationHandle = Types_2.Point3; - -// @public (undocumented) -function annotationHydration(viewport: Types_2.IViewport, toolName: string, worldPoints: Types_2.Point3[], options?: { - FrameOfReferenceUID?: string; - annotationUID?: string; -}): Annotation; - -// @public (undocumented) -type AnnotationInterpolationCompletedEventDetail = { - annotation: InterpolationROIAnnotation; - element: HTMLDivElement; - viewportId: string; - renderingEngineId: string; -}; - -// @public (undocumented) -type AnnotationInterpolationCompletedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationInterpolationRemovedEventDetail = { - annotations: Array; - element: HTMLDivElement; - viewportId: string; - renderingEngineId: string; -}; - -// @public (undocumented) -type AnnotationInterpolationRemovedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationLockChangeEventDetail = { - added: Array; - removed: Array; - locked: Array; -}; - -// @public (undocumented) -type AnnotationLockChangeEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationModifiedEventDetail = { - annotation: Annotation; - changeType?: ChangeTypes; - viewportId?: string; - renderingEngineId?: string; -}; - -// @public (undocumented) -type AnnotationModifiedEventType = Types_2.CustomEventType; - -// @public (undocumented) -class AnnotationMultiSlice { - // (undocumented) - static getFrameRange(annotation: Annotation): number | [number, number]; - // (undocumented) - static getFrameRangeStr(annotation: Annotation): string; - // (undocumented) - static setEndRange(viewport: any, annotation: any, endRange?: any): void; - // (undocumented) - static setRange(viewport: any, annotation: any, startRange?: number, endRange?: number): void; - // (undocumented) - static setSingle(viewport: any, annotation: any, current?: any): void; - // (undocumented) - static setStartRange(viewport: any, annotation: any, startRange?: any): void; - // (undocumented) - static setViewportFrameRange(viewport: any, specifier: any): void; -} - -// @public (undocumented) -type AnnotationRemovedEventDetail = { - annotation: Annotation; - annotationManagerUID: string; -}; - -// @public (undocumented) -type AnnotationRemovedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationRenderContext = { - enabledElement: Types_2.IEnabledElement; - targetId: string; - annotation: Annotation; - annotationStyle: AnnotationStyle; - svgDrawingHelper: SVGDrawingHelper; -}; - -// @public (undocumented) -type AnnotationRenderedEventDetail = { - element: HTMLDivElement; - viewportId: string; - renderingEngineId: string; -}; - -// @public (undocumented) -type AnnotationRenderedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type Annotations = Array; - -// @public (undocumented) -type AnnotationSelectionChangeEventDetail = { - added: Array; - removed: Array; - selection: Array; -}; - -// @public (undocumented) -type AnnotationSelectionChangeEventType = Types_2.CustomEventType; - -// @public (undocumented) -type AnnotationState = { - [key: string]: GroupSpecificAnnotations; -}; - -// @public (undocumented) -type AnnotationStyle = { - [key in `${Properties}${States}${Modes}`]?: string | number | boolean | Record; -}; - -declare namespace AnnotationStyle_2 { - export { - AnnotationStyle, - ToolStyleConfig, - StyleConfig, - StyleSpecifier - } -} - -// @public (undocumented) -enum AnnotationStyleStates { - // (undocumented) - AutoGenerated = "AutoGenerated", - // (undocumented) - Default = "", - // (undocumented) - Highlighted = "Highlighted", - // (undocumented) - Locked = "Locked", - // (undocumented) - Selected = "Selected" -} - -// @public (undocumented) -export abstract class AnnotationTool extends AnnotationDisplayTool { - constructor(toolProps: PublicToolProps, defaultToolProps: ToolProps); - // (undocumented) - abstract addNewAnnotation(evt: EventTypes_2.InteractionEventType, interactionType: InteractionTypes): Annotation; - // (undocumented) - abstract cancel(element: HTMLDivElement): any; - // (undocumented) - static createAndAddAnnotation(viewport: any, ...annotationBaseData: any[]): void; - // (undocumented) - static createAnnotation(...annotationBaseData: any[]): Annotation; - // (undocumented) - static createAnnotationForViewport(viewport: any, ...annotationBaseData: any[]): T; - // (undocumented) - static createAnnotationMemo(element: any, annotation: Annotation, options?: { - newAnnotation?: boolean; - deleting?: boolean; - }): { - restoreMemo: () => void; - }; - // (undocumented) - protected static createAnnotationState(annotation: Annotation, deleting?: boolean): { - annotationUID: string; - data: { - [key: string]: unknown; - handles?: { - points?: Types_2.Point3[]; - activeHandleIndex?: number | null; - textBox?: { - hasMoved?: boolean; - worldPosition?: Types_2.Point3; - worldBoundingBox?: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - [key: string]: unknown; - }; - cachedStats?: Record; - }; - deleting: boolean; - }; - // (undocumented) - protected createMemo(element: any, annotation: any, options?: any): void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender?: string[]; - newAnnotation?: boolean; - handleIndex?: number; - movingTextBox?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - protected eventDispatchDetail: { - viewportId: string; - renderingEngineId: string; - }; - // (undocumented) - protected getAnnotationStyle(context: { - annotation: Annotation; - styleSpecifier: StyleSpecifier; - }): AnnotationStyle; - // (undocumented) - getHandleNearImagePoint(element: HTMLDivElement, annotation: Annotation, canvasCoords: Types_2.Point2, proximity: number): ToolHandle | undefined; - // (undocumented) - getLinkedTextBoxStyle(specifications: StyleSpecifier, annotation?: Annotation): Record; - // (undocumented) - abstract handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: Annotation, handle: ToolHandle, interactionType: InteractionTypes): void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - abstract isPointNearTool(element: HTMLDivElement, annotation: Annotation, canvasCoords: Types_2.Point2, proximity: number, interactionType: string): boolean; - // (undocumented) - static isSuvScaled(viewport: Types_2.IStackViewport | Types_2.IVolumeViewport, targetId: string, imageId?: string): boolean; - // (undocumented) - isSuvScaled: typeof AnnotationTool.isSuvScaled; - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.MouseMoveEventType, filteredAnnotations?: Annotations) => boolean; - // (undocumented) - static toolName: any; - // (undocumented) - abstract toolSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: Annotation, interactionType: InteractionTypes, canvasCoords?: Types_2.Point2): void; -} - -// @public (undocumented) -class AnnotationToPointData { - constructor(); - // (undocumented) - static convert(annotation: any, index: any, metadataProvider: any): { - ReferencedROINumber: any; - ROIDisplayColor: number[]; - ContourSequence: any; - }; - // (undocumented) - static register(toolClass: any): void; - // (undocumented) - static TOOL_NAMES: Record; -} - -// @public (undocumented) -type AnnotationVisibilityChangeEventDetail = { - lastHidden: Array; - lastVisible: Array; - hidden: Array; -}; - -// @public (undocumented) -type AnnotationVisibilityChangeEventType = Types_2.CustomEventType; - -// @public (undocumented) -function areCoplanarContours(firstAnnotation: ContourAnnotation, secondAnnotation: ContourAnnotation): boolean; - -// @public (undocumented) -function areSameSegment(firstAnnotation: ContourSegmentationAnnotation, secondAnnotation: ContourSegmentationAnnotation): boolean; - -// @public (undocumented) -export class ArrowAnnotateTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => ArrowAnnotation; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _doneChangingTextCallback(element: any, annotation: any, updatedText: any): void; - // (undocumented) - doubleClickCallback: (evt: EventTypes_2.TouchTapEventType) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: ArrowAnnotation, handle: ToolHandle): void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], text?: string, options?: { - annotationUID?: string; - }) => ArrowAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: ArrowAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: ArrowAnnotation) => void; - // (undocumented) - touchTapCallback: (evt: EventTypes_2.TouchTapEventType) => void; -} - -// @public (undocumented) -interface ArrowAnnotation extends Annotation { - // (undocumented) - data: { - text: string; - handles: { - points: Types_2.Point3[]; - arrowFirst: boolean; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - }; -} - -// @public (undocumented) -type BaseLabelmapStyle = { - renderOutline?: boolean; - outlineWidth?: number; - activeSegmentOutlineWidthDelta?: number; - renderFill?: boolean; - fillAlpha?: number; - outlineOpacity?: number; -}; - -// @public (undocumented) -export abstract class BaseTool { - constructor(toolProps: PublicToolProps, defaultToolProps: ToolProps); - // (undocumented) - applyActiveStrategy(enabledElement: Types_2.IEnabledElement, operationData: unknown): any; - // (undocumented) - applyActiveStrategyCallback(enabledElement: Types_2.IEnabledElement, operationData: unknown, callbackType: StrategyCallbacks | string, ...extraArgs: any[]): any; - // (undocumented) - configuration: Record; - // (undocumented) - static createZoomPanMemo(viewport: any): { - restoreMemo: () => void; - }; - // (undocumented) - static defaults: { - configuration: { - strategies: {}; - defaultStrategy: any; - activeStrategy: any; - strategyOptions: {}; - }; - }; - // (undocumented) - doneEditMemo(): void; - // (undocumented) - protected getTargetId(viewport: Types_2.IViewport): string | undefined; - // (undocumented) - protected getTargetImageData(targetId: string): Types_2.IImageData | Types_2.CPUIImageData; - // (undocumented) - getToolName(): string; - // (undocumented) - protected memo: utilities_2.HistoryMemo.Memo; - // (undocumented) - static mergeDefaultProps(defaultProps?: {}, additionalProps?: any): any; - // (undocumented) - mode: ToolModes; - // (undocumented) - redo(): void; - // (undocumented) - setActiveStrategy(strategyName: string): void; - // (undocumented) - setConfiguration(newConfiguration: Record): void; - // (undocumented) - supportedInteractionTypes: InteractionTypes[]; - // (undocumented) - toolGroupId: string; - // (undocumented) - static toolName: any; - // (undocumented) - get toolName(): string; - // (undocumented) - undo(): void; -} - -declare namespace BasicStatsCalculator { - export { - BasicStatsCalculator_2 as BasicStatsCalculator, - Calculator - } -} - -// @public (undocumented) -class BasicStatsCalculator_2 extends Calculator { - // (undocumented) - static getStatistics: (options?: { - unit: string; - }) => NamedStatistics; - // (undocumented) - static statsCallback: ({ value: newValue, pointLPS, pointIJK, }: { - value: any; - pointLPS?: any; - pointIJK?: any; - }) => void; - // (undocumented) - static statsInit(options: { - storePointData: boolean; - }): void; -} - -// @public (undocumented) -interface BidirectionalAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats: { - [targetId: string]: { - length: number; - width: number; - unit: string; - }; - }; - }; -} - -// @public (undocumented) -type BidirectionalData = { - majorAxis: [Types_2.Point3, Types_2.Point3]; - minorAxis: [Types_2.Point3, Types_2.Point3]; - maxMajor: number; - maxMinor: number; - segmentIndex: number; - label?: string; - color?: string | number[]; - referencedImageId: string; - sliceIndex: number; -}; - -// @public (undocumented) -export class BidirectionalTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation(evt: EventTypes_2.InteractionEventType): BidirectionalAnnotation; - // (undocumented) - _calculateCachedStats: (annotation: any, renderingEngine: any, enabledElement: any) => any; - // (undocumented) - _calculateLength(pos1: any, pos2: any): number; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragDrawCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyHandle: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _getSignedAngle: (vector1: any, vector2: any) => number; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: BidirectionalAnnotation, handle: ToolHandle) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume: (index1: any, index2: any, index3: any, index4: any, dimensions: any) => boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: BidirectionalAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - _movingLongAxisWouldPutItThroughShortAxis: (firstLineSegment: any, secondLineSegment: any) => boolean; - // (undocumented) - preventHandleOutsideImage: boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: BidirectionalAnnotation) => void; -} - -declare namespace boundingBox { - export { - extend2DBoundingBoxInViewAxis, - getBoundingBoxAroundShapeIJK, - getBoundingBoxAroundShapeWorld, - getBoundingBoxAroundShapeIJK as getBoundingBoxAroundShape - } -} - -// @public (undocumented) -type BoundsIJK_2 = Types_2.BoundsIJK; - -// @public (undocumented) -export class BrushTool extends LabelmapBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - acceptPreview(element?: HTMLDivElement): void; - // (undocumented) - getStatistics(element: any, segmentIndices?: any): any; - // (undocumented) - interpolate(element: any, config: any): void; - // (undocumented) - invalidateBrushCursor(): void; - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - onSetToolDisabled: (evt: any) => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - onSetToolPassive: (evt: any) => void; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.MouseDownActivateEventType) => boolean; - // (undocumented) - previewCallback: () => void; - // (undocumented) - rejectPreview(element?: HTMLDivElement): void; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): void; - // (undocumented) - static toolName: any; - // (undocumented) - protected updateCursor(evt: EventTypes_2.InteractionEventType): void; -} - -// @public (undocumented) -class BSpline extends CubicSpline { - // (undocumented) - protected getTransformMatrix(): number[]; -} - -// @public (undocumented) -function calculateMinMaxMean(pixelLuminance: any, globalMin: any, globalMax: any): { - min: any; - max: any; - mean: number; -}; - -// @public (undocumented) -function calculatePerimeter(polyline: number[][], closed: boolean): number; - -// @public (undocumented) -abstract class Calculator { - // (undocumented) - static getStatistics: () => NamedStatistics; - // (undocumented) - static run: ({ value }: { - value: any; - }) => void; -} - -// @public (undocumented) -function calibrateImageSpacing(imageId: string, renderingEngine: Types_2.IRenderingEngine, calibrationOrScale: Types_2.IImageCalibration | number): void; - -// @public (undocumented) -export function cancelActiveManipulations(element: HTMLDivElement): string | undefined; - -// @public (undocumented) -type CanvasCoordinates = [ -Types_2.Point2, -Types_2.Point2, -Types_2.Point2, -Types_2.Point2 -]; - -// @public (undocumented) -class CardinalSpline extends CubicSpline { - constructor(props?: CardinalSplineProps); - // (undocumented) - get fixedScale(): boolean; - // (undocumented) - protected getTransformMatrix(): number[]; - // (undocumented) - get scale(): number; - set scale(scale: number); -} - -// @public (undocumented) -type CardinalSplineProps = SplineProps & { - scale?: number; - fixedScale?: boolean; -}; - -// @public (undocumented) -class CatmullRomSpline extends CardinalSpline { - constructor(); -} - -// @public (undocumented) -enum ChangeTypes { - // (undocumented) - Completed = "Completed", - // (undocumented) - HandlesUpdated = "HandlesUpdated", - // (undocumented) - History = "History", - // (undocumented) - InitialSetup = "InitialSetup", - // (undocumented) - Interaction = "Interaction", - // (undocumented) - InterpolationUpdated = "InterpolationUpdated", - // (undocumented) - MetadataReferenceModified = "MetadataReferenceModified", - // (undocumented) - StatsUpdated = "StatsUpdated" -} - -// @public (undocumented) -enum ChangeTypes_2 { - // (undocumented) - COMPUTE_STATISTICS = "Computing Statistics", - // (undocumented) - INTERPOLATE_LABELMAP = "Interpolating Labelmap", - // (undocumented) - POLYSEG_CONTOUR_TO_LABELMAP = "Converting Contour to Labelmap", - // (undocumented) - POLYSEG_CONTOUR_TO_SURFACE = "Converting Contour to Surface", - // (undocumented) - POLYSEG_LABELMAP_TO_SURFACE = "Converting Labelmap to Surface", - // (undocumented) - POLYSEG_SURFACE_TO_LABELMAP = "Converting Surfaces to Labelmap", - // (undocumented) - SURFACE_CLIPPING = "Clipping Surfaces" -} - -// @public (undocumented) -function checkAndSetAnnotationLocked(annotationUID: string): boolean; - -// @public (undocumented) -function checkAndSetAnnotationVisibility(annotationUID: string): boolean; - -// @public (undocumented) -function checkStandardBasis(directions: number[]): RotationMatrixInformation; - -declare namespace cine { - export { - playClip, - stopClip, - Events_3 as Events, - getToolState, - addToolState - } -} - -// @public (undocumented) -type CinePlayContext = { - get numScrollSteps(): number; - get currentStepIndex(): number; - get frameTimeVectorEnabled(): boolean; - waitForRenderedCount?: number; - scroll(delta: number): void; - play?(fps?: number): number; -}; - -declare namespace CINETypes { - export { - PlayClipOptions, - ToolData, - CinePlayContext - } -} - -declare namespace circle { - export { - getCanvasCircleRadius, - getCanvasCircleCorners - } -} - -// @public (undocumented) -interface CircleROIAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: [Types_2.Point3, Types_2.Point3]; - activeHandleIndex: number | null; - textBox?: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats?: (ROICachedStats & { - [targetId: string]: { - radius: number; - radiusUnit: string; - perimeter: number; - }; - }) | { - pointsInVolume: Types_2.Point3[]; - projectionPoints: Types_2.Point3[][]; - }; - }; -} - -// @public (undocumented) -interface CircleROIStartEndThresholdAnnotation extends Annotation { - // (undocumented) - data: { - label: string; - startCoordinate: number; - endCoordinate: number; - cachedStats?: { - pointsInVolume: Types_2.Point3[]; - projectionPoints: Types_2.Point3[][]; - statistics?: ROICachedStats; - }; - handles: { - points: [Types_2.Point3, Types_2.Point3]; - activeHandleIndex: number | null; - textBox?: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - }; - // (undocumented) - metadata: { - cameraPosition?: Types_2.Point3; - cameraFocalPoint?: Types_2.Point3; - viewPlaneNormal?: Types_2.Point3; - viewUp?: Types_2.Point3; - annotationUID?: string; - FrameOfReferenceUID: string; - referencedImageId?: string; - toolName: string; - enabledElement: Types_2.IEnabledElement; - volumeId: string; - spacingInNormal: number; - }; -} - -// @public (undocumented) -export class CircleROIStartEndThresholdTool extends CircleROITool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => { - highlighted: boolean; - invalidated: boolean; - metadata: { - toolName: string; - viewPlaneNormal: Types_2.Point3; - viewUp: Types_2.Point3; - FrameOfReferenceUID: string; - referencedImageId: any; - volumeId: any; - spacingInNormal: number; - enabledElement: Types_2.IEnabledElement; - }; - data: { - label: string; - startCoordinate: number; - endCoordinate: number; - handles: { - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - points: [Types_2.Point3, Types_2.Point3]; - activeHandleIndex: any; - }; - cachedStats: { - pointsInVolume: any[]; - projectionPoints: any[]; - statistics: ROICachedStats; - }; - labelmapUID: any; - }; - }; - // (undocumented) - _calculateCachedStatsTool(annotation: any, enabledElement: any): any; - // (undocumented) - _computePointsInsideVolume(annotation: any, imageVolume: any, targetId: any, enabledElement: any): void; - // (undocumented) - _computeProjectionPoints(annotation: CircleROIStartEndThresholdAnnotation, imageVolume: Types_2.IImageVolume): void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: Array; - handleIndex?: number; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _getCoordinateForViewplaneNormal(pos: vec3 | number, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - _getEndCoordinate(worldPos: Types_2.Point3, spacingInNormal: number, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - _getIndexOfCoordinatesForViewplaneNormal(viewPlaneNormal: Types_2.Point3): number; - // (undocumented) - _getStartCoordinate(worldPos: Types_2.Point3, spacingInNormal: number, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class CircleROITool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => CircleROIAnnotation; - // (undocumented) - _calculateCachedStats: (annotation: any, viewport: any, renderingEngine: any, enabledElement: any) => any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragDrawCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragHandle: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: Array; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: CircleROIAnnotation, handle: ToolHandle) => void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => CircleROIAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume: (index1: any, index2: any, dimensions: any) => boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: CircleROIAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: CircleROIAnnotation) => void; -} - -// @public (undocumented) -export class CircleScissorsTool extends LabelmapBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - segmentIndex: number; - segmentationId: string; - volumeId: string; - referencedVolumeId: string; - segmentsLocked: number[]; - segmentColor: [number, number, number, number]; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - imageId: string; - centerCanvas?: Array; - memo?: LabelmapMemo_2; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -function clip_2(a: any, b: any, box: any, da?: any, db?: any): 1 | 0; - -// @public (undocumented) -type ClosestControlPoint = ClosestPoint & { - index: number; -}; - -// @public (undocumented) -type ClosestPoint = { - point: Types_2.Point2; - distance: number; -}; - -// @public (undocumented) -type ClosestSplinePoint = ClosestPoint & { - uValue: number; -}; - -// @public (undocumented) -interface CobbAngleAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats: { - [targetId: string]: { - angle: number; - arc1Angle: number; - arc2Angle: number; - points: { - world: { - arc1Start: Types_2.Point3; - arc1End: Types_2.Point3; - arc2Start: Types_2.Point3; - arc2End: Types_2.Point3; - arc1Angle: number; - arc2Angle: number; - }; - canvas: { - arc1Start: Types_2.Point2; - arc1End: Types_2.Point2; - arc2Start: Types_2.Point2; - arc2End: Types_2.Point2; - arc1Angle: number; - arc2Angle: number; - }; - }; - }; - }; - }; -} - -// @public (undocumented) -export class CobbAngleTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.MouseDownActivateEventType) => CobbAngleAnnotation; - // (undocumented) - angleStartedNotYetCompleted: boolean; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - distanceToLines: ({ viewport, points, canvasCoords, proximity }: { - viewport: any; - points: any; - canvasCoords: any; - proximity: any; - }) => { - distanceToPoint: number; - distanceToPoint2: number; - isNearFirstLine: boolean; - isNearSecondLine: boolean; - }; - // (undocumented) - _dragCallback: (evt: EventTypes_2.MouseDragEventType | EventTypes_2.MouseMoveEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - isNearFirstLine?: boolean; - isNearSecondLine?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.MouseUpEventType | EventTypes_2.MouseClickEventType) => void; - // (undocumented) - getArcsStartEndPoints: ({ firstLine, secondLine, mid1, mid2, }: { - firstLine: any; - secondLine: any; - mid1: any; - mid2: any; - }) => { - arc1Start: Types_2.Point2; - arc1End: Types_2.Point2; - arc2Start: Types_2.Point2; - arc2End: Types_2.Point2; - arc1Angle: number; - arc2Angle: number; - }; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.MouseDownEventType, annotation: CobbAngleAnnotation, handle: ToolHandle, interactionType?: string): void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: CobbAngleAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - _mouseDownCallback: (evt: EventTypes_2.MouseUpEventType | EventTypes_2.MouseClickEventType) => void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.MouseDownEventType, annotation: CobbAngleAnnotation, interactionType: InteractionTypes, canvasCoords: Types_2.Point2, proximity?: number) => void; -} - -declare namespace color_2 { - export { - getSegmentIndexColor, - addColorLUT_2 as addColorLUT, - setColorLUT, - setSegmentIndexColor - } -} - -// @public (undocumented) -class Colorbar extends Widget { - constructor(props: ColorbarProps); - // (undocumented) - get activeColormapName(): string; - set activeColormapName(colormapName: string); - // (undocumented) - protected createRootElement(): HTMLElement; - // (undocumented) - _createTicksBar(props: ColorbarProps): ColorbarTicks; - // (undocumented) - destroy(): void; - // (undocumented) - protected getVOIMultipliers(): [number, number]; - // (undocumented) - protected hideTicks(): void; - // (undocumented) - get imageRange(): ColorbarVOIRange; - set imageRange(imageRange: ColorbarVOIRange); - // (undocumented) - protected onContainerResize(): void; - // (undocumented) - protected onVoiChange(voiRange: ColorbarVOIRange): void; - // (undocumented) - get showFullImageRange(): boolean; - set showFullImageRange(value: boolean); - // (undocumented) - protected showTicks(): void; - // (undocumented) - get voiRange(): ColorbarVOIRange; - set voiRange(voiRange: ColorbarVOIRange); -} - -declare namespace colorbar { - export { - Types_3 as Types, - Enums_3 as Enums, - Colorbar, - ViewportColorbar - } -} - -// @public (undocumented) -type ColorbarCommonProps = { - imageRange?: ColorbarImageRange; - voiRange?: ColorbarVOIRange; - ticks?: { - position?: ColorbarRangeTextPosition; - style?: ColorbarTicksStyle; - }; - showFullPixelValueRange?: boolean; -}; - -// @public (undocumented) -type ColorbarImageRange = { - lower: number; - upper: number; -}; - -// @public (undocumented) -type ColorbarProps = (WidgetProps & ColorbarCommonProps) & { - colormaps: IColorMapPreset[]; - activeColormapName?: string; -}; - -// @public (undocumented) -enum ColorbarRangeTextPosition { - // (undocumented) - Bottom = "bottom", - // (undocumented) - Left = "left", - // (undocumented) - Right = "right", - // (undocumented) - Top = "top" -} - -// @public (undocumented) -type ColorbarSize = { - width: number; - height: number; -}; - -// @public (undocumented) -type ColorbarTicksProps = ColorbarCommonProps & { - top?: number; - left?: number; - size?: ColorbarSize; - container?: HTMLElement; -}; - -// @public (undocumented) -type ColorbarTicksStyle = { - font?: string; - color?: string; - tickSize?: number; - tickWidth?: number; - labelMargin?: number; - maxNumTicks?: number; -}; - -// @public (undocumented) -type ColorbarVOIRange = ColorbarImageRange; - -// @public (undocumented) -function computeStackLabelmapFromVolume({ volumeId, }: { - volumeId: string; -}): Promise<{ - imageIds: string[]; -}>; - -// @public (undocumented) -function computeVolumeLabelmapFromStack(args: any): Promise<{ - volumeId: string; -}>; - -declare namespace config { - export { - getState, - getFont, - toolStyle as style - } -} - -declare namespace config_2 { - export { - color_2 as color, - visibility_2 as visibility, - style - } -} - -declare namespace CONSTANTS { - export { - CORNERSTONE_COLOR_LUT as COLOR_LUT - } -} -export { CONSTANTS } - -// @public (undocumented) -function containsPoint(polyline: Types_2.Point2[], point: Types_2.Point2, options?: { - closed?: boolean; - holes?: Types_2.Point2[][]; -}): boolean; - -// @public (undocumented) -function containsPoints(polyline: Types_2.Point2[], points: Types_2.Point2[]): boolean; - -// @public (undocumented) -function contourAndFindLargestBidirectional(segmentation: any): any; - -// @public (undocumented) -type ContourAnnotation = Annotation & ContourAnnotationData; - -// @public (undocumented) -type ContourAnnotationCompletedEventDetail = AnnotationCompletedEventDetail & { - contourHoleProcessingEnabled: boolean; -}; - -// @public (undocumented) -type ContourAnnotationData = { - data: { - cachedStats?: Record; - contour: { - polyline: Types_2.Point3[]; - closed: boolean; - windingDirection?: ContourWindingDirection; - pointsManager?: Types_2.IPointsManager; - }; - }; - onInterpolationComplete?: () => void; -}; - -declare namespace contours { - export { - areCoplanarContours, - _default_2 as contourFinder, - getDeduplicatedVTKPolyDataPoints, - _default_3 as detectContourHoles, - generateContourSetsFromLabelmap, - AnnotationToPointData, - getContourHolesDataWorld, - getContourHolesDataCanvas, - updateContourPolyline, - acceptAutogeneratedInterpolations, - findHandlePolylineIndex, - calculatePerimeter - } -} - -declare namespace contourSegmentation { - export { - areSameSegment, - isContourSegmentationAnnotation, - addContourSegmentationAnnotation, - removeContourSegmentationAnnotation - } -} - -// @public (undocumented) -type ContourSegmentationAnnotation = ContourAnnotation & ContourSegmentationAnnotationData; - -// @public (undocumented) -type ContourSegmentationAnnotationData = { - autoGenerated?: boolean; - interpolationUID?: string; - interpolationCompleted?: boolean; - data: { - segmentation: { - segmentationId: string; - segmentIndex: number; - }; - contour: { - originalPolyline?: Types_2.Point3[]; - }; - }; - metadata?: { - originalToolName?: string; - }; - handles?: { - interpolationSources?: Types_2.IPointsManager[]; - }; - onInterpolationComplete?: (annotation: ContourSegmentationAnnotation) => unknown; -}; - -// @public (undocumented) -type ContourSegmentationData = { - geometryIds?: string[]; - annotationUIDsMap?: Map>; -}; - -// @public (undocumented) -type ContourStyle = BaseContourStyle & InactiveContourStyle & AutoGeneratedContourStyle; - -// @public (undocumented) -type ControlPointInfo = { - index: number; - point: Types_2.Point2; -}; - -// @public (undocumented) -function copyPoints(points: ITouchPoints): ITouchPoints; - -// @public (undocumented) -function copyPointsList(points: ITouchPoints[]): ITouchPoints[]; - -// @public (undocumented) -const CORNERSTONE_COLOR_LUT: Types_2.Color[]; - -// @public (undocumented) -function createBidirectionalToolData(bidirectionalData: BidirectionalData, viewport: any): Annotation; - -// @public (undocumented) -function createCameraPositionSynchronizer(synchronizerName: string): Synchronizer; - -// @public (undocumented) -function createImageSliceSynchronizer(synchronizerName: string): Synchronizer; - -// @public (undocumented) -function createLabelmapMemo(segmentationId: string, segmentationVoxelManager: Types_2.IVoxelManager, preview?: InitializedOperationData): { - segmentationId: string; - restoreMemo: typeof restoreMemo; - commitMemo: typeof commitMemo; - segmentationVoxelManager: Types_2.IVoxelManager; - voxelManager: Types_2.IVoxelManager; - memo: LabelmapMemo_2; - preview: InitializedOperationData; -} | { - segmentationId: string; - restoreMemo: typeof restoreMemo; - commitMemo: typeof commitMemo; - segmentationVoxelManager: Types_2.IVoxelManager; - voxelManager: utilities_2.VoxelManager; -}; - -// @public (undocumented) -function createLabelmapVolumeForViewport(input: { - viewportId: string; - renderingEngineId: string; - segmentationId?: string; - options?: Types_2.LocalVolumeOptions & { - volumeId?: string; - }; -}): Promise; - -// @public (undocumented) -function createMergedLabelmapForIndex(labelmaps: Array, segmentIndex?: number, volumeId?: string): Types_2.IImageVolume; - -// @public (undocumented) -function createPresentationViewSynchronizer(synchronizerName: string, options?: Types_2.ViewPresentation): Synchronizer; - -// @public (undocumented) -function createPresentationViewSynchronizer_2(synchronizerName: string): Synchronizer; - -// @public (undocumented) -function createPreviewMemo(segmentationId: string, preview: InitializedOperationData): { - segmentationId: string; - restoreMemo: typeof restoreMemo; - commitMemo: typeof commitMemo; - segmentationVoxelManager: Types_2.IVoxelManager; - voxelManager: Types_2.IVoxelManager; - memo: LabelmapMemo_2; - preview: InitializedOperationData; -}; - -// @public (undocumented) -function createRleMemo(segmentationId: string, segmentationVoxelManager: Types_2.IVoxelManager): { - segmentationId: string; - restoreMemo: typeof restoreMemo; - commitMemo: typeof commitMemo; - segmentationVoxelManager: Types_2.IVoxelManager; - voxelManager: utilities_2.VoxelManager; -}; - -// @public (undocumented) -const createStackImageSynchronizer: typeof createImageSliceSynchronizer; - -// @public (undocumented) -function createSynchronizer(synchronizerId: string, eventName: string, eventHandler: ISynchronizerEventHandler, options?: SynchronizerOptions): Synchronizer; - -// @public (undocumented) -function createToolGroup(toolGroupId: string): ToolGroup | undefined; - -// @public (undocumented) -function createVOISynchronizer(synchronizerName: string, options: VOISynchronizerOptions): Synchronizer; - -// @public (undocumented) -function createZoomPanSynchronizer(synchronizerName: string): Synchronizer; - -// @public (undocumented) -export class CrosshairsTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => CrosshairsAnnotation; - // (undocumented) - _applyDeltaShiftToSelectedViewportCameras(renderingEngine: any, viewportsAnnotationsToUpdate: any, delta: any): void; - // (undocumented) - _applyDeltaShiftToViewportCamera(renderingEngine: Types_2.IRenderingEngine, annotation: any, delta: any): void; - // (undocumented) - _areViewportIdArraysEqual: (viewportIdArrayOne: any, viewportIdArrayTwo: any) => boolean; - // (undocumented) - _autoPanViewportIfNecessary(viewportId: string, renderingEngine: Types_2.IRenderingEngine): void; - // (undocumented) - cancel: () => void; - // (undocumented) - _checkIfViewportsRenderingSameScene: (viewport: any, otherViewport: any) => any; - // (undocumented) - computeToolCenter: () => void; - // (undocumented) - _computeToolCenter: (viewportsInfo: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _filterAnnotationsByUniqueViewportOrientations: (enabledElement: any, annotations: any) => any[]; - // (undocumented) - filterInteractableAnnotationsForElement: (element: any, annotations: any) => any; - // (undocumented) - _filterViewportWithSameOrientation: (enabledElement: any, referenceAnnotation: any, annotations: any) => any; - // (undocumented) - _getAnnotations: (enabledElement: Types_2.IEnabledElement) => Annotation[]; - // (undocumented) - _getAnnotationsForViewportsWithDifferentCameras: (enabledElement: any, annotations: any) => any; - // (undocumented) - getHandleNearImagePoint(element: HTMLDivElement, annotation: Annotation, canvasCoords: Types_2.Point2, proximity: number): ToolHandle | undefined; - // (undocumented) - _getReferenceLineColor?: (viewportId: string) => string; - // (undocumented) - _getReferenceLineControllable?: (viewportId: string) => boolean; - // (undocumented) - _getReferenceLineDraggableRotatable?: (viewportId: string) => boolean; - // (undocumented) - _getReferenceLineSlabThicknessControlsOn?: (viewportId: string) => boolean; - // (undocumented) - _getRotationHandleNearImagePoint(viewport: any, annotation: any, canvasCoords: any, proximity: any): any; - // (undocumented) - _getSlabThicknessHandleNearImagePoint(viewport: any, annotation: any, canvasCoords: any, proximity: any): any; - // (undocumented) - _getViewportsInfo: () => any[]; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: Annotation) => void; - // (undocumented) - initializeViewport: ({ renderingEngineId, viewportId, }: Types_2.IViewportId) => { - normal: Types_2.Point3; - point: Types_2.Point3; - }; - // (undocumented) - _isClockWise(a: any, b: any, c: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: CrosshairsAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - _jump: (enabledElement: any, jumpWorld: any) => boolean; - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.MouseMoveEventType, filteredToolAnnotations: Annotations) => boolean; - // (undocumented) - onCameraModified: (evt: any) => void; - // (undocumented) - _onNewVolume: () => void; - // (undocumented) - onResetCamera: (evt: any) => void; - // (undocumented) - onSetToolActive(): void; - // (undocumented) - onSetToolDisabled(): void; - // (undocumented) - onSetToolEnabled(): void; - // (undocumented) - onSetToolPassive(): void; - // (undocumented) - _pointNearReferenceLine: (annotation: any, canvasCoords: any, proximity: any, lineViewport: any) => boolean; - // (undocumented) - _pointNearTool(element: any, annotation: any, canvasCoords: any, proximity: any): boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - resetCrosshairs: () => void; - // (undocumented) - setSlabThickness(viewport: any, slabThickness: any): void; - // (undocumented) - _subscribeToViewportNewVolumeSet(viewports: any): void; - // (undocumented) - toolCenter: Types_2.Point3; - // (undocumented) - static toolName: any; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: Annotation, interactionType: InteractionTypes) => void; - // (undocumented) - _unsubscribeToViewportNewVolumeSet(viewportsInfo: any): void; -} - -// @public (undocumented) -abstract class CubicSpline extends Spline { - // (undocumented) - protected getPreviewCurveSegments(controlPointPreview: Types_2.Point2, closeSpline: boolean): SplineCurveSegment[]; - // (undocumented) - protected getSplineCurves(): SplineCurveSegment[]; -} - -// @public (undocumented) -const CursorNames: string[]; - -declare namespace cursors { - export { - MouseCursor, - ImageMouseCursor, - SVGMouseCursor, - elementCursor, - registerCursor, - CursorNames, - CursorSVG, - setCursorForElement - } -} -export { cursors } - -// @public (undocumented) -const CursorSVG: Record; - -// @public (undocumented) -function debounce(func: Function, wait?: number, options?: { - leading?: boolean; - maxWait?: number; - trailing?: boolean; -}): Function; - -// @public (undocumented) -function decimate_2(polyline: Types_2.Point2[], epsilon?: number): Types_2.Point2[]; - -// @public (undocumented) -const _default: { - filterAnnotationsWithinSlice: typeof filterAnnotationsWithinSlice; - getWorldWidthAndHeightFromCorners: typeof getWorldWidthAndHeightFromCorners; - getWorldWidthAndHeightFromTwoPoints: typeof getWorldWidthAndHeightFromTwoPoints; - filterAnnotationsForDisplay: typeof filterAnnotationsForDisplay; - getPointInLineOfSightWithCriteria: typeof getPointInLineOfSightWithCriteria; - isPlaneIntersectingAABB: (origin: any, normal: any, minX: any, minY: any, minZ: any, maxX: any, maxY: any, maxZ: any) => boolean; - filterAnnotationsWithinSamePlane: typeof filterAnnotationsWithinSamePlane; - getPointsInLineOfSight: typeof getPointsInLineOfSight; -}; - -// @public (undocumented) -const _default_2: { - findContours: typeof findContours; - findContoursFromReducedSet: typeof findContoursFromReducedSet; -}; - -// @public (undocumented) -const _default_3: { - processContourHoles: typeof processContourHoles; -}; - -// @public (undocumented) -const _default_4: { - smoothAnnotation: typeof smoothAnnotation; -}; - -// @public (undocumented) -const defaultSegmentationStateManager: SegmentationStateManager; - -// @public (undocumented) -function deselectAnnotation(annotationUID?: string): void; - -// @public (undocumented) -export function destroy(): void; - -// @public (undocumented) -function destroy_2(): void; - -// @public (undocumented) -function destroy_3(): void; - -// @public (undocumented) -function destroy_4(): void; - -// @public (undocumented) -function destroySynchronizer(synchronizerId: string): void; - -// @public (undocumented) -function destroyToolGroup(toolGroupId: string): void; - -// @public (undocumented) -function distanceToPoint(aabb: Types_2.AABB2, point: Types_2.Point2): number; - -// @public (undocumented) -function distanceToPoint_2(lineStart: Types_2.Point2, lineEnd: Types_2.Point2, point: Types_2.Point2): number; - -// @public (undocumented) -function distanceToPoint_3(p1: Point, p2: Point): number; - -// @public (undocumented) -function distanceToPoint_4(rect: number[], point: Types_2.Point2): number; - -// @public (undocumented) -function distanceToPointSquared(aabb: Types_2.AABB2, point: Types_2.Point2): number; - -// @public (undocumented) -function distanceToPointSquared_2(lineStart: Types_2.Point2, lineEnd: Types_2.Point2, point: Types_2.Point2): number; - -// @public (undocumented) -function distanceToPointSquared_3(p1: Point_2, p2: Point_2): number; - -// @public (undocumented) -function distanceToPointSquaredInfo(lineStart: Types_2.Point2, lineEnd: Types_2.Point2, point: Types_2.Point2): { - point: Types_2.Point2; - distanceSquared: number; -}; - -// @public (undocumented) -export class DragProbeTool extends ProbeTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - newAnnotation?: boolean; - } | null; - // (undocumented) - eventDispatchDetail: { - viewportId: string; - renderingEngineId: string; - }; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - postMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => ProbeAnnotation; - // (undocumented) - postTouchStartCallback: (evt: EventTypes_2.InteractionEventType) => ProbeAnnotation; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -function draw(element: HTMLDivElement, fn: (svgDrawingElement: SVGDrawingHelper) => void): void; - -// @public (undocumented) -function drawArrow(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, arrowUID: string, start: Types_2.Point2, end: Types_2.Point2, options?: {}): void; - -// @public (undocumented) -function drawCircle(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, circleUID: string, center: Types_2.Point2, radius: number, options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawEllipse(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, ellipseUID: string, corner1: Types_2.Point2, corner2: Types_2.Point2, options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawEllipseByCoordinates(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, ellipseUID: string, canvasCoordinates: [Types_2.Point2, Types_2.Point2, Types_2.Point2, Types_2.Point2], options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawHandle(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, handleGroupUID: string, handle: Types_2.Point2, options: {}, uniqueIndex: any): void; - -// @public (undocumented) -function drawHandles(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, handleGroupUID: string, handlePoints: Array, options?: {}): void; - -// @public (undocumented) -function drawHeight(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, heightUID: string, start: Types_2.Point2, end: Types_2.Point2, options?: {}): void; - -declare namespace drawing { - export { - draw, - drawCircle, - drawEllipse, - drawEllipseByCoordinates, - drawHandles, - drawHandle, - drawLine, - drawHeight, - drawPolyline, - drawPath, - drawLinkedTextBox, - drawRect, - drawRectByCoordinates, - drawTextBox, - drawArrow, - drawRedactionRect, - setAttributesIfNecessary, - setNewAttributesIfValid - } -} -export { drawing } - -declare namespace drawing_2 { - export { - getTextBoxCoordsCanvas - } -} - -// @public (undocumented) -function drawLine(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, lineUID: string, start: Types_2.Point2, end: Types_2.Point2, options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawLinkedTextBox(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, textBoxUID: string, textLines: Array, textBoxPosition: Types_2.Point2, annotationAnchorPoints: Array, textBox: unknown, options?: {}): SVGRect; - -// @public (undocumented) -function drawPath(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, pathUID: string, points: Types_2.Point2[] | Types_2.Point2[][], options: { - color?: string; - fillColor?: string; - fillOpacity?: number; - width?: number; - lineWidth?: number; - lineDash?: string; - closePath?: boolean; -}): void; - -// @public (undocumented) -function drawPolyline(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, polylineUID: string, points: Types_2.Point2[], options: { - color?: string; - fillColor?: string; - fillOpacity?: number; - width?: number; - lineWidth?: number; - lineDash?: string; - closePath?: boolean; - markerStartId?: string; - markerEndId?: string; -}): void; - -// @public (undocumented) -function drawRect(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, rectangleUID: string, start: Types_2.Point2, end: Types_2.Point2, options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawRectByCoordinates(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, rectangleUID: string, canvasCoordinates: Types_2.Point2[], options?: {}, dataId?: string): void; - -// @public (undocumented) -function drawRedactionRect(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, rectangleUID: string, start: Types_2.Point2, end: Types_2.Point2, options?: {}): void; - -// @public (undocumented) -function drawTextBox(svgDrawingHelper: SVGDrawingHelper, annotationUID: string, textUID: string, textLines: Array, position: Types_2.Point2, options?: {}): SVGRect; - -declare namespace dynamicVolume { - export { - getDataInTime, - generateImageFromTimeData, - updateVolumeFromTimeData - } -} - -declare namespace elementCursor { - export { - initElementCursor, - resetElementCursor, - hideElementCursor, - _setElementCursor as setElementCursor - } -} - -declare namespace ellipse { - export { - pointInEllipse, - precalculatePointInEllipse, - getCanvasEllipseCorners - } -} - -// @public (undocumented) -interface EllipticalROIAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: [Types_2.Point3, Types_2.Point3, Types_2.Point3, Types_2.Point3]; - activeHandleIndex: number | null; - textBox?: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats?: ROICachedStats; - initialRotation: number; - }; -} - -// @public (undocumented) -export class EllipticalROITool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => EllipticalROIAnnotation; - // (undocumented) - _calculateCachedStats: (annotation: any, viewport: any, renderingEngine: any) => any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragDrawCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragHandle: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: Array; - handleIndex?: number; - movingTextBox?: boolean; - centerWorld?: Array; - canvasWidth?: number; - canvasHeight?: number; - originalHandleCanvas?: Array; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _getCanvasEllipseCenter(ellipseCanvasPoints: Types_2.Point2[]): Types_2.Point2; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: EllipticalROIAnnotation, handle: ToolHandle) => void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => EllipticalROIAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume: (index1: any, index2: any, dimensions: any) => boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: EllipticalROIAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - _pointInEllipseCanvas(ellipse: any, location: Types_2.Point2): boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: EllipticalROIAnnotation) => void; -} - -declare namespace Enums { - export { - MouseBindings, - KeyboardBindings, - ToolModes, - AnnotationStyleStates, - Events, - SegmentationRepresentations, - Swipe, - StrategyCallbacks, - ChangeTypes, - ChangeTypes_2 as WorkerTypes - } -} -export { Enums } - -declare namespace Enums_3 { - export { - ColorbarRangeTextPosition - } -} - -// @public (undocumented) -export class EraserTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _deleteNearbyAnnotations(evt: EventTypes_2.InteractionEventType, interactionType: string): boolean; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - preTouchStartCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class ETDRSGridTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => ETDRSGridAnnotation; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragDrawCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragHandle: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragModifyCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: Array; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: ETDRSGridAnnotation) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: ETDRSGridAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - mouseDragCallback: unknown; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: ETDRSGridAnnotation) => void; - // (undocumented) - touchDragCallback: unknown; - // (undocumented) - worldMeasureToCanvas(measurement: any, viewport: any): number; -} - -// @public (undocumented) -enum Events { - // (undocumented) - ANNOTATION_ADDED = "CORNERSTONE_TOOLS_ANNOTATION_ADDED", - // (undocumented) - ANNOTATION_COMPLETED = "CORNERSTONE_TOOLS_ANNOTATION_COMPLETED", - // (undocumented) - ANNOTATION_INTERPOLATION_PROCESS_COMPLETED = "CORNERSTONE_TOOLS_ANNOTATION_INTERPOLATION_PROCESS_COMPLETED", - // (undocumented) - ANNOTATION_LOCK_CHANGE = "CORNERSTONE_TOOLS_ANNOTATION_LOCK_CHANGE", - // (undocumented) - ANNOTATION_MODIFIED = "CORNERSTONE_TOOLS_ANNOTATION_MODIFIED", - // (undocumented) - ANNOTATION_REMOVED = "CORNERSTONE_TOOLS_ANNOTATION_REMOVED", - // (undocumented) - ANNOTATION_RENDERED = "CORNERSTONE_TOOLS_ANNOTATION_RENDERED", - // (undocumented) - ANNOTATION_SELECTION_CHANGE = "CORNERSTONE_TOOLS_ANNOTATION_SELECTION_CHANGE", - // (undocumented) - ANNOTATION_VISIBILITY_CHANGE = "CORNERSTONE_TOOLS_ANNOTATION_VISIBILITY_CHANGE", - // (undocumented) - INTERPOLATED_ANNOTATIONS_REMOVED = "CORNERSTONE_TOOLS_INTERPOLATED_ANNOTATIONS_REMOVED", - // (undocumented) - KEY_DOWN = "CORNERSTONE_TOOLS_KEY_DOWN", - // (undocumented) - KEY_UP = "CORNERSTONE_TOOLS_KEY_UP", - // (undocumented) - MOUSE_CLICK = "CORNERSTONE_TOOLS_MOUSE_CLICK", - // (undocumented) - MOUSE_DOUBLE_CLICK = "CORNERSTONE_TOOLS_MOUSE_DOUBLE_CLICK", - // (undocumented) - MOUSE_DOWN = "CORNERSTONE_TOOLS_MOUSE_DOWN", - // (undocumented) - MOUSE_DOWN_ACTIVATE = "CORNERSTONE_TOOLS_MOUSE_DOWN_ACTIVATE", - // (undocumented) - MOUSE_DRAG = "CORNERSTONE_TOOLS_MOUSE_DRAG", - // (undocumented) - MOUSE_MOVE = "CORNERSTONE_TOOLS_MOUSE_MOVE", - // (undocumented) - MOUSE_UP = "CORNERSTONE_TOOLS_MOUSE_UP", - // (undocumented) - MOUSE_WHEEL = "CORNERSTONE_TOOLS_MOUSE_WHEEL", - // (undocumented) - SEGMENTATION_ADDED = "CORNERSTONE_TOOLS_SEGMENTATION_ADDED", - // (undocumented) - SEGMENTATION_DATA_MODIFIED = "CORNERSTONE_TOOLS_SEGMENTATION_DATA_MODIFIED", - // (undocumented) - SEGMENTATION_MODIFIED = "CORNERSTONE_TOOLS_SEGMENTATION_MODIFIED", - // (undocumented) - SEGMENTATION_REMOVED = "CORNERSTONE_TOOLS_SEGMENTATION_REMOVED", - // (undocumented) - SEGMENTATION_RENDERED = "CORNERSTONE_TOOLS_SEGMENTATION_RENDERED", - // (undocumented) - SEGMENTATION_REPRESENTATION_ADDED = "CORNERSTONE_TOOLS_SEGMENTATION_REPRESENTATION_ADDED", - // (undocumented) - SEGMENTATION_REPRESENTATION_MODIFIED = "CORNERSTONE_TOOLS_SEGMENTATION_REPRESENTATION_MODIFIED", - // (undocumented) - SEGMENTATION_REPRESENTATION_REMOVED = "CORNERSTONE_TOOLS_SEGMENTATION_REPRESENTATION_REMOVED", - // (undocumented) - TOOL_ACTIVATED = "CORNERSTONE_TOOLS_TOOL_ACTIVATED", - // (undocumented) - TOOL_MODE_CHANGED = "CORNERSTONE_TOOLS_TOOL_MODE_CHANGED", - // (undocumented) - TOOLGROUP_VIEWPORT_ADDED = "CORNERSTONE_TOOLS_TOOLGROUP_VIEWPORT_ADDED", - // (undocumented) - TOOLGROUP_VIEWPORT_REMOVED = "CORNERSTONE_TOOLS_TOOLGROUP_VIEWPORT_REMOVED", - // (undocumented) - TOUCH_DRAG = "CORNERSTONE_TOOLS_TOUCH_DRAG", - // (undocumented) - TOUCH_END = "CORNERSTONE_TOOLS_TOUCH_END", - // (undocumented) - TOUCH_PRESS = "CORNERSTONE_TOOLS_TOUCH_PRESS", - // (undocumented) - TOUCH_START = "CORNERSTONE_TOOLS_TOUCH_START", - // (undocumented) - TOUCH_START_ACTIVATE = "CORNERSTONE_TOOLS_TOUCH_START_ACTIVATE", - // (undocumented) - TOUCH_SWIPE = "CORNERSTONE_TOOLS_SWIPE", - // (undocumented) - TOUCH_TAP = "CORNERSTONE_TOOLS_TAP" -} - -// @public (undocumented) -enum Events_3 { - // (undocumented) - CLIP_STARTED = "CORNERSTONE_CINE_TOOL_STARTED", - // (undocumented) - CLIP_STOPPED = "CORNERSTONE_CINE_TOOL_STOPPED" -} - -declare namespace EventTypes_2 { - export { - InteractionStartType, - InteractionEndType, - InteractionEventType, - NormalizedInteractionEventDetail, - NormalizedMouseEventType, - NormalizedTouchEventType, - ToolModeChangedEventDetail, - ToolModeChangedEventType, - ToolActivatedEventDetail, - ToolActivatedEventType, - AnnotationAddedEventDetail, - AnnotationAddedEventType, - AnnotationCompletedEventDetail, - AnnotationCompletedEventType, - AnnotationModifiedEventDetail, - AnnotationModifiedEventType, - AnnotationRemovedEventDetail, - AnnotationRemovedEventType, - AnnotationSelectionChangeEventDetail, - AnnotationSelectionChangeEventType, - AnnotationRenderedEventDetail, - AnnotationRenderedEventType, - AnnotationLockChangeEventDetail, - AnnotationVisibilityChangeEventDetail, - AnnotationLockChangeEventType, - AnnotationVisibilityChangeEventType, - AnnotationInterpolationCompletedEventDetail, - AnnotationInterpolationCompletedEventType, - AnnotationInterpolationRemovedEventDetail, - AnnotationInterpolationRemovedEventType, - ContourAnnotationCompletedEventDetail, - SegmentationDataModifiedEventType, - SegmentationRepresentationModifiedEventDetail, - SegmentationRepresentationModifiedEventType, - SegmentationRepresentationRemovedEventDetail, - SegmentationRepresentationRemovedEventType, - SegmentationRemovedEventType, - SegmentationRemovedEventDetail, - SegmentationDataModifiedEventDetail, - SegmentationRenderedEventType, - SegmentationRenderedEventDetail, - SegmentationModifiedEventType, - SegmentationModifiedEventDetail, - KeyDownEventDetail, - KeyDownEventType, - KeyUpEventDetail, - KeyUpEventType, - MouseDownEventDetail, - TouchStartEventDetail, - MouseDownEventType, - TouchStartEventType, - MouseDownActivateEventDetail, - TouchStartActivateEventDetail, - MouseDownActivateEventType, - TouchStartActivateEventType, - MouseDragEventDetail, - TouchDragEventDetail, - MouseDragEventType, - TouchDragEventType, - MouseUpEventDetail, - TouchEndEventDetail, - MouseUpEventType, - TouchEndEventType, - MouseClickEventDetail, - MouseClickEventType, - TouchTapEventDetail, - TouchTapEventType, - TouchSwipeEventDetail, - TouchSwipeEventType, - TouchPressEventDetail, - TouchPressEventType, - MouseMoveEventDetail, - MouseMoveEventType, - MouseDoubleClickEventDetail, - MouseDoubleClickEventType, - MouseWheelEventDetail, - MouseWheelEventType, - SegmentationAddedEventDetail, - SegmentationAddedEventType - } -} - -// @public (undocumented) -function extend2DBoundingBoxInViewAxis(boundsIJK: [Types_2.Point2, Types_2.Point2, Types_2.Point2], numSlicesToProject: number): [Types_2.Point2, Types_2.Point2, Types_2.Point2]; - -// @public (undocumented) -function extractWindowLevelRegionToolData(viewport: Types_2.IVolumeViewport | Types_2.IStackViewport): { - scalarData: Types_2.PixelDataTypedArray; - minPixelValue: number; - maxPixelValue: number; - width: number; - height: number; - rows: number; - columns: number; -}; - -// @public (undocumented) -const fillInsideCircle: (enabledElement: any, operationData: any) => unknown; - -// @public (undocumented) -const fillInsideRectangle: (enabledElement: any, operationData: any) => unknown; - -// @public (undocumented) -function fillOutsideCircle(): void; - -// @public (undocumented) -function filterAnnotationsForDisplay(viewport: Types_2.IViewport, annotations: Annotations, filterOptions?: Types_2.ReferenceCompatibleOptions): Annotations; - -// @public (undocumented) -function filterAnnotationsWithinSamePlane(annotations: Annotations, camera: Types_2.ICamera): Annotations; - -// @public (undocumented) -function filterAnnotationsWithinSlice(annotations: Annotations, camera: Types_2.ICamera, spacingInNormalDirection: number): Annotations; - -// @public (undocumented) -function filterViewportsWithFrameOfReferenceUID(viewports: Array, FrameOfReferenceUID: string): Array; - -// @public (undocumented) -function filterViewportsWithParallelNormals(viewports: any, camera: any, EPS?: number): any; - -// @public (undocumented) -function filterViewportsWithToolEnabled(viewports: Array, toolName: string): Array; - -// @public (undocumented) -function findClosestPoint(sourcePoints: Array, targetPoint: Types_2.Point2): Types_2.Point2; - -// @public (undocumented) -function findHandlePolylineIndex(annotation: ContourAnnotation, handleIndex: number): number; - -// @public (undocumented) -function floodFill(getter: FloodFillGetter, seed: Types_2.Point2 | Types_2.Point3, options?: FloodFillOptions): FloodFillResult; - -// @public (undocumented) -type FloodFillGetter = FloodFillGetter2D | FloodFillGetter3D; - -// @public (undocumented) -type FloodFillOptions = { - onFlood?: (x: number, y: number, z?: number) => void; - onBoundary?: (x: number, y: number, z?: number) => void; - equals?: (a: any, b: any) => boolean; - diagonals?: boolean; - bounds?: Map; - filter?: (point: any) => boolean; -}; - -// @public (undocumented) -type FloodFillResult = { - flooded: Types_2.Point2[] | Types_2.Point3[]; -}; - -// @public (undocumented) -class FrameOfReferenceSpecificAnnotationManager implements IAnnotationManager { - constructor(uid?: string); - // (undocumented) - addAnnotation: (annotation: Annotation, groupKey?: string) => void; - // (undocumented) - getAllAnnotations: () => Annotations; - // (undocumented) - getAnnotation: (annotationUID: string) => Annotation | undefined; - // (undocumented) - getAnnotations: (groupKey: string, toolName?: string) => GroupSpecificAnnotations | Annotations; - // (undocumented) - getFramesOfReference: () => Array; - // (undocumented) - getGroupKey: (annotationGroupSelector: AnnotationGroupSelector) => string; - // (undocumented) - getNumberOfAllAnnotations: () => number; - // (undocumented) - getNumberOfAnnotations: (groupKey: string, toolName?: string) => number; - // (undocumented) - _imageVolumeModifiedHandler: (evt: Types_2.EventTypes.ImageVolumeModifiedEvent) => void; - // (undocumented) - removeAllAnnotations: () => Annotations; - // (undocumented) - removeAnnotation: (annotationUID: string) => void; - // (undocumented) - removeAnnotations: (groupKey: string, toolName?: string) => Annotations; - // (undocumented) - restoreAnnotations: (state: AnnotationState | GroupSpecificAnnotations | Annotations, groupKey?: string, toolName?: string) => void; - // (undocumented) - saveAnnotations: (groupKey?: string, toolName?: string) => AnnotationState | GroupSpecificAnnotations | Annotations; - // (undocumented) - setPreprocessingFn(preprocessingFn: (annotation: Annotation) => Annotation): void; - // (undocumented) - readonly uid: string; -} - -// @public (undocumented) -function generateContourSetsFromLabelmap({ segmentations }: { - segmentations: any; -}): any[]; - -// @public (undocumented) -function generateImageFromTimeData(dynamicVolume: Types_2.IDynamicImageVolume, operation: Enums_2.GenerateImageType, options: { - dimensionGroupNumbers?: number[]; - frameNumbers?: number[]; -}): Float32Array; - -declare namespace geometricSurfaceUtils { - export { - inverse3x3Matrix, - checkStandardBasis, - rotatePoints - } -} - -// @public (undocumented) -function getAABB(polyline: Types_2.Point2[] | Types_2.Point3[] | number[], options?: { - numDimensions: number; -}): Types_2.AABB2 | Types_2.AABB3; - -// @public (undocumented) -function getActiveSegmentation(viewportId: string): Segmentation; - -// @public (undocumented) -function getActiveSegmentIndex(segmentationId: string): number | undefined; - -// @public (undocumented) -function getAllSynchronizers(): Array; - -// @public (undocumented) -function getAllToolGroups(): Array; - -// @public (undocumented) -function getAnnotationNearPoint(element: HTMLDivElement, canvasPoint: Types_2.Point2, proximity?: number): Annotation | null; - -// @public (undocumented) -function getAnnotationNearPointOnEnabledElement(enabledElement: Types_2.IEnabledElement, point: Types_2.Point2, proximity: number): Annotation | null; - -// @public (undocumented) -function getAnnotationsLocked(): Array; - -// @public (undocumented) -function getAnnotationsLockedCount(): number; - -// @public (undocumented) -function getAnnotationsSelected(): Array; - -// @public (undocumented) -function getAnnotationsSelectedByToolName(toolName: string): Array; - -// @public (undocumented) -function getAnnotationsSelectedCount(): number; - -// @public (undocumented) -function getArea(points: Types_2.Point2[]): number; - -// @public (undocumented) -function getBoundingBoxAroundShapeIJK(points: Types_2.Point2[] | Types_2.Point3[], dimensions?: Types_2.Point2 | Types_2.Point3): BoundingBox; - -// @public (undocumented) -function getBoundingBoxAroundShapeWorld(points: Types_2.Point2[] | Types_2.Point3[], clipBounds?: Types_2.Point2 | Types_2.Point3): BoundingBox; - -// @public (undocumented) -function getBoundsIJKFromRectangleAnnotations(annotations: any, referenceVolume: any, options?: Options_3): any; - -// @public (undocumented) -function getBrushSizeForToolGroup(toolGroupId: string, toolName?: string): void; - -// @public (undocumented) -function getBrushThresholdForToolGroup(toolGroupId: string): any; - -// @public (undocumented) -function getBrushToolInstances(toolGroupId: string, toolName?: string): any[]; - -// @public (undocumented) -const getCalibratedAspect: (image: any) => any; - -// @public (undocumented) -const getCalibratedLengthUnitsAndScale: (image: any, handles: any) => { - unit: string; - areaUnit: string; - scale: number; -}; - -// @public (undocumented) -const getCalibratedProbeUnitsAndValue: (image: any, handles: any) => { - units: string[]; - values: any[]; - calibrationType?: undefined; -} | { - units: string[]; - values: any[]; - calibrationType: string; -}; - -// @public (undocumented) -function getCanvasCircleCorners(circleCanvasPoints: canvasCoordinates): Array; - -// @public (undocumented) -function getCanvasCircleRadius(circleCanvasPoints: canvasCoordinates): number; - -// @public (undocumented) -function getCanvasEllipseCorners(ellipseCanvasPoints: CanvasCoordinates): Array; - -// @public (undocumented) -function getClosestImageIdForStackViewport(viewport: StackViewport, worldPos: Types_2.Point3, viewPlaneNormal: Types_2.Point3): string; - -// @public (undocumented) -function getClosestLineSegmentIntersection(points: Types_2.Point2[], p1: Types_2.Point2, q1: Types_2.Point2, closed?: boolean): { - segment: Types_2.Point2; - distance: number; -} | undefined; - -// @public (undocumented) -function getColorLUT(index: number): Types_2.ColorLUT | undefined; - -// @public (undocumented) -function getContourHolesDataCanvas(annotation: Annotation, viewport: Types_2.IViewport): Types_2.Point2[][]; - -// @public (undocumented) -function getContourHolesDataWorld(annotation: Annotation): Types_2.Point3[][]; - -// @public (undocumented) -function getCurrentLabelmapImageIdForViewport(viewportId: string, segmentationId: string): string; - -// @public (undocumented) -function getDataInTime(dynamicVolume: Types_2.IDynamicImageVolume, options: { - dimensionGroupNumbers?: number[]; - frameNumbers?: number[]; - maskVolumeId?: string; - worldCoordinate?: Types_2.Point3; -}): number[] | number[][]; - -// @public (undocumented) -function getDeduplicatedVTKPolyDataPoints(polyData: any, bypass?: boolean): { - points: any[]; - lines: { - a: any; - b: any; - }[]; -}; - -// @public (undocumented) -function getDeltaDistance(currentPoints: IPoints[], lastPoints: IPoints[]): IDistance; - -// @public (undocumented) -function getDeltaDistanceBetweenIPoints(currentPoints: IPoints[], lastPoints: IPoints[]): IDistance; - -// @public (undocumented) -function getDeltaPoints(currentPoints: IPoints[], lastPoints: IPoints[]): IPoints; - -// @public (undocumented) -function getDeltaRotation(currentPoints: ITouchPoints[], lastPoints: ITouchPoints[]): void; - -// @public (undocumented) -function getFirstLineSegmentIntersectionIndexes(points: Types_2.Point2[], p1: Types_2.Point2, q1: Types_2.Point2, closed?: boolean): Types_2.Point2 | undefined; - -// @public (undocumented) -function getFont(styleSpecifier: StyleSpecifier, state?: AnnotationStyleStates, mode?: ToolModes): string; - -// @public (undocumented) -function getHiddenSegmentIndices(viewportId: string, specifier: { - segmentationId: string; - type: SegmentationRepresentations; -}): Set; - -// @public (undocumented) -function getHoveredContourSegmentationAnnotation(segmentationId: any): number; - -// @public (undocumented) -function getLabelmapImageIds(segmentationId: string): string | undefined; - -// @public (undocumented) -function getLineSegmentIntersectionsCoordinates(points: Types_2.Point2[], p1: Types_2.Point2, q1: Types_2.Point2, closed?: boolean): Types_2.Point2[]; - -// @public (undocumented) -function getLineSegmentIntersectionsIndexes(polyline: Types_2.Point2[], p1: Types_2.Point2, q1: Types_2.Point2, closed?: boolean): Types_2.Point2[]; - -// @public (undocumented) -function getLockedSegmentIndices(segmentationId: string): number[] | []; - -// @public (undocumented) -function getLuminanceFromRegion(imageData: any, x: any, y: any, width: any, height: any): any[]; - -// @public (undocumented) -function getMeanPoints(points: IPoints[]): IPoints; - -// @public (undocumented) -function getMeanTouchPoints(points: ITouchPoints[]): ITouchPoints; - -// @public (undocumented) -function getNextColorLUTIndex(): number; - -// @public (undocumented) -function getNormal2(polyline: Types_2.Point2[]): Types_2.Point3; - -// @public (undocumented) -function getNormal3(polyline: Types_2.Point3[]): Types_2.Point3; - -// @public (undocumented) -function getOrCreateSegmentationVolume(segmentationId: any): any; - -// @public (undocumented) -function getOrientationStringLPS(vector: Types_2.Point3): string; - -// @public (undocumented) -function getPixelValueUnits(modality: string, imageId: string, options: pixelUnitsOptions): string; - -// @public (undocumented) -function getPixelValueUnitsImageId(imageId: string, options: pixelUnitsOptions): string; - -// @public (undocumented) -function getPoint(points: any, idx: any): Types_2.Point3; - -// @public (undocumented) -function getPointInLineOfSightWithCriteria(viewport: Types_2.IVolumeViewport, worldPos: Types_2.Point3, targetVolumeId: string, criteriaFunction: (intensity: number, point: Types_2.Point3) => Types_2.Point3, stepSize?: number): Types_2.Point3; - -// @public (undocumented) -function getPointsInLineOfSight(viewport: Types_2.IVolumeViewport, worldPos: Types_2.Point3, { targetVolumeId, stepSize }: { - targetVolumeId: string; - stepSize: number; -}): Types_2.Point3[]; - -// @public (undocumented) -function getPolyDataPointIndexes(polyData: vtkPolyData): any[]; - -// @public (undocumented) -function getPolyDataPoints(polyData: vtkPolyData): any[]; - -// @public (undocumented) -function getRenderInactiveSegmentations(viewportId: string): boolean; - -// @public (undocumented) -function getSegmentation(segmentationId: string): Segmentation | undefined; - -// @public (undocumented) -function getSegmentationRepresentation(viewportId: string, specifier: { - segmentationId: string; - type: SegmentationRepresentations; -}): SegmentationRepresentation | undefined; - -// @public (undocumented) -function getSegmentationRepresentations(viewportId: string, specifier?: { - segmentationId?: string; - type?: SegmentationRepresentations; -}): SegmentationRepresentation[] | []; - -// @public (undocumented) -function getSegmentationRepresentationsBySegmentationId(segmentationId: string): { - viewportId: string; - representations: SegmentationRepresentation[]; -}[]; - -// @public (undocumented) -function getSegmentationRepresentationVisibility(viewportId: string, specifier: { - segmentationId: string; - type: SegmentationRepresentations; -}): boolean | undefined; - -// @public (undocumented) -function getSegmentations(): Segmentation[] | []; - -// @public (undocumented) -function getSegmentIndexAtLabelmapBorder(segmentationId: string, worldPoint: Types_2.Point3, { viewport, searchRadius }: Options_2): number; - -// @public (undocumented) -function getSegmentIndexAtWorldPoint(segmentationId: string, worldPoint: Types_2.Point3, options?: Options): number; - -// @public (undocumented) -function getSegmentIndexColor(viewportId: string, segmentationId: string, segmentIndex: number): Types_2.Color; - -// @public (undocumented) -function getSegmentIndexVisibility(viewportId: string, specifier: { - segmentationId: string; - type: SegmentationRepresentations; -}, segmentIndex: number): boolean; - -// @public (undocumented) -function getSignedArea(polyline: Types_2.Point2[]): number; - -// @public (undocumented) -function getSphereBoundsInfo(circlePoints: [Types_2.Point3, Types_2.Point3], imageData: vtkImageData): SphereBoundsInfo; - -// @public (undocumented) -function getStackSegmentationImageIdsForViewport(viewportId: string, segmentationId: string): string[]; - -// @public (undocumented) -function getState(annotation?: Annotation): AnnotationStyleStates; - -// @public (undocumented) -function getStatistics({ segmentationId, segmentIndices, }: { - segmentationId: string; - segmentIndices: number[] | number; -}): Promise; - -// @public (undocumented) -function getStyle(specifier: SpecifierWithType): StyleForType; - -// @public (undocumented) -const getSubPixelSpacingAndXYDirections: (viewport: Types_2.IStackViewport | Types_2.IVolumeViewport, subPixelResolution: number) => { - spacing: Types_2.Point2; - xDir: Types_2.Point3; - yDir: Types_2.Point3; -}; - -// @public (undocumented) -function getSynchronizer(synchronizerId: string): Synchronizer | void; - -// @public (undocumented) -function getSynchronizersForViewport(viewportId: string, renderingEngineId: string): Array; - -// @public (undocumented) -function getTextBoxCoordsCanvas(annotationCanvasPoints: Array): Types_2.Point2; - -// @public (undocumented) -function getToolGroup(toolGroupId: string): ToolGroup | undefined; - -// @public (undocumented) -function getToolGroupForViewport(viewportId: string, renderingEngineId?: string): ToolGroup | undefined; - -// @public (undocumented) -function getToolGroupsWithToolName(toolName: string): ToolGroup[] | []; - -// @public (undocumented) -function getToolState(element: HTMLDivElement): CINETypes.ToolData | undefined; - -// @public (undocumented) -function getUniqueSegmentIndices(segmentationId: any): any; - -// @public (undocumented) -function getViewportForAnnotation(annotation: Annotation): Types_2.IStackViewport | Types_2.IVolumeViewport | undefined; - -// @public (undocumented) -function getViewportIdsWithSegmentation(segmentationId: string): string[]; - -// @public (undocumented) -function getViewportIdsWithToolToRender(element: HTMLDivElement, toolName: string, requireParallelNormals?: boolean): string[]; - -// @public (undocumented) -function getViewportSegmentations(viewportId: string, type?: SegmentationRepresentations): Segmentation[]; - -// @public (undocumented) -function getWindingDirection(polyline: Types_2.Point2[]): number; - -// @public (undocumented) -function getWorldWidthAndHeightFromCorners(viewPlaneNormal: Types_2.Point3, viewUp: Types_2.Point3, topLeftWorld: Types_2.Point3, bottomRightWorld: Types_2.Point3): { - worldWidth: number; - worldHeight: number; -}; - -// @public (undocumented) -function getWorldWidthAndHeightFromTwoPoints(viewPlaneNormal: Types_2.Point3, viewUp: Types_2.Point3, worldPos1: Types_2.Point3, worldPos2: Types_2.Point3): { - worldWidth: number; - worldHeight: number; -}; - -// @public (undocumented) -type GroupSpecificAnnotations = { - [toolName: string]: Annotations; -}; - -declare namespace growCut { - export { - runGrowCut as run, - runGrowCutForSphere, - runGrowCutForBoundingBox, - runOneClickGrowCut, - SphereInfo, - GrowCutOptions as GrowCutSphereOptions, - GrowCutBoundingBoxOptions, - GrowCutOneClickOptions - } -} - -// @public (undocumented) -type GrowCutBoundingBoxOptions = GrowCutOptions & { - negativePixelRange?: [number, number]; - positivePixelRange?: [number, number]; -}; - -// @public (undocumented) -type GrowCutOneClickOptions = GrowCutOptions & { - subVolumePaddingPercentage?: number | [number, number, number]; - subVolumeMinPadding?: number | [number, number, number]; -}; - -// @public (undocumented) -type GrowCutOptions = { - maxProcessingTime?: number; - windowSize?: number; - positiveSeedValue?: number; - negativeSeedValue?: number; - positiveSeedVariance?: number; - negativeSeedVariance?: number; - inspection?: { - numCyclesInterval?: number; - numCyclesBelowThreashold?: number; - threshold?: number; - }; -}; - -// @public (undocumented) -function hasCustomStyle(specifier: { - viewportId?: string; - segmentationId?: string; - type?: SegmentationRepresentations; - segmentIndex?: number; -}): boolean; - -// @public (undocumented) -function hasTool(ToolClass: any): boolean; - -// @public (undocumented) -export class HeightTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => LengthAnnotation; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any; - // (undocumented) - _calculateHeight(pos1: any, pos2: any): number; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: LengthAnnotation, handle: ToolHandle): void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: LengthAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - midX: number; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: LengthAnnotation) => void; -} - -// @public (undocumented) -const helpers: { - clearSegmentValue: typeof clearSegmentValue; - convertStackToVolumeLabelmap: typeof convertStackToVolumeLabelmap; - computeVolumeLabelmapFromStack: typeof computeVolumeLabelmapFromStack; - convertVolumeToStackLabelmap: typeof convertVolumeToStackLabelmap; -}; - -// @public (undocumented) -function hideElementCursor(element: HTMLDivElement): void; - -// @public (undocumented) -interface IAnnotationManager { - // (undocumented) - addAnnotation: (annotation: Annotation, groupKey: string) => void; - // (undocumented) - getAnnotation: (annotationUID: string) => Annotation; - // (undocumented) - getAnnotations: (groupKey: string, toolName?: string) => GroupSpecificAnnotations | Annotations; - // (undocumented) - getGroupKey: (annotationGroupSelector: AnnotationGroupSelector) => string; - // (undocumented) - getNumberOfAllAnnotations: () => number; - // (undocumented) - getNumberOfAnnotations: (groupKey: string, toolName?: string) => number; - // (undocumented) - removeAllAnnotations: () => void; - // (undocumented) - removeAnnotation: (annotationUID: string) => void; - // (undocumented) - removeAnnotations: (groupKey: string) => void; -} - -// @public (undocumented) -type IBaseTool = BaseTool; - -// @public (undocumented) -type IDistance = { - page: number; - client: number; - canvas: number; - world: number; -}; - -// @public (undocumented) -type ImageInterpolationData = { - sliceIndex: number; - annotations?: Annotation[]; -}; - -// @public (undocumented) -class ImageMouseCursor extends MouseCursor { - constructor(url: string, x?: number, y?: number, name?: string | undefined, fallback?: MouseCursor | undefined); - // (undocumented) - getStyleProperty(): string; - // (undocumented) - static getUniqueInstanceName(prefix: string): string; -} - -// @public (undocumented) -type InactiveLabelmapStyle = { - renderOutlineInactive?: boolean; - outlineWidthInactive?: number; - renderFillInactive?: boolean; - fillAlphaInactive?: number; - outlineOpacityInactive?: number; -}; - -// @public (undocumented) -export function init(defaultConfiguration?: Config): void; - -// @public (undocumented) -function initElementCursor(element: HTMLDivElement, cursor: MouseCursor | null): void; - -// @public (undocumented) -type InteractionEndType = Types_2.CustomEventType; - -// @public (undocumented) -type InteractionEventType = Types_2.CustomEventType; - -// @public (undocumented) -type InteractionStartType = Types_2.CustomEventType; - -// @public (undocumented) -type InteractionTypes = 'Mouse' | 'Touch'; - -// @public (undocumented) -function internalAddRepresentationData({ segmentationId, type, data, }: AddRepresentationData): void; - -// @public (undocumented) -type InterpolationROIAnnotation = ContourAnnotation & ContourSegmentationAnnotationData & { - metadata: { - annotationUID?: string; - }; - interpolationUID?: string; - interpolationCompleted?: boolean; - isInterpolationUpdate?: boolean; -}; - -// @public (undocumented) -type InterpolationViewportData = { - annotation: InterpolationROIAnnotation; - interpolationUID: string; - viewport: Types_2.IViewport; - sliceData: Types_2.ImageSliceData; - isInterpolationUpdate?: boolean; -}; - -// @public (undocumented) -function intersectAABB(aabb1: Types_2.AABB2, aabb2: Types_2.AABB2): boolean; - -// @public (undocumented) -function intersectLine(line1Start: Types_2.Point2, line1End: Types_2.Point2, line2Start: Types_2.Point2, line2End: Types_2.Point2): number[]; - -// @public (undocumented) -function intersectPolyline(sourcePolyline: Types_2.Point2[], targetPolyline: Types_2.Point2[]): boolean; - -// @public (undocumented) -function invalidateBrushCursor(toolGroupId: string): void; - -// @public (undocumented) -function inverse3x3Matrix(matrix: number[]): number[]; - -// @public (undocumented) -function invertOrientationStringLPS(orientationString: string): string; - -// @public (undocumented) -type IPoints = { - page: Types_2.Point2; - client: Types_2.Point2; - canvas: Types_2.Point2; - world: Types_2.Point3; -}; - -// @public (undocumented) -function isAnnotationLocked(annotationUID: string): boolean; - -// @public (undocumented) -function isAnnotationSelected(annotationUID: string): boolean; - -// @public (undocumented) -function isAnnotationVisible(annotationUID: string): boolean | undefined; - -// @public (undocumented) -function isAxisAlignedRectangle(rectangleCornersIJK: any): boolean; - -// @public (undocumented) -function isClosed(polyline: Types_2.Point2[]): boolean; - -// @public (undocumented) -function isContourSegmentationAnnotation(annotation: Annotation): annotation is ContourSegmentationAnnotation; - -// @public (undocumented) -interface ISculptToolShape { - // (undocumented) - configureToolSize(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - getInsertPosition(previousIndex: number, nextIndex: number, sculptData: SculptData): Types_2.Point3; - // (undocumented) - getMaxSpacing(minSpacing: number): number; - // (undocumented) - pushHandles(viewport: Types_2.IViewport, sculptData: SculptData): PushedHandles; - // (undocumented) - renderShape(svgDrawingHelper: SVGDrawingHelper, canvasLocation: Types_2.Point2, options: any): void; - // (undocumented) - updateToolSize(canvasCoords: Types_2.Point2, viewport: Types_2.IViewport, activeAnnotation: ContourAnnotation): void; -} - -// @public (undocumented) -class IslandRemoval { - constructor(options?: { - maxInternalRemove?: number; - fillInternalEdge?: boolean; - }); - // (undocumented) - static covers(rle: any, row: any): boolean; - // (undocumented) - fillSegments: (index: number) => boolean; - // (undocumented) - floodFillSegmentIsland(): number; - // (undocumented) - initialize(viewport: any, segmentationVoxels: any, options: any): boolean; - // (undocumented) - previewSegmentIndex: number; - // (undocumented) - previewVoxelManager: Types_2.VoxelManager; - // (undocumented) - removeExternalIslands(): void; - // (undocumented) - removeInternalIslands(): number[]; - // (undocumented) - segmentIndex: number; - // (undocumented) - segmentSet: Types_2.RLEVoxelMap; - // (undocumented) - selectedPoints: Types_2.Point3[]; -} - -// @public (undocumented) -function isObject(value: any): boolean; - -// @public (undocumented) -const isPlaneIntersectingAABB: (origin: any, normal: any, minX: any, minY: any, minZ: any, maxX: any, maxY: any, maxZ: any) => boolean; - -// @public (undocumented) -interface ISpline { - // (undocumented) - get aabb(): Types_2.AABB2; - // (undocumented) - addControlPoint(point: Types_2.Point2): void; - // (undocumented) - addControlPointAtU(u: number): ControlPointInfo; - // (undocumented) - addControlPoints(points: Types_2.Point2[]): void; - // (undocumented) - clearControlPoints(): void; - // (undocumented) - get closed(): boolean; - set closed(closed: boolean); - // (undocumented) - containsPoint(point: Types_2.Point2): boolean; - // (undocumented) - deleteControlPointByIndex(index: number): boolean; - // (undocumented) - get fixedResolution(): boolean; - // (undocumented) - getClosestControlPoint(point: Types_2.Point2): ClosestControlPoint; - // (undocumented) - getClosestControlPointWithinDistance(point: Types_2.Point2, range: number): ClosestControlPoint; - // (undocumented) - getClosestPoint(point: Types_2.Point2): ClosestSplinePoint; - // (undocumented) - getClosestPointOnControlPointLines(point: Types_2.Point2): ClosestPoint; - // (undocumented) - getControlPoints(): Types_2.Point2[]; - // (undocumented) - getPolylinePoints(): Types_2.Point2[]; - // (undocumented) - getPreviewPolylinePoints(controlPointPreview: Types_2.Point2, closeDistance: number): Types_2.Point2[]; - // (undocumented) - hasTangentPoints(): boolean; - // (undocumented) - get invalidated(): boolean; - // (undocumented) - isPointNearCurve(point: Types_2.Point2, maxDist: number): boolean; - // (undocumented) - get length(): number; - // (undocumented) - get numControlPoints(): number; - // (undocumented) - get resolution(): number; - set resolution(resolution: number); - // (undocumented) - setControlPoints(points: Types_2.Point2[]): void; - // (undocumented) - updateControlPoint(index: number, newControlPoint: Types_2.Point2): void; -} - -// @public (undocumented) -function isPointInsidePolyline3D(point: Types_2.Point3, polyline: Types_2.Point3[], options?: { - holes?: Types_2.Point3[][]; -}): boolean; - -// @public (undocumented) -function isPointOnLineSegment(lineStart: Types_2.Point2, lineEnd: Types_2.Point2, point: Types_2.Point2): boolean; - -// @public (undocumented) -function isSegmentIndexLocked(segmentationId: string, segmentIndex: number): boolean; - -// @public (undocumented) -function isViewportPreScaled(viewport: Types_2.IStackViewport | Types_2.IVolumeViewport, targetId: string): boolean; - -// @public (undocumented) -interface ISynchronizerEventHandler { - // (undocumented) - (synchronizer: Synchronizer, sourceViewport: Types_2.IViewportId, targetViewport: Types_2.IViewportId, sourceEvent: any, options?: unknown): Promise | void; -} - -// @public (undocumented) -type IToolBinding = { - mouseButton?: ToolBindingMouseType; - modifierKey?: ToolBindingKeyboardType; - numTouchPoints?: number; -}; - -// @public (undocumented) -type IToolClassReference = new (config: unknown) => T; - -// @public (undocumented) -type ITouchPoints = IPoints & { - touch: { - identifier: string; - radiusX: number; - radiusY: number; - force: number; - rotationAngle: number; - }; -}; - -// @public (undocumented) -enum KeyboardBindings { - // (undocumented) - Alt = 18, - // (undocumented) - AltMeta = 1891, - // (undocumented) - Ctrl = 17, - // (undocumented) - CtrlAlt = 1718, - // (undocumented) - CtrlMeta = 1791, - // (undocumented) - Meta = 91, - // (undocumented) - Shift = 16, - // (undocumented) - ShiftAlt = 1618, - // (undocumented) - ShiftCtrl = 1617, - // (undocumented) - ShiftMeta = 1691 -} - -// @public (undocumented) -type KeyDownEventDetail = { - element: HTMLDivElement; - viewportId: string; - renderingEngineId: string; - key: string; - keyCode: number; -}; - -// @public (undocumented) -type KeyDownEventType = Types_2.CustomEventType; - -// @public (undocumented) -type KeyImageAnnotation = ProbeAnnotation & { - data: { - isPoint: boolean; - seriesLevel: boolean; - }; -}; - -// @public (undocumented) -export class KeyImageTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => Annotation; - // (undocumented) - cancel(element: HTMLDivElement): string; - // (undocumented) - static dataPoint: { - data: { - isPoint: boolean; - }; - }; - // (undocumented) - static dataSeries: { - data: { - seriesLevel: boolean; - }; - }; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _doneChangingTextCallback(element: any, annotation: any, updatedText: any): void; - // (undocumented) - doubleClickCallback: (evt: EventTypes_2.TouchTapEventType) => void; - // (undocumented) - _dragCallback: (evt: any) => void; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: KeyImageAnnotation): void; - // (undocumented) - _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: Annotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static setPoint(annotation: any, isPoint?: boolean, element?: any): void; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: Annotation) => void; -} - -// @public (undocumented) -type KeyUpEventDetail = KeyDownEventDetail; - -// @public (undocumented) -type KeyUpEventType = Types_2.CustomEventType; - -// @public (undocumented) -interface LabelAnnotation extends Annotation { - // (undocumented) - data: { - text: string; - handles: { - points: Types_2.Point3[]; - }; - }; -} - -// @public (undocumented) -export class LabelmapBaseTool extends BaseTool { - constructor(toolProps: any, defaultToolProps: any); - // (undocumented) - acceptPreview(element?: HTMLDivElement): void; - // (undocumented) - addPreview(element?: HTMLDivElement, options?: { - acceptReject: boolean; - }): unknown; - // (undocumented) - protected createEditData(element: any): EditDataReturnType; - // (undocumented) - protected createHoverData(element: any, centerCanvas?: any): { - brushCursor: { - metadata: { - viewPlaneNormal: Types_2.Point3; - viewUp: Types_2.Point3; - FrameOfReferenceUID: string; - referencedImageId: string; - toolName: string; - segmentColor: Types_2.Color; - }; - data: {}; - }; - centerCanvas: any; - segmentIndex: number; - viewport: Types_2.IStackViewport | VolumeViewport; - segmentationId: string; - segmentColor: Types_2.Color; - viewportIdsToRender: string[]; - }; - // (undocumented) - createMemo(segmentId: string, segmentationVoxelManager: any, preview: any): LabelmapMemo.LabelmapMemo; - // (undocumented) - protected _editData: { - override: { - voxelManager: Types_2.IVoxelManager; - imageData: vtkImageData; - }; - segmentsLocked: number[]; - imageId?: string; - imageIds?: string[]; - volumeId?: string; - referencedVolumeId?: string; - } | null; - // (undocumented) - protected getActiveSegmentationData(viewport: any): { - segmentIndex: number; - segmentationId: string; - segmentColor: Types_2.Color; - }; - // (undocumented) - protected getEditData({ viewport, representationData, segmentsLocked, segmentationId, }: { - viewport: any; - representationData: any; - segmentsLocked: any; - segmentationId: any; - }): EditDataReturnType; - // (undocumented) - protected getOperationData(element?: any): ModifiedLabelmapToolOperationData; - // (undocumented) - protected _hoverData?: { - brushCursor: any; - segmentationId: string; - segmentIndex: number; - segmentColor: [number, number, number, number]; - viewportIdsToRender: string[]; - centerCanvas?: Array; - viewport: Types_2.IViewport; - }; - // (undocumented) - static previewData?: PreviewData; - // (undocumented) - protected get _previewData(): PreviewData; - // (undocumented) - rejectPreview(element?: HTMLDivElement): void; - // (undocumented) - static viewportContoursToLabelmap(viewport: Types_2.IViewport, options?: { - removeContours: boolean; - }): void; -} - -declare namespace LabelmapMemo { - export { - createLabelmapMemo, - restoreMemo, - createRleMemo, - createPreviewMemo, - LabelmapMemo_2 as LabelmapMemo - } -} - -// @public (undocumented) -type LabelmapMemo_2 = Types_2.Memo & { - segmentationVoxelManager: Types_2.IVoxelManager; - voxelManager: Types_2.IVoxelManager; - redoVoxelManager?: Types_2.IVoxelManager; - undoVoxelManager?: Types_2.IVoxelManager; - memo?: LabelmapMemo_2; -}; - -// @public (undocumented) -type LabelmapSegmentationData = LabelmapSegmentationDataVolume | LabelmapSegmentationDataStack | { - volumeId?: string; - referencedVolumeId?: string; - referencedImageIds?: string[]; - imageIds?: string[]; -}; - -// @public (undocumented) -type LabelmapSegmentationDataStack = { - imageIds: string[]; -}; - -// @public (undocumented) -type LabelmapSegmentationDataVolume = { - volumeId: string; - referencedVolumeId?: string; -}; - -// @public (undocumented) -type LabelmapStyle = BaseLabelmapStyle & InactiveLabelmapStyle; - -// @public (undocumented) -type LabelmapToolOperationData = { - segmentationId: string; - segmentIndex: number; - previewColors?: Record; - segmentsLocked: number[]; - viewPlaneNormal: number[]; - viewUp: number[]; - activeStrategy: string; - points: Types_2.Point3[]; - voxelManager: any; - override: { - voxelManager: Types_2.IVoxelManager; - imageData: vtkImageData; - }; - preview: any; - toolGroupId: string; - createMemo: (segmentId: any, segmentVoxels: any, previewVoxels?: any, previewMemo?: any) => LabelmapMemo_2; -}; - -// @public (undocumented) -type LabelmapToolOperationDataStack = LabelmapToolOperationData & LabelmapSegmentationDataStack; - -// @public (undocumented) -type LabelmapToolOperationDataVolume = LabelmapToolOperationData & LabelmapSegmentationDataVolume; - -// @public (undocumented) -export class LabelTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => LabelAnnotation; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _doneChangingTextCallback(element: any, annotation: any, updatedText: any): void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - newAnnotation?: boolean; - hasMoved?: boolean; - offset: Types_2.Point3; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: Annotation, handle: ToolHandle, interactionType: InteractionTypes): void; - // (undocumented) - static hydrate: (viewportId: string, position: Types_2.Point3, text: string, options?: { - annotationUID?: string; - }) => LabelAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: LabelAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: LabelAnnotation) => void; -} - -// @public (undocumented) -interface LengthAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats: { - [targetId: string]: { - length: number; - unit: string; - }; - }; - }; -} - -// @public (undocumented) -export class LengthTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => LengthAnnotation; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any; - // (undocumented) - _calculateLength(pos1: any, pos2: any): number; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: LengthAnnotation, handle: ToolHandle): void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => LengthAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume(index1: any, index2: any, dimensions: any): boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: LengthAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: LengthAnnotation) => void; -} - -// @public (undocumented) -class LinearSpline extends CardinalSpline { - constructor(); -} - -declare namespace lineSegment { - export { - distanceToPoint_2 as distanceToPoint, - distanceToPointSquared_2 as distanceToPointSquared, - distanceToPointSquaredInfo, - intersectLine, - isPointOnLineSegment - } -} - -// @public (undocumented) -type LivewireContourAnnotation = ContourAnnotation; - -// @public (undocumented) -type LivewireContourSegmentationAnnotation = LivewireContourAnnotation & ContourSegmentationAnnotationData; - -// @public (undocumented) -export class LivewireContourSegmentationTool extends LivewireContourTool { - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - protected renderAnnotationInstance(renderContext: any): boolean; - // (undocumented) - static toolName: string; - // (undocumented) - updateInterpolatedAnnotation(annotation: ContourSegmentationAnnotation, enabledElement: Types_2.IEnabledElement): void; -} - -// @public (undocumented) -export class LivewireContourTool extends ContourSegmentationBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - addNewAnnotation(evt: EventTypes_2.InteractionEventType): LivewireContourAnnotation; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - cancelInProgress(element: any, config: any, evt: any): void; - // (undocumented) - protected clearEditData(): void; - // (undocumented) - protected createAnnotation(evt: EventTypes_2.InteractionEventType): ContourAnnotation; - // (undocumented) - editData: { - annotation: LivewireContourAnnotation; - viewportIdsToRender: Array; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - lastCanvasPoint?: Types_2.Point2; - confirmedPath?: LivewirePath; - currentPath?: LivewirePath; - confirmedPathNext?: LivewirePath; - closed?: boolean; - worldToSlice?: (point: Types_2.Point3) => Types_2.Point2; - sliceToWorld?: (point: Types_2.Point2) => Types_2.Point3; - originalPath?: Types_2.Point3[]; - contourHoleProcessingEnabled?: boolean; - } | null; - // (undocumented) - editHandle(worldPos: Types_2.Point3, element: any, annotation: LivewireContourAnnotation, handleIndex: number): void; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType, clearAnnotation?: boolean) => void; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: LivewireContourAnnotation, handle: ToolHandle) => void; - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: LivewireContourAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): boolean; - // (undocumented) - protected renderAnnotationInstance(renderContext: { - enabledElement: Types_2.IEnabledElement; - targetId: string; - annotation: LivewireContourAnnotation; - annotationStyle: AnnotationStyle; - svgDrawingHelper: SVGDrawingHelper; - }): boolean; - // (undocumented) - protected scissors: LivewireScissors; - // (undocumented) - protected scissorsNext: LivewireScissors; - // (undocumented) - protected setupBaseEditData(worldPos: any, element: any, annotation: any, nextPos?: any, contourHoleProcessingEnabled?: any): void; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: LivewireContourAnnotation) => void; - // (undocumented) - triggerAnnotationModified: (annotation: LivewireContourAnnotation, enabledElement: Types_2.IEnabledElement, changeType?: ChangeTypes) => void; - // (undocumented) - triggerChangeEvent: (annotation: LivewireContourAnnotation, enabledElement: Types_2.IEnabledElement, changeType?: ChangeTypes, contourHoleProcessingEnabled?: boolean) => void; - // (undocumented) - protected updateAnnotation(livewirePath: LivewirePath): void; -} - -declare namespace locking { - export { - setAnnotationLocked, - getAnnotationsLocked, - getAnnotationsLockedCount, - unlockAllAnnotations, - isAnnotationLocked, - checkAndSetAnnotationLocked - } -} - -// @public (undocumented) -export class MagnifyTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _createMagnificationViewport: () => void; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _dragEndCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - referencedImageId: string; - viewportIdsToRender: string[]; - enabledElement: Types_2.IEnabledElement; - renderingEngine: Types_2.IRenderingEngine; - currentPoints: IPoints; - } | null; - // (undocumented) - _getReferencedImageId(viewport: Types_2.IStackViewport | Types_2.IVolumeViewport): string; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - preTouchStartCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - static toolName: any; -} - -declare namespace math { - export { - aabb, - BasicStatsCalculator, - circle, - ellipse, - lineSegment, - point, - polyline, - rectangle, - vec2, - angle - } -} - -// @public (undocumented) -function mergePolylines(targetPolyline: Types_2.Point2[], sourcePolyline: Types_2.Point2[]): Types_2.Point2[]; - -// @public (undocumented) -export class MIPJumpToClickTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - mouseClickCallback(evt: any): void; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -function mirror(mirrorPoint: Types_2.Point2, staticPoint: Types_2.Point2): Types_2.Point2; - -// @public (undocumented) -enum MouseBindings { - // (undocumented) - Auxiliary = 4, - // (undocumented) - Fifth_Button = 16, - // (undocumented) - Fourth_Button = 8, - // (undocumented) - Primary = 1, - // (undocumented) - Primary_And_Auxiliary = 5, - // (undocumented) - Primary_And_Secondary = 3, - // (undocumented) - Primary_And_Secondary_And_Auxiliary = 7, - // (undocumented) - Secondary = 2, - // (undocumented) - Secondary_And_Auxiliary = 6, - // (undocumented) - Wheel = 524288, - // (undocumented) - Wheel_Primary = 524289 -} - -// @public (undocumented) -type MouseClickEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & MousePointsDetail & { - mouseButton: number; -}; - -// @public (undocumented) -type MouseClickEventType = Types_2.CustomEventType; - -// @public (undocumented) -class MouseCursor { - constructor(name: string, fallback?: MouseCursor | undefined); - // (undocumented) - addFallbackStyleProperty(style: string): string; - // (undocumented) - static getDefinedCursor(name: string): MouseCursor | undefined; - // (undocumented) - getName(): string; - // (undocumented) - getStyleProperty(): string; - // (undocumented) - static setDefinedCursor(name: string, cursor: MouseCursor): boolean; -} - -// @public (undocumented) -type MouseDoubleClickEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & MousePointsDetail; - -// @public (undocumented) -type MouseDoubleClickEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseDownActivateEventDetail = NormalizedInteractionEventDetail & MousePointsDetail & MouseCustomEventDetail & { - mouseButton: number; -}; - -// @public (undocumented) -type MouseDownActivateEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseDownEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & MousePointsDetail & { - mouseButton: number; -}; - -// @public (undocumented) -type MouseDownEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseDragEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & MousePointsDetail & { - mouseButton: number; -}; - -// @public (undocumented) -type MouseDragEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseMoveEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & { - currentPoints: IPoints; -}; - -// @public (undocumented) -type MouseMoveEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseUpEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & MousePointsDetail & { - mouseButton: number; -}; - -// @public (undocumented) -type MouseUpEventType = Types_2.CustomEventType; - -// @public (undocumented) -type MouseWheelEventDetail = NormalizedInteractionEventDetail & MouseCustomEventDetail & { - detail: Record; - wheel: { - spinX: number; - spinY: number; - pixelX: number; - pixelY: number; - direction: number; - }; - points: IPoints; -}; - -// @public (undocumented) -type MouseWheelEventType = Types_2.CustomEventType; - -// @public (undocumented) -type NamedStatistics = { - mean: Statistics & { - name: 'mean'; - }; - max: Statistics & { - name: 'max'; - }; - min: Statistics & { - name: 'min'; - }; - stdDev: Statistics & { - name: 'stdDev'; - }; - count: Statistics & { - name: 'count'; - }; - area?: Statistics & { - name: 'area'; - }; - volume?: Statistics & { - name: 'volume'; - }; - circumference?: Statistics & { - name: 'circumference'; - }; - pointsInShape?: Types_2.IPointsManager; - maxIJKs?: Array<{ - value: number; - pointIJK: Types_2.Point3; - }>; - array: Statistics[]; -}; - -// @public (undocumented) -type NormalizedInteractionEventDetail = { - eventName: string; - renderingEngineId: string; - viewportId: string; - camera: Record; - element: HTMLDivElement; -}; - -// @public (undocumented) -type NormalizedMouseEventType = Types_2.CustomEventType; - -// @public (undocumented) -type NormalizedTouchEventType = Types_2.CustomEventType; - -// @public (undocumented) -function normalizeViewportPlane(viewport: Types_2.IViewport, boundsIJK: Types_2.BoundsIJK): { - toIJK: any; - boundsIJKPrime: any; - fromIJK: any; - error: string; -} | { - boundsIJKPrime: any; - toIJK: (ijkPrime: any) => any; - fromIJK: (ijk: any) => any; - type: string; - error?: undefined; -} | { - boundsIJKPrime: any; - toIJK: ([j, k, i]: [any, any, any]) => any[]; - fromIJK: ([i, j, k]: [any, any, any]) => any[]; - type: string; - error?: undefined; -}; - -declare namespace orientation_2 { - export { - getOrientationStringLPS, - invertOrientationStringLPS - } -} - -// @public (undocumented) -export class OrientationMarkerTool extends BaseTool { - constructor(toolProps?: {}, defaultToolProps?: { - configuration: { - orientationWidget: { - enabled: boolean; - viewportCorner: Corners; - viewportSize: number; - minPixelSize: number; - maxPixelSize: number; - }; - overlayMarkerType: OverlayMarkerType; - overlayConfiguration: OverlayConfiguration; - }; - }); - // (undocumented) - addAxisActorInViewport(viewport: any): Promise; - // (undocumented) - static AXIS: number; - // (undocumented) - createAnnotatedCubeActor(): Promise; - // (undocumented) - static CUBE: number; - // (undocumented) - _getViewportsInfo: () => any[]; - // (undocumented) - onSetToolActive: () => void; - // (undocumented) - onSetToolDisabled: () => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - orientationMarkers: any; - // (undocumented) - static OVERLAY_MARKER_TYPES: typeof OverlayMarkerType; - // (undocumented) - polyDataURL: any; - // (undocumented) - resize: (viewportId: any) => void; - // (undocumented) - _resizeObservers: Map; - // (undocumented) - _subscribeToViewportEvents(): void; - // (undocumented) - static toolName: any; - // (undocumented) - _unsubscribeToViewportNewVolumeSet(): void; - // (undocumented) - updatingOrientationMarker: any; - // (undocumented) - static VTPFILE: number; -} - -// @public (undocumented) -export class OverlayGridTool extends AnnotationDisplayTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - calculateImageIdPointSets: (imageId: string) => { - pointSet1: Types_2.Point3[]; - pointSet2: Types_2.Point3[]; - }; - // (undocumented) - _init: () => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - onSetToolActive: () => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class PaintFillTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class PanTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _dragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - mouseDragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback(evt: EventTypes_2.InteractionEventType): void; -} - -declare namespace planar_2 { - export { - _default as default, - filterAnnotationsWithinSlice, - getWorldWidthAndHeightFromCorners, - getWorldWidthAndHeightFromTwoPoints, - filterAnnotationsForDisplay, - getPointInLineOfSightWithCriteria, - isPlaneIntersectingAABB, - filterAnnotationsWithinSamePlane, - getPointsInLineOfSight - } -} - -// @public (undocumented) -type PlanarBoundingBox = { - x: number; - y: number; - width: number; - height: number; -}; - -// @public (undocumented) -type PlanarFreehandContourSegmentationAnnotation = PlanarFreehandROIAnnotation & ContourSegmentationAnnotationData; - -// @public (undocumented) -export class PlanarFreehandContourSegmentationTool extends PlanarFreehandROITool { - constructor(toolProps: PublicToolProps); - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - protected renderAnnotationInstance(renderContext: AnnotationRenderContext): boolean; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -type PlanarFreehandROIAnnotation = ContourAnnotation & { - data: { - label?: string; - isOpenUShapeContour?: boolean; - openUShapeContourVectorToPeak?: Types_2.Point3[]; - cachedStats?: ROICachedStats; - }; -}; - -// @public (undocumented) -export class PlanarFreehandROITool extends ContourSegmentationBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - protected activateDraw: (evt: EventTypes_2.InteractionEventType, annotation: PlanarFreehandROIAnnotation, viewportIdsToRender: string[]) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => PlanarFreehandROIAnnotation; - // (undocumented) - _calculateStatsIfActive(annotation: PlanarFreehandROIAnnotation, targetId: string, viewport: any, renderingEngine: any, enabledElement: any): void; - // (undocumented) - cancel: (element: HTMLDivElement) => void; - // (undocumented) - protected createAnnotation(evt: EventTypes_2.InteractionEventType): ContourAnnotation; - // (undocumented) - filterInteractableAnnotationsForElement(element: HTMLDivElement, annotations: Annotations): Annotations | undefined; - // (undocumented) - protected getAnnotationStyle(context: any): any; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: PlanarFreehandROIAnnotation, handle: ToolHandle) => void; - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isEditingClosed: boolean; - // (undocumented) - isEditingOpen: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: PlanarFreehandROIAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - protected renderAnnotationInstance(renderContext: AnnotationRenderContext): boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: PlanarFreehandROIAnnotation) => void; - // (undocumented) - protected updateClosedCachedStats({ viewport, points, imageData, metadata, cachedStats, targetId, modalityUnit, canvasCoordinates, calibratedScale, }: { - viewport: any; - points: any; - imageData: any; - metadata: any; - cachedStats: any; - targetId: any; - modalityUnit: any; - canvasCoordinates: any; - calibratedScale: any; - }): void; - // (undocumented) - protected updateOpenCachedStats({ targetId, metadata, canvasCoordinates, cachedStats, modalityUnit, calibratedScale, }: { - targetId: any; - metadata: any; - canvasCoordinates: any; - cachedStats: any; - modalityUnit: any; - calibratedScale: any; - }): void; -} - -declare namespace planarFreehandROITool { - export { - _default_4 as default, - smoothAnnotation - } -} - -// @public (undocumented) -export class PlanarRotateTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _dragCallback(evt: EventTypes_2.MouseDragEventType): void; - // (undocumented) - mouseDragCallback: (evt: EventTypes_2.MouseDragEventType) => void; - // (undocumented) - mouseWheelCallback: (evt: EventTypes_2.MouseWheelEventType) => void; - // (undocumented) - setAngle(viewport: any, angle: any): void; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback: (evt: EventTypes_2.MouseDragEventType) => void; -} - -// @public (undocumented) -function playClip(element: HTMLDivElement, playClipOptions: CINETypes.PlayClipOptions): void; - -// @public (undocumented) -type PlayClipOptions = { - framesPerSecond?: number; - frameTimeVector?: number[]; - reverse?: boolean; - loop?: boolean; - dynamicCineEnabled?: boolean; - frameTimeVectorSpeedMultiplier?: number; - waitForRendered?: number; -}; - -declare namespace point { - export { - distanceToPoint_3 as distanceToPoint, - distanceToPointSquared_3 as distanceToPointSquared, - mirror - } -} - -// @public (undocumented) -const pointCanProjectOnLine: (p: Types_2.Point2, p1: Types_2.Point2, p2: Types_2.Point2, proximity: number) => boolean; - -// @public (undocumented) -function pointInEllipse(ellipse: any, pointLPS: any, inverts?: Inverts): boolean; - -// @public (undocumented) -function pointInSurroundingSphereCallback(imageData: vtkImageData, circlePoints: [Types_2.Point3, Types_2.Point3], callback: (args: { - value: unknown; - index: number; - pointIJK: Types_2.Point3; - pointLPS: Types_2.Point3; -}) => void, viewport?: Types_2.IVolumeViewport): void; - -// @public (undocumented) -const pointsAreWithinCloseContourProximity: (p1: Types_2.Point2, p2: Types_2.Point2, closeContourProximity: number) => boolean; - -// @public (undocumented) -function pointToString(point: any, decimals?: number): string; - -declare namespace polyDataUtils { - export { - getPoint, - getPolyDataPointIndexes, - getPolyDataPoints - } -} - -declare namespace polyline { - export { - isClosed, - containsPoint, - containsPoints, - getAABB, - getArea, - getSignedArea, - getWindingDirection, - getNormal3, - getNormal2, - intersectPolyline, - decimate_2 as decimate, - getFirstLineSegmentIntersectionIndexes, - getLineSegmentIntersectionsIndexes, - getLineSegmentIntersectionsCoordinates, - getClosestLineSegmentIntersection, - getSubPixelSpacingAndXYDirections, - pointsAreWithinCloseContourProximity, - addCanvasPointsToArray, - pointCanProjectOnLine, - mergePolylines, - subtractPolylines, - isPointInsidePolyline3D, - projectTo2D - } -} - -// @public (undocumented) -const precalculatePointInEllipse: (ellipse: any, inverts?: Inverts) => Inverts; - -// @public (undocumented) -interface ProbeAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - }; - cachedStats: { - [targetId: string]: { - Modality: string; - index: Types_2.Point3; - value: number; - }; - }; - label: string; - }; -} - -// @public (undocumented) -export class ProbeTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: any); - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => ProbeAnnotation; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any, changeType?: ChangeTypes): any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragCallback: (evt: any) => void; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - getHandleNearImagePoint(element: HTMLDivElement, annotation: ProbeAnnotation, canvasCoords: Types_2.Point2, proximity: number): ToolHandle | undefined; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: ProbeAnnotation): void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => ProbeAnnotation; - // (undocumented) - isPointNearTool(element: HTMLDivElement, annotation: ProbeAnnotation, canvasCoords: Types_2.Point2, proximity: number): boolean; - // (undocumented) - static probeDefaults: { - supportedInteractionTypes: string[]; - configuration: { - shadow: boolean; - preventHandleOutsideImage: boolean; - getTextLines: typeof defaultGetTextLines; - handleRadius: string; - }; - }; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback(): void; -} - -// @public (undocumented) -function projectTo2D(polyline: Types_2.Point3[]): { - sharedDimensionIndex: any; - projectedPolyline: Types_2.Point2[]; -}; - -// @public (undocumented) -type PublicToolProps = SharedToolProp & { - name?: string; -}; - -// @public (undocumented) -class QuadraticBezier extends QuadraticSpline { - // (undocumented) - protected getTransformMatrix(): number[]; - // (undocumented) - hasTangentPoints(): boolean; -} - -// @public (undocumented) -abstract class QuadraticSpline extends Spline { - // (undocumented) - protected getLineSegments(): SplineLineSegment[]; - // (undocumented) - getPreviewCurveSegments(controlPointPreview: Types_2.Point2, closeSpline: boolean): SplineCurveSegment[]; - // (undocumented) - protected getSplineCurves(): SplineCurveSegment[]; -} - -declare namespace rectangle { - export { - distanceToPoint_4 as distanceToPoint - } -} - -// @public (undocumented) -interface RectangleROIAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats?: ROICachedStats | { - pointsInVolume?: Types_2.Point3[]; - projectionPoints?: Types_2.Point3[]; - projectionPointsImageIds?: string[]; - }; - }; -} - -// @public (undocumented) -interface RectangleROIStartEndThresholdAnnotation extends Annotation { - // (undocumented) - data: { - label: string; - startCoordinate: number; - endCoordinate: number; - cachedStats: { - pointsInVolume: Types_2.Point3[]; - projectionPoints: Types_2.Point3[][]; - projectionPointsImageIds: string[]; - statistics?: ROICachedStats; - }; - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - }; - // (undocumented) - metadata: { - cameraPosition?: Types_2.Point3; - cameraFocalPoint?: Types_2.Point3; - viewPlaneNormal?: Types_2.Point3; - viewUp?: Types_2.Point3; - annotationUID?: string; - FrameOfReferenceUID: string; - referencedImageId?: string; - toolName: string; - enabledElement: Types_2.IEnabledElement; - volumeId: string; - spacingInNormal: number; - }; -} - -// @public (undocumented) -export class RectangleROIStartEndThresholdTool extends RectangleROITool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => { - highlighted: boolean; - invalidated: boolean; - metadata: { - viewPlaneNormal: Types_2.Point3; - enabledElement: Types_2.IEnabledElement; - viewUp: Types_2.Point3; - FrameOfReferenceUID: string; - referencedImageId: any; - toolName: string; - volumeId: any; - spacingInNormal: number; - }; - data: { - label: string; - startCoordinate: number; - endCoordinate: number; - cachedStats: { - pointsInVolume: any[]; - projectionPoints: any[]; - projectionPointsImageIds: any[]; - statistics: ROICachedStats; - }; - handles: { - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - points: Types_2.Point3[]; - activeHandleIndex: any; - }; - labelmapUID: any; - }; - }; - // (undocumented) - _calculateCachedStatsTool(annotation: any, enabledElement: any): any; - // (undocumented) - _computePointsInsideVolume(annotation: any, targetId: any, imageVolume: any, enabledElement: any): void; - // (undocumented) - _computeProjectionPoints(annotation: RectangleROIStartEndThresholdAnnotation, imageVolume: Types_2.IImageVolume): void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _getCoordinateForViewplaneNormal(pos: vec3 | number, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - _getEndCoordinate(worldPos: Types_2.Point3, spacingInNormal: number, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - _getIndexOfCoordinatesForViewplaneNormal(viewPlaneNormal: Types_2.Point3): number; - // (undocumented) - _getStartCoordinate(worldPos: Types_2.Point3, viewPlaneNormal: Types_2.Point3): number | undefined; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -interface RectangleROIThresholdAnnotation extends Annotation { - // (undocumented) - data: { - label: string; - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - }; - }; - // (undocumented) - metadata: { - cameraPosition?: Types_2.Point3; - cameraFocalPoint?: Types_2.Point3; - viewPlaneNormal?: Types_2.Point3; - viewUp?: Types_2.Point3; - annotationUID?: string; - FrameOfReferenceUID: string; - referencedImageId?: string; - toolName: string; - enabledElement: Types_2.IEnabledElement; - volumeId: string; - }; -} - -// @public (undocumented) -export class RectangleROIThresholdTool extends RectangleROITool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => { - highlighted: boolean; - invalidated: boolean; - metadata: { - viewPlaneNormal: Types_2.Point3; - enabledElement: Types_2.IEnabledElement; - viewUp: Types_2.Point3; - FrameOfReferenceUID: string; - referencedImageId: any; - toolName: string; - volumeId: any; - }; - data: { - label: string; - handles: { - textBox: { - hasMoved: boolean; - worldPosition: any; - worldBoundingBox: any; - }; - points: Types_2.Point3[]; - activeHandleIndex: any; - }; - segmentationId: any; - }; - }; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -function rectangleROIThresholdVolumeByRange(annotationUIDs: string[], segmentationVolume: Types_2.IImageVolume, thresholdVolumeInformation: ThresholdInformation[], options: ThresholdOptions): Types_2.IImageVolume; - -// @public (undocumented) -export class RectangleROITool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => RectangleROIAnnotation; - // (undocumented) - _calculateCachedStats: (annotation: any, viewPlaneNormal: any, viewUp: any, renderingEngine: any, enabledElement: any) => any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _getRectangleImageCoordinates: (points: Array) => { - left: number; - top: number; - width: number; - height: number; - }; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: RectangleROIAnnotation, handle: ToolHandle) => void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - }) => RectangleROIAnnotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume: (index1: any, index2: any, dimensions: any) => boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: RectangleROIAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: RectangleROIAnnotation) => void; -} - -declare namespace rectangleROITool { - export { - getBoundsIJKFromRectangleAnnotations, - isAxisAlignedRectangle - } -} - -// @public (undocumented) -export class RectangleScissorsTool extends LabelmapBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - volumeId: string; - referencedVolumeId: string; - imageId: string; - annotation: Annotation; - segmentationId: string; - segmentIndex: number; - segmentsLocked: number[]; - segmentColor: [number, number, number, number]; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -interface ReferenceCursor extends Annotation { - // (undocumented) - data: { - handles: { - points: [Types_2.Point3]; - }; - }; -} - -// @public (undocumented) -export class ReferenceCursors extends AnnotationDisplayTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - createInitialAnnotation: (worldPos: Types_2.Point3, element: HTMLDivElement) => void; - // (undocumented) - _currentCanvasPosition: null | Types_2.Point2; - // (undocumented) - _currentCursorWorldPosition: null | Types_2.Point3; - // (undocumented) - _disableCursorEnabled: boolean; - // (undocumented) - _elementWithCursor: null | HTMLDivElement; - // (undocumented) - filterInteractableAnnotationsForElement(element: HTMLDivElement, annotations: Annotations): Annotations; - // (undocumented) - getActiveAnnotation(element: HTMLDivElement): null | Annotation; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - onCameraModified: (evt: Types_2.EventTypes.CameraModifiedEvent) => void; - // (undocumented) - onSetToolActive(): void; - // (undocumented) - onSetToolDisabled(): void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; - // (undocumented) - updateAnnotationPosition(element: HTMLDivElement, annotation: Annotation): void; - // (undocumented) - updateViewportImage(viewport: Types_2.IStackViewport | Types_2.IVolumeViewport): void; -} - -// @public (undocumented) -interface ReferenceLineAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - }; - }; -} - -// @public (undocumented) -export class ReferenceLinesTool extends AnnotationDisplayTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - editData: { - renderingEngine: Types_2.IRenderingEngine; - sourceViewportId: string; - annotation: ReferenceLineAnnotation; - } | null; - // (undocumented) - _init: () => void; - // (undocumented) - intersectInfiniteLines(line1Start: Types_2.Point2, line1End: Types_2.Point2, line2Start: Types_2.Point2, line2End: Types_2.Point2): number[]; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isInBound(point: number[], dimensions: Types_2.Point3): boolean; - // (undocumented) - isParallel(vec1: Types_2.Point3, vec2: Types_2.Point3): boolean; - // (undocumented) - isPerpendicular: (vec1: Types_2.Point3, vec2: Types_2.Point3) => boolean; - // (undocumented) - onCameraModified: (evt: Types_2.EventTypes.CameraModifiedEvent) => void; - // (undocumented) - onSetToolConfiguration: () => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class RegionSegmentPlusTool extends GrowCutBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - protected getGrowCutLabelmap(growCutData: any): Promise; - // (undocumented) - protected getRemoveIslandData(growCutData: RegionSegmentPlusToolData): RemoveIslandData; - // (undocumented) - protected growCutData: RegionSegmentPlusToolData | null; - // (undocumented) - preMouseDownCallback(evt: EventTypes_2.MouseDownActivateEventType): Promise; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -export class RegionSegmentTool extends GrowCutBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - protected getGrowCutLabelmap(growCutData: any): Promise; - // (undocumented) - protected growCutData: RegionSegmentToolData | null; - // (undocumented) - preMouseDownCallback(evt: EventTypes_2.MouseDownActivateEventType): Promise; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): void; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -function registerCursor(toolName: string, iconContent: string, viewBox: { - x: number; - y: number; -}): void; - -// @public (undocumented) -function removeAllSegmentationRepresentations(): void; - -// @public (undocumented) -function removeAllSegmentations(): void; - -// @public (undocumented) -function removeColorLUT(colorLUTIndex: number): void; - -// @public (undocumented) -function removeContourRepresentation(viewportId: string, segmentationId: string, immediate?: boolean): void; - -// @public (undocumented) -function removeContourSegmentationAnnotation(annotation: ContourSegmentationAnnotation): void; - -// @public (undocumented) -function removeEnabledElement(elementDisabledEvt: Types_2.EventTypes.ElementDisabledEvent): void; - -// @public (undocumented) -function removeLabelmapRepresentation(viewportId: string, segmentationId: string, immediate?: boolean): void; - -// @public (undocumented) -function removeSegment(segmentationId: string, segmentIndex: number, options?: { - setNextSegmentAsActive: boolean; -}): void; - -// @public (undocumented) -function removeSegmentation(segmentationId: string): void; - -// @public (undocumented) -function removeSegmentationRepresentation(viewportId: string, specifier: { - segmentationId: string; - type: SegmentationRepresentations; -}, immediate?: boolean): Array<{ - segmentationId: string; - type: SegmentationRepresentations; -}>; - -// @public (undocumented) -function removeSegmentationRepresentations(viewportId: string, specifier: { - segmentationId?: string; - type?: SegmentationRepresentations; -}, immediate?: boolean): Array<{ - segmentationId: string; - type: SegmentationRepresentations; -}>; - -// @public (undocumented) -function removeSurfaceRepresentation(viewportId: string, segmentationId: string, immediate?: boolean): void; - -// @public (undocumented) -export function removeTool(ToolClass: any): void; - -// @public (undocumented) -type RepresentationData = LabelmapSegmentationData | ContourSegmentationData | SurfaceSegmentationData; - -// @public (undocumented) -type RepresentationsData = { - [Enums.SegmentationRepresentations.Labelmap]?: LabelmapSegmentationData; - [Enums.SegmentationRepresentations.Contour]?: ContourSegmentationData; - [Enums.SegmentationRepresentations.Surface]?: SurfaceSegmentationData; -}; - -// @public (undocumented) -type RepresentationStyle = LabelmapStyle | ContourStyle | SurfaceStyle; - -// @public (undocumented) -function resetElementCursor(element: HTMLDivElement): void; - -// @public (undocumented) -function resetToGlobalStyle(): void; - -// @public (undocumented) -function restoreMemo(isUndo?: boolean): void; - -// @public (undocumented) -interface ROICachedStats { - // (undocumented) - [targetId: string]: { - Modality: string; - area: number; - areaUnit: string; - max: number; - mean: number; - stdDev: number; - }; -} - -// @public (undocumented) -function rotatePoints(rotationMatrix: number[], origin: number[], points: number[]): number[]; - -// @public (undocumented) -const roundNumber_2: typeof utilities_2.roundNumber; - -// @public (undocumented) -function runGrowCut(referenceVolumeId: string, labelmapVolumeId: string, options?: GrowCutOptions): Promise; - -// @public (undocumented) -function runGrowCutForBoundingBox(referencedVolumeId: string, boundingBoxInfo: BoundingBoxInfo, options?: GrowCutBoundingBoxOptions): Promise; - -// @public (undocumented) -function runGrowCutForSphere(referencedVolumeId: string, sphereInfo: SphereInfo, viewport: Types_2.IViewport, options?: GrowCutOptions): Promise; - -// @public (undocumented) -function runOneClickGrowCut(referencedVolumeId: string, worldPosition: Types_2.Point3, viewport: Types_2.IViewport, options?: GrowCutOneClickOptions): Promise; - -// @public (undocumented) -interface ScaleOverlayAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - }; - viewportId: string; - }; -} - -// @public (undocumented) -export class ScaleOverlayTool extends AnnotationDisplayTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - computeCanvasScaleCoordinates: (canvasSize: any, canvasCoordinates: any, vscaleBounds: any, hscaleBounds: any, location: any) => any; - // (undocumented) - computeEndScaleTicks: (canvasCoordinates: any, location: any) => { - endTick1: any[][]; - endTick2: any[][]; - }; - // (undocumented) - computeInnerScaleTicks: (scaleSize: number, location: string, annotationUID: string, leftTick: Types_2.Point2[], rightTick: Types_2.Point2[]) => { - tickIds: any[]; - tickUIDs: any[]; - tickCoordinates: any[]; - }; - // (undocumented) - computeScaleBounds: (canvasSize: any, horizontalReduction: any, verticalReduction: any, location: any) => { - height: any; - width: any; - }; - // (undocumented) - computeScaleSize: (worldWidthViewport: number, worldHeightViewport: number, location: string) => any; - // (undocumented) - computeWorldScaleCoordinates: (scaleSize: any, location: any, pointSet: any) => any; - // (undocumented) - editData: { - renderingEngine: Types_2.IRenderingEngine; - viewport: Types_2.IViewport; - annotation: ScaleOverlayAnnotation; - } | null; - // (undocumented) - _getTextLines(scaleSize: number): string[] | undefined; - // (undocumented) - _init: () => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - onCameraModified: (evt: Types_2.EventTypes.CameraModifiedEvent) => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -export class SculptorTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - protected activateModify(element: HTMLDivElement): void; - // (undocumented) - protected deactivateModify(element: HTMLDivElement): void; - // (undocumented) - protected interpolatePointsWithinMaxSpacing(i: number, points: Array, indicesToInsertAfter: Array, maxSpacing: number): void; - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - registeredShapes: Map; - // (undocumented) - registerShapes(shapeName: string, shapeClass: new () => T): void; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): void; - // (undocumented) - protected sculpt(eventData: any, points: Array): void; - // (undocumented) - setToolShape(toolShape: string): void; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -type Segment = { - segmentIndex: number; - label: string; - locked: boolean; - cachedStats: { - [key: string]: unknown; - }; - active: boolean; -}; - -// @public (undocumented) -type Segmentation = { - segmentationId: string; - label: string; - segments: { - [segmentIndex: number]: Segment; - }; - representationData: RepresentationsData; - cachedStats: { - [key: string]: unknown; - }; -}; - -declare namespace segmentation { - export { - removeSegmentationRepresentation, - removeContourRepresentation, - removeLabelmapRepresentation, - removeSurfaceRepresentation, - removeAllSegmentations, - removeSegmentation, - removeSegmentationRepresentations, - addLabelmapRepresentationToViewport, - addLabelmapRepresentationToViewportMap, - addSegmentationRepresentations, - removeAllSegmentationRepresentations, - addContourRepresentationToViewport, - addContourRepresentationToViewportMap, - addSurfaceRepresentationToViewport, - addSurfaceRepresentationToViewportMap, - addSegmentations, - updateSegmentations, - state_3 as state, - activeSegmentation, - segmentLocking, - config_2 as config, - segmentIndex, - triggerSegmentationEvents, - helpers, - removeSegment, - getLabelmapImageIds, - internalAddRepresentationData as addRepresentationData, - strategies, - segmentationStyle, - defaultSegmentationStateManager - } -} -export { segmentation } - -declare namespace segmentation_2 { - export { - thresholdVolumeByRange, - createMergedLabelmapForIndex, - createLabelmapVolumeForViewport, - rectangleROIThresholdVolumeByRange, - triggerSegmentationRender, - triggerSegmentationRenderBySegmentationId, - floodFill, - getBrushSizeForToolGroup, - setBrushSizeForToolGroup, - getBrushThresholdForToolGroup, - setBrushThresholdForToolGroup, - VolumetricCalculator, - thresholdSegmentationByRange, - contourAndFindLargestBidirectional, - createBidirectionalToolData, - segmentContourAction, - invalidateBrushCursor, - getUniqueSegmentIndices, - getSegmentIndexAtWorldPoint, - getSegmentIndexAtLabelmapBorder, - getHoveredContourSegmentationAnnotation, - getBrushToolInstances, - growCut, - LabelmapMemo, - IslandRemoval, - getOrCreateSegmentationVolume, - getStatistics, - validateLabelmap, - computeStackLabelmapFromVolume, - computeVolumeLabelmapFromStack - } -} - -// @public (undocumented) -type SegmentationAddedEventDetail = { - segmentationId: string; -}; - -// @public (undocumented) -type SegmentationAddedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type SegmentationDataModifiedEventDetail = { - segmentationId: string; - modifiedSlicesToUse?: number[]; - segmentIndex?: number; -}; - -// @public (undocumented) -type SegmentationDataModifiedEventType = Types_2.CustomEventType; - -// @public (undocumented) -export class SegmentationIntersectionTool extends AnnotationDisplayTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _init: () => void; - // (undocumented) - onCameraModified: (evt: Types_2.EventTypes.CameraModifiedEvent) => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -type SegmentationModifiedEventDetail = { - segmentationId: string; -}; - -// @public (undocumented) -type SegmentationModifiedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type SegmentationPublicInput = { - segmentationId: string; - representation: { - type: Enums.SegmentationRepresentations; - data?: RepresentationData; - }; - config?: { - segments?: { - [segmentIndex: number]: Partial; - }; - label?: string; - cachedStats?: { - [key: string]: unknown; - }; - }; -}; - -// @public (undocumented) -type SegmentationRemovedEventDetail = { - segmentationId: string; -}; - -// @public (undocumented) -type SegmentationRemovedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type SegmentationRenderedEventDetail = { - viewportId: string; - segmentationId: string; - type: string; -}; - -// @public (undocumented) -type SegmentationRenderedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type SegmentationRepresentation = LabelmapRepresentation | ContourRepresentation | SurfaceRepresentation; - -// @public (undocumented) -type SegmentationRepresentationModifiedEventDetail = { - segmentationId: string; - type: string; - viewportId: string; -}; - -// @public (undocumented) -type SegmentationRepresentationModifiedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type SegmentationRepresentationRemovedEventDetail = { - segmentationId: string; - type: string; - viewportId: string; -}; - -// @public (undocumented) -type SegmentationRepresentationRemovedEventType = Types_2.CustomEventType; - -// @public (undocumented) -enum SegmentationRepresentations { - // (undocumented) - Contour = "Contour", - // (undocumented) - Labelmap = "Labelmap", - // (undocumented) - Surface = "Surface" -} - -// @public (undocumented) -type SegmentationState = { - colorLUT: Types_2.ColorLUT[]; - segmentations: Segmentation[]; - viewportSegRepresentations: { - [viewportId: string]: Array; - }; -}; - -// @public (undocumented) -const segmentationStyle: SegmentationStyle; - -// @public (undocumented) -function segmentContourAction(element: HTMLDivElement, configuration: any): any; - -declare namespace segmentIndex { - export { - setActiveSegmentIndex, - getActiveSegmentIndex - } -} - -declare namespace segmentLocking { - export { - isSegmentIndexLocked, - setSegmentIndexLocked, - getLockedSegmentIndices - } -} - -// @public (undocumented) -export class SegmentSelectTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - mouseMoveCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - onSetToolActive: () => void; - // (undocumented) - onSetToolDisabled: () => void; - // (undocumented) - onSetToolEnabled: () => void; - // (undocumented) - static SelectMode: { - Inside: string; - Border: string; - }; - // (undocumented) - _setActiveSegment(evt?: EventTypes_2.InteractionEventType): void; - // (undocumented) - _setActiveSegmentForType(activeSegmentation: Segmentation, worldPoint: Types_2.Point3, viewport: Types_2.IStackViewport | Types_2.IVolumeViewport): void; - // (undocumented) - static toolName: any; -} - -declare namespace selection { - export { - setAnnotationSelected, - getAnnotationsSelected, - getAnnotationsSelectedByToolName, - getAnnotationsSelectedCount, - deselectAnnotation, - isAnnotationSelected - } -} - -// @public (undocumented) -function setActiveSegmentation(viewportId: string, segmentationId: string): void; - -// @public (undocumented) -function setActiveSegmentIndex(segmentationId: string, segmentIndex: number): void; - -// @public (undocumented) -function setAnnotationLocked(annotationUID: string, locked?: boolean): void; - -// @public (undocumented) -function setAnnotationSelected(annotationUID: string, selected?: boolean, preserveSelected?: boolean): void; - -// @public (undocumented) -function setAnnotationVisibility(annotationUID: string, visible?: boolean): void; - -// @public (undocumented) -function setAttributesIfNecessary(attributes: any, svgNode: any): void; - -// @public (undocumented) -function setBrushSizeForToolGroup(toolGroupId: string, brushSize: number, toolName?: string): void; - -// @public (undocumented) -function setBrushThresholdForToolGroup(toolGroupId: string, threshold: { - range: Types_2.Point2; - isDynamic: boolean; - dynamicRadius: number; -}): void; - -// @public (undocumented) -function setColorLUT(viewportId: string, segmentationId: string, colorLUTsIndex: number): void; - -// @public (undocumented) -function setCursorForElement(element: HTMLDivElement, cursorName: string): void; - -// @public (undocumented) -function _setElementCursor(element: HTMLDivElement, cursor: MouseCursor | null): void; - -// @public (undocumented) -function setNewAttributesIfValid(attributes: any, svgNode: any): void; - -// @public (undocumented) -function setRenderInactiveSegmentations(viewportId: string, renderInactiveSegmentations: boolean): void; - -// @public (undocumented) -function setSegmentationRepresentationVisibility(viewportId: string, specifier: { - segmentationId: string; - type?: SegmentationRepresentations; -}, visibility: boolean): void; - -// @public (undocumented) -function setSegmentIndexColor(viewportId: string, segmentationId: string, segmentIndex: number, color: Types_2.Color): void; - -// @public (undocumented) -function setSegmentIndexLocked(segmentationId: string, segmentIndex: number, locked?: boolean): void; - -// @public (undocumented) -function setSegmentIndexVisibility(viewportId: string, specifier: { - segmentationId: string; - type?: SegmentationRepresentations; -}, segmentIndex: number, visibility: boolean): void; - -// @public (undocumented) -function setStyle(specifier: SpecifierWithType, style: StyleForType): void; - -// @public (undocumented) -type SetToolBindingsType = { - bindings: IToolBinding[]; -}; - -// @public (undocumented) -function showAllAnnotations(): void; - -// @public (undocumented) -function smoothAnnotation(annotation: PlanarFreehandROIAnnotation, options?: SmoothOptions): boolean; - -// @public (undocumented) -type SphereInfo = { - center: Types_2.Point3; - radius: number; -}; - -// @public (undocumented) -export class SphereScissorsTool extends LabelmapBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - segmentIndex: number; - segmentsLocked: number[]; - segmentationId: string; - volumeId: string; - referencedVolumeId: string; - imageId: string; - toolGroupId: string; - segmentColor: [number, number, number, number]; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - centerCanvas?: Array; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => true; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -abstract class Spline implements ISpline { - constructor(props?: SplineProps); - // (undocumented) - get aabb(): Types_2.AABB2; - // (undocumented) - addControlPoint(point: Types_2.Point2): void; - // (undocumented) - addControlPointAtU(u: number): ControlPointInfo; - // (undocumented) - addControlPoints(points: Types_2.Point2[]): void; - // (undocumented) - clearControlPoints(): void; - // (undocumented) - get closed(): boolean; - set closed(closed: boolean); - // (undocumented) - containsPoint(point: Types_2.Point2): boolean; - // (undocumented) - protected get controlPoints(): Types_2.Point2[]; - // (undocumented) - deleteControlPointByIndex(index: number): boolean; - // (undocumented) - get fixedResolution(): boolean; - // (undocumented) - getClosestControlPoint(point: Types_2.Point2): ClosestControlPoint; - // (undocumented) - getClosestControlPointWithinDistance(point: Types_2.Point2, maxDist: number): ClosestControlPoint; - // (undocumented) - getClosestPoint(point: Types_2.Point2): ClosestSplinePoint; - // (undocumented) - getClosestPointOnControlPointLines(point: Types_2.Point2): ClosestPoint; - // (undocumented) - getControlPoints(): Types_2.Point2[]; - // (undocumented) - getPolylinePoints(): Types_2.Point2[]; - // (undocumented) - protected abstract getPreviewCurveSegments(controlPointPreview: Types_2.Point2, closeSpline: boolean): SplineCurveSegment[]; - // (undocumented) - getPreviewPolylinePoints(controlPointPreview: Types_2.Point2, closeDistance: number): Types_2.Point2[]; - // (undocumented) - protected abstract getSplineCurves(): SplineCurveSegment[]; - // (undocumented) - protected abstract getTransformMatrix(): number[]; - // (undocumented) - hasTangentPoints(): boolean; - // (undocumented) - get invalidated(): boolean; - protected set invalidated(invalidated: boolean); - // (undocumented) - isPointNearCurve(point: Types_2.Point2, maxDist: number): boolean; - // (undocumented) - get length(): number; - // (undocumented) - get numControlPoints(): number; - // (undocumented) - get resolution(): number; - set resolution(resolution: number); - // (undocumented) - setControlPoints(points: Types_2.Point2[]): void; - // (undocumented) - updateControlPoint(index: number, newControlPoint: Types_2.Point2): void; -} - -// @public (undocumented) -type SplineContourSegmentationAnnotation = SplineROIAnnotation & ContourSegmentationAnnotationData; - -// @public (undocumented) -export class SplineContourSegmentationTool extends SplineROITool { - constructor(toolProps: PublicToolProps); - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - static toolName: string; -} - -// @public (undocumented) -type SplineCurveSegment = { - controlPoints: { - p0: Types_2.Point2; - p1: Types_2.Point2; - p2: Types_2.Point2; - p3: Types_2.Point2; - }; - aabb: Types_2.AABB2; - length: number; - previousCurveSegmentsLength: number; - lineSegments: SplineLineSegment[]; -}; - -// @public (undocumented) -type SplineLineSegment = { - points: { - start: Types_2.Point2; - end: Types_2.Point2; - }; - aabb: Types_2.AABB2; - length: number; - previousLineSegmentsLength: number; -}; - -// @public (undocumented) -type SplineProps = { - resolution?: number; - fixedResolution?: boolean; - closed?: boolean; -}; - -// @public (undocumented) -type SplineROIAnnotation = ContourAnnotation & { - data: { - label?: string; - spline: { - type: string; - instance: ISpline; - resolution: number; - }; - cachedStats?: { - [targetId: string]: { - Modality: string; - area: number; - areaUnit: string; - }; - }; - }; -}; - -// @public (undocumented) -export class SplineROITool extends ContourSegmentationBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - static Actions: typeof SplineToolActions; - // (undocumented) - addControlPointCallback: (evt: EventTypes_2.InteractionEventType, annotation: SplineROIAnnotation) => void; - // (undocumented) - addNewAnnotation(evt: EventTypes_2.InteractionEventType): SplineROIAnnotation; - // (undocumented) - cancel(element: HTMLDivElement): string; - // (undocumented) - protected createAnnotation(evt: EventTypes_2.InteractionEventType): ContourAnnotation; - // (undocumented) - protected createInterpolatedSplineControl(annotation: any): void; - // (undocumented) - deleteControlPointCallback: (evt: EventTypes_2.InteractionEventType, annotation: SplineROIAnnotation) => void; - // (undocumented) - editData: { - annotation: SplineROIAnnotation; - viewportIdsToRender: Array; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - lastCanvasPoint?: Types_2.Point2; - contourHoleProcessingEnabled?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - fireChangeOnUpdate: { - annotationUID: string; - changeType: ChangeTypes; - contourHoleProcessingEnabled: boolean; - }; - // (undocumented) - handleSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: SplineROIAnnotation, handle: ToolHandle) => void; - // (undocumented) - static hydrate: (viewportId: string, points: Types_2.Point3[], options?: { - annotationUID?: string; - splineType?: SplineTypesEnum; - }) => SplineROIAnnotation; - // (undocumented) - protected isContourSegmentationTool(): boolean; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: SplineROIAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - _isSplineROIAnnotation(annotation: Annotation): annotation is SplineROIAnnotation; - // (undocumented) - protected renderAnnotationInstance(renderContext: AnnotationRenderContext): boolean; - // (undocumented) - static SplineTypes: typeof SplineTypesEnum; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: EventTypes_2.InteractionEventType, annotation: SplineROIAnnotation) => void; - // (undocumented) - triggerAnnotationCompleted: (annotation: SplineROIAnnotation, contourHoleProcessingEnabled: boolean) => void; - // (undocumented) - triggerAnnotationModified: (annotation: SplineROIAnnotation, enabledElement: Types_2.IEnabledElement, changeType?: ChangeTypes) => void; - // (undocumented) - triggerChangeEvent: (annotation: SplineROIAnnotation, enabledElement: Types_2.IEnabledElement, changeType: ChangeTypes, contourHoleProcessingEnabled: any) => void; -} - -declare namespace splines { - export { - BSpline, - CardinalSpline, - CatmullRomSpline, - CubicSpline, - LinearSpline, - QuadraticBezier, - QuadraticSpline, - Spline - } -} -export { splines } - -// @public (undocumented) -const stackContextPrefetch: { - enable: (element: any) => void; - disable: typeof disable_2; - getConfiguration: typeof getConfiguration_2; - setConfiguration: typeof setConfiguration_2; -}; - -// @public (undocumented) -const stackPrefetch: { - enable: typeof enable; - disable: typeof disable; - getConfiguration: typeof getConfiguration; - setConfiguration: typeof setConfiguration; -}; - -// @public (undocumented) -export class StackScrollTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - deltaY: number; - // (undocumented) - _dragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - _getPixelPerImage(viewport: any): number; - // (undocumented) - mouseDragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - mouseWheelCallback(evt: EventTypes_2.MouseWheelEventType): void; - // (undocumented) - _scroll(evt: EventTypes_2.MouseWheelEventType): void; - // (undocumented) - _scrollDrag(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback(evt: EventTypes_2.InteractionEventType): void; -} - -// @public (undocumented) -export let state: ICornerstoneTools3dState; - -// @public (undocumented) -const state_2: { - resetAnnotationManager: typeof resetAnnotationManager; - triggerAnnotationAddedForElement: typeof annotationStateHelpers.triggerAnnotationAddedForElement; - triggerAnnotationAddedForFOR: typeof annotationStateHelpers.triggerAnnotationAddedForFOR; - triggerAnnotationRemoved: typeof annotationStateHelpers.triggerAnnotationRemoved; - triggerAnnotationModified: typeof annotationStateHelpers.triggerAnnotationModified; - triggerAnnotationCompleted: typeof annotationStateHelpers.triggerAnnotationCompleted; - triggerContourAnnotationCompleted: typeof annotationStateHelpers.triggerContourAnnotationCompleted; - getAllAnnotations: typeof annotationState.getAllAnnotations; - getAnnotations: typeof annotationState.getAnnotations; - getParentAnnotation: typeof annotationState.getParentAnnotation; - getChildAnnotations: typeof annotationState.getChildAnnotations; - clearParentAnnotation: typeof annotationState.clearParentAnnotation; - addChildAnnotation: typeof annotationState.addChildAnnotation; - getNumberOfAnnotations: typeof annotationState.getNumberOfAnnotations; - addAnnotation: typeof annotationState.addAnnotation; - removeAnnotation: typeof annotationState.removeAnnotation; - removeAnnotations: typeof annotationState.removeAnnotations; - removeAllAnnotations: typeof annotationState.removeAllAnnotations; - setAnnotationManager: typeof annotationState.setAnnotationManager; - getAnnotationManager: typeof annotationState.getAnnotationManager; - invalidateAnnotation: typeof annotationState.invalidateAnnotation; - getAnnotation: typeof annotationState.getAnnotation; -}; - -declare namespace state_3 { - export { - getColorLUT, - getCurrentLabelmapImageIdForViewport, - getNextColorLUTIndex, - getSegmentation, - getSegmentations, - getStackSegmentationImageIdsForViewport, - getViewportIdsWithSegmentation, - getSegmentationRepresentation, - getSegmentationRepresentations, - removeColorLUT, - getViewportSegmentations, - removeSegmentation, - removeLabelmapRepresentation, - removeContourRepresentation, - removeSurfaceRepresentation, - removeSegmentationRepresentation, - removeAllSegmentationRepresentations, - removeAllSegmentations, - addColorLUT, - addSegmentations, - updateLabelmapSegmentationImageReferences, - getSegmentationRepresentationsBySegmentationId, - destroy_4 as destroy - } -} - -// @public (undocumented) -type Statistics = { - name: string; - label?: string; - value: number | number[]; - unit: null | string; - pointIJK?: Types_2.Point3; - pointLPS?: Types_2.Point3; -}; - -// @public (undocumented) -function stopClip(element: HTMLDivElement, options?: StopClipOptions): void; - -declare namespace store { - export { - addTool, - hasTool, - removeTool, - addEnabledElement, - removeEnabledElement, - cancelActiveManipulations, - svgNodeCache, - ToolGroupManager, - SynchronizerManager, - Synchronizer, - state - } -} -export { store } - -declare namespace strategies { - export { - fillInsideRectangle, - thresholdInsideRectangle, - fillInsideCircle, - fillOutsideCircle - } -} - -// @public (undocumented) -enum StrategyCallbacks { - // (undocumented) - AcceptPreview = "acceptPreview", - // (undocumented) - AddPreview = "addPreview", - // (undocumented) - ComputeInnerCircleRadius = "computeInnerCircleRadius", - // (undocumented) - CreateIsInThreshold = "createIsInThreshold", - // (undocumented) - EnsureImageVolumeFor3DManipulation = "ensureImageVolumeFor3DManipulation", - // (undocumented) - EnsureSegmentationVolumeFor3DManipulation = "ensureSegmentationVolumeFor3DManipulation", - // (undocumented) - Fill = "fill", - // (undocumented) - GetStatistics = "getStatistics", - // (undocumented) - Initialize = "initialize", - // (undocumented) - INTERNAL_setValue = "setValue", - // (undocumented) - Interpolate = "interpolate", - // (undocumented) - OnInteractionEnd = "onInteractionEnd", - // (undocumented) - OnInteractionStart = "onInteractionStart", - // (undocumented) - Preview = "preview", - // (undocumented) - RejectPreview = "rejectPreview", - // (undocumented) - StrategyFunction = "strategyFunction" -} - -declare namespace style { - export { - getStyle, - setStyle, - setRenderInactiveSegmentations, - getRenderInactiveSegmentations, - resetToGlobalStyle, - hasCustomStyle - } -} - -// @public (undocumented) -type StyleConfig = { - annotations?: { - [annotationUID: string]: AnnotationStyle; - }; - viewports?: { - [viewportId: string]: ToolStyleConfig; - }; - toolGroups?: { - [toolGroupId: string]: ToolStyleConfig; - }; - default: ToolStyleConfig; -}; - -// @public (undocumented) -type StyleSpecifier = { - viewportId?: string; - toolGroupId?: string; - toolName?: string; - annotationUID?: string; -}; - -// @public (undocumented) -function subtractPolylines(targetPolyline: Types_2.Point2[], sourcePolyline: Types_2.Point2[]): Types_2.Point2[][]; - -// @public (undocumented) -type SurfaceSegmentationData = { - geometryIds: Map; -}; - -// @public (undocumented) -type SurfaceStateStyles = {}; - -// @public (undocumented) -type SurfaceStyle = {}; - -// @public (undocumented) -type SVGCursorDescriptor = { - name?: string; - iconContent: string; - iconSize?: number; - viewBox: { - x: number; - y: number; - }; - mousePoint?: { - x: number; - y: number; - }; - mousePointerGroupString?: string; -}; - -// @public (undocumented) -type SVGDrawingHelper = { - svgLayerElement: HTMLDivElement; - svgNodeCacheForCanvas: Record; - getSvgNode: (cacheKey: string) => SVGGElement | undefined; - appendNode: (svgNode: SVGElement, cacheKey: string) => void; - setNodeTouched: (cacheKey: string) => void; - clearUntouched: () => void; -}; - -// @public (undocumented) -class SVGMouseCursor extends ImageMouseCursor { - constructor(url: string, x?: number, y?: number, name?: string | undefined, fallback?: MouseCursor | undefined); - // (undocumented) - static getDefinedCursor(name: string, pointer?: boolean, color?: string): MouseCursor; -} - -// @public (undocumented) -let svgNodeCache: {}; - -// @public (undocumented) -type SVGPoint_2 = { - x: number; - y: number; -}; - -// @public (undocumented) -enum Swipe { - // (undocumented) - DOWN = "DOWN", - // (undocumented) - LEFT = "LEFT", - // (undocumented) - RIGHT = "RIGHT", - // (undocumented) - UP = "UP" -} - -// @public (undocumented) -export class Synchronizer { - constructor(synchronizerId: string, eventName: string, eventHandler: ISynchronizerEventHandler, options?: SynchronizerOptions); - // (undocumented) - add(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - addSource(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - addTarget(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - destroy(): void; - // (undocumented) - getOptions(viewportId: string): Record | undefined; - // (undocumented) - getSourceViewports(): Array; - // (undocumented) - getTargetViewports(): Array; - // (undocumented) - hasSourceViewport(renderingEngineId: string, viewportId: string): boolean; - // (undocumented) - hasTargetViewport(renderingEngineId: string, viewportId: string): boolean; - // (undocumented) - id: string; - // (undocumented) - isDisabled(): boolean; - // (undocumented) - remove(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - removeSource(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - removeTarget(viewportInfo: Types_2.IViewportId): void; - // (undocumented) - setEnabled(enabled: boolean): void; - // (undocumented) - setOptions(viewportId: string, options?: Record): void; -} - -declare namespace SynchronizerManager { - export { - createSynchronizer, - destroy_2 as destroy, - getSynchronizer, - getSynchronizersForViewport, - getAllSynchronizers, - destroySynchronizer - } -} -export { SynchronizerManager } - -declare namespace synchronizers { - export { - createCameraPositionSynchronizer, - createPresentationViewSynchronizer, - createVOISynchronizer, - createZoomPanSynchronizer, - createImageSliceSynchronizer, - createStackImageSynchronizer, - createPresentationViewSynchronizer_2 as createSlabThicknessSynchronizer - } -} -export { synchronizers } - -// @public (undocumented) -type TextBoxHandle = { - hasMoved: boolean; - worldBoundingBox: { - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - }; - worldPosition: Types_2.Point3; -}; - -// @public (undocumented) -const thresholdInsideRectangle: (enabledElement: any, operationData: any) => unknown; - -// @public (undocumented) -function thresholdSegmentationByRange(segmentationVolume: Types_2.IImageVolume, segmentationIndex: number, thresholdVolumeInformation: ThresholdInformation[], overlapType: number): Types_2.IImageVolume; - -// @public (undocumented) -function thresholdVolumeByRange(segmentationVolume: Types_2.IImageVolume, thresholdVolumeInformation: ThresholdInformation[], options: ThresholdRangeOptions): Types_2.IImageVolume; - -// @public (undocumented) -function throttle(func: Function, wait?: number, options?: { - leading?: boolean; - trailing?: boolean; -}): Function; - -// @public (undocumented) -type ToolAction = { - method: string | ((evt: InteractionEventType, annotation: Annotation) => void); - bindings: SetToolBindingsType[]; -}; - -// @public (undocumented) -type ToolActivatedEventDetail = { - toolGroupId: string; - toolName: string; - toolBindingsOptions: SetToolBindingsType; -}; - -// @public (undocumented) -type ToolActivatedEventType = Types_2.CustomEventType; - -// @public (undocumented) -type ToolConfiguration = Record & { - statsCalculator?: Calculator; -}; - -// @public (undocumented) -interface ToolData { - // (undocumented) - dynamicCineEnabled?: boolean; - // (undocumented) - framesPerSecond: number; - // (undocumented) - frameTimeVector: number[] | undefined; - // (undocumented) - ignoreFrameTimeVector: boolean; - // (undocumented) - intervalId: number | undefined; - // (undocumented) - lastFrameTimeStamp: number | undefined; - // (undocumented) - loop: boolean; - // (undocumented) - reverse: boolean; - // (undocumented) - speed: number; - // (undocumented) - usingFrameTimeVector: boolean; -} - -// @public (undocumented) -class ToolGroup { - constructor(id: string); - // (undocumented) - addTool(toolName: string, configuration?: ToolConfiguration): void; - // (undocumented) - addToolInstance(toolName: string, parentClassName: string, configuration?: {}): void; - // (undocumented) - addViewport(viewportId: string, renderingEngineId?: string): void; - // (undocumented) - clone(newToolGroupId: any, fnToolFilter?: (toolName: string) => void): ToolGroup; - // (undocumented) - currentActivePrimaryToolName: string | null; - // (undocumented) - getActivePrimaryMouseButtonTool(): string; - // (undocumented) - getCurrentActivePrimaryToolName(): string; - // (undocumented) - getDefaultMousePrimary(): MouseBindings; - // (undocumented) - getDefaultPrimaryBindings(): IToolBinding[]; - // (undocumented) - getPrevActivePrimaryToolName(): string; - // (undocumented) - getToolConfiguration(toolName: string, configurationPath?: string): unknown; - // (undocumented) - getToolInstance(toolInstanceName: string): any; - // (undocumented) - getToolInstances(): Record; - // (undocumented) - getToolOptions(toolName: string): ToolOptionsType; - // (undocumented) - getViewportIds(): string[]; - // (undocumented) - getViewportsInfo(): Array; - // (undocumented) - hasTool(toolName: string): boolean; - // (undocumented) - id: string; - // (undocumented) - prevActivePrimaryToolName: string | null; - // (undocumented) - removeViewports(renderingEngineId: string, viewportId?: string): void; - // (undocumented) - restoreToolOptions: {}; - // (undocumented) - setActivePrimaryTool(toolName: string): void; - // (undocumented) - setActiveStrategy(toolName: string, strategyName: string): void; - // (undocumented) - _setCursorForViewports(cursor: MouseCursor): void; - // (undocumented) - setToolActive(toolName: string, toolBindingsOptions?: SetToolBindingsType): void; - // (undocumented) - setToolConfiguration(toolName: string, configuration: ToolConfiguration, overwrite?: boolean): boolean; - // (undocumented) - setToolDisabled(toolName: string): void; - // (undocumented) - setToolEnabled(toolName: string): void; - // (undocumented) - setToolMode(toolName: string, mode: ToolModes, options?: SetToolBindingsType): void; - // (undocumented) - setToolPassive(toolName: string, options?: { - removeAllBindings?: boolean | IToolBinding[]; - }): void; - // (undocumented) - setViewportsCursorByToolName(toolName: string, strategyName?: string): void; - // (undocumented) - _toolInstances: {}; - // (undocumented) - toolOptions: {}; - // (undocumented) - viewportsInfo: any[]; -} - -declare namespace ToolGroupManager { - export { - createToolGroup, - destroy_3 as destroy, - destroyToolGroup, - getToolGroup, - getToolGroupForViewport, - getAllToolGroups, - getToolGroupsWithToolName - } -} -export { ToolGroupManager } - -// @public (undocumented) -type ToolHandle = AnnotationHandle | TextBoxHandle; - -// @public (undocumented) -type ToolModeChangedEventDetail = { - toolGroupId: string; - toolName: string; - mode: ToolModes; - toolBindingsOptions?: SetToolBindingsType; -}; - -// @public (undocumented) -type ToolModeChangedEventType = Types_2.CustomEventType; - -// @public (undocumented) -enum ToolModes { - // (undocumented) - Active = "Active", - // (undocumented) - Disabled = "Disabled", - // (undocumented) - Enabled = "Enabled", - // (undocumented) - Passive = "Passive" -} - -// @public (undocumented) -type ToolOptionsType = { - bindings: IToolBinding[]; - mode: ToolModes; -}; - -// @public (undocumented) -type ToolProps = SharedToolProp; - -declare namespace ToolSpecificAnnotationTypes { - export { - ROICachedStats, - RectangleROIAnnotation, - ProbeAnnotation, - KeyImageAnnotation, - LengthAnnotation, - AdvancedMagnifyAnnotation, - CircleROIAnnotation, - SplineROIAnnotation, - SplineContourSegmentationAnnotation, - LivewireContourAnnotation, - LivewireContourSegmentationAnnotation, - EllipticalROIAnnotation, - BidirectionalAnnotation, - RectangleROIThresholdAnnotation, - RectangleROIStartEndThresholdAnnotation, - CircleROIStartEndThresholdAnnotation, - PlanarFreehandROIAnnotation, - PlanarFreehandContourSegmentationAnnotation, - InterpolationROIAnnotation, - ArrowAnnotation, - LabelAnnotation, - AngleAnnotation, - UltrasoundDirectionalAnnotation, - CobbAngleAnnotation, - ReferenceCursor, - ReferenceLineAnnotation, - ScaleOverlayAnnotation, - VideoRedactionAnnotation, - ContourAnnotation - } -} - -// @public (undocumented) -const toolStyle: ToolStyle; - -// @public (undocumented) -type ToolStyleConfig = { - [toolName: string]: AnnotationStyle; -} & { - global?: AnnotationStyle; -}; - -declare namespace touch { - export { - getMeanPoints, - getMeanTouchPoints, - copyPoints, - copyPointsList, - getDeltaDistanceBetweenIPoints, - getDeltaPoints, - getDeltaDistance, - getDeltaRotation - } -} - -// @public (undocumented) -type TouchDragEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & TouchPointsDetail; - -// @public (undocumented) -type TouchDragEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchEndEventDetail = NormalizedInteractionEventDetail & TouchPointsDetail & TouchCustomEventDetail; - -// @public (undocumented) -type TouchEndEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchPressEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & { - startPointsList: ITouchPoints[]; - lastPointsList: ITouchPoints[]; - startPoints: ITouchPoints; - lastPoints: ITouchPoints; -}; - -// @public (undocumented) -type TouchPressEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchStartActivateEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & TouchPointsDetail; - -// @public (undocumented) -type TouchStartActivateEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchStartEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & TouchPointsDetail; - -// @public (undocumented) -type TouchStartEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchSwipeEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & { - swipe: Swipe; -}; - -// @public (undocumented) -type TouchSwipeEventType = Types_2.CustomEventType; - -// @public (undocumented) -type TouchTapEventDetail = NormalizedInteractionEventDetail & TouchCustomEventDetail & { - currentPointsList: ITouchPoints[]; - currentPoints: ITouchPoints; - taps: number; -}; - -// @public (undocumented) -type TouchTapEventType = Types_2.CustomEventType; - -// @public (undocumented) -export class TrackballRotateTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - cleanUp: () => void; - // (undocumented) - _dragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - _getViewportsInfo: () => any[]; - // (undocumented) - _hasResolutionChanged: boolean; - // (undocumented) - mouseDragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - onSetToolActive: () => void; - // (undocumented) - onSetToolDisabled: () => void; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - _resizeObservers: Map; - // (undocumented) - rotateCamera: (viewport: any, centerWorld: any, axis: any, angle: any) => void; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _viewportAddedListener: (evt: any) => void; -} - -// @public (undocumented) -function triggerAnnotationRender(element: HTMLDivElement): void; - -// @public (undocumented) -function triggerAnnotationRenderForToolGroupIds(toolGroupIds: string[]): void; - -// @public (undocumented) -function triggerAnnotationRenderForViewportIds(viewportIdsToRender: string[]): void; - -// @public (undocumented) -function triggerEvent(el: EventTarget, type: string, detail?: unknown): boolean; - -// @public (undocumented) -function triggerSegmentationDataModified(segmentationId: string, modifiedSlicesToUse?: number[], segmentIndex?: number): void; - -declare namespace triggerSegmentationEvents { - export { - triggerSegmentationDataModified, - triggerSegmentationModified, - triggerSegmentationRemoved, - triggerSegmentationRepresentationModified, - triggerSegmentationRepresentationRemoved - } -} - -// @public (undocumented) -function triggerSegmentationModified(segmentationId: string): void; - -// @public (undocumented) -function triggerSegmentationRemoved(segmentationId: string): void; - -// @public (undocumented) -function triggerSegmentationRender(viewportId?: string): void; - -// @public (undocumented) -function triggerSegmentationRenderBySegmentationId(segmentationId?: string): void; - -// @public (undocumented) -function triggerSegmentationRepresentationModified(viewportId: string, segmentationId: string, type?: SegmentationRepresentations): void; - -// @public (undocumented) -function triggerSegmentationRepresentationRemoved(viewportId: string, segmentationId: string, type: SegmentationRepresentations): void; - -declare namespace Types { - export { - Annotation, - Annotations, - ContourAnnotationData, - ContourAnnotation, - ContourSegmentationAnnotationData, - ContourSegmentationAnnotation, - BidirectionalData, - CanvasCoordinates, - IAnnotationManager, - InterpolationViewportData, - ImageInterpolationData, - GroupSpecificAnnotations, - AnnotationState, - AnnotationStyle_2 as AnnotationStyle, - ToolSpecificAnnotationTypes, - AnnotationGroupSelector, - AnnotationRenderContext, - PlanarBoundingBox, - ToolProps, - PublicToolProps, - ToolConfiguration, - EventTypes_2 as EventTypes, - IPoints, - ITouchPoints, - IDistance, - IToolBinding, - SetToolBindingsType, - ToolOptionsType, - InteractionTypes, - ToolAction, - ToolGroup as IToolGroup, - IToolClassReference, - ISynchronizerEventHandler, - ToolHandle, - AnnotationHandle, - TextBoxHandle, - Segmentation, - SegmentationRepresentation, - SegmentationState, - RepresentationData, - RepresentationsData, - SVGCursorDescriptor, - SVGPoint_2 as SVGPoint, - CINETypes, - BoundsIJK_2 as BoundsIJK, - SVGDrawingHelper, - FloodFillResult, - FloodFillGetter, - FloodFillOptions, - ContourSegmentationData, - ISculptToolShape, - Statistics, - NamedStatistics, - LabelmapToolOperationData, - LabelmapToolOperationDataStack, - LabelmapToolOperationDataVolume, - CardinalSplineProps, - ClosestControlPoint, - ClosestPoint, - ClosestSplinePoint, - ControlPointInfo, - ISpline, - SplineCurveSegment, - SplineLineSegment, - SplineProps, - IBaseTool, - RepresentationStyle, - Segment, - SegmentationPublicInput, - LabelmapStyle, - ContourStyle, - SurfaceStyle, - SurfaceSegmentationData, - SurfaceStateStyles, - LabelmapSegmentationData, - LabelmapSegmentationDataStack, - LabelmapSegmentationDataVolume, - BaseLabelmapStyle, - InactiveLabelmapStyle - } -} -export { Types } - -declare namespace Types_3 { - export { - ColorbarCommonProps, - ColorbarProps, - ColorbarImageRange, - ColorbarVOIRange, - ColorbarSize, - ColorbarTicksProps, - ColorbarTicksStyle, - ViewportColorbarProps - } -} - -// @public (undocumented) -interface UltrasoundDirectionalAnnotation extends Annotation { - // (undocumented) - data: { - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - textBox: { - hasMoved: boolean; - worldPosition: Types_2.Point3; - worldBoundingBox: { - topLeft: Types_2.Point3; - topRight: Types_2.Point3; - bottomLeft: Types_2.Point3; - bottomRight: Types_2.Point3; - }; - }; - }; - label: string; - cachedStats: { - [targetId: string]: { - xValues: number[]; - yValues: number[]; - units: string[]; - isHorizontal: boolean; - isUnitless: boolean; - }; - }; - }; -} - -// @public (undocumented) -export class UltrasoundDirectionalTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _activateModify: (element: HTMLDivElement) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => UltrasoundDirectionalAnnotation; - // (undocumented) - _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any; - // (undocumented) - cancel: (element: HTMLDivElement) => string; - // (undocumented) - _deactivateDraw: (element: HTMLDivElement) => void; - // (undocumented) - _deactivateModify: (element: HTMLDivElement) => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - handleIndex?: number; - movingTextBox?: boolean; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: UltrasoundDirectionalAnnotation, handle: ToolHandle): void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - isPointNearTool: (element: HTMLDivElement, annotation: UltrasoundDirectionalAnnotation, canvasCoords: Types_2.Point2, proximity: number) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - startedDrawing: boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback(evt: EventTypes_2.InteractionEventType, annotation: Annotation, interactionType: InteractionTypes, canvasCoords?: Types_2.Point2): void; -} - -// @public (undocumented) -function unlockAllAnnotations(): void; - -// @public (undocumented) -function updateContourPolyline(annotation: ContourAnnotation, polylineData: { - points: Types_2.Point2[]; - closed?: boolean; - targetWindingDirection?: ContourWindingDirection; -}, transforms: { - canvasToWorld: (point: Types_2.Point2) => Types_2.Point3; - worldToCanvas: (point: Types_2.Point3) => Types_2.Point2; -}, options?: { - updateWindingDirection?: boolean; - decimate?: { - enabled?: boolean; - epsilon?: number; - }; -}): void; - -// @public (undocumented) -function updateLabelmapSegmentationImageReferences(viewportId: string, segmentationId: string): string | undefined; - -// @public (undocumented) -function updateSegmentations(segmentationUpdateArray: { - segmentationId: string; - payload: Partial; -}[], suppressEvents?: boolean): void; - -// @public (undocumented) -function updateVolumeFromTimeData(dynamicVolume: Types_2.IDynamicImageVolume, operation: Enums_2.GenerateImageType, options: { - dimensionGroupNumbers?: number[]; - frameNumbers?: number[]; - targetVolume: Types_2.IImageVolume; -}): void; - -declare namespace utilities { - export { - math, - planar_2 as planar, - viewportFilters, - drawing_2 as drawing, - debounce, - dynamicVolume, - throttle, - orientation_2 as orientation, - isObject, - touch, - triggerEvent, - calibrateImageSpacing, - getCalibratedLengthUnitsAndScale, - getCalibratedProbeUnitsAndValue, - getCalibratedAspect, - getPixelValueUnits, - getPixelValueUnitsImageId, - segmentation_2 as segmentation, - contours, - triggerAnnotationRenderForViewportIds, - triggerAnnotationRenderForToolGroupIds, - triggerAnnotationRender, - getSphereBoundsInfo, - getAnnotationNearPoint, - getViewportForAnnotation, - getAnnotationNearPointOnEnabledElement, - viewport, - cine, - boundingBox, - rectangleROITool, - planarFreehandROITool, - stackPrefetch, - stackContextPrefetch, - roundNumber_2 as roundNumber, - pointToString, - polyDataUtils, - voi, - AnnotationMultiSlice, - contourSegmentation, - annotationHydration, - getClosestImageIdForStackViewport, - pointInSurroundingSphereCallback, - normalizeViewportPlane, - IslandRemoval, - geometricSurfaceUtils - } -} -export { utilities } - -// @public (undocumented) -function validate(segmentationRepresentationData: LabelmapSegmentationData): void; - -declare namespace validateLabelmap { - export { - validatePublic, - validate - } -} - -// @public (undocumented) -function validatePublic(segmentationInput: SegmentationPublicInput): void; - -declare namespace vec2 { - export { - findClosestPoint, - clip_2 as liangBarksyClip - } -} - -// @public (undocumented) -interface VideoRedactionAnnotation extends Annotation { - // (undocumented) - data: { - invalidated: boolean; - handles: { - points: Types_2.Point3[]; - activeHandleIndex: number | null; - }; - cachedStats: { - [key: string]: unknown; - }; - active: boolean; - }; - // (undocumented) - metadata: { - viewPlaneNormal: Types_2.Point3; - viewUp: Types_2.Point3; - FrameOfReferenceUID: string; - referencedImageId: string; - toolName: string; - }; -} - -// @public (undocumented) -export class VideoRedactionTool extends AnnotationTool { - constructor(toolConfiguration?: {}); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: (element: any) => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => VideoRedactionAnnotation; - // (undocumented) - _calculateCachedStats: (annotation: any, viewPlaneNormal: any, viewUp: any, renderingEngine: any, enabledElement: any) => any; - // (undocumented) - cancel(element: any): any; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: (element: any) => void; - // (undocumented) - _dragCallback: (evt: any) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportUIDsToRender: string[]; - handleIndex?: number; - newAnnotation?: boolean; - hasMoved?: boolean; - } | null; - // (undocumented) - _endCallback: (evt: any) => void; - // (undocumented) - getHandleNearImagePoint: (element: any, annotation: any, canvasCoords: any, proximity: any) => any; - // (undocumented) - _getImageVolumeFromTargetUID(targetUID: any, renderingEngine: any): { - imageVolume: any; - viewport: any; - }; - // (undocumented) - _getRectangleImageCoordinates: (points: Array) => { - left: number; - top: number; - width: number; - height: number; - }; - // (undocumented) - _getTargetStackUID(viewport: any): string; - // (undocumented) - _getTargetVolumeUID: (scene: any) => any; - // (undocumented) - handleSelectedCallback: (evt: any, annotation: any, handle: any, interactionType?: string) => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isHandleOutsideImage: boolean; - // (undocumented) - _isInsideVolume: (index1: any, index2: any, dimensions: any) => boolean; - // (undocumented) - isPointNearTool: (element: any, annotation: any, canvasCoords: any, proximity: any) => boolean; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - _throttledCalculateCachedStats: Function; - // (undocumented) - static toolName: string; - // (undocumented) - toolSelectedCallback: (evt: any, annotation: any, interactionType?: string) => void; -} - -declare namespace viewport { - export { - isViewportPreScaled - } -} - -// @public (undocumented) -class ViewportColorbar extends Colorbar { - constructor(props: ViewportColorbarProps); - // (undocumented) - destroy(): void; - // (undocumented) - get element(): HTMLDivElement; - // (undocumented) - get enabledElement(): Types_2.IEnabledElement; - // (undocumented) - protected getVOIMultipliers(): [number, number]; - // (undocumented) - protected onVoiChange(voiRange: ColorbarVOIRange): void; -} - -// @public (undocumented) -type ViewportColorbarProps = ColorbarProps & { - element: HTMLDivElement; - volumeId?: string; -}; - -declare namespace viewportFilters { - export { - filterViewportsWithToolEnabled, - filterViewportsWithFrameOfReferenceUID, - getViewportIdsWithToolToRender, - filterViewportsWithParallelNormals - } -} - -declare namespace visibility { - export { - setAnnotationVisibility, - showAllAnnotations, - isAnnotationVisible, - checkAndSetAnnotationVisibility - } -} - -declare namespace visibility_2 { - export { - setSegmentationRepresentationVisibility, - getSegmentationRepresentationVisibility, - setSegmentIndexVisibility, - getSegmentIndexVisibility, - getHiddenSegmentIndices - } -} - -declare namespace voi { - export { - colorbar, - windowLevel_2 as windowLevel - } -} - -// @public (undocumented) -export class VolumeRotateTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _configuration: unknown; - // (undocumented) - mouseWheelCallback(evt: MouseWheelEventType): void; - // (undocumented) - static toolName: any; -} - -// @public (undocumented) -class VolumetricCalculator extends BasicStatsCalculator_2 { - // (undocumented) - static getStatistics(options: { - spacing?: number; - unit?: string; - }): NamedStatistics; - // (undocumented) - static statsCallback(data: { - value: number | Types_2.RGB; - pointLPS?: Types_2.Point3; - pointIJK?: Types_2.Point3; - }): void; -} - -// @public (undocumented) -export class WholeBodySegmentTool extends GrowCutBaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - protected getGrowCutLabelmap(growCutData: any): Promise; - // (undocumented) - protected getRemoveIslandData(): RemoveIslandData; - // (undocumented) - protected growCutData: WholeBodySegmentToolData | null; - // (undocumented) - preMouseDownCallback(evt: EventTypes_2.MouseDownActivateEventType): Promise; - // (undocumented) - renderAnnotation(enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper): void; - // (undocumented) - static toolName: any; -} - -declare namespace windowLevel_2 { - export { - getLuminanceFromRegion, - calculateMinMaxMean, - extractWindowLevelRegionToolData - } -} - -// @public (undocumented) -export class WindowLevelRegionTool extends AnnotationTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - _activateDraw: (element: any) => void; - // (undocumented) - _activateModify: () => void; - // (undocumented) - addNewAnnotation: (evt: EventTypes_2.InteractionEventType) => Annotation; - // (undocumented) - applyWindowLevelRegion: (annotation: any, element: any) => void; - // (undocumented) - cancel: () => void; - // (undocumented) - _deactivateDraw: (element: any) => void; - // (undocumented) - _deactivateModify: () => void; - // (undocumented) - _dragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - editData: { - annotation: Annotation; - viewportIdsToRender: string[]; - } | null; - // (undocumented) - _endCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - handleSelectedCallback: () => void; - // (undocumented) - isDrawing: boolean; - // (undocumented) - isPointNearTool: () => any; - // (undocumented) - renderAnnotation: (enabledElement: Types_2.IEnabledElement, svgDrawingHelper: SVGDrawingHelper) => boolean; - // (undocumented) - static toolName: any; - // (undocumented) - toolSelectedCallback: () => void; -} - -// @public (undocumented) -export class WindowLevelTool extends BaseTool { - constructor(toolProps?: {}, defaultToolProps?: { - supportedInteractionTypes: string[]; - }); - // (undocumented) - _getImageDynamicRangeFromMiddleSlice: (scalarData: any, dimensions: any) => number; - // (undocumented) - _getImageDynamicRangeFromViewport(viewport: any): number; - // (undocumented) - _getMultiplierFromDynamicRange(viewport: any, volumeId: any): number; - // (undocumented) - getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper }: { - viewport: any; - deltaPointsCanvas: any; - volumeId: any; - lower: any; - upper: any; - }): { - lower: number; - upper: number; - }; - // (undocumented) - getPTScaledNewRange({ deltaPointsCanvas, lower, upper, clientHeight, viewport, volumeId, isPreScaled, }: { - deltaPointsCanvas: any; - lower: any; - upper: any; - clientHeight: any; - viewport: any; - volumeId: any; - isPreScaled: any; - }): { - lower: any; - upper: any; - }; - // (undocumented) - mouseDragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback(evt: EventTypes_2.InteractionEventType): void; -} - -// @public (undocumented) -export class ZoomTool extends BaseTool { - constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps); - // (undocumented) - dirVec: Types_2.Point3; - // (undocumented) - _dragCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - _dragParallelProjection: (evt: EventTypes_2.InteractionEventType, viewport: Types_2.IStackViewport | Types_2.IVolumeViewport, camera: Types_2.ICamera, pinch?: boolean) => void; - // (undocumented) - _dragPerspectiveProjection: (evt: EventTypes_2.InteractionEventType, viewport: Types_2.IStackViewport | Types_2.IVolumeViewport, camera: Types_2.ICamera, pinch?: boolean) => void; - // (undocumented) - initialMousePosWorld: Types_2.Point3; - // (undocumented) - mouseDragCallback: (evt: EventTypes_2.InteractionEventType) => void; - // (undocumented) - _panCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - _pinchCallback(evt: EventTypes_2.InteractionEventType): void; - // (undocumented) - preMouseDownCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - preTouchStartCallback: (evt: EventTypes_2.InteractionEventType) => boolean; - // (undocumented) - static toolName: any; - // (undocumented) - touchDragCallback: (evt: EventTypes_2.InteractionEventType) => void; -} - -// (No @packageDocumentation comment for this package) - -``` diff --git a/package.json b/package.json index a1a157534..c02a47d5f 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,7 @@ "build": "npx lerna run build --stream && npx lerna run build:loader", "build:esm": "npx lerna run build:esm --stream", "watch": "npx lerna watch -- lerna run build --scope=$LERNA_PACKAGE_NAME --include-dependents", - "build:update-api:ai": "cd packages/ai && npm run build:update-api", - "build:update-api:labelmap-interpolation": "cd packages/labelmap-interpolation && npm run build:update-api", - "build:update-api:polymorphic-segmentation": "cd packages/polymorphic-segmentation && npm run build:update-api", - "build:update-api:core": "cd packages/core && npm run build:update-api", - "build:update-api:tools": "cd packages/tools && npm run build:update-api", - "build:update-api:nifti": "cd packages/nifti-volume-loader && npm run build:update-api", - "build:update-api:dicomImageLoader": "cd packages/dicomImageLoader && npm run build:update-api", - "build:update-api": "npm run build && npm run build:update-api:ai && npm run build:update-api:core && npm run build:update-api:tools && npm run build:update-api:nifti && npm run build:update-api:dicomImageLoader", + "build:update-api": "echo not needed anymore", "clean": "npx lerna run clean --stream", "clean:deep": "npx lerna run clean:deep --stream", "example": "node ./utils/ExampleRunner/example-runner-cli.js", @@ -40,7 +33,7 @@ "docs:watch": "npx lerna run docs:watch", "preinstall": "node preinstall.js", "prepare": "husky", - "commit:prepare": "yarn build:update-api && yarn test:ci && yarn test:unit", + "commit:prepare": "yarn test:ci && yarn test:unit", "start": "yarn run dev", "test:e2e:ci": "npx playwright test", "test:e2e:ui": "npx playwright test --ui", diff --git a/packages/adapters/api-extractor.json b/packages/adapters/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/adapters/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/ai/api-extractor.json b/packages/ai/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/ai/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/ai/package.json b/packages/ai/package.json index 7ecea9c0a..ba339d88a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -28,7 +28,6 @@ "build:esm:watch": "tsc --project ./tsconfig.json --watch", "dev": "tsc --project ./tsconfig.json --watch", "build:all": "yarn run build:esm", - "build:update-api": "yarn run build:esm && api-extractor run --local", "start": "tsc --project ./tsconfig.json --watch", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", "lint": "eslint --fix .", diff --git a/packages/core/api-extractor.json b/packages/core/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/core/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/core/package.json b/packages/core/package.json index 80eec62b0..898cb50f7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -63,7 +63,6 @@ "dev": "tsc --project ./tsconfig.json --watch", "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", - "build:update-api": "yarn run build:esm && api-extractor run --local", "prepublishOnly": "yarn run build" }, "dependencies": { diff --git a/packages/core/src/cache/classes/Surface.ts b/packages/core/src/cache/classes/Surface.ts index a3e2bb196..b97a8383a 100644 --- a/packages/core/src/cache/classes/Surface.ts +++ b/packages/core/src/cache/classes/Surface.ts @@ -15,6 +15,7 @@ export class Surface { private _polys: number[]; private _segmentIndex: number; private _centroid: Point3; + private _visible: boolean; /** * Creates an instance of Surface. @@ -29,6 +30,7 @@ export class Surface { this._segmentIndex = props.segmentIndex; this.sizeInBytes = this._getSizeInBytes(); this._updateCentroid(); + this._visible = true; } /** @@ -120,6 +122,21 @@ export class Surface { return this._segmentIndex; } + /** + * Gets the visibility of the surface. + */ + get visible(): boolean { + return this._visible; + } + + /** + * Sets the visibility of the surface. + * @param {boolean} visible - The new visibility for the surface. + */ + set visible(visible: boolean) { + this._visible = visible; + } + /** * Gets the centroid of the surface. * @returns {Point3} The centroid of the surface. diff --git a/packages/dicomImageLoader/api-extractor.json b/packages/dicomImageLoader/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/dicomImageLoader/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index ec6a3c9c6..2d4bb1c64 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -76,7 +76,6 @@ "clean:deep": "yarn run clean && shx rm -rf node_modules", "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", - "build:update-api": "yarn run build:esm && api-extractor run --local", "cm": "npx git-cz", "clean:dist": "shx rm -rf dist", "clean:docs": "shx rm -rf documentation", diff --git a/packages/docs/docs/contribute/update-api.md b/packages/docs/docs/contribute/update-api.md deleted file mode 100644 index 8bbb78bd4..000000000 --- a/packages/docs/docs/contribute/update-api.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: update-api ---- - -# API Updating - -We have adopted the [api-extractor](https://api-extractor.com/) tool to extract the public API from the codebase. -Having a consistent API is the key to making our library easy to use and build upon; therefore, -for each Pull Request (PR) we extract the API for the PR and compare it to the API of the base branch. - -If you have unintentionally changed the public API of the library, one of our checks in Github would -catch it and notify you by an Error. - -If the change to the API is intentional, you need to run `yarn run build:update-api` to update the API. -This will create set of new API summary files (located at `common/reviews/api/*`) and you need to add and commit them -with your changes, in order for the Error to be fixed. diff --git a/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md b/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md index f398c4300..cd1a20000 100644 --- a/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md +++ b/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md @@ -13,9 +13,6 @@ import TabItem from '@theme/TabItem'; We have removed all dependency cycles in the library, ensuring it is now free of any such issues. To maintain this, we have added rules in our linters that will catch any dependency cycles in pull requests during continuous integration. Additionally, you can run `yarn run format-check` to ensure that the formatting is correct and to check for dependencies as well. -### Published APIs - -We have now published the APIs for the DICOM Image Loader and Nifti Volume Loader. So in creating your PRs don't forget to run `yarn run build:update-api` and include the generated files in your PR. ### Karma tests diff --git a/packages/docs/package.json b/packages/docs/package.json index c336754b9..b0bf942d1 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "3.0.0-beta.5", + "version": "3.0.0", "private": true, "repository": "https://github.com/cornerstonejs/cornerstone3D", "scripts": { diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index 1ae328840..43b8fab24 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -251,7 +251,6 @@ module.exports = { collapsed: true, items: [ 'contribute/pull-request', - 'contribute/update-api', 'contribute/documentation', 'contribute/playwright-tests', 'contribute/karma-tests', diff --git a/packages/labelmap-interpolation/api-extractor.json b/packages/labelmap-interpolation/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/labelmap-interpolation/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 50df07596..25e67cc3d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -33,7 +33,6 @@ "lint": "eslint --fix .", "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", - "build:update-api": "yarn run build:esm && api-extractor run --local", "prepublishOnly": "yarn clean && yarn build" }, "repository": { diff --git a/packages/nifti-volume-loader/api-extractor.json b/packages/nifti-volume-loader/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/nifti-volume-loader/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4b38c4e9c..419014bea 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -53,7 +53,6 @@ "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", "copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" dist/esm", - "build:update-api": "yarn run build:esm && api-extractor run --local", "prepublishOnly": "yarn run build", "webpack:watch": "webpack --mode development --progress --watch --config ./.webpack/webpack.dev.js" }, diff --git a/packages/polymorphic-segmentation/api-extractor.json b/packages/polymorphic-segmentation/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/polymorphic-segmentation/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a4a1632e3..57c848026 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -32,7 +32,6 @@ "lint": "eslint --fix .", "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", - "build:update-api": "yarn run build:esm && api-extractor run --local", "prepublishOnly": "yarn clean && yarn build" }, "repository": { diff --git a/packages/tools/api-extractor.json b/packages/tools/api-extractor.json deleted file mode 100644 index 4ddb5f44d..000000000 --- a/packages/tools/api-extractor.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../api-extractor.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/dist/esm/index.d.ts", - "apiReport": { - "reportFileName": ".api.md", - "reportFolder": "../../common/reviews/api" - } -} diff --git a/packages/tools/package.json b/packages/tools/package.json index 5f329dec4..7f48f3b0d 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -89,7 +89,6 @@ "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", "clean:deep": "yarn run clean && shx rm -rf node_modules", "dev": "tsc --project ./tsconfig.json --watch", - "build:update-api": "yarn run build:esm && api-extractor run --local", "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn run build", diff --git a/packages/tools/src/stateManagement/segmentation/helpers/getSegmentationActor.ts b/packages/tools/src/stateManagement/segmentation/helpers/getSegmentationActor.ts index 0c088d69f..845eb904a 100644 --- a/packages/tools/src/stateManagement/segmentation/helpers/getSegmentationActor.ts +++ b/packages/tools/src/stateManagement/segmentation/helpers/getSegmentationActor.ts @@ -76,11 +76,12 @@ export function getSurfaceActorEntry( segmentationId: string, segmentIndex?: number | string ) { - return getActorEntry(viewportId, segmentationId, (actor) => - // @ts-expect-error - actor.representationUID?.startsWith( + return getActorEntry( + viewportId, + segmentationId, + (actor) => + actor.representationUID === getSurfaceRepresentationUID(segmentationId, segmentIndex) - ) ); } diff --git a/packages/tools/src/tools/displayTools/Surface/addOrUpdateSurfaceToElement.ts b/packages/tools/src/tools/displayTools/Surface/addOrUpdateSurfaceToElement.ts index 24595b445..7e4764f70 100644 --- a/packages/tools/src/tools/displayTools/Surface/addOrUpdateSurfaceToElement.ts +++ b/packages/tools/src/tools/displayTools/Surface/addOrUpdateSurfaceToElement.ts @@ -25,7 +25,14 @@ function addOrUpdateSurfaceToElement( const surfaceActor = surfaceActorEntry?.actor as Types.Actor; + const isVisible = surface.visible; + if (surfaceActor) { + surfaceActor.setVisibility(isVisible); + + if (!isVisible) { + return; + } // we already have an actor for this surface, we just need to update it // Todo: figure out if the surface configuration has changed diff --git a/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts b/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts index de06cfb33..2fbf737c8 100644 --- a/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts +++ b/packages/tools/src/tools/displayTools/Surface/surfaceDisplay.ts @@ -13,6 +13,7 @@ import { getSegmentation } from '../../../stateManagement/segmentation/getSegmen import { getColorLUT } from '../../../stateManagement/segmentation/getColorLUT'; import { getPolySeg } from '../../../config'; import { computeAndAddRepresentation } from '../../../utilities/segmentation/computeAndAddRepresentation'; +import { internalGetHiddenSegmentIndices } from '../../../stateManagement/segmentation/helpers/internalGetHiddenSegmentIndices'; /** * It removes a segmentation representation from the tool group's viewports and @@ -55,7 +56,7 @@ async function render( viewport: Types.IVolumeViewport | Types.IStackViewport, representation: SegmentationRepresentation ): Promise { - const { segmentationId } = representation; + const { segmentationId, type } = representation; const segmentation = getSegmentation(segmentationId); @@ -124,10 +125,17 @@ async function render( } const segmentIndex = geometry.data.segmentIndex; + const hiddenSegments = internalGetHiddenSegmentIndices(viewport.id, { + segmentationId, + type, + }); + const isHidden = hiddenSegments.has(segmentIndex); + const surface = geometry.data as Types.ISurface; const color = colorLUT[segmentIndex]; surface.color = color.slice(0, 3) as Types.Point3; + surface.visible = !isHidden; surfaces.push(surface); addOrUpdateSurfaceToElement( From cd299e40723fb94a6f2568a8008935d8e01ff4f4 Mon Sep 17 00:00:00 2001 From: Adnane Belmadiaf Date: Mon, 3 Mar 2025 18:18:39 +0100 Subject: [PATCH 36/48] fix(CrosshairsTool): support HPDI screens in CrosshairsTool (#1824) fix #1822 --- packages/tools/src/tools/CrosshairsTool.ts | 58 ++++++++++++---------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/packages/tools/src/tools/CrosshairsTool.ts b/packages/tools/src/tools/CrosshairsTool.ts index 869dabb0d..c55a37554 100644 --- a/packages/tools/src/tools/CrosshairsTool.ts +++ b/packages/tools/src/tools/CrosshairsTool.ts @@ -135,6 +135,9 @@ class CrosshairsTool extends AnnotationTool { enabled: false, panSize: 10, }, + handleRadius: 3, + // Enable HDPI rendering for handles using devicePixelRatio + enableHDPIHandles: false, // radius of the area around the intersection of the planes, in which // the reference lines will not be rendered. This is only used when // having 3 viewports in the toolGroup. @@ -1270,6 +1273,15 @@ class CrosshairsTool extends AnnotationTool { slabThicknessHandleWorldFour ); + let handleRadius = + this.configuration.handleRadius * + (this.configuration.enableHDPIHandles ? window.devicePixelRatio : 1); + let opacity = 1; + if (this.configuration.mobile?.enabled) { + handleRadius = this.configuration.mobile.handleRadius; + opacity = this.configuration.mobile.opacity; + } + if ( (lineActive || this.configuration.mobile?.enabled) && !rotHandlesActive && @@ -1286,12 +1298,8 @@ class CrosshairsTool extends AnnotationTool { rotationHandles, { color, - handleRadius: this.configuration.mobile?.enabled - ? this.configuration.mobile?.handleRadius - : 3, - opacity: this.configuration.mobile?.enabled - ? this.configuration.mobile?.opacity - : 1, + handleRadius, + opacity, type: 'circle', } ); @@ -1303,12 +1311,8 @@ class CrosshairsTool extends AnnotationTool { slabThicknessHandles, { color, - handleRadius: this.configuration.mobile?.enabled - ? this.configuration.mobile?.handleRadius - : 3, - opacity: this.configuration.mobile?.enabled - ? this.configuration.mobile?.opacity - : 1, + handleRadius, + opacity, type: 'rect', } ); @@ -1327,12 +1331,8 @@ class CrosshairsTool extends AnnotationTool { rotationHandles, { color, - handleRadius: this.configuration.mobile?.enabled - ? this.configuration.mobile?.handleRadius - : 3, - opacity: this.configuration.mobile?.enabled - ? this.configuration.mobile?.opacity - : 1, + handleRadius, + opacity, type: 'circle', } ); @@ -1351,17 +1351,18 @@ class CrosshairsTool extends AnnotationTool { slabThicknessHandles, { color, - handleRadius: this.configuration.mobile?.enabled - ? this.configuration.mobile?.handleRadius - : 3, - opacity: this.configuration.mobile?.enabled - ? this.configuration.mobile?.opacity - : 1, + handleRadius, + opacity, type: 'rect', } ); } else if (rotHandlesActive && viewportDraggableRotatable) { const handleUID = `${lineIndex}`; + const handleRadius = + this.configuration.handleRadius * + (this.configuration.enableHDPIHandles + ? window.devicePixelRatio + : 1); // draw all rotation handles as active drawHandlesSvg( svgDrawingHelper, @@ -1370,7 +1371,7 @@ class CrosshairsTool extends AnnotationTool { rotationHandles, { color, - handleRadius: 2, + handleRadius, fill: color, type: 'circle', } @@ -1380,6 +1381,11 @@ class CrosshairsTool extends AnnotationTool { selectedViewportId && viewportSlabThicknessControlsOn ) { + const handleRadius = + this.configuration.handleRadius * + (this.configuration.enableHDPIHandles + ? window.devicePixelRatio + : 1); // draw only the slab thickness handles for the active viewport as active drawHandlesSvg( svgDrawingHelper, @@ -1388,7 +1394,7 @@ class CrosshairsTool extends AnnotationTool { slabThicknessHandles, { color, - handleRadius: 2, + handleRadius, fill: color, type: 'rect', } From 029966d0a3ffc86fa38d3e089d9b0d7d5c105f32 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 3 Mar 2025 23:15:14 -0500 Subject: [PATCH 37/48] fix(segmentation): resolve variable declaration and null check issues (#1872) --- .circleci/config.yml | 10 +++++----- .../strategies/compositions/ensureImageVolume.ts | 2 +- .../segmentation/strategies/utils/getStrategyData.ts | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f3a6a7ce7..b0f601bb5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -155,12 +155,12 @@ workflows: - TEST: requires: - CHECKOUT - - HOLD_FOR_APPROVAL: - type: approval - requires: - - BUILD + # - HOLD_FOR_APPROVAL: + # type: approval + # requires: + # - BUILD - NPM_PUBLISH: requires: - - HOLD_FOR_APPROVAL + - BUILD # VS Code Extension Version: 1.5.1 diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts b/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts index 83324c41f..d374299f4 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/ensureImageVolume.ts @@ -9,7 +9,7 @@ export default { let referencedImageIds; if (viewport) { - const referencedImageIds = viewport.getImageIds(); + referencedImageIds = viewport.getImageIds(); const isValidVolumeForSphere = csUtils.isValidVolume(referencedImageIds); if (!isValidVolumeForSphere) { throw new Error( diff --git a/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts b/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts index faf8d2c6b..ac43a6d99 100644 --- a/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts +++ b/packages/tools/src/tools/segmentation/strategies/utils/getStrategyData.ts @@ -172,9 +172,9 @@ function getStrategyData({ strategy: unknown; }) { if ( - ('volumeId' in operationData && operationData.volumeId !== undefined) || + ('volumeId' in operationData && operationData.volumeId != null) || ('referencedVolumeId' in operationData && - operationData.referencedVolumeId !== undefined) + operationData.referencedVolumeId != null) ) { return getStrategyDataForVolumeViewport({ operationData }); } From 8b27a007751787b2d36861a6d841b688889f3f1d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 4 Mar 2025 04:19:21 +0000 Subject: [PATCH 38/48] chore(version): version.json [skip ci] --- bun.lock | 38 +++++++++---------- commit.txt | 2 +- packages/adapters/package.json | 4 +- packages/ai/package.json | 4 +- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 ++--- packages/labelmap-interpolation/package.json | 4 +- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 4 +- packages/tools/package.json | 2 +- version.json | 4 +- version.txt | 2 +- 12 files changed, 39 insertions(+), 39 deletions(-) diff --git a/bun.lock b/bun.lock index 8d6161262..75e0e4a72 100644 --- a/bun.lock +++ b/bun.lock @@ -131,7 +131,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -140,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -164,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -173,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -185,19 +185,19 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", "dicom-parser": "^1.8.9", }, }, "packages/docs": { "name": "docs", - "version": "3.0.0-beta.5", + "version": "3.0.0", "dependencies": { - "@cornerstonejs/adapters": "^3.0.0", - "@cornerstonejs/core": "^3.0.0", - "@cornerstonejs/dicom-image-loader": "^3.0.0", - "@cornerstonejs/nifti-volume-loader": "^3.0.0", - "@cornerstonejs/tools": "^3.0.0", + "@cornerstonejs/adapters": "^3.0.1", + "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/dicom-image-loader": "^3.0.1", + "@cornerstonejs/nifti-volume-loader": "^3.0.1", + "@cornerstonejs/tools": "^3.0.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -235,7 +235,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -248,17 +248,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -270,7 +270,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.0.0", + "version": "3.0.1", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -280,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.0", + "@cornerstonejs/core": "^3.0.1", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 6686d0577..b568eabc4 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -86dc516b70ed695174f6ad3a99762af11d3af931 \ No newline at end of file +029966d0a3ffc86fa38d3e089d9b0d7d5c105f32 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 47f74ba95..ae78f3866 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1" + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index ba339d88a..83a8cf394 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -56,7 +56,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1" + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2d4bb1c64..8a95d27c4 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -115,7 +115,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index b0bf942d1..1366712f4 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.1", - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/dicom-image-loader": "^3.0.1", - "@cornerstonejs/nifti-volume-loader": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1", + "@cornerstonejs/adapters": "^3.0.2", + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/dicom-image-loader": "^3.0.2", + "@cornerstonejs/nifti-volume-loader": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 25e67cc3d..0c95fcac9 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -50,8 +50,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 419014bea..08564ba22 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -60,7 +60,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1" + "@cornerstonejs/core": "^3.0.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 57c848026..0266ee8b2 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -48,8 +48,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 7f48f3b0d..ce5ed0db5 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -103,7 +103,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 626c2d013..7cee64a0e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.1", - "commit": "86dc516b70ed695174f6ad3a99762af11d3af931" + "version": "3.0.2", + "commit": "029966d0a3ffc86fa38d3e089d9b0d7d5c105f32" } \ No newline at end of file diff --git a/version.txt b/version.txt index 13d683ccb..d9c62ed92 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.1 \ No newline at end of file +3.0.2 \ No newline at end of file From 2bc521eac85d1dc5f5192d5c8015944bed64262e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 4 Mar 2025 04:19:39 +0000 Subject: [PATCH 39/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 11 +++++++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 6 ++++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 6 ++++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 6 ++++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 6 ++++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 6 ++++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 11 +++++++++++ packages/tools/package.json | 2 +- 18 files changed, 73 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2f227eb..fbaf60d51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Bug Fixes + +- **CrosshairsTool:** support HPDI screens in CrosshairsTool ([#1824](https://github.com/cornerstonejs/cornerstone3D/issues/1824)) ([cd299e4](https://github.com/cornerstonejs/cornerstone3D/commit/cd299e40723fb94a6f2568a8008935d8e01ff4f4)), closes [#1822](https://github.com/cornerstonejs/cornerstone3D/issues/1822) +- **segmentation:** resolve variable declaration and null check issues ([#1872](https://github.com/cornerstonejs/cornerstone3D/issues/1872)) ([029966d](https://github.com/cornerstonejs/cornerstone3D/commit/029966d0a3ffc86fa38d3e089d9b0d7d5c105f32)) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 578e8603e..92a988e56 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.1", + "version": "3.0.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 6cf8950df..3ebe49356 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ae78f3866..ec8771d86 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.1", + "version": "3.0.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8b3b6ca20..9e0835e89 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 83a8cf394..5bd051ba9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.1", + "version": "3.0.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 149722106..e0b0c626d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 898cb50f7..a57840c60 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.1", + "version": "3.0.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 7d76b5930..d718b2720 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8a95d27c4..7c0ca79c3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.1", + "version": "3.0.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index ea5efee80..98463d450 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0c95fcac9..4641c9c94 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.1", + "version": "3.0.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index fa10b124b..5ac11e6e6 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 08564ba22..a4a511d74 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.1", + "version": "3.0.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index b7f556d13..0b14bb2ad 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0266ee8b2..2a8baf7bf 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.1", + "version": "3.0.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 5d4f93a9e..fcae8af7a 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) + +### Bug Fixes + +- **CrosshairsTool:** support HPDI screens in CrosshairsTool ([#1824](https://github.com/cornerstonejs/cornerstone3D/issues/1824)) ([cd299e4](https://github.com/cornerstonejs/cornerstone3D/commit/cd299e40723fb94a6f2568a8008935d8e01ff4f4)), closes [#1822](https://github.com/cornerstonejs/cornerstone3D/issues/1822) +- **segmentation:** resolve variable declaration and null check issues ([#1872](https://github.com/cornerstonejs/cornerstone3D/issues/1872)) ([029966d](https://github.com/cornerstonejs/cornerstone3D/commit/029966d0a3ffc86fa38d3e089d9b0d7d5c105f32)) + +### Features + +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) + ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index ce5ed0db5..fd8381787 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.1", + "version": "3.0.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 06c82fba65c1cf578eb322642dfe080d39ce0719 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 3 Mar 2025 23:41:32 -0500 Subject: [PATCH 40/48] fix: try to pass the fake version number (#1873) --- .../tools/src/tools/segmentation/strategies/BrushStrategy.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts index f7f953a0f..5a8e68cd7 100644 --- a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts +++ b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts @@ -247,7 +247,6 @@ export default class BrushStrategy { ): InitializedOperationData { const { viewport } = enabledElement; - // pass in the strategy to getStrategyData const data = getStrategyData({ operationData, viewport, strategy: this }); if (!data) { From 16cc082e53a65f80955c71a9d34e8520f4f221d3 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 4 Mar 2025 04:45:36 +0000 Subject: [PATCH 41/48] chore(version): version.json [skip ci] --- bun.lock | 36 +++++++++---------- commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++--- packages/labelmap-interpolation/package.json | 4 +-- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 4 +-- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/bun.lock b/bun.lock index 75e0e4a72..abb1898d6 100644 --- a/bun.lock +++ b/bun.lock @@ -131,7 +131,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -140,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -164,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -173,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -185,7 +185,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", "dicom-parser": "^1.8.9", }, }, @@ -193,11 +193,11 @@ "name": "docs", "version": "3.0.0", "dependencies": { - "@cornerstonejs/adapters": "^3.0.1", - "@cornerstonejs/core": "^3.0.1", - "@cornerstonejs/dicom-image-loader": "^3.0.1", - "@cornerstonejs/nifti-volume-loader": "^3.0.1", - "@cornerstonejs/tools": "^3.0.1", + "@cornerstonejs/adapters": "^3.0.2", + "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/dicom-image-loader": "^3.0.2", + "@cornerstonejs/nifti-volume-loader": "^3.0.2", + "@cornerstonejs/tools": "^3.0.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -235,7 +235,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -248,17 +248,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -270,7 +270,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.0.1", + "version": "3.0.2", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -280,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.1", + "@cornerstonejs/core": "^3.0.2", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index b568eabc4..d06741a54 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -029966d0a3ffc86fa38d3e089d9b0d7d5c105f32 \ No newline at end of file +06c82fba65c1cf578eb322642dfe080d39ce0719 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ec8771d86..4375d6b2f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2" + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 5bd051ba9..8b6036f61 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -56,7 +56,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2" + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7c0ca79c3..6584052e8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -115,7 +115,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 1366712f4..5a90f379e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.2", - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/dicom-image-loader": "^3.0.2", - "@cornerstonejs/nifti-volume-loader": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2", + "@cornerstonejs/adapters": "^3.0.3", + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/dicom-image-loader": "^3.0.3", + "@cornerstonejs/nifti-volume-loader": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 4641c9c94..7189ee145 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -50,8 +50,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a4a511d74..a832416f0 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -60,7 +60,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2" + "@cornerstonejs/core": "^3.0.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2a8baf7bf..08a026ed8 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -48,8 +48,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index fd8381787..fe83d6509 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -103,7 +103,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 7cee64a0e..9569d4cab 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.2", - "commit": "029966d0a3ffc86fa38d3e089d9b0d7d5c105f32" + "version": "3.0.3", + "commit": "06c82fba65c1cf578eb322642dfe080d39ce0719" } \ No newline at end of file diff --git a/version.txt b/version.txt index d9c62ed92..282895a8f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.2 \ No newline at end of file +3.0.3 \ No newline at end of file From 7f2909c1410e2a63ce7393fd5eb80afa3b40fc8e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 4 Mar 2025 04:45:51 +0000 Subject: [PATCH 42/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbaf60d51..915cf2ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +### Bug Fixes + +- try to pass the fake version number ([#1873](https://github.com/cornerstonejs/cornerstone3D/issues/1873)) ([06c82fb](https://github.com/cornerstonejs/cornerstone3D/commit/06c82fba65c1cf578eb322642dfe080d39ce0719)) + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 92a988e56..659408825 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.2", + "version": "3.0.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 3ebe49356..11ee108db 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4375d6b2f..8bb375050 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.2", + "version": "3.0.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 9e0835e89..390956942 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/ai/package.json b/packages/ai/package.json index 8b6036f61..9c935b2ce 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.2", + "version": "3.0.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index e0b0c626d..7048a0ae3 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index a57840c60..ce1bcd490 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.2", + "version": "3.0.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index d718b2720..1df8610d1 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 6584052e8..3e0516cb5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.2", + "version": "3.0.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 98463d450..e9b2ed27e 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 7189ee145..569fa1bb7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.2", + "version": "3.0.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 5ac11e6e6..d158a2536 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a832416f0..63a5c1ba8 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.2", + "version": "3.0.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 0b14bb2ad..e93650e24 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Features diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 08a026ed8..200d8233a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.2", + "version": "3.0.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index fcae8af7a..55a062777 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) + +### Bug Fixes + +- try to pass the fake version number ([#1873](https://github.com/cornerstonejs/cornerstone3D/issues/1873)) ([06c82fb](https://github.com/cornerstonejs/cornerstone3D/commit/06c82fba65c1cf578eb322642dfe080d39ce0719)) + ## [3.0.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.1...v3.0.2) (2025-03-04) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index fe83d6509..010a6a001 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.2", + "version": "3.0.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From a97effd52abe35eaf532a5634a69b76f932099e7 Mon Sep 17 00:00:00 2001 From: Alireza Date: Wed, 5 Mar 2025 12:31:23 -0500 Subject: [PATCH 43/48] fix(worker): should not change type of input (#1877) --- packages/core/src/webWorkerManager/webWorkerManager.js | 3 --- packages/tools/examples/labelmapStatistics/index.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/packages/core/src/webWorkerManager/webWorkerManager.js b/packages/core/src/webWorkerManager/webWorkerManager.js index eb1286274..79c69864b 100644 --- a/packages/core/src/webWorkerManager/webWorkerManager.js +++ b/packages/core/src/webWorkerManager/webWorkerManager.js @@ -52,7 +52,6 @@ class CentralizedWorkerManager { autoTerminateOnIdle: autoTerminateOnIdle.enabled, idleCheckIntervalId: null, idleTimeThreshold: autoTerminateOnIdle.idleTimeThreshold, - options: options, }; workerProperties.loadCounters = Array(maxWorkerInstances).fill(0); @@ -157,8 +156,6 @@ class CentralizedWorkerManager { workerProperties.processing = true; - // augment args with options - args = { ...args, ...workerProperties.options }; const results = await api[methodName](args, ...finalCallbacks); workerProperties.processing = false; diff --git a/packages/tools/examples/labelmapStatistics/index.ts b/packages/tools/examples/labelmapStatistics/index.ts index 5b8f9d9da..f719dfd7a 100644 --- a/packages/tools/examples/labelmapStatistics/index.ts +++ b/packages/tools/examples/labelmapStatistics/index.ts @@ -107,7 +107,6 @@ function displayStat(stat) { } async function calculateStatistics(id, indices) { - const viewport = renderingEngine.getViewport(viewportId); const stats = await segmentationUtils.getStatistics({ segmentationId: 'SEGMENTATION_ID', segmentIndices: indices, From 54ab654f62cbd7bda126a3800468400761f46cf7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 5 Mar 2025 17:35:48 +0000 Subject: [PATCH 44/48] chore(version): version.json [skip ci] --- bun.lock | 36 +++++++++---------- commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++--- packages/labelmap-interpolation/package.json | 4 +-- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 4 +-- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/bun.lock b/bun.lock index abb1898d6..4acb6d932 100644 --- a/bun.lock +++ b/bun.lock @@ -131,7 +131,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -140,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -164,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -173,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -185,7 +185,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", "dicom-parser": "^1.8.9", }, }, @@ -193,11 +193,11 @@ "name": "docs", "version": "3.0.0", "dependencies": { - "@cornerstonejs/adapters": "^3.0.2", - "@cornerstonejs/core": "^3.0.2", - "@cornerstonejs/dicom-image-loader": "^3.0.2", - "@cornerstonejs/nifti-volume-loader": "^3.0.2", - "@cornerstonejs/tools": "^3.0.2", + "@cornerstonejs/adapters": "^3.0.3", + "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/dicom-image-loader": "^3.0.3", + "@cornerstonejs/nifti-volume-loader": "^3.0.3", + "@cornerstonejs/tools": "^3.0.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -235,7 +235,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -248,17 +248,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -270,7 +270,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.0.2", + "version": "3.0.3", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -280,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.2", + "@cornerstonejs/core": "^3.0.3", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index d06741a54..83c354909 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -06c82fba65c1cf578eb322642dfe080d39ce0719 \ No newline at end of file +a97effd52abe35eaf532a5634a69b76f932099e7 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8bb375050..8bde051a4 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3" + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9c935b2ce..196557985 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -56,7 +56,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3" + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3e0516cb5..62642e917 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -115,7 +115,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 5a90f379e..af0c1a1f9 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.3", - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/dicom-image-loader": "^3.0.3", - "@cornerstonejs/nifti-volume-loader": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3", + "@cornerstonejs/adapters": "^3.0.4", + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/dicom-image-loader": "^3.0.4", + "@cornerstonejs/nifti-volume-loader": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 569fa1bb7..ea9641035 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -50,8 +50,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 63a5c1ba8..db823ebe6 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -60,7 +60,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3" + "@cornerstonejs/core": "^3.0.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 200d8233a..7d4883329 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -48,8 +48,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 010a6a001..55aabe387 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -103,7 +103,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 9569d4cab..0c4718e3a 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.3", - "commit": "06c82fba65c1cf578eb322642dfe080d39ce0719" + "version": "3.0.4", + "commit": "a97effd52abe35eaf532a5634a69b76f932099e7" } \ No newline at end of file diff --git a/version.txt b/version.txt index 282895a8f..b38ebbfce 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.3 \ No newline at end of file +3.0.4 \ No newline at end of file From 51cb78effc2cbf39fee020cc7ab2428feb157982 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 5 Mar 2025 17:36:07 +0000 Subject: [PATCH 45/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 915cf2ecc..7f90bbcde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +### Bug Fixes + +- **worker:** should not change type of input ([#1877](https://github.com/cornerstonejs/cornerstone3D/issues/1877)) ([a97effd](https://github.com/cornerstonejs/cornerstone3D/commit/a97effd52abe35eaf532a5634a69b76f932099e7)) + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 659408825..4b19eba73 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.3", + "version": "3.0.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 11ee108db..00d3f5880 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8bde051a4..5ea521ea1 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.3", + "version": "3.0.4", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 390956942..7cdbf3520 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 196557985..bf562f704 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.3", + "version": "3.0.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 7048a0ae3..9d9fabbdc 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +### Bug Fixes + +- **worker:** should not change type of input ([#1877](https://github.com/cornerstonejs/cornerstone3D/issues/1877)) ([a97effd](https://github.com/cornerstonejs/cornerstone3D/commit/a97effd52abe35eaf532a5634a69b76f932099e7)) + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index ce1bcd490..312d7bd83 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.3", + "version": "3.0.4", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 1df8610d1..57d2d347b 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 62642e917..f50042874 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.3", + "version": "3.0.4", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index e9b2ed27e..8db7b17c1 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index ea9641035..8ed993990 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.3", + "version": "3.0.4", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d158a2536..d87a71f57 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index db823ebe6..a8495f5f8 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.3", + "version": "3.0.4", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index e93650e24..4bbb6dc37 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7d4883329..fedea611e 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.3", + "version": "3.0.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 55a062777..7baff1652 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) + +### Bug Fixes + +- **worker:** should not change type of input ([#1877](https://github.com/cornerstonejs/cornerstone3D/issues/1877)) ([a97effd](https://github.com/cornerstonejs/cornerstone3D/commit/a97effd52abe35eaf532a5634a69b76f932099e7)) + ## [3.0.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.2...v3.0.3) (2025-03-04) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 55aabe387..894b17d90 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.3", + "version": "3.0.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From eae957729848d44971050ca40d684dae8f919170 Mon Sep 17 00:00:00 2001 From: Alireza Date: Thu, 6 Mar 2025 11:36:27 -0500 Subject: [PATCH 46/48] fix(segmentation): Add segmentation ID requirement for threshold operations (#1879) --- packages/tools/examples/rectangleROIThreshold/index.ts | 1 - .../segmentation/rectangleROIThresholdVolumeByRange.ts | 3 ++- .../segmentation/thresholdSegmentationByRange.ts | 10 ++++++++-- .../utilities/segmentation/thresholdVolumeByRange.ts | 10 ++++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/tools/examples/rectangleROIThreshold/index.ts b/packages/tools/examples/rectangleROIThreshold/index.ts index 585db9e16..1cc057fdb 100644 --- a/packages/tools/examples/rectangleROIThreshold/index.ts +++ b/packages/tools/examples/rectangleROIThreshold/index.ts @@ -149,7 +149,6 @@ addButtonToToolbar({ const ctVolume = cache.getVolume(ctVolumeId); const ptVolume = cache.getVolume(ptVolumeId); const segmentationVolume = cache.getVolume(segmentationId); - csToolsUtils.segmentation.rectangleROIThresholdVolumeByRange( selectedAnnotationUIDs, segmentationVolume, diff --git a/packages/tools/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts b/packages/tools/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts index 761ea090b..e61fd37d3 100644 --- a/packages/tools/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +++ b/packages/tools/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts @@ -8,6 +8,7 @@ import getBoundsIJKFromRectangleAnnotations from '../rectangleROITool/getBoundsI import type { ThresholdInformation } from './utilities'; export type ThresholdOptions = { + segmentationId: string; numSlicesToProject?: number; // number of slices to project before and after current slice overwrite: boolean; overlapType?: number; // type of the voxel overlap @@ -67,7 +68,7 @@ function rectangleROIThresholdVolumeByRange( const outputSegmentationVolume = thresholdVolumeByRange( segmentationVolume, thresholdVolumeInformation, - { ...options, boundsIJK } + { ...options, boundsIJK, segmentationId: options.segmentationId } ); outputSegmentationVolume.modified(); diff --git a/packages/tools/src/utilities/segmentation/thresholdSegmentationByRange.ts b/packages/tools/src/utilities/segmentation/thresholdSegmentationByRange.ts index 10097054d..cb0da9891 100644 --- a/packages/tools/src/utilities/segmentation/thresholdSegmentationByRange.ts +++ b/packages/tools/src/utilities/segmentation/thresholdSegmentationByRange.ts @@ -18,8 +18,14 @@ function thresholdSegmentationByRange( segmentationVolume: Types.IImageVolume, segmentationIndex: number, thresholdVolumeInformation: ThresholdInformation[], - overlapType: number + overlapType: number, + segmentationId: string ): Types.IImageVolume { + if (!segmentationId) { + throw new Error( + 'Segmentation ID is required to be passed inside thresholdSegmentationByRange' + ); + } // prepare a list of volume information objects for callback functions const { baseVolumeIdx, volumeInfoList } = processVolumes( segmentationVolume, @@ -66,7 +72,7 @@ function thresholdSegmentationByRange( } }); - triggerSegmentationDataModified(segmentationVolume.volumeId); + triggerSegmentationDataModified(segmentationId); return segmentationVolume; } diff --git a/packages/tools/src/utilities/segmentation/thresholdVolumeByRange.ts b/packages/tools/src/utilities/segmentation/thresholdVolumeByRange.ts index 1d1f1da1d..6901ba0e9 100644 --- a/packages/tools/src/utilities/segmentation/thresholdVolumeByRange.ts +++ b/packages/tools/src/utilities/segmentation/thresholdVolumeByRange.ts @@ -6,6 +6,7 @@ import { getVoxelOverlap, processVolumes } from './utilities'; export type ThresholdRangeOptions = { overwrite: boolean; + segmentationId: string; boundsIJK: BoundsIJK; overlapType?: number; segmentIndex?: number; @@ -37,7 +38,12 @@ function thresholdVolumeByRange( ): Types.IImageVolume { const { imageData: segmentationImageData } = segmentationVolume; - const { overwrite, boundsIJK } = options; + const { overwrite, boundsIJK, segmentationId } = options; + if (!segmentationId) { + throw new Error( + 'Segmentation ID is required to be passed inside thresholdVolumeByRange as options' + ); + } const overlapType = options?.overlapType || 0; const segVoxelManager = segmentationVolume.voxelManager as Types.IVoxelManager; @@ -153,7 +159,7 @@ function thresholdVolumeByRange( boundsIJK, }); - triggerSegmentationDataModified(segmentationVolume.volumeId); + triggerSegmentationDataModified(options.segmentationId); return segmentationVolume; } From 671babceae1bb8fc242767811eca0df7d07446df Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 6 Mar 2025 16:40:43 +0000 Subject: [PATCH 47/48] chore(version): version.json [skip ci] --- bun.lock | 36 +++++++++---------- commit.txt | 2 +- packages/adapters/package.json | 4 +-- packages/ai/package.json | 4 +-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++--- packages/labelmap-interpolation/package.json | 4 +-- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 4 +-- packages/tools/package.json | 2 +- version.json | 4 +-- version.txt | 2 +- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/bun.lock b/bun.lock index 4acb6d932..0c0ff55ab 100644 --- a/bun.lock +++ b/bun.lock @@ -131,7 +131,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -140,13 +140,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -164,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@kitware/vtk.js": "32.9.0", "comlink": "^4.4.1", @@ -173,7 +173,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -185,7 +185,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", "dicom-parser": "^1.8.9", }, }, @@ -193,11 +193,11 @@ "name": "docs", "version": "3.0.0", "dependencies": { - "@cornerstonejs/adapters": "^3.0.3", - "@cornerstonejs/core": "^3.0.3", - "@cornerstonejs/dicom-image-loader": "^3.0.3", - "@cornerstonejs/nifti-volume-loader": "^3.0.3", - "@cornerstonejs/tools": "^3.0.3", + "@cornerstonejs/adapters": "^3.0.4", + "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/dicom-image-loader": "^3.0.4", + "@cornerstonejs/nifti-volume-loader": "^3.0.4", + "@cornerstonejs/tools": "^3.0.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -235,7 +235,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -248,17 +248,17 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -270,7 +270,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.0.3", + "version": "3.0.4", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -280,7 +280,7 @@ "canvas": "^2.11.2", }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.3", + "@cornerstonejs/core": "^3.0.4", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 83c354909..e00a3af5e 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a97effd52abe35eaf532a5634a69b76f932099e7 \ No newline at end of file +eae957729848d44971050ca40d684dae8f919170 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 5ea521ea1..3a011b45b 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -84,7 +84,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", - "@cornerstonejs/tools": "^3.0.4" + "@cornerstonejs/core": "^3.0.5", + "@cornerstonejs/tools": "^3.0.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index bf562f704..3ede5059f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -56,7 +56,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", - "@cornerstonejs/tools": "^3.0.4" + "@cornerstonejs/core": "^3.0.5", + "@cornerstonejs/tools": "^3.0.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f50042874..ab07443ec 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -115,7 +115,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/core": "^3.0.5", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index af0c1a1f9..03a25f9d9 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,11 +33,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.0.4", - "@cornerstonejs/core": "^3.0.4", - "@cornerstonejs/dicom-image-loader": "^3.0.4", - "@cornerstonejs/nifti-volume-loader": "^3.0.4", - "@cornerstonejs/tools": "^3.0.4", + "@cornerstonejs/adapters": "^3.0.5", + "@cornerstonejs/core": "^3.0.5", + "@cornerstonejs/dicom-image-loader": "^3.0.5", + "@cornerstonejs/nifti-volume-loader": "^3.0.5", + "@cornerstonejs/tools": "^3.0.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8ed993990..f8c89a325 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -50,8 +50,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", - "@cornerstonejs/tools": "^3.0.4", + "@cornerstonejs/core": "^3.0.5", + "@cornerstonejs/tools": "^3.0.5", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a8495f5f8..5acf76140 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -60,7 +60,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4" + "@cornerstonejs/core": "^3.0.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fedea611e..a7a8726d4 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -48,8 +48,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", - "@cornerstonejs/tools": "^3.0.4", + "@cornerstonejs/core": "^3.0.5", + "@cornerstonejs/tools": "^3.0.5", "@kitware/vtk.js": "^32.9.0" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 894b17d90..5860c47b6 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -103,7 +103,7 @@ "canvas": "^2.11.2" }, "peerDependencies": { - "@cornerstonejs/core": "^3.0.4", + "@cornerstonejs/core": "^3.0.5", "@kitware/vtk.js": "32.9.0", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 0c4718e3a..57cffde4d 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.0.4", - "commit": "a97effd52abe35eaf532a5634a69b76f932099e7" + "version": "3.0.5", + "commit": "eae957729848d44971050ca40d684dae8f919170" } \ No newline at end of file diff --git a/version.txt b/version.txt index b38ebbfce..7da3c1687 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.4 \ No newline at end of file +3.0.5 \ No newline at end of file From 0b67f91a41eb069e0ef212d4be7acdcb4c68c542 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 6 Mar 2025 16:40:59 +0000 Subject: [PATCH 48/48] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f90bbcde..7e3585cf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +### Bug Fixes + +- **segmentation:** Add segmentation ID requirement for threshold operations ([#1879](https://github.com/cornerstonejs/cornerstone3D/issues/1879)) ([eae9577](https://github.com/cornerstonejs/cornerstone3D/commit/eae957729848d44971050ca40d684dae8f919170)) + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 4b19eba73..ca503de86 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.4", + "version": "3.0.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 00d3f5880..e5706c244 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3a011b45b..407738cb4 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.0.4", + "version": "3.0.5", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 7cdbf3520..cff2eab9a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 3ede5059f..e1951c671 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.0.4", + "version": "3.0.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 9d9fabbdc..ccd08b468 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 312d7bd83..bc4ee48f4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.0.4", + "version": "3.0.5", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 57d2d347b..4aaa22196 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index ab07443ec..ad5bdb30f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.0.4", + "version": "3.0.5", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 8db7b17c1..f3a2a902b 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f8c89a325..b759c6c07 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.0.4", + "version": "3.0.5", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d87a71f57..264b66b70 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5acf76140..12bd2c7ae 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.0.4", + "version": "3.0.5", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 4bbb6dc37..bb070c82a 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a7a8726d4..ac20db348 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.0.4", + "version": "3.0.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 7baff1652..6f6617614 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.4...v3.0.5) (2025-03-06) + +### Bug Fixes + +- **segmentation:** Add segmentation ID requirement for threshold operations ([#1879](https://github.com/cornerstonejs/cornerstone3D/issues/1879)) ([eae9577](https://github.com/cornerstonejs/cornerstone3D/commit/eae957729848d44971050ca40d684dae8f919170)) + ## [3.0.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.3...v3.0.4) (2025-03-05) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 5860c47b6..ecc842ed8 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.0.4", + "version": "3.0.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js",

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℞G(9j zBDb=NmKIRhsywOmo9%vx8(4;VJH*WLDK`sCW@b8LV@oVvuy*Hx-TL*zHDQFfl5;oRRe zh%5KwWJZ9<2ZT5Ulfc;Q+j7?eSvba>FO!ZX_fxtG9eqGV0iK>xscqWa>hY{%@(duY z+nU)oWhRyzq`OvalOGLS{0e*2(9qD)@f-}O5V1v~SFfXchlV!2c-+NS_3(ETH){ZV zwX2L)E(5A-#qk02Uc7}x*Orvze_U*woSgKXoX#h`2F0nY6w$k(_c?A{6JxC?VpzEO zQ4jx@m6cUmZmz@U$#a)C#lQP&n_H$nBamnOZ^R1}?keY;! zYl5)=l0l;pj(JOym0^Vxw~`&ZSjPt6x{yyoQPzuBlEAT*z22_m+LCqbufv6K(&4nc z?3BiKrrnbs_d!q*RAknLjxUqdE*U9Eh??!d!%iBJ;T1I6DYm}xHeBl-%K{^P^~AkT zj-B^=zWE!I55_*dCmJW;RXwLX)#O=dcE(c9x#VK*S0c>fGcvudgW;XeaO3qDDs7GO z>%LyIaoza=WwD+MROde^syaH{pD#@*Aqr(Tz-0i!m&?Ww9G78cNFo{k2FEDPx2l6| zjBvhL$v5XnmyCADDl574BJ0oe_;$xevojE1h2iZKD}M;`8(^`WuK<_kPd9mfas;}l z{ra~otg#0>UzN&c`Chwq-vEnD_pv{d>M^L8?hN4s z|6)t3GPAETeCGE@;^>pfq>Q{lPN2g9EY^dp$}l32B9sl&Lb4(#(y0C zWSb(*OKkS+zc#RPDdf%Fgifrq0rrJ7v5}#k;Cn6Ql=V~==WLR+&3*;bBzUrX7giWY zhktr{H%ox%F^ID|+M@HD=b%sZ%8G!1K#|MQeZQ^71i9t%CUi0F6RC=b5CH3LEh)!f z9|)c0SW|$%c=l`=Nr&TJK|Ls5S}KDzK#=_qsYk9I)T8ezqglQtrn{SP=0kM7J;be%@hkx;_ra+IgKDF^+@d0NOq)i%hgJf0_1kEJqW0wm zjFZ*@arxAng*O|sNOa3;WU%ynD?Nvw#tWYccHpq7r>X9E=Oa=Lm70M=K7=PiIuA3Z zKs#Cw?BCxTqQU3(9x&((o6QD)0@k4!Y^>|83~kR zC&++<7jeBv-Fw%#VG++cAg*~|w1cL-)?1M>w@&#_pi7ngv%!*9VqSds+RXfX%L-Ae z644Bhz_sPXV+;CH?q+ASpjdQF3~yYCdm@JXjCbGzYOM((uP6bLg+@An6y|hO_~e&l zo60?RYl9X!BdlqHE>WFF48*Uz%-wuN>9T$tE+QAY8kau`}oTW z>hBMV>x2buvDb=R!k6P6vg}bFq@au^Z^9u{xBRo5vi<#!?AQ(q>l)nX5&lOu$FQRje1G^_x z=ClkbcOPs(K?B8pYpu9A+{_y0KVW2JLhSDD4Y|g5b_|E&=xlVF%EdkU$*&u9Ky6NK z_XpJTKmL%=@c}wc*(LqkIs8zwNFot?Ig5xcMUbGJB>p>xV@=eDDxlh-luO5OHHa%@!8&v`?uq4;3^ zBCS=|+%oX@S`%Rf9^*pp0Kl2v-d;=muOn{{HSFE9;Fji+0r9qx^g$3yBfKmA-MfEn zgjI1}`=<5CSP2 zPO+mOB4y=>ztc`#_D+n1yx?4am7tjF5Cs1G2aX5L*HVqh<&Z)dNr$iu1^hCvK4PF7 zlu>I>%!nD45Pv|-N+&r7y3_DpG#!F}Omy`2u@PH~QVP4rpj7y^VVr|4B1R?79GU=v zV~OGF;1!t3;MF`|hsWy>d|X>#3}ZEtB* zPEHO~o2MEbD*5on6*X&~+cbgE5_Li|AE2Yfn6rA`iA70CNfU%buODwq>g(%UTDBk- z91Bx_+;^9!&AP;lg+%ePh<(^H__~iLo%^I3uBXt0i%oL_?CM!WE!HB3h|bN76)2$m6@<2?zl+n>$OLoNA@h#X93Bu zv8gEy?=gsIY0-Q3;ll^`ofB>o9nW(&x*tF&4f@PwSMrXvB;GNzh-|hiY=6IRhOzzO z4AZuTpYRI>`1xJhS|!)o|9ipFq@}3`|GF=KbQ{S4H)P4}(zUp|7D4MU zhTC`PE*i~K<1xK%NmRM!=^YvAh*!ct6zympSyOB~=T5knuot*45~^;(#oke;ZXX1p zPMnHN(5UkOPt_5UV|gZ3oG_->pVF=Yg%df1OQu+e?K}u$3E#^abD;9#RHqMuv~rw~ zx8o$ngM9NHAAM*AMyk6HIwu%lKWT{Q1?5~{gv`XD@*SnJ*(SV>HX#86c8nLw%`xm9 z$O#En#0NBHeR(3G>UsSzrMF)+k#Neu%t9r*^E38p9%b#4)KlqQlf>rj!nU9t!g}6B zq;-+7QI*x6D=UG33IM(%rh-e0Hk7s36{!B=gUpjE;E%0Skk$d>1VOynp1jZ1FQlh} z6MUzFVNNcN;h<`ls>BYMo;@Mm>2o|p#KL06U)sRzNPFFU91_|M>3${N$FJYO%5|-t z&7o_+cQ7xcq4wRtZVxYiJh*!WfK7X~dzT|L&y~x?(V_08*{^SG$agpnX`m+?r$;^A z^!R%`fW8KtOGczG8~-Iaj-g&RkyeOh1Xs(KmCmYTJO)p!|Ne~x*zLC55%NXD_I#xE zHYfT2EKUdKl)7|-P{*<^5ZfeUq@Thr<8-<= zzQo37?V?VHt33!l?t@N7NysKWt2$$m3xhsiwrc{4O7*bQ^U~H7f5e`#CfsP&$SOPV zOB%Y?xx21BOvj;09&WR)DI5EG-yPLOJftG|`1mFbu3ouqk8TOjm3_TqSD;lJAm)^J zDtmc X`Em|=1EDgz{Tzd9CRcHKcO(A|PMaAp literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/rectangleScissorSegmentation1.png b/tests/screenshots/chromium/stackLabelmapSegmentation.spec.ts/rectangleScissorSegmentation1.png new file mode 100644 index 0000000000000000000000000000000000000000..4174423ea718ebb468d5d5a6df31be02e361cbce GIT binary patch literal 70572 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%0A#~ws(`KEZFe)!?9n@ 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