From c2c6c99fc7846677ad28a36f7697fce7744080e8 Mon Sep 17 00:00:00 2001 From: m00n620 <50647994+m00n620@users.noreply.github.com> Date: Mon, 6 Oct 2025 13:45:24 -0400 Subject: [PATCH 001/108] fix: ellipse ROI stats (#2368) * fix ellipse ROI stats * remove console logs --- .../src/tools/annotation/EllipticalROITool.ts | 199 +++++++++--------- 1 file changed, 105 insertions(+), 94 deletions(-) diff --git a/packages/tools/src/tools/annotation/EllipticalROITool.ts b/packages/tools/src/tools/annotation/EllipticalROITool.ts index d836879c7..8a37a3a20 100644 --- a/packages/tools/src/tools/annotation/EllipticalROITool.ts +++ b/packages/tools/src/tools/annotation/EllipticalROITool.ts @@ -5,10 +5,14 @@ import { VolumeViewport, utilities as csUtils, getEnabledElementByViewportId, + EPSILON, } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; -import { getCalibratedLengthUnitsAndScale } from '../../utilities/getCalibratedUnits'; +import { + getCalibratedAspect, + getCalibratedLengthUnitsAndScale, +} from '../../utilities/getCalibratedUnits'; import throttle from '../../utilities/throttle'; import { addAnnotation, @@ -1039,111 +1043,118 @@ class EllipticalROITool extends AnnotationTool { pos1Index[1] = Math.floor(pos1Index[1]); pos1Index[2] = Math.floor(pos1Index[2]); - const post2Index = transformWorldToIndex(imageData, worldPos2); + const pos2Index = transformWorldToIndex(imageData, worldPos2); - post2Index[0] = Math.floor(post2Index[0]); - post2Index[1] = Math.floor(post2Index[1]); - post2Index[2] = Math.floor(post2Index[2]); + pos2Index[0] = Math.floor(pos2Index[0]); + pos2Index[1] = Math.floor(pos2Index[1]); + pos2Index[2] = Math.floor(pos2Index[2]); // Check if one of the indexes are inside the volume, this then gives us // Some area to do stats over. - this.isHandleOutsideImage = !this._isInsideVolume( - pos1Index, - post2Index, - dimensions - ); - - const iMin = Math.min(pos1Index[0], post2Index[0]); - const iMax = Math.max(pos1Index[0], post2Index[0]); - - const jMin = Math.min(pos1Index[1], post2Index[1]); - const jMax = Math.max(pos1Index[1], post2Index[1]); - - const kMin = Math.min(pos1Index[2], post2Index[2]); - const kMax = Math.max(pos1Index[2], post2Index[2]); - - const boundsIJK = [ - [iMin, iMax], - [jMin, jMax], - [kMin, kMax], - ] as [Types.Point2, Types.Point2, Types.Point2]; - - const center = [ - (topLeftWorld[0] + bottomRightWorld[0]) / 2, - (topLeftWorld[1] + bottomRightWorld[1]) / 2, - (topLeftWorld[2] + bottomRightWorld[2]) / 2, - ] as Types.Point3; - - const ellipseObj = { - center, - xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2, - yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2, - zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2, - }; - - const { worldWidth, worldHeight } = getWorldWidthAndHeightFromTwoPoints( - viewPlaneNormal, - viewUp, - worldPos1, - worldPos2 - ); - const isEmptyArea = worldWidth === 0 && worldHeight === 0; + if (this._isInsideVolume(pos1Index, pos2Index, dimensions)) { + const iMin = Math.min(pos1Index[0], pos2Index[0]); + const iMax = Math.max(pos1Index[0], pos2Index[0]); + + const jMin = Math.min(pos1Index[1], pos2Index[1]); + const jMax = Math.max(pos1Index[1], pos2Index[1]); + + const kMin = Math.min(pos1Index[2], pos2Index[2]); + const kMax = Math.max(pos1Index[2], pos2Index[2]); + + const boundsIJK = [ + [iMin, iMax], + [jMin, jMax], + [kMin, kMax], + ] as [Types.Point2, Types.Point2, Types.Point2]; + + const center = [ + (topLeftWorld[0] + bottomRightWorld[0]) / 2, + (topLeftWorld[1] + bottomRightWorld[1]) / 2, + (topLeftWorld[2] + bottomRightWorld[2]) / 2, + ] as Types.Point3; + + const xRadius = Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2; + const yRadius = Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2; + const zRadius = Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2; + + const ellipseObj = { + center, + xRadius: xRadius < EPSILON / 2 ? 0 : xRadius, + yRadius: yRadius < EPSILON / 2 ? 0 : yRadius, + zRadius: zRadius < EPSILON / 2 ? 0 : zRadius, + }; - const handles = [pos1Index, post2Index]; - const { scale, areaUnit } = getCalibratedLengthUnitsAndScale( - image, - handles - ); + const { worldWidth, worldHeight } = getWorldWidthAndHeightFromTwoPoints( + viewPlaneNormal, + viewUp, + worldPos1, + worldPos2 + ); + const isEmptyArea = worldWidth === 0 && worldHeight === 0; - const area = - Math.abs(Math.PI * (worldWidth / 2) * (worldHeight / 2)) / - scale / - scale; + const handles = [pos1Index, pos2Index]; + const { scale, unit, areaUnit } = getCalibratedLengthUnitsAndScale( + image, + handles + ); + const aspect = getCalibratedAspect(image); + const area = Math.abs( + Math.PI * + (worldWidth / scale / 2) * + (worldHeight / aspect / scale / 2) + ); - const pixelUnitsOptions = { - isPreScaled: isViewportPreScaled(viewport, targetId), + const pixelUnitsOptions = { + isPreScaled: isViewportPreScaled(viewport, targetId), + isSuvScaled: this.isSuvScaled( + viewport, + targetId, + annotation.metadata.referencedImageId + ), + }; - isSuvScaled: this.isSuvScaled( - viewport, - targetId, - annotation.metadata.referencedImageId - ), - }; + const modalityUnit = getPixelValueUnits( + metadata.Modality, + annotation.metadata.referencedImageId, + pixelUnitsOptions + ); - const modalityUnit = getPixelValueUnits( - metadata.Modality, - annotation.metadata.referencedImageId, - pixelUnitsOptions - ); + let pointsInShape; + if (voxelManager) { + pointsInShape = voxelManager.forEach( + this.configuration.statsCalculator.statsCallback, + { + isInObject: (pointLPS) => + pointInEllipse(ellipseObj, pointLPS, { fast: true }), + boundsIJK, + imageData, + returnPoints: this.configuration.storePointData, + } + ); + } + const stats = this.configuration.statsCalculator.getStatistics(); + + cachedStats[targetId] = { + Modality: metadata.Modality, + area, + mean: stats.mean?.value, + max: stats.max?.value, + min: stats.min?.value, + stdDev: stats.stdDev?.value, + statsArray: stats.array, + pointsInShape, + isEmptyArea, + areaUnit, + modalityUnit, + }; + } else { + this.isHandleOutsideImage = true; - let pointsInShape; - if (voxelManager) { - const pointsInShape = voxelManager.forEach( - this.configuration.statsCalculator.statsCallback, - { - boundsIJK, - imageData, - isInObject: (pointLPS) => - pointInEllipse(ellipseObj, pointLPS, { fast: true }), - returnPoints: this.configuration.storePointData, - } - ); + cachedStats[targetId] = { + Modality: metadata.Modality, + }; } - const stats = this.configuration.statsCalculator.getStatistics(); - cachedStats[targetId] = { - Modality: metadata.Modality, - area, - mean: stats.mean?.value, - max: stats.max?.value, - min: stats.min?.value, - stdDev: stats.stdDev?.value, - statsArray: stats.array, - pointsInShape, - isEmptyArea, - areaUnit, - modalityUnit, - }; } const invalidated = annotation.invalidated; From 2c6dde83cb3f24ec1a9280f48fa4d847434412b4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 6 Oct 2025 17:49:23 +0000 Subject: [PATCH 002/108] 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 8c34d8f4b..d899c59d8 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d859a20051ed92b625d6e71b92d44c2ef9ced79e \ No newline at end of file +c2c6c99fc7846677ad28a36f7697fce7744080e8 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index a64211ddc..671a5adeb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", - "@cornerstonejs/tools": "4.4.1" + "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/tools": "4.4.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index d9f23d3aa..f35292ad5 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", - "@cornerstonejs/tools": "4.4.1" + "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/tools": "4.4.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 88ab356ee..7992fbd55 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", + "@cornerstonejs/core": "4.4.2", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index dca08fca7..7bc2d39ea 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.4.1", - "@cornerstonejs/core": "4.4.1", - "@cornerstonejs/dicom-image-loader": "4.4.1", - "@cornerstonejs/nifti-volume-loader": "4.4.1", - "@cornerstonejs/tools": "4.4.1", + "@cornerstonejs/adapters": "4.4.2", + "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/dicom-image-loader": "4.4.2", + "@cornerstonejs/nifti-volume-loader": "4.4.2", + "@cornerstonejs/tools": "4.4.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 fb2976352..c4c972457 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", - "@cornerstonejs/tools": "4.4.1", + "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/tools": "4.4.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 31056b3ae..2a3004007 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1" + "@cornerstonejs/core": "4.4.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 09bc8e178..fed4ab65d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", - "@cornerstonejs/tools": "4.4.1", + "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/tools": "4.4.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 40304559c..3adde6918 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.1", + "@cornerstonejs/core": "4.4.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 4bcc4df25..84b2ab55c 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.4.1", - "commit": "d859a20051ed92b625d6e71b92d44c2ef9ced79e" + "version": "4.4.2", + "commit": "c2c6c99fc7846677ad28a36f7697fce7744080e8" } \ No newline at end of file diff --git a/version.txt b/version.txt index 4f3470c16..f93922292 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.4.1 \ No newline at end of file +4.4.2 \ No newline at end of file From be47490c0fec762b46cd51556f9305049b4e0666 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 6 Oct 2025 17:49:39 +0000 Subject: [PATCH 003/108] 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 72d6753fc..70e2c2d1d 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +### Bug Fixes + +- ellipse ROI stats ([#2368](https://github.com/cornerstonejs/cornerstone3D/issues/2368)) ([c2c6c99](https://github.com/cornerstonejs/cornerstone3D/commit/c2c6c99fc7846677ad28a36f7697fce7744080e8)) + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) ### Bug Fixes diff --git a/lerna.json b/lerna.json index d83755fe8..bc1be1673 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.4.1", + "version": "4.4.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 0109e6c9c..a55aa1e62 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 671a5adeb..a11b74078 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.4.1", + "version": "4.4.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 f5b802aca..130450549 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index f35292ad5..6c85add51 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.4.1", + "version": "4.4.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b6dce5ed5..e95b4db4f 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 2221edc30..0ea176206 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.4.1", + "version": "4.4.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 0d339ca09..d73c10d0c 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7992fbd55..25f389827 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.4.1", + "version": "4.4.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 1ea4c205b..9ef783e0b 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index c4c972457..98d5faa6f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.4.1", + "version": "4.4.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 b0fcfd5a5..3c824b342 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **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 2a3004007..0f7928dfb 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": "4.4.1", + "version": "4.4.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 05b90285a..25b2fa91f 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fed4ab65d..90635e249 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.4.1", + "version": "4.4.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 10d2ca2a0..1bcc0cc3d 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. +## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) + +### Bug Fixes + +- ellipse ROI stats ([#2368](https://github.com/cornerstonejs/cornerstone3D/issues/2368)) ([c2c6c99](https://github.com/cornerstonejs/cornerstone3D/commit/c2c6c99fc7846677ad28a36f7697fce7744080e8)) + ## [4.4.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.0...v4.4.1) (2025-10-03) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 3adde6918..f4e378bb1 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.4.1", + "version": "4.4.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From e9db49c820e93f4b404ff0aa918ccb013191bebe Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 6 Oct 2025 17:49:50 +0000 Subject: [PATCH 004/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 5c8a8fe53..dd29e0ab6 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.1'; +export const version = '4.4.2'; From 690ec6e90499b24364c06ad404fd0d2b0c521134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Tue, 7 Oct 2025 15:11:51 -0300 Subject: [PATCH 005/108] feat(BrushTool): segmentation brush interpolation (#2374) Co-authored-by: IbrahimCSAE Co-authored-by: Ibrahim --- packages/tools/jest.config.js | 1 + .../tools/src/tools/segmentation/BrushTool.ts | 61 ++++- .../strategies/__tests__/fillCircle.spec.ts | 34 +++ .../segmentation/strategies/fillCircle.ts | 233 ++++++++++++++++-- .../segmentation/strategies/fillSphere.ts | 95 ++++++- .../src/types/LabelmapToolOperationData.ts | 5 + ...RI_64_64_10_5_1_1_0_SEG_Mocked_Brushed.png | Bin 7723 -> 8057 bytes 7 files changed, 409 insertions(+), 20 deletions(-) create mode 100644 packages/tools/src/tools/segmentation/strategies/__tests__/fillCircle.spec.ts diff --git a/packages/tools/jest.config.js b/packages/tools/jest.config.js index 6f8cd76c2..682de0e84 100644 --- a/packages/tools/jest.config.js +++ b/packages/tools/jest.config.js @@ -5,6 +5,7 @@ const path = require('path'); module.exports = { ...base, displayName: 'tools', + testMatch: [...base.testMatch, '/src/**/*.spec.ts'], moduleNameMapper: { '^@cornerstonejs/(.*)$': path.resolve(__dirname, '../$1/src'), }, diff --git a/packages/tools/src/tools/segmentation/BrushTool.ts b/packages/tools/src/tools/segmentation/BrushTool.ts index 1cf6eccaa..539295546 100644 --- a/packages/tools/src/tools/segmentation/BrushTool.ts +++ b/packages/tools/src/tools/segmentation/BrushTool.ts @@ -37,6 +37,12 @@ import { getStrategyData } from './strategies/utils/getStrategyData'; */ class BrushTool extends LabelmapBaseTool { static toolName; + // Remember the last drag position in both canvas and world space so we can + // pass a full stroke segment to the strategies instead of a single point. + private _lastDragInfo: { + canvas: Types.Point2; + world: Types.Point3; + } | null = null; constructor( toolProps: PublicToolProps = {}, @@ -180,8 +186,9 @@ class BrushTool extends LabelmapBaseTool { evt: EventTypes.MouseDownActivateEventType ): boolean => { const eventData = evt.detail; - const { element } = eventData; + const { element, currentPoints } = eventData; const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; // @ts-expect-error this._editData = this.createEditData(element); @@ -194,6 +201,15 @@ class BrushTool extends LabelmapBaseTool { // This might be a mouse down this._previewData.isDrag = false; this._previewData.timerStart = Date.now(); + const canvasPoint = vec2.clone(currentPoints.canvas) as Types.Point2; + const worldPoint = viewport.canvasToWorld([ + canvasPoint[0], + canvasPoint[1], + ]) as Types.Point3; + this._lastDragInfo = { + canvas: canvasPoint, + world: vec3.clone(worldPoint) as Types.Point3, + }; const hoverData = this._hoverData || this.createHoverData(element); @@ -343,6 +359,7 @@ class BrushTool extends LabelmapBaseTool { const eventData = evt.detail; const { element, currentPoints } = eventData; const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; this.updateCursor(evt); @@ -370,17 +387,53 @@ class BrushTool extends LabelmapBaseTool { window.clearTimeout(this._previewData.timer); this._previewData.timer = null; } + if (!this._lastDragInfo) { + const startCanvas = this._previewData.startPoint; + const startWorld = viewport.canvasToWorld([ + startCanvas[0], + startCanvas[1], + ]) as Types.Point3; + this._lastDragInfo = { + canvas: vec2.clone(startCanvas) as Types.Point2, + world: vec3.clone(startWorld) as Types.Point3, + }; + } + + const currentCanvas = currentPoints.canvas; + const currentWorld = viewport.canvasToWorld([ + currentCanvas[0], + currentCanvas[1], + ]) as Types.Point3; + + this._hoverData = this.createHoverData(element, currentCanvas); + + this._calculateCursor(element, currentCanvas); + + const operationData = this.getOperationData(element); + // Hand the strategy the exact stroke segment we just traversed so it can + // paint a continuous capsule in one pass instead of trying to infer the + // path from scattered samples. + operationData.strokePointsWorld = [ + vec3.clone(this._lastDragInfo.world) as Types.Point3, + vec3.clone(currentWorld) as Types.Point3, + ]; this._previewData.preview = this.applyActiveStrategy( enabledElement, - this.getOperationData(element) + operationData ); + + const currentCanvasClone = vec2.clone(currentCanvas) as Types.Point2; + this._lastDragInfo = { + canvas: currentCanvasClone, + world: vec3.clone(currentWorld) as Types.Point3, + }; this._previewData.element = element; // Add a bit of time to the timer start so small accidental movements dont // cause issues on clicking this._previewData.timerStart = Date.now() + dragTimeMs; this._previewData.isDrag = true; - this._previewData.startPoint = currentPoints.canvas; + this._previewData.startPoint = currentCanvasClone; }; private _calculateCursor(element, centerCanvas) { @@ -484,6 +537,8 @@ class BrushTool extends LabelmapBaseTool { this._editData = null; + this._lastDragInfo = null; + this.applyActiveStrategyCallback( enabledElement, operationData, diff --git a/packages/tools/src/tools/segmentation/strategies/__tests__/fillCircle.spec.ts b/packages/tools/src/tools/segmentation/strategies/__tests__/fillCircle.spec.ts new file mode 100644 index 000000000..84d5aeae6 --- /dev/null +++ b/packages/tools/src/tools/segmentation/strategies/__tests__/fillCircle.spec.ts @@ -0,0 +1,34 @@ +import type { Types } from '@cornerstonejs/core'; + +import { createPointInEllipse } from '../fillCircle'; + +describe('createPointInEllipse', () => { + const corners: Types.Point3[] = [ + [-1, 1, 0], + [1, -1, 0], + [-1, -1, 0], + [1, 1, 0], + ]; + + it('detects points inside the base circle', () => { + const predicate = createPointInEllipse(corners); + + expect(predicate([0, 0, 0] as Types.Point3)).toBe(true); + expect(predicate([0.5, 0.5, 0] as Types.Point3)).toBe(true); + expect(predicate([1.2, 0, 0] as Types.Point3)).toBe(false); + }); + + it('covers interpolated stroke segments', () => { + const predicate = createPointInEllipse(corners, { + strokePointsWorld: [ + [-2, 0, 0] as Types.Point3, + [2, 0, 0] as Types.Point3, + ], + radius: 1, + }); + + expect(predicate([0, 0, 0] as Types.Point3)).toBe(true); + expect(predicate([1.5, 0, 0] as Types.Point3)).toBe(true); + expect(predicate([3.2, 0, 0] as Types.Point3)).toBe(false); + }); +}); diff --git a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts index d5ab59379..613d58829 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts @@ -1,6 +1,8 @@ import { vec3 } from 'gl-matrix'; +import type { ReadonlyVec3 } from 'gl-matrix'; import { utilities as csUtils } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; +import type vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import { getBoundingBoxAroundShapeIJK } from '../../../utilities/boundingBox'; import BrushStrategy from './BrushStrategy'; @@ -10,7 +12,7 @@ import { StrategyCallbacks } from '../../../enums'; import compositions from './compositions'; import { pointInSphere } from '../../../utilities/math/sphere'; -const { transformWorldToIndex, isEqual } = csUtils; +const { transformWorldToIndex, transformIndexToWorld, isEqual } = csUtils; /** * Returns the corners of an ellipse in canvas coordinates. @@ -30,12 +32,119 @@ export function getEllipseCornersFromCanvasCoordinates( return [topLeft, bottomRight, bottomLeft, topRight]; } +function createCircleCornersForCenter( + center: Types.Point3, + viewUp: ReadonlyVec3, + viewRight: ReadonlyVec3, + radius: number +): Types.Point3[] { + const centerVec = vec3.fromValues(center[0], center[1], center[2]); + + const top = vec3.create(); + vec3.scaleAndAdd(top, centerVec, viewUp, radius); + + const bottom = vec3.create(); + vec3.scaleAndAdd(bottom, centerVec, viewUp, -radius); + + const right = vec3.create(); + vec3.scaleAndAdd(right, centerVec, viewRight, radius); + + const left = vec3.create(); + vec3.scaleAndAdd(left, centerVec, viewRight, -radius); + + return [ + bottom as Types.Point3, + top as Types.Point3, + left as Types.Point3, + right as Types.Point3, + ]; +} + +// Build a lightweight capsule predicate that covers every sampled point and +// the straight segment in between. The previous approach re-ran the brush +// strategy for many intermediate samples, which was unnecessarily expensive +// and still missed fast mouse moves. This predicate lets us describe the full +// swept volume in constant time per segment when the strategy runs. +function createStrokePredicate(centers: Types.Point3[], radius: number) { + if (!centers.length || radius <= 0) { + return null; + } + + const radiusSquared = radius * radius; + const centerVecs = centers.map( + (point) => [point[0], point[1], point[2]] as Types.Point3 + ); + const segments = [] as Array<{ + start: Types.Point3; + vector: [number, number, number]; + lengthSquared: number; + }>; + + for (let i = 1; i < centerVecs.length; i++) { + const start = centerVecs[i - 1]; + const end = centerVecs[i]; + const dx = end[0] - start[0]; + const dy = end[1] - start[1]; + const dz = end[2] - start[2]; + const lengthSquared = dx * dx + dy * dy + dz * dz; + + segments.push({ start, vector: [dx, dy, dz], lengthSquared }); + } + + return (worldPoint: Types.Point3) => { + if (!worldPoint) { + return false; + } + + for (const centerVec of centerVecs) { + const dx = worldPoint[0] - centerVec[0]; + const dy = worldPoint[1] - centerVec[1]; + const dz = worldPoint[2] - centerVec[2]; + if (dx * dx + dy * dy + dz * dz <= radiusSquared) { + return true; + } + } + + for (const { start, vector, lengthSquared } of segments) { + if (lengthSquared === 0) { + const dx = worldPoint[0] - start[0]; + const dy = worldPoint[1] - start[1]; + const dz = worldPoint[2] - start[2]; + if (dx * dx + dy * dy + dz * dz <= radiusSquared) { + return true; + } + continue; + } + + const dx = worldPoint[0] - start[0]; + const dy = worldPoint[1] - start[1]; + const dz = worldPoint[2] - start[2]; + const dot = dx * vector[0] + dy * vector[1] + dz * vector[2]; + const t = Math.max(0, Math.min(1, dot / lengthSquared)); + const projX = start[0] + vector[0] * t; + const projY = start[1] + vector[1] * t; + const projZ = start[2] + vector[2] * t; + const distX = worldPoint[0] - projX; + const distY = worldPoint[1] - projY; + const distZ = worldPoint[2] - projZ; + + if (distX * distX + distY * distY + distZ * distZ <= radiusSquared) { + return true; + } + } + + return false; + }; +} + const initializeCircle = { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { const { points, // bottom, top, left, right viewport, segmentationImageData, + viewUp, + viewPlaneNormal, } = operationData; // Happens on a preview setup @@ -60,6 +169,9 @@ const initializeCircle = { center as Types.Point3 ); + const brushRadius = + points.length >= 2 ? vec3.distance(points[0], points[1]) / 2 : 0; + const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p) ) as CanvasCoordinates; @@ -69,20 +181,58 @@ const initializeCircle = { const cornersInWorld = corners.map((corner) => viewport.canvasToWorld(corner) ); - // 2. Find the extent of the ellipse (circle) in IJK index space of the image - const circleCornersIJK = points.map((world) => { - return transformWorldToIndex(segmentationImageData, world); - }); - // get the bounds from the circle points since in oblique images the - // circle will not be axis aligned + const normalizedViewUp = vec3.fromValues(viewUp[0], viewUp[1], viewUp[2]); + vec3.normalize(normalizedViewUp, normalizedViewUp); + + const normalizedPlaneNormal = vec3.fromValues( + viewPlaneNormal[0], + viewPlaneNormal[1], + viewPlaneNormal[2] + ); + vec3.normalize(normalizedPlaneNormal, normalizedPlaneNormal); + + const viewRight = vec3.create(); + vec3.cross(viewRight, normalizedViewUp, normalizedPlaneNormal); + vec3.normalize(viewRight, viewRight); + + // Build a set of explicit stroke centers. When we only looked at the last + // sample, quick cursor moves left holes behind. Feeding the full segment + // gives us deterministic coverage regardless of device speed. + const strokeCentersSource = + operationData.strokePointsWorld && + operationData.strokePointsWorld.length > 0 + ? operationData.strokePointsWorld + : [operationData.centerWorld]; + + const strokeCenters = strokeCentersSource.map( + (point) => vec3.clone(point) as Types.Point3 + ); + + const strokeCornersWorld = strokeCenters.flatMap((centerPoint) => + createCircleCornersForCenter( + centerPoint, + normalizedViewUp, + viewRight, + brushRadius + ) + ); + + const circleCornersIJK = strokeCornersWorld.map((world) => + transformWorldToIndex(segmentationImageData, world) + ); + const boundsIJK = getBoundingBoxAroundShapeIJK( circleCornersIJK, segmentationImageData.getDimensions() ); - // 3. Derives the ellipse function from the corners - operationData.isInObject = createPointInEllipse(cornersInWorld); + operationData.strokePointsWorld = strokeCenters; + operationData.isInObject = createPointInEllipse(cornersInWorld, { + strokePointsWorld: strokeCenters, + segmentationImageData, + radius: brushRadius, + }); operationData.isInObjectBoundsIJK = boundsIJK; }, @@ -96,7 +246,14 @@ const initializeCircle = { * sphere shape (same radius in two or three dimensions), or an elliptical shape * if they differ. */ -function createPointInEllipse(cornersInWorld: Types.Point3[] = []) { +function createPointInEllipse( + cornersInWorld: Types.Point3[] = [], + options: { + strokePointsWorld?: Types.Point3[]; + segmentationImageData?: vtkImageData; + radius?: number; + } = {} +) { if (!cornersInWorld || cornersInWorld.length !== 4) { throw new Error('createPointInEllipse: cornersInWorld must have 4 points'); } @@ -125,6 +282,12 @@ function createPointInEllipse(cornersInWorld: Types.Point3[] = []) { vec3.normalize(normal, normal); // If radii are equal, treat as sphere + const radiusForStroke = options.radius ?? Math.max(xRadius, yRadius); + const strokePredicate = createStrokePredicate( + options.strokePointsWorld || [], + radiusForStroke + ); + if (isEqual(xRadius, yRadius)) { const radius = xRadius; const sphereObj = { @@ -132,14 +295,55 @@ function createPointInEllipse(cornersInWorld: Types.Point3[] = []) { radius, radius2: radius * radius, }; - return (pointLPS) => pointInSphere(sphereObj, pointLPS); + return (pointLPS: Types.Point3 | null, pointIJK?: Types.Point3) => { + let worldPoint: Types.Point3 | null = pointLPS; + + // When the iterator only supplies IJK coordinates we reconstruct the + // world position once here instead of forcing callers to do the + // conversion (the previous code re-did this work on every sample). + if (!worldPoint && pointIJK && options.segmentationImageData) { + worldPoint = transformIndexToWorld( + options.segmentationImageData, + pointIJK as Types.Point3 + ) as Types.Point3; + } + + if (!worldPoint) { + return false; + } + + if (strokePredicate?.(worldPoint)) { + return true; + } + + return pointInSphere(sphereObj, worldPoint); + }; } // Otherwise, treat as ellipse in oblique plane - return (pointLPS: Types.Point3) => { - // Project point onto the plane + return (pointLPS: Types.Point3 | null, pointIJK?: Types.Point3) => { + let worldPoint: Types.Point3 | null = pointLPS; + + if (!worldPoint && pointIJK && options.segmentationImageData) { + worldPoint = transformIndexToWorld( + options.segmentationImageData, + pointIJK as Types.Point3 + ) as Types.Point3; + } + + if (!worldPoint) { + return false; + } + + if (strokePredicate?.(worldPoint)) { + return true; + } + + // Project point onto the plane so we can evaluate the ellipse equation in + // plane coordinates. We do this once per sample; previously the repeated + // conversions happened on callers for every interpolated point. const pointVec = vec3.create(); - vec3.subtract(pointVec, pointLPS, center); + vec3.subtract(pointVec, worldPoint, center); // Remove component along normal const distToPlane = vec3.dot(pointVec, normal); const proj = vec3.create(); @@ -213,5 +417,6 @@ export { CIRCLE_THRESHOLD_STRATEGY, fillInsideCircle, thresholdInsideCircle, + createPointInEllipse, createPointInEllipse as createEllipseInPoint, }; diff --git a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts index 59583c1b1..6d70e3ab7 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts @@ -39,7 +39,7 @@ const sphereComposition = { center as Types.Point3 ); - const { boundsIJK: newBoundsIJK } = getSphereBoundsInfoFromViewport( + const baseExtent = getSphereBoundsInfoFromViewport( points.slice(0, 2) as [Types.Point3, Types.Point3], segmentationImageData, viewport @@ -54,8 +54,97 @@ const sphereComposition = { viewport.canvasToWorld(corner) ); - operationData.isInObjectBoundsIJK = newBoundsIJK; - operationData.isInObject = createEllipseInPoint(cornersInWorld); + const strokeRadius = + points.length >= 2 ? vec3.distance(points[0], points[1]) / 2 : undefined; + + const strokeCenters = + operationData.strokePointsWorld && + operationData.strokePointsWorld.length > 0 + ? operationData.strokePointsWorld + : [operationData.centerWorld]; + + // The original implementation recalculated the expensive sphere bounds for + // every interpolated point. That repeats a handful of world-to-index + // conversions per sample, which adds up quickly during fast brushes. We + // know each stroke point simply translates the same sphere, so we can reuse + // the base bounds and slide them by the delta in IJK space instead. + const baseBounds = baseExtent.boundsIJK; + const baseCenterIJK = operationData.centerIJK; + const boundsForStroke = strokeCenters.reduce( + (acc, centerPoint) => { + if (!centerPoint) { + return acc; + } + + const translatedCenterIJK = transformWorldToIndex( + segmentationImageData, + centerPoint as Types.Point3 + ); + const deltaIJK = [ + translatedCenterIJK[0] - baseCenterIJK[0], + translatedCenterIJK[1] - baseCenterIJK[1], + translatedCenterIJK[2] - baseCenterIJK[2], + ]; + + const translatedBounds: Types.BoundsIJK = [ + [baseBounds[0][0] + deltaIJK[0], baseBounds[0][1] + deltaIJK[0]], + [baseBounds[1][0] + deltaIJK[1], baseBounds[1][1] + deltaIJK[1]], + [baseBounds[2][0] + deltaIJK[2], baseBounds[2][1] + deltaIJK[2]], + ]; + + if (!acc) { + return translatedBounds; + } + + return [ + [ + Math.min(acc[0][0], translatedBounds[0][0]), + Math.max(acc[0][1], translatedBounds[0][1]), + ], + [ + Math.min(acc[1][0], translatedBounds[1][0]), + Math.max(acc[1][1], translatedBounds[1][1]), + ], + [ + Math.min(acc[2][0], translatedBounds[2][0]), + Math.max(acc[2][1], translatedBounds[2][1]), + ], + ] as Types.BoundsIJK; + }, + null + ); + + const boundsToUse = boundsForStroke ?? baseExtent.boundsIJK; + + if (segmentationImageData) { + const dimensions = segmentationImageData.getDimensions(); + // Clamp once at the end to keep the bounds valid for downstream + // iteration. We were clamping each partial result previously, which was + // redundant and still left us doing extra work when a drag crossed the + // image edges. + operationData.isInObjectBoundsIJK = [ + [ + Math.max(0, Math.min(boundsToUse[0][0], dimensions[0] - 1)), + Math.max(0, Math.min(boundsToUse[0][1], dimensions[0] - 1)), + ], + [ + Math.max(0, Math.min(boundsToUse[1][0], dimensions[1] - 1)), + Math.max(0, Math.min(boundsToUse[1][1], dimensions[1] - 1)), + ], + [ + Math.max(0, Math.min(boundsToUse[2][0], dimensions[2] - 1)), + Math.max(0, Math.min(boundsToUse[2][1], dimensions[2] - 1)), + ], + ] as Types.BoundsIJK; + } else { + operationData.isInObjectBoundsIJK = boundsToUse; + } + + operationData.isInObject = createEllipseInPoint(cornersInWorld, { + strokePointsWorld: operationData.strokePointsWorld, + segmentationImageData, + radius: strokeRadius, + }); // } }, } as Composition; diff --git a/packages/tools/src/types/LabelmapToolOperationData.ts b/packages/tools/src/types/LabelmapToolOperationData.ts index 128de8f25..1aa36b32e 100644 --- a/packages/tools/src/types/LabelmapToolOperationData.ts +++ b/packages/tools/src/types/LabelmapToolOperationData.ts @@ -21,6 +21,11 @@ type LabelmapToolOperationData = { viewUp: number[]; activeStrategy: string; points: Types.Point3[]; + /** + * Optional pair of world points describing the last stroke segment so the + * strategy can cover the full path instead of a single sample location. + */ + strokePointsWorld?: Types.Point3[]; voxelManager; override: { voxelManager: Types.IVoxelManager; diff --git a/packages/tools/test/groundTruth/imageURI_64_64_10_5_1_1_0_SEG_Mocked_Brushed.png b/packages/tools/test/groundTruth/imageURI_64_64_10_5_1_1_0_SEG_Mocked_Brushed.png index dc4cc5f776867efa55ff9508369dc3e913d4936c..b90d30396d3f78e7a8f76dae3a665db4876566f1 100644 GIT binary patch literal 8057 zcmbtZc|28X_dj-<_HhiybfQ7ql)1ssWM~sQA<5Jc;gn0pCK^y|p;B%~iKJ`jiiU%e zG8C1oNw-4gvC?3Q5JE-2b=>aT+r97m{-!^C?B_XqKhJvB`mVLUYduG8ZPthi&laXo zD57hbW_A>c0EhpF3BgRnouyCUpTKUrHKvr@%DFuh%6#3mW+o2%-1^(s$0|Q;emGQf z-bXJ;`;9@j^rCKI3)$;K3dafB{PJ|GeI0QpUOtW3bDP{_9GN||_=)MF3yGHXXDfS; z93TJ5!s~!Y+#JnUM=J(~6K?;!>X*^xw69Z1X<`OnswO8VJN6k)eHk7c+%Yxz{(WG4 z_T>1`>yGx4y{o<&8XKpEe;w?&tN1!^MaAolX=#VQwid0*U2!^P{^yc`JBGUZ_I;k} z+)t@aD)UBbW_9O1!`>W4NzdLZdKzTH$(leh0VH{KPP#ZrXPPA6OQAF84y_X>@QjfY z8l1=d7pi|X-c?!D84s~wkugcc=hn%0u>oom%jkt&CPqE}MIP|J0YW8Z_FxFAV>a6< z4JD)O2wZ_zE@l!z#4zvnp29h{!ify#yVI`Tc!p_{PgBF8keLIY)kF~L+jzp%BYIvW zg%pX8saG|@GoeTd966ZY4`k6R58PXbmr>3xR<8L=N6xJo9mj(H-*sN&Hp;N z(Y~PAu|8^j*F1W6u-7irj!vg6oJ;7qildT%ky}*{Dwg1H9IA_Ao?jfK zm}+b6k*o7$kcC>v;k&|f|2gw|A)yy3N-ZnLPksbtGc|M;?f^tmZd>M52P=l(2s zGvX7)H9(?KER*h#?SF=>1WdfhaW<)7+5N6}qI{8F{89r#P0kRQGm|I%% zyfrTh%Zyhc^^m%GUfP#5#h|d8EKWatmg@&E^#Hgv)#*%S=(rN(&qNovW`bRDgGn5yH4nWLX&?_S9TN z{iP)?$k8+L@IcU$Yb&2p-=qz^SQ=ki>N9$H`|af8!4to92eS1Q8s$heaz&Stz0}Qu z6c^Oa`7CNjwcd>isS^0Glo@`y56hH1(}{`LL=c^--C2S)pB%3h@;YawreeoU(?`NQ zeQy_q?LJ1#zI=w5{jw*v3TII8wA{Y5s(^79!VOyHx{gTP}b! zvjpfB4aaQwn+rR%#hRxS8uY z&Cujr{lH#|wdnv-7k^ginw#z8o=Z$k-k){&_0agp@SpKhHHhXX@kGePLkjh+vak^^ zh#vC}*g`u-EFF?tvKFPE!3kV5QHbPXFRC%T8X$01qEg&8v~uU{M~sHB=OKy_ggc@F z2$CrJIK_P$z&_n}U6FJ9{-W6kc3lGJEIqjHRt|A?u;(}h(UihDGE$3GIP;&ECZDUH zoV?}2((HT!3)@VmNQM07Cs$m9yBRLxS+o zho3CgrHC?LK-%$CqC6sc4TY@7=uBB7GD?7Uf`VLu-EF$9+?;n!9F7WP2P2C_ z5R7Y){!w35>6Yiti+-hO{wC2mvI5gc|D{ZdsmdwGBg(vBk!*+h+xhnxPO5|a8DG@W zZMROZ72|MwxyF7UMUv|@EM!3;ZNTxQn3^0LJlcdp@&k&^rL(&?@Acib$i6Q@nhnR0 zK>!IQzcZYw?(RaIFBFQ#QV=%cvfLFSpG4S~@u9)@?Iqc14<8N>%r_3h;?%SdtnVm= zwDznO_FVtdduKX&|F%H*IMFRWq=Jb8+WVw;r9fcwv6D zIX=bNL7Q*A+suOo&ZcPPguAG@?*{SoscqMZ5X)DaBm>wv&aWPTrt~qbN#w!(A|7_H zgx4_cAtyz;0J46`_ZO_8W-bN`%Rw|(cSQdWqZBFTBZEAn{I;eU)|z|F1cTedse%!8z>ed*WG8%lr;vnnU3vsc~7~72I=!N1u0P>@Y9!6IF=q~L8pOKI`b!A>U4C& zc`hJa@+RaGnzaI8kXY7>$c>&>v6oZjv>#*`$|9J9By%!4WC$#O>G7FW%G}o%^bzb0 z09M6C^B*gUsBq%loVU>Yiu4D5qZ8>;WS#rPs+Mv^PUAIS+Ph$jO@L_~ILgUu+T1_I z5YglmxPSi$w@x1o**?r*kfrC?F078V|ItuGl+KiZ=e6~T#bDvx$Yw#i54W#KRXtv%97KEfR(Lnf zuPe>)#NjeAtnT)!HzO6|+h3%meQDNrLwYt!pfx8hFfrg21YXF~Ijy1rTc#4$xXM7u z%4Y@9KhgZg(saa+l-W=dO5x+~7YDw+O(vd!$k!c@Yjc+#3{i?8QYmCp`R^N(CBPSx zP=-Xs#a4$#onFTUCEUH@(G-Lxp?2ey!G4+_Z6gHm3`-rbYuj7_WQDx=!`iC5cWcAv zpEz7nQerOrn_PwB8PP}zqJT^@F-e91`VsOG<~gAMegfPSaxT!cP34LaWzVT}jO@Gh zz-T^#MPcw9Wog9%2Q&~s6gamUi@R2Xy7cmcL4_Y5e&H+rxnJ8bDEe8p2w zC-Ok?d-(!~=IyLH%opAqnRp#O^{LkC^=FInLhiWfCBCM1#1TDv_ZQi=z1q0H$Z%lb zvkmo4eml@)sfq1ZG3C3C4k$!BW%rrr7MiB}PZorSAf)ueZpxhbUq`ZM74a5k7u~F=c~XuXF$<(=uC{kTQz09KnbVJG zbHh%{36L^?V)>8)qOjOeKl&NN>2?{cunD!yJ(F13KXj$4Y8~VjyHMXTf5=X~FE{)3 zGn`f>D(0+7fAcjucUehx{GHEJkB6n@pWn_)txO;;&(N-8XNIo_TGlg7_|8L=+R$cx zNP;PmRcKMjYZ>o}D}zvbeB(?spRmC^1u9~ijL156u(0bphLf*b&dxPPDOaQG&o&>O zD&zt0-JC!nwPHheEk>M|i#y@88Oz!hf=kHysBof(iRtkmx~WQc({=+<@ohZn$I^L; zE0NvsJG;vm z<_bSp;+mbu2&bs+-GLy9cGiMd7LG;IqB0j7Z>;Uf(RN{FjI@>uleez&&|O=p+rwND zA9UPr?{qYDK20IHvEjQ9Nink%B>35oYnk44<9^+t;td79u_a>9cLnNnH6&_tb9+8( zLt3CW&7oQ0%Mu44JXGOWL=^H?3P^kXQCBS0r6N5E8ZN9~2;plQWU71n&E7+@VN4{) zy~~fLnc&1%h=HifF4p_rew$NwUTrOqzX_(=52h-q<)Qht_r#`vKE>lMtV0`fdyJF_ zTzHEpAIW}ozbrA3x@e@eceHRf5~%0;IO8)lS(|Iy(F7-J_hBK;K3isnYXReuD>Yk} z7eyfxY-_TX@%`<&zKWX?d2;x;-|FIk`ZJXFSxO!>&8QZJ6V@kGE?FUT(ld550CCpw zG$92Jy-74mg(Ir`NV)`a`$Ac&a@5XKY`-eqT%*iZrxYzRC0P%urvO2anFN_h<>W21 zAddGiCrKg_v|AA!HeIiEA1`m^MLyv?rZc;5{$UK{Ub8z6U06dITMjFJB(SLgZE& zEhwS@Ju)eTvTmN57AcY-V(%PHA)|OwOstP!A87CUVey4?3n97d0b`wIbG#!4(r|_z z?Auq)rh2kp#!Zp=A}UX%cz5z%O7Ormu-GP=PVb&V@$auzY;3}FUc5zM}IZ{e&@p} zP8nuci8}wKS^x5-zpWCoWXliBtZq7a=!5;f#^5>lyAXSbVhMqussPLi7aa^Te+hw1 zQiJwSGZDnke}sIJVEpE)&+IpuP%nOW)A5M@?Inm4o)HCS_Fv6Hd?KKM*jWFXqm|6x?1EDG@DW+Fy#>h))5LFz&GY!TcwA-KU_DfC^Sv8qL}HrVU;Ww4+mQ=Th9SA$A9I^8!# zf~kEqsWoYCLR!eD*cRhbbCdKK3Rzcud7Bk3!^_oE;TX>~H{p|MNeA)6GsqDEEBwIn z*hm7J8Oj$WnaeI0EX%Q(VW2e->>@pfC`C<2md&Ac9aLX%_c zaZC29_?iuLCYTR(M0zYv6E`!YG4egA*1%4alggxKs;;|A@3x8{K7BA;b1k}lrWQHU zp(cz_A&I8@(yq*b&tmLw^d{uQ_sjtHsF@{hEl&#IJG^A$g+IG;pnJ<%x ztXETmo$DSdBvFII!^4-$pIE<2T)gYW!29=%s4MA&q zMKV?Gke;>nTIeUq@xBvZC*G}J6#WG{WvO4iU09>l0qlC+&`UG_#{#BJP7H*v*v>XO zI6AT7CJ?XcLSFCq>9Cy%c{w>-FY6;dU@%2%JlKPp`EybOb{ybq>Wp(%0_q=H`Jono zr3@`Pb6!)+qMtt$6a0;*(w_zC$svOfl}e zo57{mEj&;@DiE@cRN<_2+oZG@fhhJ9N%R6r<}J#RkR<_h`NV%O#9!CfBI|}~W|I>9 z7)V1u=&3Zmf8(5sp(RDV5c!W0xt4TI>3DH_a_Gy60QN2GSm3E=*55cf%`X*r z-xw^(<{wMu`^ZqLqQIGN$cg!_GeG4LSD?JB`&P3S>;^%Hpqnh zo~ei67QyL~;IE4Rrog?Ppn3Z~ND3Y`>IIm;!{pUqhU&lN8 zKie+gmkIp*9)IgC)R0t}(>zQBs((|e0;ln}O=M{$lZIOG^KT!$LaNDXt?TLlnx?}M zsAnO{DinVQ%8#(oTFCKR|9sf|Sng2n#;tB=iseIt@xLmsmHh#~l`ID*j?nrE!pyZ_xMm}hTK=t0q3 z*unP+qama(?l=@ROBFckcw_FEWW~v!M#8x2;A!z=o;gX2l#~`HQOGAMW0tF2SZUBZ zU|wvBGWSpcNs#sb@Rl+jlC0IyiuFTk62AxpH!(JYjZ zgqwG!Afm(v${y@ZFb|ruO4@YUy%qtAaDE!F1uNq_xo_fTRS0C7zE ztO=bJ5B~X5>RX{31HxoD{8{$KDDYO0u1b3+&YOSpig5$Z4?qtn0v&(TOMjNhfW~34%Z-oyTCghH`0av7er^2)DI9CY07c!p zn$w|xjyPYJop*jwY^w)mMs15Cvaki)y`3RYnXS4Jsk9iV_*HmCB!^(!4_J&s(HTXY z7yS77C7Q1mcu0Y+!gC?pUc5-V6Fu1RY7X`5#8kiBMQ!f3fLpTXh(zx|Gt>@1K=wf& zyplLa>Ln!RV*Wr;^fHeUy&cYEoo?+6asxnpwHKBtFaPHlI&PiH7e=5=gz{{~=ml}a z1sVybn-!rebjL4Hu;#(~?Wo1{6b@5pjga+rRA|AD-N=oSk}Eb3S51A++nr`by3&Ha ze0q1cWbZ)gLHYSrcf!X9GeW)?1)teOS{uE-+d38+5>^#imJ4~qWF>GxJGK;}j$V*M z=0Fw~T+6?%h+YSm83|sPe+0xDM+X z4LeFITpGxLSDD(LRp1H03`ZGAvO`l8A#CCkQzitPZ9VB*wdUZy;jEqa4(u5lQ~3Pk zN_GpBbUsfO!6nF-3kHAC6)S*+MGIV`aEMP7X~F5Hg3`#z;rPd`5Lw-XKoP7XH#6iK$DejJ0&&D z*wB9m6uKgpW?13>o`ht)fsd+-_KY@a+L%T|gVzMyG7`S{k9>&V8~&nScp}=}=ks`d zS66ew!Ql5+wJ&OOw8JyxHEh`uf0O}X>gZocsyy5{_RL5mKJ5SnpaM{k^y8cspZ?JX z23hA6`4Q7v1Hk9HY{Uy{6*<$bT|yJ|p|bp08u2Nj0O`5AK^m2W^O^*AGMxGyLfTta z#u@ZJ&1tz~yUOS>fS^FF0J`mR&`=S&esbY%CtPLcqE>pv<9k?U;mPZ3Jmldb^$WOez#+O-Y+pw5E4mjVP1`gNu+e;3-wuIu~$=<1qf-S_i6_u=>a?%xWx*li{( zC?!ZB5QKNqw_6ejL=NvCA^@I*Rp>qk{}FvG&5Q}TFIEo`2r}q&|$QbaZ%w- z=ef_VY09npg!>JTiVGZjikwk&U~fFyvqPegBx3NHYCt(UHHvAeKef+vJ=qgwS$FrN z^^Sq?2I&)OMkc++GM}S-u1_n73|d}EogW$xT^PSxz1Z2^ow{c2+R%ldz`#w5rvm~? z7+yxfGsjQPO^r4g?b)+uu)Dh=w4z}$Dwx}HAT@REVoAmKK$g|H(5aH{kRX>&pXSSY zg9!PmcoV`pn6{X0imEFh3R>kqWK-$u*1b`c#ZX43_&XC6w$#}5Ydo30`g5}g%CY!f zB-rmAw667QRK3Fs>~!FyOO)A)#fa|3FD(gAZ(&n}!wDWD^CF z#?Uw+n@-gaZAa7hV!TIodJR;r`F6Fp7YMiqJkg@5im=9oJ+(N^%rZ^Bw!ZKw+o`le zgIb6}%yRtuN)?f1Ocl)4 z!LP}%1&r@F-NA0J8Ju0Y{vbaQ zx+{0CT6!CrjvxxKb=!J`Oc&p{x(k6wJMv4g*K6vEmQkgUlsNmcyp*~a_*#fgyZ*}VEBl7iTB-hnz)h>)x97KY6!b*K40qeVL%yW}jpvrUaM z+~e>F2l(<7D+?*tA%zgLv5e3OCaw2?zSubY3i zpx0ZQGaIkh`P3%AtFL9Cvd?(C|EK|WzmQ2%h@tS-)fWPRG;)JT&e}9`!(Q2*db#6U zQi5NNl~;#h))Q)NDgg=sG**ec1)VwetgP?JS*DVjJjd_*#mgg9?hjl~vosC?7yGIG zgC=B4`bCIE!%F1yWr!)t50Rv zRjntCP+@;LivqogcVbF~1N_D)|6}BD@4}XZIvTQXR~V+*E2P8;EuT9rUe|Edx?*l1 zsm?CGJA6#+_4==!q5gjIZnbygr%qvFK@9K z-euQj^P4|#}#$j08vTbNXTMEMB zHz<*_An{CL{Cm|{qEK9qpP)NQXBur5AUdYZMO&3XL9@e?N%Hr7O}@LNA5cR%wAOcL zFll(e^YQe_$MM*6tbL}&jRuKRP_h;$%AvxOlzn5*o!cmHOOkYyR_jN~nAnpuAZtOv zqa&v&m#0_UXYWA8LngHO@f8U9f+W|h`mIpLnLR~nXuc>B0?=TVTAV1Ax7%s-%g!kY zc)grPdl!9@VFO#fykllXmPjVx+PVZJ<9?;~D*Q5NlEb|Yg8dg7y%{!_Az(lBH@QIVb!NK2x z{(+z(DOK(K56+{_@KP0|xb@E4nyWZb=%T5V$n6B21WKZ(8RhWxp3;Vp97PPxrl_fF z1f=$T+X=!y>8}JK9*i`WSO2&0dryqAOKCaLSFPcK(VhdsMEErY1(j~yc}$={Fg1yS z^)P`uCcz5&*4vm=XAKZt|EwR=Wlbaja)#{|PQJSxpO0jCggp`@!oxHS?e%z$RfWZx z5%6lzpb~~So46s00G$VJHBLe#KI=6^c!fNMI(>nu0yzc{vf4BZtNK7v5V8q^$(teo z(6Y<>V`=fB^bcaMO?zUu@jN{bY20b9ZksbKp^mTCJ!dEZoPbi7#+5jc*!nXBsF93v zB5x$l)l(TZ()a-Z-XazgiC66$3v5QI)^!X~Qh)x&@u#49D4MAuornq>`I6bT&UC#K-9!K3^ol>go@Z6!{0fWs|^1Kz6pAy=2@?jXV*+nHnT zyI+^HPJG?y00kKaIl7j;R5F%?$;zOJf6mNxJStE?p@RgaNkZn!Gx}2wEO46FQgtU? zTPp`1NRa+l}SqhXj9{D{JJVC=W5qtdkw zJD5-~bQkLPSg#lyv-}s`?+F&5LIpt+%4ROwy9j8CUTXkJI0%xfWd|jYp1()XW>q4T zAgTHr+>t-T5%A{`ahMC_vl&8s89m4G*4g^#yEUYYj;5b3%Z63%g6>vWsBb;H1D&K! zo@Y-6mV&eZA%Mm?;4_AVT-q zv1^^LhY=uq>f0S?k(!k~qcwZiqt)YE&JrMfit^@P^@9Yn&)$3l7qrkPBw(_{Wnj1U z`kK_xHESFe7C(RX1$?ss%U@Qo+(iU*I++N`a+;ehR}$fq;EIBOnUi>91d|bPIY1;~ zRbC4RK(I0TBxdBzwg2^I6N0nNn$hDl`omr@=bJ6iwhD z3f24f!{oQ;3AjyF`;m+wK@fYhG&*Xu@Hr|^&B^|k835t~J?{W5uUOU@a6@lZs(^f0 zVI!tock6SMrhNZwuG#C)9O9bc@z+($B9{Ey%kbOKhyq8QzataXCLYN5X>NXw; zl?%gkfRPwKkCpwu(f4imAMXmCuhgm~?peS2tqDUwFfrExaDwc`oQnCpx#E>hJTo0DB9+@twbU-$L84;?pP~-@`5nbx#N(ef2?Bu~JJM!+x z5}T^5jpE0Qdn6z@y4MrTb8Z6EU$ayo2B2P4w~}#LPDjK_dnb}RMORPOVmp}Mo^kKo zzS#5P;RVd4GSO!p{yhD?9XtRiWYA;F1ETZ`V9*ADQ90x*$Jug@h_k(ai`C3_)ZM{l zQ~TY!_m+v^9_C--PyU8Luw|pfA9(cVUmgMQ>yJkas*h(4Ka>TaG_^GC27r07lMd#^ zrNO&H2F$5?mSA2q(qsX!Aa_Cp4_5d z$SzXzfNX1v@TQ7sejQDuStUV50u3 zb^tbx?=Kbv6jdu%r`fYq-UO})mB86@OH~j6RxJC~bByOG;$Jx`_w+yTuF(+u{R)M5EhT~DD~F!W?0b}S z)2kc>z7%-frw4dKlDy1q@Zg5xzj&Y#aPxa9@$!i08k4L1K-!Sz)n*wOFxyrSY49HC z{N=$V*gKL}1p7!M3kwThW@ct4CO;itm>(PSjGv-%)vg(`1n}r5E0pfJ5d4P1frBH|G`L=suqVHR(s?(F*7qQ?0H+hYKyy~6V z?bMt+!>d|k$ad9AJg0APY?MUiPVF+wqoe77_JUNZ0b+gWW$AquX+-MQoxH6^i-25q z^o3)dTHZgG!;d9SICjY!jNX()aF11+dDQOKG0?TTtM`8c>0z7lEu9UB3@WCBrVJbP z(0w07NFggtK@M&zrjC?I(l6YT)D&JxVhy+H%%6Qk%ZW6-pxH?IR3AMc=U)626vK<9Ws+c|Ur}zA z$M!Hx7y9NZ$qVI_A`vPL=kiNalvi?FC*4BoZv1AypQ_w880h&hFY}&exu?_)G+h~B zEHidKfq+XOIy{aexP&mc1m7Qw=c5o92>RV~Yd>FB0ZQ5m`KI=yFiCD#jp4WsknW^bx$yFw_?Hc;Ed8=k<=nl# zdY)(YDq^EBiJZ?C|NFvzDOjC;-eZlI%3Cgid~-$V$Va9#iIra|Jpx2MNS;G}`?Q|Q zW#W3T?I9AsDOl`G?AP}eXZX8p0zmPDwya!X9ft`le|&$8N>|nZ@s`O^!G%@^9`5Y4 zN8ikNe7muuHc(nRJaKM4vDQyGA`#49$}(F2rDq!FDdd$?R)+LTU2VOzQq@UEm#XuI z8n>}|HIG%g00`B$vDNzREugdV0ASe$2D-GJ!%*onr{Nu!tfo~qr+_)+{*_IEKJ!0+ z>)}g#IR=EpO}sUCH&E$!p89vGg465*r%8#Uadw{>eSGlza@NK1_7>Z?{4HxsQ~a77 zlLJyNC#egCaZWKp?dBeegq+22w6+jxX^S4sBOMWyM&>j4s!2;#j zYv_F?oB1VOWE@_OXm8|`<@}^zZ)pfr;;nMR$pBnjpbbyn31!5zZUR^0CflfAT5@4c z@%Hyapm%Nxjn2;QM87)U*f9d2am(qe0ZD(_tRsNJbRfjb<_pKuIOnQczHH^!j2(G- z=K)fqG-d_CKkoWsn)VF<>=#{yxls}POVVhjp*+Viy8EP0rx2?(s@1oGRCDb^WF;9& z5L6A?atS**mzgszg6AB`G`5G48Xz1}+D^D58GXl>jY{EUZkkExqNgZ#;kn^PM%qDq zY1}*esrOfD(&D$VIjy}6o3^L7W@~}zg%6PgJcs_J{aKkIN1UnuBo>sJe~%}Hd+`&A z#s8S-MdJ`n#veDp1#(Ov(t1@MB(W-+^~WcGoEv>?s63pOL-U<0Kab762&n0zaG$r5 zc%pAAiG1N{vow%N5|o!@5@@5qBbr7sHa0fqa{gP?;`fo@rdwF9_{s0HBYzRoPESpC zHZLP;akhH5UUCFb@boCkf#_^cdS$s3&>}bRC6yUX zR43_eNc}Kn4c5%AbDb6g*Xw3oghi{wJ(W0k)tZcKxIptLQ2dXlb&yzT`OAjZ<2gc) zSfTwBzHzji*h=a0l%@LQrF_FO0XzrZ)I17nTD(2u8;e;Bn4=qrD}42FA+agco(5pU z>Xba_^-5`F1}er3AR)9}{h%f)|u<>KcEl(7Mp28Z#m zlm%Mx*h3Xud-e6(6+Zx)z;~17Gv9twW?q=zhiMCKCYPI;0TC7+0kZY)_2;X_sjaPT ziS|-Br0I{aNJZsu$UM25ro|~WZyRoXJ?WG3E|C$s z@DxtAg1a?WUZQWHlRG|%5LKH%(Atye*0$p>f`dKBtrgS zN7e!#IGWEh+T1|Cl?5SLAZdj>jJbENa*?lIc*PNuDMfzp^_Q@7$L{U9#>}7o17Zgj A*8l(j From 3e4f2c3efa706eed144102334c526c3db2d292bc Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 18:15:39 +0000 Subject: [PATCH 006/108] 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 d899c59d8..e5bccfab1 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -c2c6c99fc7846677ad28a36f7697fce7744080e8 \ No newline at end of file +690ec6e90499b24364c06ad404fd0d2b0c521134 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index a11b74078..b2dfc2ae4 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", - "@cornerstonejs/tools": "4.4.2" + "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/tools": "4.5.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 6c85add51..54465f65a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", - "@cornerstonejs/tools": "4.4.2" + "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/tools": "4.5.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 25f389827..105599ba2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/core": "4.5.0", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7bc2d39ea..c38e5ec1a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.4.2", - "@cornerstonejs/core": "4.4.2", - "@cornerstonejs/dicom-image-loader": "4.4.2", - "@cornerstonejs/nifti-volume-loader": "4.4.2", - "@cornerstonejs/tools": "4.4.2", + "@cornerstonejs/adapters": "4.5.0", + "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/dicom-image-loader": "4.5.0", + "@cornerstonejs/nifti-volume-loader": "4.5.0", + "@cornerstonejs/tools": "4.5.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 98d5faa6f..ef7d2a099 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", - "@cornerstonejs/tools": "4.4.2", + "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/tools": "4.5.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 0f7928dfb..34eba480a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2" + "@cornerstonejs/core": "4.5.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 90635e249..63c2df302 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", - "@cornerstonejs/tools": "4.4.2", + "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/tools": "4.5.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index f4e378bb1..d9c4735e0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.4.2", + "@cornerstonejs/core": "4.5.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 84b2ab55c..b635d1469 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.4.2", - "commit": "c2c6c99fc7846677ad28a36f7697fce7744080e8" + "version": "4.5.0", + "commit": "690ec6e90499b24364c06ad404fd0d2b0c521134" } \ No newline at end of file diff --git a/version.txt b/version.txt index f93922292..ae153944e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.4.2 \ No newline at end of file +4.5.0 \ No newline at end of file From d2af0de684fa36bb05b864895c39ac2689bf8fec Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 18:15:53 +0000 Subject: [PATCH 007/108] 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 70e2c2d1d..c8011cb1c 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +### Features + +- **BrushTool:** segmentation brush interpolation ([#2374](https://github.com/cornerstonejs/cornerstone3D/issues/2374)) ([690ec6e](https://github.com/cornerstonejs/cornerstone3D/commit/690ec6e90499b24364c06ad404fd0d2b0c521134)) + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) ### Bug Fixes diff --git a/lerna.json b/lerna.json index bc1be1673..2213b677b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.4.2", + "version": "4.5.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index a55aa1e62..fdb7f8864 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b2dfc2ae4..047619410 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.4.2", + "version": "4.5.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 130450549..812cfd974 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 54465f65a..810c98493 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.4.2", + "version": "4.5.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index e95b4db4f..849464696 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 0ea176206..4b4d25fa2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.4.2", + "version": "4.5.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 d73c10d0c..65f54f03f 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 105599ba2..c68162377 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.4.2", + "version": "4.5.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 9ef783e0b..15261e5dd 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index ef7d2a099..704d591b8 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.4.2", + "version": "4.5.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 3c824b342..0a144ec03 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-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 34eba480a..c192a8973 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": "4.4.2", + "version": "4.5.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 25b2fa91f..f05753b2c 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 63c2df302..7b7f64271 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.4.2", + "version": "4.5.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 1bcc0cc3d..ed4c22db2 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. +# [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) + +### Features + +- **BrushTool:** segmentation brush interpolation ([#2374](https://github.com/cornerstonejs/cornerstone3D/issues/2374)) ([690ec6e](https://github.com/cornerstonejs/cornerstone3D/commit/690ec6e90499b24364c06ad404fd0d2b0c521134)) + ## [4.4.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.1...v4.4.2) (2025-10-06) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index d9c4735e0..5a4f950e0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.4.2", + "version": "4.5.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b678e3f34fb4984c6ba94c1564e60b63ae08cd42 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 18:16:03 +0000 Subject: [PATCH 008/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index dd29e0ab6..bc1edceb4 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.4.2'; +export const version = '4.5.0'; From 969369a623ea39ba9740e547fb94867183ec396b Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:00:43 -0400 Subject: [PATCH 009/108] fix(segmentation): For contour segmentation logical operators, avoid updating segment color and label when they are not defined/specified. (#2376) --- .../contourSegmentation/logicalOperators.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/utilities/contourSegmentation/logicalOperators.ts b/packages/tools/src/utilities/contourSegmentation/logicalOperators.ts index 4e5d05904..f239176b2 100644 --- a/packages/tools/src/utilities/contourSegmentation/logicalOperators.ts +++ b/packages/tools/src/utilities/contourSegmentation/logicalOperators.ts @@ -164,14 +164,26 @@ function addSegmentInSegmentation( if (!segmentation?.segments) { return; } - segmentation.segments[segmentIndex] = { + + const segmentData: SegmentInfo = segmentation.segments[segmentIndex] ?? { active: false, locked: false, - label, segmentIndex, cachedStats: {}, + label, color, }; + + // Only update label if it's defined + if (label !== undefined) { + segmentData.label = label; + } + // Only update color if it's defined + if (color !== undefined) { + segmentData.color = color; + } + + segmentation.segments[segmentIndex] = segmentData; } /** From 86985585f4d7c01dd8dc08625bedfdd2a2314f11 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 21:05:52 +0000 Subject: [PATCH 010/108] 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 e5bccfab1..df0ddd02e 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -690ec6e90499b24364c06ad404fd0d2b0c521134 \ No newline at end of file +969369a623ea39ba9740e547fb94867183ec396b \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 047619410..93bba433f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", - "@cornerstonejs/tools": "4.5.0" + "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/tools": "4.5.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 810c98493..bed7040fc 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", - "@cornerstonejs/tools": "4.5.0" + "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/tools": "4.5.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c68162377..436ddd937 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/core": "4.5.1", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index c38e5ec1a..51b78de9a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.0", - "@cornerstonejs/core": "4.5.0", - "@cornerstonejs/dicom-image-loader": "4.5.0", - "@cornerstonejs/nifti-volume-loader": "4.5.0", - "@cornerstonejs/tools": "4.5.0", + "@cornerstonejs/adapters": "4.5.1", + "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/dicom-image-loader": "4.5.1", + "@cornerstonejs/nifti-volume-loader": "4.5.1", + "@cornerstonejs/tools": "4.5.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 704d591b8..e92466d31 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", - "@cornerstonejs/tools": "4.5.0", + "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/tools": "4.5.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c192a8973..004326a1b 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0" + "@cornerstonejs/core": "4.5.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7b7f64271..76927d3ae 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", - "@cornerstonejs/tools": "4.5.0", + "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/tools": "4.5.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5a4f950e0..fc9c2798e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.0", + "@cornerstonejs/core": "4.5.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index b635d1469..d3f9f6d24 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.0", - "commit": "690ec6e90499b24364c06ad404fd0d2b0c521134" + "version": "4.5.1", + "commit": "969369a623ea39ba9740e547fb94867183ec396b" } \ No newline at end of file diff --git a/version.txt b/version.txt index ae153944e..99523d476 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.0 \ No newline at end of file +4.5.1 \ No newline at end of file From f81b751527a4ca7d95374d0f7502485446db4569 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 21:06:06 +0000 Subject: [PATCH 011/108] 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 c8011cb1c..ce70502eb 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +### Bug Fixes + +- **segmentation:** For contour segmentation logical operators, avoid updating segment color and label when they are not defined/specified. ([#2376](https://github.com/cornerstonejs/cornerstone3D/issues/2376)) ([969369a](https://github.com/cornerstonejs/cornerstone3D/commit/969369a623ea39ba9740e547fb94867183ec396b)) + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) ### Features diff --git a/lerna.json b/lerna.json index 2213b677b..556069654 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.0", + "version": "4.5.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index fdb7f8864..aae21dfaf 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 93bba433f..830bb43e0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.0", + "version": "4.5.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 812cfd974..b18f1a57d 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/ai + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index bed7040fc..a5caa91fa 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.0", + "version": "4.5.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 849464696..f2629067b 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/core + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 4b4d25fa2..5c2460ba9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.0", + "version": "4.5.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 65f54f03f..ebda8e19a 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 436ddd937..2c1d5aad8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.0", + "version": "4.5.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 15261e5dd..2f5a99fef 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index e92466d31..8b63dc6a5 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.0", + "version": "4.5.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 0a144ec03..66fecad37 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **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 004326a1b..91326032c 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": "4.5.0", + "version": "4.5.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 f05753b2c..8e3f4d21e 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 76927d3ae..bc6540e55 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.0", + "version": "4.5.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index ed4c22db2..fa827652e 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. +## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) + +### Bug Fixes + +- **segmentation:** For contour segmentation logical operators, avoid updating segment color and label when they are not defined/specified. ([#2376](https://github.com/cornerstonejs/cornerstone3D/issues/2376)) ([969369a](https://github.com/cornerstonejs/cornerstone3D/commit/969369a623ea39ba9740e547fb94867183ec396b)) + # [4.5.0](https://github.com/cornerstonejs/cornerstone3D/compare/v4.4.2...v4.5.0) (2025-10-07) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index fc9c2798e..218054ec7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.0", + "version": "4.5.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From d6f57a44f27720d3c6052aa2f791414dad976e89 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 21:06:17 +0000 Subject: [PATCH 012/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index bc1edceb4..26afa3eb4 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.0'; +export const version = '4.5.1'; From 18509162c91b4c2be08c61d95ce75dbeeb4329f2 Mon Sep 17 00:00:00 2001 From: m00n620 <50647994+m00n620@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:49:15 -0400 Subject: [PATCH 013/108] fix: limit pan off viewport (#2375) * feat: limit pan off viewport * refactor --- .../examples/stackManipulationTools/index.ts | 2 +- packages/tools/src/tools/PanTool.ts | 87 ++++++++++++++++++- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/packages/tools/examples/stackManipulationTools/index.ts b/packages/tools/examples/stackManipulationTools/index.ts index 2ae2d86b3..8f19589b4 100644 --- a/packages/tools/examples/stackManipulationTools/index.ts +++ b/packages/tools/examples/stackManipulationTools/index.ts @@ -144,7 +144,7 @@ async function run() { // Add tools to the tool group toolGroup.addTool(WindowLevelTool.toolName); - toolGroup.addTool(PanTool.toolName); + toolGroup.addTool(PanTool.toolName, { limitToViewport: true }); toolGroup.addTool(ZoomTool.toolName); toolGroup.addTool(StackScrollTool.toolName, { loop: false }); toolGroup.addTool(PlanarRotateTool.toolName); diff --git a/packages/tools/src/tools/PanTool.ts b/packages/tools/src/tools/PanTool.ts index ff96b39c4..9c664f745 100644 --- a/packages/tools/src/tools/PanTool.ts +++ b/packages/tools/src/tools/PanTool.ts @@ -1,5 +1,5 @@ import { BaseTool } from './base'; -import { getEnabledElement } from '@cornerstonejs/core'; +import { getEnabledElement, utilities as csUtils } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; import type { EventTypes, PublicToolProps, ToolProps } from '../types'; @@ -13,6 +13,9 @@ class PanTool extends BaseTool { toolProps: PublicToolProps = {}, defaultToolProps: ToolProps = { supportedInteractionTypes: ['Mouse', 'Touch'], + configuration: { + limitToViewport: false, + }, } ) { super(toolProps, defaultToolProps); @@ -26,11 +29,79 @@ class PanTool extends BaseTool { this._dragCallback(evt); } + _checkImageInViewport(viewport, deltaPointsCanvas: Types.Point2) { + const { canvas } = viewport; + const ratio = window.devicePixelRatio; + + const viewportLeft = 0; + const viewportRight = canvas.width / ratio; + const viewportTop = 0; + const viewportBottom = canvas.height / ratio; + + const defaultActor = viewport.getDefaultActor(); + const renderer = viewport.getRenderer(); + + let bounds; + if (defaultActor && csUtils.isImageActor(defaultActor)) { + // Use the default actor's bounds + const imageData = defaultActor.actor.getMapper().getInputData(); + bounds = imageData.getBounds(); + } else { + // Fallback to all actors if no default image actor is found + bounds = renderer.computeVisiblePropBounds(); + } + + const [imageLeft, imageTop] = viewport.worldToCanvas([ + bounds[0], + bounds[2], + bounds[4], + ]); + const [imageRight, imageBottom] = viewport.worldToCanvas([ + bounds[1], + bounds[3], + bounds[5], + ]); + + const zoom = viewport.getZoom(); + + // Check image bounds against viewport bounds + if (zoom <= 1) { + if ( + (imageLeft + deltaPointsCanvas[0] < viewportLeft && + deltaPointsCanvas[0] < 0) || + (imageRight + deltaPointsCanvas[0] > viewportRight && + deltaPointsCanvas[0] > 0) || + (imageTop + deltaPointsCanvas[1] < viewportTop && + deltaPointsCanvas[1] < 0) || + (imageBottom + deltaPointsCanvas[1] > viewportBottom && + deltaPointsCanvas[1] > 0) + ) { + return false; + } + } else { + if ( + (imageLeft + deltaPointsCanvas[0] > viewportLeft && + deltaPointsCanvas[0] > 0) || + (imageRight + deltaPointsCanvas[0] < viewportRight && + deltaPointsCanvas[0] < 0) || + (imageTop + deltaPointsCanvas[1] > viewportTop && + deltaPointsCanvas[1] > 0) || + (imageBottom + deltaPointsCanvas[1] < viewportBottom && + deltaPointsCanvas[1] < 0) + ) { + return false; + } + } + + return true; + } + _dragCallback(evt: EventTypes.InteractionEventType) { const { element, deltaPoints } = evt.detail; const enabledElement = getEnabledElement(element); const deltaPointsWorld = deltaPoints.world; + const deltaPointsCanvas = deltaPoints.canvas; // This occurs when the mouse event is fired but the mouse hasn't moved a full pixel yet (high resolution mice) if ( deltaPointsWorld[0] === 0 && @@ -39,9 +110,17 @@ class PanTool extends BaseTool { ) { return; } - const camera = enabledElement.viewport.getCamera(); + const viewport = enabledElement.viewport; + const camera = viewport.getCamera(); const { focalPoint, position } = camera; + if ( + this.configuration.limitToViewport && + !this._checkImageInViewport(viewport, deltaPointsCanvas) + ) { + return; + } + const updatedPosition = [ position[0] - deltaPointsWorld[0], position[1] - deltaPointsWorld[1], @@ -54,11 +133,11 @@ class PanTool extends BaseTool { focalPoint[2] - deltaPointsWorld[2], ]; - enabledElement.viewport.setCamera({ + viewport.setCamera({ focalPoint: updatedFocalPoint, position: updatedPosition, }); - enabledElement.viewport.render(); + viewport.render(); } } From a10bb48123f1a7c2f4bfc284a9ae97e2461dea30 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 22:52:57 +0000 Subject: [PATCH 014/108] 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 df0ddd02e..e584919f1 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -969369a623ea39ba9740e547fb94867183ec396b \ No newline at end of file +18509162c91b4c2be08c61d95ce75dbeeb4329f2 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 830bb43e0..c6f1422ae 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", - "@cornerstonejs/tools": "4.5.1" + "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/tools": "4.5.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a5caa91fa..cf8e13080 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", - "@cornerstonejs/tools": "4.5.1" + "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/tools": "4.5.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2c1d5aad8..79f04e16e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/core": "4.5.2", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 51b78de9a..79f704e91 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.1", - "@cornerstonejs/core": "4.5.1", - "@cornerstonejs/dicom-image-loader": "4.5.1", - "@cornerstonejs/nifti-volume-loader": "4.5.1", - "@cornerstonejs/tools": "4.5.1", + "@cornerstonejs/adapters": "4.5.2", + "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/dicom-image-loader": "4.5.2", + "@cornerstonejs/nifti-volume-loader": "4.5.2", + "@cornerstonejs/tools": "4.5.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 8b63dc6a5..ec23edba3 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", - "@cornerstonejs/tools": "4.5.1", + "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/tools": "4.5.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 91326032c..2994f654f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1" + "@cornerstonejs/core": "4.5.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index bc6540e55..5c5af23a5 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", - "@cornerstonejs/tools": "4.5.1", + "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/tools": "4.5.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 218054ec7..bf8b82381 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.1", + "@cornerstonejs/core": "4.5.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index d3f9f6d24..31f294241 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.1", - "commit": "969369a623ea39ba9740e547fb94867183ec396b" + "version": "4.5.2", + "commit": "18509162c91b4c2be08c61d95ce75dbeeb4329f2" } \ No newline at end of file diff --git a/version.txt b/version.txt index 99523d476..689f7fbd3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.1 \ No newline at end of file +4.5.2 \ No newline at end of file From eb7a50b01442c6c17febe00d5865c03eb4c0c350 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 22:53:10 +0000 Subject: [PATCH 015/108] 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 ce70502eb..5f3a3dc07 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +### Bug Fixes + +- limit pan off viewport ([#2375](https://github.com/cornerstonejs/cornerstone3D/issues/2375)) ([1850916](https://github.com/cornerstonejs/cornerstone3D/commit/18509162c91b4c2be08c61d95ce75dbeeb4329f2)) + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 556069654..7648c0ba8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.1", + "version": "4.5.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index aae21dfaf..f6383ce16 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c6f1422ae..ff9d77c94 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.1", + "version": "4.5.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 b18f1a57d..5eaa54899 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index cf8e13080..bac73ab1b 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.1", + "version": "4.5.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f2629067b..a297de61a 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 5c2460ba9..a2550b38d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.1", + "version": "4.5.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 ebda8e19a..357fbaea5 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 79f04e16e..ac5b876f7 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.1", + "version": "4.5.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 2f5a99fef..8ac317f45 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index ec23edba3..82d9ea924 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.1", + "version": "4.5.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 66fecad37..c705d30b9 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **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 2994f654f..b8a706a22 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": "4.5.1", + "version": "4.5.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 8e3f4d21e..7859ea049 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 5c5af23a5..7960e3b55 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.1", + "version": "4.5.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index fa827652e..e390c7b68 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. +## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) + +### Bug Fixes + +- limit pan off viewport ([#2375](https://github.com/cornerstonejs/cornerstone3D/issues/2375)) ([1850916](https://github.com/cornerstonejs/cornerstone3D/commit/18509162c91b4c2be08c61d95ce75dbeeb4329f2)) + ## [4.5.1](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.0...v4.5.1) (2025-10-07) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index bf8b82381..5461da3eb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.1", + "version": "4.5.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 586ad50c7640afcea3e89fa3777ca7698b955ccb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 7 Oct 2025 22:53:20 +0000 Subject: [PATCH 016/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 26afa3eb4..ebb8bf900 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.1'; +export const version = '4.5.2'; From 563fc6c6b8edf987b115b540d4069a2238b88fee Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Wed, 8 Oct 2025 09:44:11 -0400 Subject: [PATCH 017/108] fix(segmentation): Added SEGMENTATION_REPRESENTATION_MODIFIED event listener to LabelmapEditWithContour tool to ensure a contour representation is added for the tool. (#2377) --- .../src/tools/segmentation/LabelmapEditWithContour.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts b/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts index 5bce524e0..253d91c19 100644 --- a/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts +++ b/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts @@ -121,6 +121,10 @@ class LabelMapEditWithContourTool extends PlanarFreehandContourSegmentationTool Events.SEGMENTATION_MODIFIED, this.onSegmentationModifiedBinded ); + eventTarget.addEventListener( + Events.SEGMENTATION_REPRESENTATION_MODIFIED, + this.onSegmentationModifiedBinded + ); } /** @@ -155,6 +159,10 @@ class LabelMapEditWithContourTool extends PlanarFreehandContourSegmentationTool Events.SEGMENTATION_MODIFIED, this.onSegmentationModified.bind(this) ); + eventTarget.removeEventListener( + Events.SEGMENTATION_REPRESENTATION_MODIFIED, + this.onSegmentationModified.bind(this) + ); } /** From 598f8f405c4b9c37844b6db5fcaa55f46c837e50 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 13:48:20 +0000 Subject: [PATCH 018/108] 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 e584919f1..b21a4de14 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -18509162c91b4c2be08c61d95ce75dbeeb4329f2 \ No newline at end of file +563fc6c6b8edf987b115b540d4069a2238b88fee \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ff9d77c94..d181c626d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", - "@cornerstonejs/tools": "4.5.2" + "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/tools": "4.5.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index bac73ab1b..639eab04a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", - "@cornerstonejs/tools": "4.5.2" + "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/tools": "4.5.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index ac5b876f7..527b17767 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/core": "4.5.3", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 79f704e91..232a410b6 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.2", - "@cornerstonejs/core": "4.5.2", - "@cornerstonejs/dicom-image-loader": "4.5.2", - "@cornerstonejs/nifti-volume-loader": "4.5.2", - "@cornerstonejs/tools": "4.5.2", + "@cornerstonejs/adapters": "4.5.3", + "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/dicom-image-loader": "4.5.3", + "@cornerstonejs/nifti-volume-loader": "4.5.3", + "@cornerstonejs/tools": "4.5.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 82d9ea924..82e67bf4a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", - "@cornerstonejs/tools": "4.5.2", + "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/tools": "4.5.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b8a706a22..536fe72c6 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2" + "@cornerstonejs/core": "4.5.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7960e3b55..44bc53546 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", - "@cornerstonejs/tools": "4.5.2", + "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/tools": "4.5.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5461da3eb..8ded7eb4e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.2", + "@cornerstonejs/core": "4.5.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 31f294241..e5666ac1e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.2", - "commit": "18509162c91b4c2be08c61d95ce75dbeeb4329f2" + "version": "4.5.3", + "commit": "563fc6c6b8edf987b115b540d4069a2238b88fee" } \ No newline at end of file diff --git a/version.txt b/version.txt index 689f7fbd3..ae6e65bd9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.2 \ No newline at end of file +4.5.3 \ No newline at end of file From 378731fd724b5e3f25289a710a1ac31ba3d990b7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 13:48:33 +0000 Subject: [PATCH 019/108] 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 5f3a3dc07..31b760022 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +### Bug Fixes + +- **segmentation:** Added SEGMENTATION_REPRESENTATION_MODIFIED event listener to LabelmapEditWithContour tool to ensure a contour representation is added for the tool. ([#2377](https://github.com/cornerstonejs/cornerstone3D/issues/2377)) ([563fc6c](https://github.com/cornerstonejs/cornerstone3D/commit/563fc6c6b8edf987b115b540d4069a2238b88fee)) + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 7648c0ba8..be429cdd2 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.2", + "version": "4.5.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index f6383ce16..fa645ed70 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d181c626d..fcdf483e4 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.2", + "version": "4.5.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 5eaa54899..744c59a26 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 639eab04a..2fc037a8c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.2", + "version": "4.5.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a297de61a..4c4c4398d 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index a2550b38d..be3ce5559 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.2", + "version": "4.5.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 357fbaea5..5086b642a 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 527b17767..d5dddeef2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.2", + "version": "4.5.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 8ac317f45..5e9486271 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 82e67bf4a..dd16ee619 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.2", + "version": "4.5.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 c705d30b9..8ab0916f9 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **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 536fe72c6..0e25a1dd7 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": "4.5.2", + "version": "4.5.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 7859ea049..d72e63af9 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 44bc53546..cdc38163d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.2", + "version": "4.5.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index e390c7b68..c8f9763ca 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. +## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) + +### Bug Fixes + +- **segmentation:** Added SEGMENTATION_REPRESENTATION_MODIFIED event listener to LabelmapEditWithContour tool to ensure a contour representation is added for the tool. ([#2377](https://github.com/cornerstonejs/cornerstone3D/issues/2377)) ([563fc6c](https://github.com/cornerstonejs/cornerstone3D/commit/563fc6c6b8edf987b115b540d4069a2238b88fee)) + ## [4.5.2](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.1...v4.5.2) (2025-10-07) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 8ded7eb4e..959f053ff 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.2", + "version": "4.5.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From cd5898def857a37fc3add224d8f4c5233fa6d568 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 13:48:42 +0000 Subject: [PATCH 020/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ebb8bf900..dc23fcdd4 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.2'; +export const version = '4.5.3'; From cfc232c0472aa89eba859d2e2da97af58ca50bfc Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:15:20 -0400 Subject: [PATCH 021/108] fix: clear preview segmentation when AI tools are disabled (#2373) - Add rejectPreview() call to LabelmapSlicePropagationTool onSetToolDisabled() and onSetToolPassive() - Add rejectPreview() call to MarkerLabelmapTool onSetToolDisabled() - Follows the same pattern as BrushTool for consistency - Fixes OHI-2219: Preview segmentation persists when tools are toggled off Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Alireza --- packages/ai/src/LabelmapSlicePropagationTool.ts | 2 ++ packages/ai/src/MarkerLabelmapTool.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/ai/src/LabelmapSlicePropagationTool.ts b/packages/ai/src/LabelmapSlicePropagationTool.ts index 6f63d8294..100c02ed1 100644 --- a/packages/ai/src/LabelmapSlicePropagationTool.ts +++ b/packages/ai/src/LabelmapSlicePropagationTool.ts @@ -106,6 +106,7 @@ class LabelmapSlicePropagationTool extends LabelmapBaseTool { if (this.segmentAI) { this.segmentAI.enabled = false; } + this.rejectPreview(); }; onSetToolPassive = (): void => { @@ -113,6 +114,7 @@ class LabelmapSlicePropagationTool extends LabelmapBaseTool { if (this.segmentAI) { this.segmentAI.enabled = false; } + this.rejectPreview(); }; /** diff --git a/packages/ai/src/MarkerLabelmapTool.ts b/packages/ai/src/MarkerLabelmapTool.ts index 2925e4fa5..6cb135199 100644 --- a/packages/ai/src/MarkerLabelmapTool.ts +++ b/packages/ai/src/MarkerLabelmapTool.ts @@ -235,6 +235,7 @@ class MarkerLabelmapTool extends LabelmapBaseTool { if (this.segmentAI) { this.segmentAI.enabled = false; } + this.rejectPreview(); }; /** From 4e945e435a03a4eb62f162a79fc2168d18f72ce1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 14:19:37 +0000 Subject: [PATCH 022/108] 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 b21a4de14..37278f80f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -563fc6c6b8edf987b115b540d4069a2238b88fee \ No newline at end of file +cfc232c0472aa89eba859d2e2da97af58ca50bfc \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index fcdf483e4..766ea4b23 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", - "@cornerstonejs/tools": "4.5.3" + "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/tools": "4.5.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 2fc037a8c..38fbfddb3 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", - "@cornerstonejs/tools": "4.5.3" + "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/tools": "4.5.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d5dddeef2..14c182314 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/core": "4.5.4", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 232a410b6..1e4098f2e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.3", - "@cornerstonejs/core": "4.5.3", - "@cornerstonejs/dicom-image-loader": "4.5.3", - "@cornerstonejs/nifti-volume-loader": "4.5.3", - "@cornerstonejs/tools": "4.5.3", + "@cornerstonejs/adapters": "4.5.4", + "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/dicom-image-loader": "4.5.4", + "@cornerstonejs/nifti-volume-loader": "4.5.4", + "@cornerstonejs/tools": "4.5.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 dd16ee619..215488e0a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", - "@cornerstonejs/tools": "4.5.3", + "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/tools": "4.5.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 0e25a1dd7..a83a7bb58 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3" + "@cornerstonejs/core": "4.5.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index cdc38163d..680e7fcfd 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", - "@cornerstonejs/tools": "4.5.3", + "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/tools": "4.5.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 959f053ff..61bfca112 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.3", + "@cornerstonejs/core": "4.5.4", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index e5666ac1e..47af0ac1d 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.3", - "commit": "563fc6c6b8edf987b115b540d4069a2238b88fee" + "version": "4.5.4", + "commit": "cfc232c0472aa89eba859d2e2da97af58ca50bfc" } \ No newline at end of file diff --git a/version.txt b/version.txt index ae6e65bd9..d01c9f660 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.3 \ No newline at end of file +4.5.4 \ No newline at end of file From 721d2190c24f6cb291705218d24a2c06198d3591 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 14:19:52 +0000 Subject: [PATCH 023/108] 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 | 6 ++++++ 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, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31b760022..3e27c8fd7 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +### Bug Fixes + +- clear preview segmentation when AI tools are disabled ([#2373](https://github.com/cornerstonejs/cornerstone3D/issues/2373)) ([cfc232c](https://github.com/cornerstonejs/cornerstone3D/commit/cfc232c0472aa89eba859d2e2da97af58ca50bfc)) + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) ### Bug Fixes diff --git a/lerna.json b/lerna.json index be429cdd2..7a5f75308 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.3", + "version": "4.5.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index fa645ed70..46cbae280 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 766ea4b23..66093f094 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.3", + "version": "4.5.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 744c59a26..32d970ce9 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +### Bug Fixes + +- clear preview segmentation when AI tools are disabled ([#2373](https://github.com/cornerstonejs/cornerstone3D/issues/2373)) ([cfc232c](https://github.com/cornerstonejs/cornerstone3D/commit/cfc232c0472aa89eba859d2e2da97af58ca50bfc)) + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 38fbfddb3..c16285acd 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.3", + "version": "4.5.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 4c4c4398d..f6936de2d 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index be3ce5559..f21772ee0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.3", + "version": "4.5.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 5086b642a..a66cdd163 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 14c182314..c8956e93e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.3", + "version": "4.5.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 5e9486271..1fceb7249 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 215488e0a..b86ca24b1 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.3", + "version": "4.5.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 8ab0916f9..4f3b6273f 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **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 a83a7bb58..7e806e139 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": "4.5.3", + "version": "4.5.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 d72e63af9..414a8c632 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 680e7fcfd..35355d077 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.3", + "version": "4.5.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c8f9763ca..c1f0abe01 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. +## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.3](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.2...v4.5.3) (2025-10-08) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 61bfca112..2855be3ae 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.3", + "version": "4.5.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From d6c75a36e76e4e633f8a002618bb3ac74d1e56e2 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 8 Oct 2025 14:20:02 +0000 Subject: [PATCH 024/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index dc23fcdd4..2c519bb46 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.3'; +export const version = '4.5.4'; From 7d61b2c7cd1627c34b0547967c5616d01fc29f96 Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:09:21 -0400 Subject: [PATCH 025/108] fix(interpolation): Fixed contour segmentation interpolation for spline contours. (#2381) For simplified splines, fire an annotation modified event when the simplified spline is added so that the interpolation is triggered. When choosing the viewport for the interpolation, choose a viewport that has the interpolated annotation's referenced image id. --- .../annotation/SplineContourSegmentationTool.ts | 1 + .../convertContourSegmentation.ts | 3 +++ .../tools/src/utilities/getViewportForAnnotation.ts | 12 +++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/annotation/SplineContourSegmentationTool.ts b/packages/tools/src/tools/annotation/SplineContourSegmentationTool.ts index b8542ee96..7b1cd2576 100644 --- a/packages/tools/src/tools/annotation/SplineContourSegmentationTool.ts +++ b/packages/tools/src/tools/annotation/SplineContourSegmentationTool.ts @@ -45,6 +45,7 @@ class SplineContourSegmentationTool extends SplineROITool { protected annotationCutMergeCompleted(evt) { const { sourceAnnotation: annotation } = evt.detail; if ( + this.toolName !== annotation?.metadata?.toolName || !this.splineToolNames.includes(annotation?.metadata?.toolName) || !this.configuration.simplifiedSpline ) { diff --git a/packages/tools/src/utilities/contourSegmentation/convertContourSegmentation.ts b/packages/tools/src/utilities/contourSegmentation/convertContourSegmentation.ts index 5b03da21a..e3cfaf808 100644 --- a/packages/tools/src/utilities/contourSegmentation/convertContourSegmentation.ts +++ b/packages/tools/src/utilities/contourSegmentation/convertContourSegmentation.ts @@ -6,6 +6,7 @@ import { addAnnotation, removeAnnotation } from '../../stateManagement'; import type { ContourSegmentationAnnotation } from '../../types'; import { removeContourSegmentationAnnotation } from './removeContourSegmentationAnnotation'; import { addContourSegmentationAnnotation } from './addContourSegmentationAnnotation'; +import { triggerAnnotationModified } from '../../stateManagement/annotation/helpers/state'; // Default tool name used for converted contour segmentation annotations const DEFAULT_CONTOUR_SEG_TOOL_NAME = 'PlanarFreehandContourSegmentationTool'; @@ -106,6 +107,8 @@ export default function convertContourSegmentationAnnotation( addAnnotation(newAnnotation, annotation.metadata.FrameOfReferenceUID); addContourSegmentationAnnotation(newAnnotation); + triggerAnnotationModified(newAnnotation); + // Return the newly created annotation return newAnnotation; } diff --git a/packages/tools/src/utilities/getViewportForAnnotation.ts b/packages/tools/src/utilities/getViewportForAnnotation.ts index 177898ed8..7bdea4173 100644 --- a/packages/tools/src/utilities/getViewportForAnnotation.ts +++ b/packages/tools/src/utilities/getViewportForAnnotation.ts @@ -16,5 +16,15 @@ export default function getViewportForAnnotation( ): Types.IStackViewport | Types.IVolumeViewport | undefined { const viewports = getViewportsForAnnotation(annotation); - return viewports.length ? viewports[0] : undefined; + if (!viewports?.length) { + return undefined; + } + + const viewport = viewports.find((viewport) => + viewport + .getImageIds() + .some((imageId) => imageId === annotation.metadata.referencedImageId) + ); + + return viewport ?? viewports[0]; } From fbb2dd71cd0933e02e981a42803132b34a0c7515 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 9 Oct 2025 20:13:41 +0000 Subject: [PATCH 026/108] 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 37278f80f..cff13d11d 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -cfc232c0472aa89eba859d2e2da97af58ca50bfc \ No newline at end of file +7d61b2c7cd1627c34b0547967c5616d01fc29f96 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 66093f094..c2d06d7ea 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", - "@cornerstonejs/tools": "4.5.4" + "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/tools": "4.5.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index c16285acd..49f54e3ca 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", - "@cornerstonejs/tools": "4.5.4" + "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/tools": "4.5.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c8956e93e..66e5b698c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/core": "4.5.5", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 1e4098f2e..2b5a6dff5 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.4", - "@cornerstonejs/core": "4.5.4", - "@cornerstonejs/dicom-image-loader": "4.5.4", - "@cornerstonejs/nifti-volume-loader": "4.5.4", - "@cornerstonejs/tools": "4.5.4", + "@cornerstonejs/adapters": "4.5.5", + "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/dicom-image-loader": "4.5.5", + "@cornerstonejs/nifti-volume-loader": "4.5.5", + "@cornerstonejs/tools": "4.5.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 b86ca24b1..3aac2d3e9 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", - "@cornerstonejs/tools": "4.5.4", + "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/tools": "4.5.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7e806e139..cb6ebd20f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4" + "@cornerstonejs/core": "4.5.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 35355d077..4357dd098 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", - "@cornerstonejs/tools": "4.5.4", + "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/tools": "4.5.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 2855be3ae..828528c49 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.4", + "@cornerstonejs/core": "4.5.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 47af0ac1d..0b563a3bb 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.4", - "commit": "cfc232c0472aa89eba859d2e2da97af58ca50bfc" + "version": "4.5.5", + "commit": "7d61b2c7cd1627c34b0547967c5616d01fc29f96" } \ No newline at end of file diff --git a/version.txt b/version.txt index d01c9f660..500212027 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.4 \ No newline at end of file +4.5.5 \ No newline at end of file From 362bc5e06e0d74c17ebfa3abe75cbe7d7735f495 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 9 Oct 2025 20:13:53 +0000 Subject: [PATCH 027/108] 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 3e27c8fd7..b6016082f 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +### Bug Fixes + +- **interpolation:** Fixed contour segmentation interpolation for spline contours. ([#2381](https://github.com/cornerstonejs/cornerstone3D/issues/2381)) ([7d61b2c](https://github.com/cornerstonejs/cornerstone3D/commit/7d61b2c7cd1627c34b0547967c5616d01fc29f96)) + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 7a5f75308..8011b9c64 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.4", + "version": "4.5.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 46cbae280..568be4f57 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c2d06d7ea..d552cb0a0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.4", + "version": "4.5.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 32d970ce9..ec6ea0185 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) ### Bug Fixes diff --git a/packages/ai/package.json b/packages/ai/package.json index 49f54e3ca..c92487591 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.4", + "version": "4.5.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f6936de2d..5147bae09 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index f21772ee0..76c1b65a1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.4", + "version": "4.5.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 a66cdd163..69dfa2e0d 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 66e5b698c..155ce07af 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.4", + "version": "4.5.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 1fceb7249..37192fa1a 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3aac2d3e9..6e635202f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.4", + "version": "4.5.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 4f3b6273f..798895688 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **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 cb6ebd20f..566687bb6 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": "4.5.4", + "version": "4.5.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 414a8c632..bb83f3ee2 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4357dd098..bcc34bb98 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.4", + "version": "4.5.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c1f0abe01..0e19cdeea 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. +## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) + +### Bug Fixes + +- **interpolation:** Fixed contour segmentation interpolation for spline contours. ([#2381](https://github.com/cornerstonejs/cornerstone3D/issues/2381)) ([7d61b2c](https://github.com/cornerstonejs/cornerstone3D/commit/7d61b2c7cd1627c34b0547967c5616d01fc29f96)) + ## [4.5.4](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.3...v4.5.4) (2025-10-08) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 828528c49..febf4f5f9 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.4", + "version": "4.5.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 81069bb99855572947ad7111bec99f4d66a3d79b Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 9 Oct 2025 20:14:02 +0000 Subject: [PATCH 028/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 2c519bb46..ed560258b 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.4'; +export const version = '4.5.5'; From 89a8db54bec5b96a61624dcca65464982d5e40b3 Mon Sep 17 00:00:00 2001 From: Devu-trenser <91659097+Devu-trenser@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:27:09 +0530 Subject: [PATCH 029/108] fix: Updated BasicStatsCalculator to change from private to protected (#2382) --- packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts b/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts index ee847f318..1698f7108 100644 --- a/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts +++ b/packages/tools/src/utilities/math/basic/BasicStatsCalculator.ts @@ -293,7 +293,7 @@ function basicGetStatistics( * A static basic stats calculator that uses shared helper functions. */ export class BasicStatsCalculator extends Calculator { - private static state: BasicStatsState = createBasicStatsState(true); + protected static state: BasicStatsState = createBasicStatsState(true); public static statsInit(options: { storePointData: boolean }): void { if (!options.storePointData) { From 5d4da10dc569684ed33f1f9d2109ec6f3c2620ab Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 10 Oct 2025 14:01:16 +0000 Subject: [PATCH 030/108] 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 cff13d11d..ae507dbd3 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -7d61b2c7cd1627c34b0547967c5616d01fc29f96 \ No newline at end of file +89a8db54bec5b96a61624dcca65464982d5e40b3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d552cb0a0..e1f904b75 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", - "@cornerstonejs/tools": "4.5.5" + "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/tools": "4.5.6" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index c92487591..407b628c8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", - "@cornerstonejs/tools": "4.5.5" + "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/tools": "4.5.6" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 155ce07af..4081c3f9a 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/core": "4.5.6", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2b5a6dff5..1f71080bf 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.5", - "@cornerstonejs/core": "4.5.5", - "@cornerstonejs/dicom-image-loader": "4.5.5", - "@cornerstonejs/nifti-volume-loader": "4.5.5", - "@cornerstonejs/tools": "4.5.5", + "@cornerstonejs/adapters": "4.5.6", + "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/dicom-image-loader": "4.5.6", + "@cornerstonejs/nifti-volume-loader": "4.5.6", + "@cornerstonejs/tools": "4.5.6", "@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 6e635202f..a2d4c4ecc 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", - "@cornerstonejs/tools": "4.5.5", + "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/tools": "4.5.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 566687bb6..7e23925b4 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5" + "@cornerstonejs/core": "4.5.6" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index bcc34bb98..2a3a6cae1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", - "@cornerstonejs/tools": "4.5.5", + "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/tools": "4.5.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index febf4f5f9..5ab12dafa 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.5", + "@cornerstonejs/core": "4.5.6", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 0b563a3bb..254ac02c7 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.5", - "commit": "7d61b2c7cd1627c34b0547967c5616d01fc29f96" + "version": "4.5.6", + "commit": "89a8db54bec5b96a61624dcca65464982d5e40b3" } \ No newline at end of file diff --git a/version.txt b/version.txt index 500212027..2733e9268 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.5 \ No newline at end of file +4.5.6 \ No newline at end of file From 7fa76e8828f0a248868506c971f382e4eca51db4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 10 Oct 2025 14:01:31 +0000 Subject: [PATCH 031/108] 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 b6016082f..c225ef935 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +### Bug Fixes + +- Updated BasicStatsCalculator to change from private to protected ([#2382](https://github.com/cornerstonejs/cornerstone3D/issues/2382)) ([89a8db5](https://github.com/cornerstonejs/cornerstone3D/commit/89a8db54bec5b96a61624dcca65464982d5e40b3)) + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 8011b9c64..23b64d7a8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.5", + "version": "4.5.6", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 568be4f57..6e9a65af6 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index e1f904b75..5b1700d57 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.5", + "version": "4.5.6", "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 ec6ea0185..6a679553a 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 407b628c8..fb2d5ae8d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.5", + "version": "4.5.6", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 5147bae09..0ded5fb84 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 76c1b65a1..f0741d4fa 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.5", + "version": "4.5.6", "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 69dfa2e0d..8b64c8226 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4081c3f9a..04aec5996 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.5", + "version": "4.5.6", "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 37192fa1a..eb3eaa6fa 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a2d4c4ecc..004c56731 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.5", + "version": "4.5.6", "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 798895688..9c22f2375 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **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 7e23925b4..718da3fa9 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": "4.5.5", + "version": "4.5.6", "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 bb83f3ee2..e3835ea34 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2a3a6cae1..d2f78dbb0 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.5", + "version": "4.5.6", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 0e19cdeea..e6b2c44ed 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. +## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) + +### Bug Fixes + +- Updated BasicStatsCalculator to change from private to protected ([#2382](https://github.com/cornerstonejs/cornerstone3D/issues/2382)) ([89a8db5](https://github.com/cornerstonejs/cornerstone3D/commit/89a8db54bec5b96a61624dcca65464982d5e40b3)) + ## [4.5.5](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.4...v4.5.5) (2025-10-09) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 5ab12dafa..5b1c345fb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.5", + "version": "4.5.6", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 4f634db4526be8197d1f5fe2aa743af9bcc1c520 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 10 Oct 2025 14:01:42 +0000 Subject: [PATCH 032/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ed560258b..ef84dbca2 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.5'; +export const version = '4.5.6'; From 222e3a8d7ea0297a4be327df03510d0ab77d938f Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:45:41 -0400 Subject: [PATCH 033/108] fix(bun): Use bun version 1.2.23. (#2390) --- .circleci/config.yml | 11 +---------- .github/workflows/build-docs.yml | 2 ++ .github/workflows/docusaurus-build.yml | 2 +- .github/workflows/format-check.yml | 2 +- .github/workflows/playwright.yml | 2 ++ .github/workflows/test.yml | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 567ef3fd9..6f730ae4b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,22 +13,13 @@ defaults: &defaults commands: install_bun: steps: - - restore_cache: - keys: - - bun-cache-v2-{{ arch }}-latest - run: name: Install Bun command: | - if [ ! -d "$HOME/.bun" ]; then - curl -fsSL https://bun.sh/install | bash - fi + curl -fsSL https://bun.sh/install | bash -s "bun-v1.2.23" echo 'export BUN_INSTALL="$HOME/.bun"' >> $BASH_ENV echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> $BASH_ENV source $BASH_ENV - - save_cache: - key: bun-cache-v2-{{ arch }}-latest - paths: - - ~/.bun jobs: CHECKOUT: diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index a3eefd2ba..b35e1434b 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -24,6 +24,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.2.23 - uses: actions/setup-node@v4 with: node-version: 20 # Or your desired Node version diff --git a/.github/workflows/docusaurus-build.yml b/.github/workflows/docusaurus-build.yml index db1311cbb..d234e5dbb 100644 --- a/.github/workflows/docusaurus-build.yml +++ b/.github/workflows/docusaurus-build.yml @@ -31,7 +31,7 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v2 with: - bun-version: latest + bun-version: 1.2.23 - name: Install root dependencies run: bun install --frozen-lockfile diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 22411a335..b4e7781e8 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v2 with: - bun-version: latest + bun-version: 1.2.23 - name: Install dependencies run: bun install diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 434f499c3..48637afd4 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -18,6 +18,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.2.23 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dc82425a3..ac5d01109 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Bun uses: oven-sh/setup-bun@v2 with: - bun-version: latest # Or pin to a specific version like '1.1.18' + bun-version: 1.2.23 - name: Install dependencies run: bun install --frozen-lockfile From 687983c39cccd28cec14c143e0861aabfb9ae75e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 14 Oct 2025 21:49:19 +0000 Subject: [PATCH 034/108] 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 ae507dbd3..d356881bc 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -89a8db54bec5b96a61624dcca65464982d5e40b3 \ No newline at end of file +222e3a8d7ea0297a4be327df03510d0ab77d938f \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 5b1700d57..06737baca 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", - "@cornerstonejs/tools": "4.5.6" + "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/tools": "4.5.7" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index fb2d5ae8d..58f78b265 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", - "@cornerstonejs/tools": "4.5.6" + "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/tools": "4.5.7" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 04aec5996..08269766b 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/core": "4.5.7", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 1f71080bf..9a37be74f 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.6", - "@cornerstonejs/core": "4.5.6", - "@cornerstonejs/dicom-image-loader": "4.5.6", - "@cornerstonejs/nifti-volume-loader": "4.5.6", - "@cornerstonejs/tools": "4.5.6", + "@cornerstonejs/adapters": "4.5.7", + "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/dicom-image-loader": "4.5.7", + "@cornerstonejs/nifti-volume-loader": "4.5.7", + "@cornerstonejs/tools": "4.5.7", "@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 004c56731..3fa1c36fd 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", - "@cornerstonejs/tools": "4.5.6", + "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/tools": "4.5.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 718da3fa9..cf0890cfe 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6" + "@cornerstonejs/core": "4.5.7" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index d2f78dbb0..a0ed2aaa7 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", - "@cornerstonejs/tools": "4.5.6", + "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/tools": "4.5.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5b1c345fb..84f655c0c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.6", + "@cornerstonejs/core": "4.5.7", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 254ac02c7..a6bfd3971 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.6", - "commit": "89a8db54bec5b96a61624dcca65464982d5e40b3" + "version": "4.5.7", + "commit": "222e3a8d7ea0297a4be327df03510d0ab77d938f" } \ No newline at end of file diff --git a/version.txt b/version.txt index 2733e9268..0c8d4d7eb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.6 \ No newline at end of file +4.5.7 \ No newline at end of file From aa51a1502be2c1d5a853c49af71e88cd429ef884 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 14 Oct 2025 21:49:31 +0000 Subject: [PATCH 035/108] 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 | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 47 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c225ef935..4f91ba248 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +### Bug Fixes + +- **bun:** Use bun version 1.2.23. ([#2390](https://github.com/cornerstonejs/cornerstone3D/issues/2390)) ([222e3a8](https://github.com/cornerstonejs/cornerstone3D/commit/222e3a8d7ea0297a4be327df03510d0ab77d938f)) + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 23b64d7a8..b51136c45 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.6", + "version": "4.5.7", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 6e9a65af6..edebfcb60 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 06737baca..de00e5812 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.6", + "version": "4.5.7", "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 6a679553a..26c4562c3 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 58f78b265..0eaa8e0ca 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.6", + "version": "4.5.7", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0ded5fb84..fb0c3035a 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index f0741d4fa..5a0ba907d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.6", + "version": "4.5.7", "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 8b64c8226..cfdcecd05 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 08269766b..405825804 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.6", + "version": "4.5.7", "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 eb3eaa6fa..a4231587f 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3fa1c36fd..d54c94b1d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.6", + "version": "4.5.7", "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 9c22f2375..14c3db0e6 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **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 cf0890cfe..5688191a9 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": "4.5.6", + "version": "4.5.7", "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 e3835ea34..7950001d3 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a0ed2aaa7..7d5aa9952 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.6", + "version": "4.5.7", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index e6b2c44ed..02bb5d313 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. +## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.6](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.5...v4.5.6) (2025-10-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 84f655c0c..60fb70e01 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.6", + "version": "4.5.7", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From a9b4a8ce73d0415f14132d7c0abfbde66a0221d0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 14 Oct 2025 21:49:39 +0000 Subject: [PATCH 036/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ef84dbca2..a1aa9f1c1 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.6'; +export const version = '4.5.7'; From 90ed2e9d1b0ce134feec1adafe570977ba8d1981 Mon Sep 17 00:00:00 2001 From: nithin-trenser <107548822+nithin-trenser@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:20:12 +0530 Subject: [PATCH 037/108] Fixed issue:- The segments are not removed from the viewport when the user deletes the ROI after loading a SEG file if at least 2 segments drawn in the same slice (#2267) --- .../Segmentation/labelmapImagesFromBuffer.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/adapters/src/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.ts b/packages/adapters/src/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.ts index 0b27f2999..dc5895940 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.ts @@ -370,6 +370,7 @@ export function insertPixelDataPlanar({ const imageIdIndex = imageIdMaps.indices[imageId]; const labelmapImage = labelMapImages[imageIdIndex]; const labelmap2DView = labelmapImage.getPixelData(); + const imageVoxelManager = labelmapImage.voxelManager; const data = alignedPixelDataI.data; @@ -400,7 +401,16 @@ export function insertPixelDataPlanar({ }) ); } - labelmap2DView[x] = segmentIndex; + if (imageVoxelManager) { + // Ensure voxelManager updates boundaries + imageVoxelManager.setAtIndex( + x, + segmentIndex + ); + } else { + // Directly assign pixel data when volume is not managed via voxelManager. + labelmap2DView[x] = segmentIndex; + } indexCache.push(x); } } From 8665941ac975674eb621fcd9f1ee53a616ba8f58 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 13:53:49 +0000 Subject: [PATCH 038/108] 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 d356881bc..78f805108 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -222e3a8d7ea0297a4be327df03510d0ab77d938f \ No newline at end of file +90ed2e9d1b0ce134feec1adafe570977ba8d1981 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index de00e5812..a5def78ea 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", - "@cornerstonejs/tools": "4.5.7" + "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/tools": "4.5.8" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 0eaa8e0ca..c3473710c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", - "@cornerstonejs/tools": "4.5.7" + "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/tools": "4.5.8" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 405825804..c17726cb0 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/core": "4.5.8", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 9a37be74f..da647187a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.7", - "@cornerstonejs/core": "4.5.7", - "@cornerstonejs/dicom-image-loader": "4.5.7", - "@cornerstonejs/nifti-volume-loader": "4.5.7", - "@cornerstonejs/tools": "4.5.7", + "@cornerstonejs/adapters": "4.5.8", + "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/dicom-image-loader": "4.5.8", + "@cornerstonejs/nifti-volume-loader": "4.5.8", + "@cornerstonejs/tools": "4.5.8", "@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 d54c94b1d..65edb5bad 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", - "@cornerstonejs/tools": "4.5.7", + "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/tools": "4.5.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5688191a9..cf2db5f70 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7" + "@cornerstonejs/core": "4.5.8" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7d5aa9952..5aca246e9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", - "@cornerstonejs/tools": "4.5.7", + "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/tools": "4.5.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 60fb70e01..4576341ed 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.7", + "@cornerstonejs/core": "4.5.8", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index a6bfd3971..4a9193127 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.7", - "commit": "222e3a8d7ea0297a4be327df03510d0ab77d938f" + "version": "4.5.8", + "commit": "90ed2e9d1b0ce134feec1adafe570977ba8d1981" } \ No newline at end of file diff --git a/version.txt b/version.txt index 0c8d4d7eb..b544af5f9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.7 \ No newline at end of file +4.5.8 \ No newline at end of file From c1f3f1522d92e53c453dbd3ff8b4921ee39cb6bf Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 13:54:01 +0000 Subject: [PATCH 039/108] 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 4f91ba248..b8764d8c0 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package root + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) ### Bug Fixes diff --git a/lerna.json b/lerna.json index b51136c45..36084d4cc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.7", + "version": "4.5.8", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index edebfcb60..92119f410 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index a5def78ea..e5147d950 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.7", + "version": "4.5.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 26c4562c3..8ad5d3677 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index c3473710c..0f651cde9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.7", + "version": "4.5.8", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index fb0c3035a..31733fb8c 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 5a0ba907d..1f0eec0a3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.7", + "version": "4.5.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 cfdcecd05..2155c89e8 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c17726cb0..138779a4f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.7", + "version": "4.5.8", "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 a4231587f..9d4216a99 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 65edb5bad..33a4a4dad 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.7", + "version": "4.5.8", "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 14c3db0e6..f682a2a74 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **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 cf2db5f70..1c1370541 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": "4.5.7", + "version": "4.5.8", "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 7950001d3..2e38e819d 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 5aca246e9..5965e5a12 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.7", + "version": "4.5.8", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 02bb5d313..c2551fa2a 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. +## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.7](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.6...v4.5.7) (2025-10-14) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 4576341ed..da777d079 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.7", + "version": "4.5.8", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 8534f86040ba427cf37ae2d64b337e78a05b312c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 13:54:10 +0000 Subject: [PATCH 040/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index a1aa9f1c1..6a2766c5c 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.7'; +export const version = '4.5.8'; From 662a8b3c7b3268557e9787fd6abc67e923ab731b Mon Sep 17 00:00:00 2001 From: Julian Linares <140447953+julianlinaress@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:31:32 -0300 Subject: [PATCH 041/108] fix: update toLowHighRange function to handle SIGMOID function bounds as a temporary fix (#2394) --- packages/core/src/utilities/windowLevel.ts | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/core/src/utilities/windowLevel.ts b/packages/core/src/utilities/windowLevel.ts index 11d8ed740..62a1737e1 100644 --- a/packages/core/src/utilities/windowLevel.ts +++ b/packages/core/src/utilities/windowLevel.ts @@ -58,7 +58,13 @@ function toLowHighRange( lower: number; upper: number; } { - if (voiLUTFunction === VOILUTFunctionType.LINEAR) { + // Note: The SIGMOID function is currently treated the same as LINEAR + // because we don't have a good way to define "bounds" for it. + // Remove or statement when fixed + if ( + voiLUTFunction === VOILUTFunctionType.LINEAR || + voiLUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID + ) { // From C.11.2.1.2.1 (linear function) return { lower: windowCenter - 0.5 - (windowWidth - 1) / 2, @@ -70,15 +76,18 @@ function toLowHighRange( lower: windowCenter - windowWidth / 2, upper: windowCenter + windowWidth / 2, }; - } else if (voiLUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID) { - // From C.11.2.1.3.1 (sigmoid function) - // Sigmoid: y = 1 / (1 + exp(-4*(x - c)/w)) - const xLower = logit(0.01, windowCenter, windowWidth); - const xUpper = logit(0.99, windowCenter, windowWidth); - return { - lower: xLower, - upper: xUpper, - }; + // Note: The SIGMOID function is currently treated the same as LINEAR + // because we don't have a good way to define "bounds" for it. + // Uncomment when fixed + // } else if (voiLUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID) { + // // From C.11.2.1.3.1 (sigmoid function) + // // Sigmoid: y = 1 / (1 + exp(-4*(x - c)/w)) + // const xLower = logit(0.01, windowCenter, windowWidth); + // const xUpper = logit(0.99, windowCenter, windowWidth); + // return { + // lower: xLower, + // upper: xUpper, + // }; } else { throw new Error('Invalid VOI LUT function'); } From 1d45a4604548de9eab0bb63fe8e179d943318628 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 20:35:06 +0000 Subject: [PATCH 042/108] 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 78f805108..3195aa54e 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -90ed2e9d1b0ce134feec1adafe570977ba8d1981 \ No newline at end of file +662a8b3c7b3268557e9787fd6abc67e923ab731b \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index e5147d950..167870ecb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", - "@cornerstonejs/tools": "4.5.8" + "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/tools": "4.5.9" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 0f651cde9..5b545db32 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", - "@cornerstonejs/tools": "4.5.8" + "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/tools": "4.5.9" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 138779a4f..0cffe8f77 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/core": "4.5.9", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index da647187a..8db2ca91c 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.8", - "@cornerstonejs/core": "4.5.8", - "@cornerstonejs/dicom-image-loader": "4.5.8", - "@cornerstonejs/nifti-volume-loader": "4.5.8", - "@cornerstonejs/tools": "4.5.8", + "@cornerstonejs/adapters": "4.5.9", + "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/dicom-image-loader": "4.5.9", + "@cornerstonejs/nifti-volume-loader": "4.5.9", + "@cornerstonejs/tools": "4.5.9", "@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 33a4a4dad..9d82263f1 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", - "@cornerstonejs/tools": "4.5.8", + "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/tools": "4.5.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 1c1370541..268acc36f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8" + "@cornerstonejs/core": "4.5.9" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 5965e5a12..ce0bc4f89 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", - "@cornerstonejs/tools": "4.5.8", + "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/tools": "4.5.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index da777d079..45b3f66ac 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.8", + "@cornerstonejs/core": "4.5.9", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 4a9193127..03b7fd687 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.8", - "commit": "90ed2e9d1b0ce134feec1adafe570977ba8d1981" + "version": "4.5.9", + "commit": "662a8b3c7b3268557e9787fd6abc67e923ab731b" } \ No newline at end of file diff --git a/version.txt b/version.txt index b544af5f9..94bc0a3e0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.8 \ No newline at end of file +4.5.9 \ No newline at end of file From 594d1be09fad541bf44d666d2ea3011c75799d2f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 20:35:18 +0000 Subject: [PATCH 043/108] 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 | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8764d8c0..ee2d12205 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +### Bug Fixes + +- update toLowHighRange function to handle SIGMOID function bounds as a temporary fix ([#2394](https://github.com/cornerstonejs/cornerstone3D/issues/2394)) ([662a8b3](https://github.com/cornerstonejs/cornerstone3D/commit/662a8b3c7b3268557e9787fd6abc67e923ab731b)) + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 36084d4cc..8d1034e98 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.8", + "version": "4.5.9", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 92119f410..68a3a3f5a 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 167870ecb..7202209e1 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.8", + "version": "4.5.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 8ad5d3677..c71a48d4f 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 5b545db32..3d59633ed 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.8", + "version": "4.5.9", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 31733fb8c..20e58fe22 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +### Bug Fixes + +- update toLowHighRange function to handle SIGMOID function bounds as a temporary fix ([#2394](https://github.com/cornerstonejs/cornerstone3D/issues/2394)) ([662a8b3](https://github.com/cornerstonejs/cornerstone3D/commit/662a8b3c7b3268557e9787fd6abc67e923ab731b)) + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 1f0eec0a3..d67a9b971 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.8", + "version": "4.5.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 2155c89e8..56e8e245b 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 0cffe8f77..d2a569af3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.8", + "version": "4.5.9", "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 9d4216a99..cb8dadb44 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 9d82263f1..0cbdee5a7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.8", + "version": "4.5.9", "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 f682a2a74..25bdf0deb 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **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 268acc36f..49302b4a4 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": "4.5.8", + "version": "4.5.9", "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 2e38e819d..d5024cd5a 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index ce0bc4f89..a35f2c8c2 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.8", + "version": "4.5.9", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c2551fa2a..c36a1b44a 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. +## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.8](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.7...v4.5.8) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 45b3f66ac..0565e4bb3 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.8", + "version": "4.5.9", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 4a7c39f07b5c1890772a4ed258a23bb6c7c56965 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 15 Oct 2025 20:35:27 +0000 Subject: [PATCH 044/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 6a2766c5c..913c848d6 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.8'; +export const version = '4.5.9'; From a13fce2d65aa1d5b8de849ddf6255e3d42dc841a Mon Sep 17 00:00:00 2001 From: Celian-abd <101793092+Celian-abd@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:13:45 +0200 Subject: [PATCH 045/108] fix(MagnifyTool): Fix MagnifyTool freeze when pressing right click (#2388) * debug magnify tool * fix * run prettier --- packages/tools/src/tools/MagnifyTool.ts | 29 ++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/MagnifyTool.ts b/packages/tools/src/tools/MagnifyTool.ts index a97838b05..93f58fd70 100644 --- a/packages/tools/src/tools/MagnifyTool.ts +++ b/packages/tools/src/tools/MagnifyTool.ts @@ -204,6 +204,15 @@ class MagnifyTool extends BaseTool { triggerAnnotationRenderForViewportIds(viewportIdsToRender); }; + _cancelCallback = (evt: EventTypes.InteractionEventType) => { + // Empêche l'affichage du menu contextuel par défaut du navigateur + evt.preventDefault(); + evt.stopPropagation(); + + // Appelle la fonction qui désactive et nettoie l'outil + this._dragEndCallback(evt); + }; + _dragCallback = (evt: EventTypes.InteractionEventType) => { const eventDetail = evt.detail; @@ -253,7 +262,15 @@ class MagnifyTool extends BaseTool { }; _dragEndCallback = (evt: EventTypes.InteractionEventType) => { - const { element } = evt.detail; + let { element } = evt.detail; + + if (element === undefined) { + const { enabledElement } = this.editData; + + const { viewport } = enabledElement; + element = viewport.element; + } + const enabledElement = getEnabledElement(element); const { renderingEngine } = enabledElement; @@ -289,6 +306,11 @@ class MagnifyTool extends BaseTool { this._dragEndCallback as EventListener ); + element.addEventListener( + 'contextmenu', + this._cancelCallback as EventListener + ); + element.addEventListener( Events.TOUCH_END, this._dragEndCallback as EventListener @@ -314,6 +336,11 @@ class MagnifyTool extends BaseTool { Events.MOUSE_CLICK, this._dragEndCallback as EventListener ); + + element.removeEventListener( + 'contextmenu', + this._cancelCallback as EventListener + ); element.removeEventListener( Events.TOUCH_END, this._dragEndCallback as EventListener From 3aec54db5f3927c445c0a92b72838cb4e68b8e40 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:17:48 +0000 Subject: [PATCH 046/108] 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 3195aa54e..60cce7f30 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -662a8b3c7b3268557e9787fd6abc67e923ab731b \ No newline at end of file +a13fce2d65aa1d5b8de849ddf6255e3d42dc841a \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 7202209e1..243cfe2e2 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", - "@cornerstonejs/tools": "4.5.9" + "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/tools": "4.5.10" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3d59633ed..2ff38a088 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", - "@cornerstonejs/tools": "4.5.9" + "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/tools": "4.5.10" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d2a569af3..4eefe46a5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/core": "4.5.10", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 8db2ca91c..33a8334ed 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.9", - "@cornerstonejs/core": "4.5.9", - "@cornerstonejs/dicom-image-loader": "4.5.9", - "@cornerstonejs/nifti-volume-loader": "4.5.9", - "@cornerstonejs/tools": "4.5.9", + "@cornerstonejs/adapters": "4.5.10", + "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/dicom-image-loader": "4.5.10", + "@cornerstonejs/nifti-volume-loader": "4.5.10", + "@cornerstonejs/tools": "4.5.10", "@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 0cbdee5a7..330532ba5 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", - "@cornerstonejs/tools": "4.5.9", + "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/tools": "4.5.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 49302b4a4..19582d38f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9" + "@cornerstonejs/core": "4.5.10" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a35f2c8c2..84de4e09a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", - "@cornerstonejs/tools": "4.5.9", + "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/tools": "4.5.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 0565e4bb3..8ef896dea 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.9", + "@cornerstonejs/core": "4.5.10", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 03b7fd687..5aeb0a3cc 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.9", - "commit": "662a8b3c7b3268557e9787fd6abc67e923ab731b" + "version": "4.5.10", + "commit": "a13fce2d65aa1d5b8de849ddf6255e3d42dc841a" } \ No newline at end of file diff --git a/version.txt b/version.txt index 94bc0a3e0..dc39e3b2b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.9 \ No newline at end of file +4.5.10 \ No newline at end of file From ac076522f0e6f3297f0be9a74825ec1f5da0b8de Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:18:04 +0000 Subject: [PATCH 047/108] 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 ee2d12205..fab9947fc 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +### Bug Fixes + +- **MagnifyTool:** Fix MagnifyTool freeze when pressing right click ([#2388](https://github.com/cornerstonejs/cornerstone3D/issues/2388)) ([a13fce2](https://github.com/cornerstonejs/cornerstone3D/commit/a13fce2d65aa1d5b8de849ddf6255e3d42dc841a)) + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 8d1034e98..b9b9f69c9 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.9", + "version": "4.5.10", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 68a3a3f5a..a9208a4ba 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 243cfe2e2..467d2950e 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.9", + "version": "4.5.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 c71a48d4f..baa6b594a 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 2ff38a088..19010173f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.9", + "version": "4.5.10", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 20e58fe22..fef6994cb 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index d67a9b971..870ef6aa1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.9", + "version": "4.5.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 56e8e245b..c7fd2e337 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4eefe46a5..3bac37101 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.9", + "version": "4.5.10", "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 cb8dadb44..d2e21f52f 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 330532ba5..07d1c481c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.9", + "version": "4.5.10", "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 25bdf0deb..ba24ab446 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **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 19582d38f..5a7102353 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": "4.5.9", + "version": "4.5.10", "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 d5024cd5a..25c09dd59 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 84de4e09a..6b1496821 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.9", + "version": "4.5.10", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c36a1b44a..5eae97b10 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. +## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) + +### Bug Fixes + +- **MagnifyTool:** Fix MagnifyTool freeze when pressing right click ([#2388](https://github.com/cornerstonejs/cornerstone3D/issues/2388)) ([a13fce2](https://github.com/cornerstonejs/cornerstone3D/commit/a13fce2d65aa1d5b8de849ddf6255e3d42dc841a)) + ## [4.5.9](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.8...v4.5.9) (2025-10-15) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 8ef896dea..4e131f087 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.9", + "version": "4.5.10", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 6a800e1697d9caf1d44a37df50f7cdcaa9d658e7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:18:15 +0000 Subject: [PATCH 048/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 913c848d6..06138a169 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.9'; +export const version = '4.5.10'; From 83b4092d76c6e115adfd12a50d399e96483622a4 Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Thu, 16 Oct 2025 09:19:27 -0400 Subject: [PATCH 049/108] fix(segmentation): Lock contour annotations when segment is locked. (#2395) --- .../segmentation/segmentLocking.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/tools/src/stateManagement/segmentation/segmentLocking.ts b/packages/tools/src/stateManagement/segmentation/segmentLocking.ts index 6fca8077d..62a3d002c 100644 --- a/packages/tools/src/stateManagement/segmentation/segmentLocking.ts +++ b/packages/tools/src/stateManagement/segmentation/segmentLocking.ts @@ -1,5 +1,37 @@ import { getSegmentation } from '../../stateManagement/segmentation/getSegmentation'; +import type { Segmentation } from '../../types'; +import { setAnnotationLocked } from '../annotation/annotationLocking'; import { triggerSegmentationModified } from './triggerSegmentationEvents'; +import { getAnnotationsUIDMapFromSegmentation } from './utilities'; + +/** + * Set the locked status of every annotation in a segment. + * @param segmentation - The segmentation to set the locked status for. + * @param segmentIndex - The index of the segment to set the locked status for. + * @param locked - The locked status to set. + */ +function _setContourSegmentationSegmentAnnotationsLocked( + segmentation: Segmentation, + segmentIndex: number, + locked: boolean +) { + const annotationUIDsMap = getAnnotationsUIDMapFromSegmentation( + segmentation.segmentationId + ); + + if (!annotationUIDsMap) { + return; + } + + const annotationUIDs = annotationUIDsMap.get(segmentIndex); + if (!annotationUIDs) { + return; + } + + annotationUIDs.forEach((annotationUID) => { + setAnnotationLocked(annotationUID, locked); + }); +} /** * Get the locked status for a segment index in a segmentation @@ -43,6 +75,14 @@ function setSegmentIndexLocked( segments[segmentIndex].locked = locked; + if (segmentation?.representationData?.Contour) { + _setContourSegmentationSegmentAnnotationsLocked( + segmentation, + segmentIndex, + locked + ); + } + triggerSegmentationModified(segmentationId); } From 63ec69fd83a796cf5ce27a5cdf5682689be827ce Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:22:57 +0000 Subject: [PATCH 050/108] 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 60cce7f30..8159e3406 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a13fce2d65aa1d5b8de849ddf6255e3d42dc841a \ No newline at end of file +83b4092d76c6e115adfd12a50d399e96483622a4 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 467d2950e..9630a6644 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", - "@cornerstonejs/tools": "4.5.10" + "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/tools": "4.5.11" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 19010173f..37e65a125 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", - "@cornerstonejs/tools": "4.5.10" + "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/tools": "4.5.11" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3bac37101..601911ea5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/core": "4.5.11", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 33a8334ed..e3a5bb70d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.10", - "@cornerstonejs/core": "4.5.10", - "@cornerstonejs/dicom-image-loader": "4.5.10", - "@cornerstonejs/nifti-volume-loader": "4.5.10", - "@cornerstonejs/tools": "4.5.10", + "@cornerstonejs/adapters": "4.5.11", + "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/dicom-image-loader": "4.5.11", + "@cornerstonejs/nifti-volume-loader": "4.5.11", + "@cornerstonejs/tools": "4.5.11", "@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 07d1c481c..8f0e08696 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", - "@cornerstonejs/tools": "4.5.10", + "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/tools": "4.5.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5a7102353..aead8d8aa 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10" + "@cornerstonejs/core": "4.5.11" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6b1496821..e797ad245 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", - "@cornerstonejs/tools": "4.5.10", + "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/tools": "4.5.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4e131f087..dd02f00db 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.10", + "@cornerstonejs/core": "4.5.11", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 5aeb0a3cc..a41e189dc 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.10", - "commit": "a13fce2d65aa1d5b8de849ddf6255e3d42dc841a" + "version": "4.5.11", + "commit": "83b4092d76c6e115adfd12a50d399e96483622a4" } \ No newline at end of file diff --git a/version.txt b/version.txt index dc39e3b2b..1e7bac5f6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.10 \ No newline at end of file +4.5.11 \ No newline at end of file From 14c2042660cbbb35fd36cbdaf6510bedda12f593 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:23:09 +0000 Subject: [PATCH 051/108] 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 fab9947fc..25061e1fb 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +### Bug Fixes + +- **segmentation:** Lock contour annotations when segment is locked. ([#2395](https://github.com/cornerstonejs/cornerstone3D/issues/2395)) ([83b4092](https://github.com/cornerstonejs/cornerstone3D/commit/83b4092d76c6e115adfd12a50d399e96483622a4)) + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index b9b9f69c9..759a2c5b8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.10", + "version": "4.5.11", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index a9208a4ba..7272d0676 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9630a6644..04336e70c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.10", + "version": "4.5.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 baa6b594a..8f1b29767 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 37e65a125..a5227bbb7 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.10", + "version": "4.5.11", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index fef6994cb..4ebd3bd42 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 870ef6aa1..452e9c2e3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.10", + "version": "4.5.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 c7fd2e337..e90a68b86 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 601911ea5..06cdf1655 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.10", + "version": "4.5.11", "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 d2e21f52f..c916be16f 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8f0e08696..b9e45742e 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.10", + "version": "4.5.11", "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 ba24ab446..69691db77 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **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 aead8d8aa..8352b2575 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": "4.5.10", + "version": "4.5.11", "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 25c09dd59..01157f4da 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e797ad245..8c47ee521 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.10", + "version": "4.5.11", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 5eae97b10..adc031b74 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. +## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) + +### Bug Fixes + +- **segmentation:** Lock contour annotations when segment is locked. ([#2395](https://github.com/cornerstonejs/cornerstone3D/issues/2395)) ([83b4092](https://github.com/cornerstonejs/cornerstone3D/commit/83b4092d76c6e115adfd12a50d399e96483622a4)) + ## [4.5.10](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.9...v4.5.10) (2025-10-16) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index dd02f00db..1437e9046 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.10", + "version": "4.5.11", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 5ce420b157dde1e5e7b33b0641a56c356f713975 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 13:23:18 +0000 Subject: [PATCH 052/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 06138a169..e5d9a752a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.10'; +export const version = '4.5.11'; From aa1f6aae0b99378d73c9905f06f4f7a2704f8485 Mon Sep 17 00:00:00 2001 From: Abhijith Sb <105038248+abhijith-trenser@users.noreply.github.com> Date: Thu, 16 Oct 2025 21:15:40 +0530 Subject: [PATCH 053/108] implemented grouping of annotate annotation for undo/redo (#2312) --- packages/tools/src/tools/annotation/ArrowAnnotateTool.ts | 4 +++- packages/tools/src/tools/base/AnnotationTool.ts | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/annotation/ArrowAnnotateTool.ts b/packages/tools/src/tools/annotation/ArrowAnnotateTool.ts index 52850b09c..f01812bf8 100644 --- a/packages/tools/src/tools/annotation/ArrowAnnotateTool.ts +++ b/packages/tools/src/tools/annotation/ArrowAnnotateTool.ts @@ -149,6 +149,7 @@ class ArrowAnnotateTool extends AnnotationTool { addNewAnnotation = ( evt: EventTypes.InteractionEventType ): ArrowAnnotation => { + this.startGroupRecording(); const eventDetail = evt.detail; const { currentPoints, element } = eventDetail; const worldPos = currentPoints.world; @@ -372,7 +373,8 @@ class ArrowAnnotateTool extends AnnotationTool { // This is only new if it wasn't already memoed this.createMemo(element, annotation, { newAnnotation: !!this.memo }); setAnnotationLabel(annotation, element, label); - + this.endGroupRecording(); + this.doneEditMemo(); triggerAnnotationRenderForViewportIds(viewportIdsToRender); }); } else if (!movingTextBox) { diff --git a/packages/tools/src/tools/base/AnnotationTool.ts b/packages/tools/src/tools/base/AnnotationTool.ts index 98744e4d6..3c932c8e8 100644 --- a/packages/tools/src/tools/base/AnnotationTool.ts +++ b/packages/tools/src/tools/base/AnnotationTool.ts @@ -630,6 +630,15 @@ abstract class AnnotationTool extends AnnotationDisplayTool { ); } + protected startGroupRecording() { + DefaultHistoryMemo.startGroupRecording(); + } + + /** Ends a group recording of history memo */ + protected endGroupRecording() { + DefaultHistoryMemo.endGroupRecording(); + } + protected static hydrateBase( ToolClass: new () => T, enabledElement: Types.IEnabledElement, From eedb8442e601110b8e3aa08cbc242b465f50d670 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 15:49:40 +0000 Subject: [PATCH 054/108] 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 8159e3406..ab2e67ab7 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -83b4092d76c6e115adfd12a50d399e96483622a4 \ No newline at end of file +aa1f6aae0b99378d73c9905f06f4f7a2704f8485 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 04336e70c..63ed8679e 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", - "@cornerstonejs/tools": "4.5.11" + "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/tools": "4.5.12" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a5227bbb7..e6c8f173d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", - "@cornerstonejs/tools": "4.5.11" + "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/tools": "4.5.12" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 06cdf1655..db3b5d1f8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/core": "4.5.12", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index e3a5bb70d..b4c7adb3f 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.11", - "@cornerstonejs/core": "4.5.11", - "@cornerstonejs/dicom-image-loader": "4.5.11", - "@cornerstonejs/nifti-volume-loader": "4.5.11", - "@cornerstonejs/tools": "4.5.11", + "@cornerstonejs/adapters": "4.5.12", + "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/dicom-image-loader": "4.5.12", + "@cornerstonejs/nifti-volume-loader": "4.5.12", + "@cornerstonejs/tools": "4.5.12", "@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 b9e45742e..b111b5137 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", - "@cornerstonejs/tools": "4.5.11", + "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/tools": "4.5.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 8352b2575..921d42ac9 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11" + "@cornerstonejs/core": "4.5.12" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 8c47ee521..5c13e9ee9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", - "@cornerstonejs/tools": "4.5.11", + "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/tools": "4.5.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 1437e9046..48e3629d9 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.11", + "@cornerstonejs/core": "4.5.12", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index a41e189dc..6f05a187b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.11", - "commit": "83b4092d76c6e115adfd12a50d399e96483622a4" + "version": "4.5.12", + "commit": "aa1f6aae0b99378d73c9905f06f4f7a2704f8485" } \ No newline at end of file diff --git a/version.txt b/version.txt index 1e7bac5f6..d019b5035 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.11 \ No newline at end of file +4.5.12 \ No newline at end of file From d5012f6617c1e354a800ccaa69bef309577e84e1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 15:49:51 +0000 Subject: [PATCH 055/108] 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 25061e1fb..463493cc1 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package root + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 759a2c5b8..a3287eb33 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.11", + "version": "4.5.12", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 7272d0676..83d8b59e4 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 63ed8679e..a35864337 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.11", + "version": "4.5.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 8f1b29767..d4bca54a5 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index e6c8f173d..5789c5552 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.11", + "version": "4.5.12", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 4ebd3bd42..ba66c0c1d 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 452e9c2e3..47b529b4d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.11", + "version": "4.5.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 e90a68b86..0fb27dd86 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index db3b5d1f8..b53d4df47 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.11", + "version": "4.5.12", "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 c916be16f..114ba6fd3 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index b111b5137..d31ae236c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.11", + "version": "4.5.12", "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 69691db77..55f8f3321 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **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 921d42ac9..5b2fa201a 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": "4.5.11", + "version": "4.5.12", "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 01157f4da..b0a1d7fe2 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 5c13e9ee9..433d428f9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.11", + "version": "4.5.12", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index adc031b74..c0f185abd 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. +## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.11](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.10...v4.5.11) (2025-10-16) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 48e3629d9..4e8aba229 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.11", + "version": "4.5.12", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 9d272a9af2769b8f12a5af40dcfa7b2ade95d209 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 15:50:00 +0000 Subject: [PATCH 056/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index e5d9a752a..c1e2363a1 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.11'; +export const version = '4.5.12'; From 15cfdd93ffdc55dfa70f15bec8cb1be15d1290df Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:52:08 -0400 Subject: [PATCH 057/108] fix(segmentation): Lock added contour annotations when segment is locked (#2399) --- .../contourSegmentation/addContourSegmentationAnnotation.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/tools/src/utilities/contourSegmentation/addContourSegmentationAnnotation.ts b/packages/tools/src/utilities/contourSegmentation/addContourSegmentationAnnotation.ts index 4a5429b0e..83d4c1042 100644 --- a/packages/tools/src/utilities/contourSegmentation/addContourSegmentationAnnotation.ts +++ b/packages/tools/src/utilities/contourSegmentation/addContourSegmentationAnnotation.ts @@ -1,3 +1,4 @@ +import { setAnnotationLocked } from '../../stateManagement/annotation/annotationLocking'; import { getSegmentation } from '../../stateManagement/segmentation/getSegmentation'; import type { ContourSegmentationAnnotation } from '../../types'; @@ -38,6 +39,11 @@ export function addContourSegmentationAnnotation( annotationUIDsMap.set(segmentIndex, annotationsUIDsSet); } + // Lock the annotation if the segment is locked. + if (segmentation.segments[segmentIndex].locked) { + setAnnotationLocked(annotation.annotationUID, true); + } + annotationUIDsMap.set( segmentIndex, annotationsUIDsSet.add(annotation.annotationUID) From e7257ac181e38415502ac8a9079a6dea14f3bf14 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 18:55:41 +0000 Subject: [PATCH 058/108] 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 ab2e67ab7..5a9261ccb 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -aa1f6aae0b99378d73c9905f06f4f7a2704f8485 \ No newline at end of file +15cfdd93ffdc55dfa70f15bec8cb1be15d1290df \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index a35864337..54f7742aa 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", - "@cornerstonejs/tools": "4.5.12" + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/tools": "4.5.13" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 5789c5552..10cb4407d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", - "@cornerstonejs/tools": "4.5.12" + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/tools": "4.5.13" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b53d4df47..4758f15a2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/core": "4.5.13", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index b4c7adb3f..7400a1cb0 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.12", - "@cornerstonejs/core": "4.5.12", - "@cornerstonejs/dicom-image-loader": "4.5.12", - "@cornerstonejs/nifti-volume-loader": "4.5.12", - "@cornerstonejs/tools": "4.5.12", + "@cornerstonejs/adapters": "4.5.13", + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/dicom-image-loader": "4.5.13", + "@cornerstonejs/nifti-volume-loader": "4.5.13", + "@cornerstonejs/tools": "4.5.13", "@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 d31ae236c..2e25dfba6 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", - "@cornerstonejs/tools": "4.5.12", + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/tools": "4.5.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5b2fa201a..c8a493d73 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12" + "@cornerstonejs/core": "4.5.13" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 433d428f9..4ced4494e 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", - "@cornerstonejs/tools": "4.5.12", + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/tools": "4.5.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4e8aba229..97f58bc31 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.12", + "@cornerstonejs/core": "4.5.13", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 6f05a187b..859331c13 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.12", - "commit": "aa1f6aae0b99378d73c9905f06f4f7a2704f8485" + "version": "4.5.13", + "commit": "15cfdd93ffdc55dfa70f15bec8cb1be15d1290df" } \ No newline at end of file diff --git a/version.txt b/version.txt index d019b5035..fb7d6f77b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.12 \ No newline at end of file +4.5.13 \ No newline at end of file From 6afdee7946ba68630cd979b399a27c22f6292eed Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 18:55:53 +0000 Subject: [PATCH 059/108] 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 463493cc1..65763f8b7 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +### Bug Fixes + +- **segmentation:** Lock added contour annotations when segment is locked ([#2399](https://github.com/cornerstonejs/cornerstone3D/issues/2399)) ([15cfdd9](https://github.com/cornerstonejs/cornerstone3D/commit/15cfdd93ffdc55dfa70f15bec8cb1be15d1290df)) + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index a3287eb33..59c5c4b07 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.12", + "version": "4.5.13", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 83d8b59e4..50bf92d3f 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 54f7742aa..66e734492 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.12", + "version": "4.5.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 d4bca54a5..acdc26275 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 10cb4407d..9391f4a84 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.12", + "version": "4.5.13", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index ba66c0c1d..e0897bbbd 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 47b529b4d..4bdcb4ad3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.12", + "version": "4.5.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 0fb27dd86..d6a28a522 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4758f15a2..8e1004ff9 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.12", + "version": "4.5.13", "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 114ba6fd3..81c657be3 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 2e25dfba6..7a3a85495 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.12", + "version": "4.5.13", "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 55f8f3321..72fcecc6c 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **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 c8a493d73..52e664cca 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": "4.5.12", + "version": "4.5.13", "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 b0a1d7fe2..b5ac03904 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4ced4494e..c8eb588ed 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.12", + "version": "4.5.13", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c0f185abd..7043f7fb3 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. +## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) + +### Bug Fixes + +- **segmentation:** Lock added contour annotations when segment is locked ([#2399](https://github.com/cornerstonejs/cornerstone3D/issues/2399)) ([15cfdd9](https://github.com/cornerstonejs/cornerstone3D/commit/15cfdd93ffdc55dfa70f15bec8cb1be15d1290df)) + ## [4.5.12](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.11...v4.5.12) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 97f58bc31..03c4b80c2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.12", + "version": "4.5.13", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From d1ba756ec155bc6870473d9fdbf4484847b7e03d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 18:56:02 +0000 Subject: [PATCH 060/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index c1e2363a1..867b6dccd 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.12'; +export const version = '4.5.13'; From d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e Mon Sep 17 00:00:00 2001 From: James Manners Date: Fri, 17 Oct 2025 08:23:39 +1100 Subject: [PATCH 061/108] fix(dicomImageLoader): :bug: set usingDefaultValues in ImagePlane metadata module in the WadoUri loader (#2391) * fix(dicomImageLoader): :bug: Add usingDefaultValues to WadoUri loader * Trigger CI --- .../src/imageLoader/wadouri/metaData/metaDataProvider.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/dicomImageLoader/src/imageLoader/wadouri/metaData/metaDataProvider.ts b/packages/dicomImageLoader/src/imageLoader/wadouri/metaData/metaDataProvider.ts index 938daae12..bac439bcb 100644 --- a/packages/dicomImageLoader/src/imageLoader/wadouri/metaData/metaDataProvider.ts +++ b/packages/dicomImageLoader/src/imageLoader/wadouri/metaData/metaDataProvider.ts @@ -149,9 +149,14 @@ export function metadataForDataset( let rowPixelSpacing = null; + let usingDefaultValues = false; if (pixelSpacing) { rowPixelSpacing = pixelSpacing[0]; columnPixelSpacing = pixelSpacing[1]; + } else { + usingDefaultValues = true; + rowPixelSpacing = 1; + columnPixelSpacing = 1; } let rowCosines = null; @@ -190,6 +195,7 @@ export function metadataForDataset( pixelSpacing, rowPixelSpacing, columnPixelSpacing, + usingDefaultValues, }; } From 2e0e09949f145fc922251551dab8256bbd313874 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:27:12 +0000 Subject: [PATCH 062/108] 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 5a9261ccb..211bf2929 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -15cfdd93ffdc55dfa70f15bec8cb1be15d1290df \ No newline at end of file +d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 66e734492..d5b1ffcce 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/tools": "4.5.13" + "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/tools": "4.5.14" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9391f4a84..1ae083c52 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/tools": "4.5.13" + "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/tools": "4.5.14" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8e1004ff9..69482b649 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/core": "4.5.14", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7400a1cb0..ceec3a00d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.13", - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/dicom-image-loader": "4.5.13", - "@cornerstonejs/nifti-volume-loader": "4.5.13", - "@cornerstonejs/tools": "4.5.13", + "@cornerstonejs/adapters": "4.5.14", + "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/dicom-image-loader": "4.5.14", + "@cornerstonejs/nifti-volume-loader": "4.5.14", + "@cornerstonejs/tools": "4.5.14", "@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 7a3a85495..262f7014b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/tools": "4.5.13", + "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/tools": "4.5.14", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 52e664cca..787145784 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13" + "@cornerstonejs/core": "4.5.14" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c8eb588ed..cc4f83899 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/tools": "4.5.13", + "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/tools": "4.5.14", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 03c4b80c2..68955504c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/core": "4.5.14", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 859331c13..654380fef 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.13", - "commit": "15cfdd93ffdc55dfa70f15bec8cb1be15d1290df" + "version": "4.5.14", + "commit": "d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e" } \ No newline at end of file diff --git a/version.txt b/version.txt index fb7d6f77b..de8a68ea5 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.13 \ No newline at end of file +4.5.14 \ No newline at end of file From f425bf292ce8ac8efd38f3975af6e0533c133ad5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:27:27 +0000 Subject: [PATCH 063/108] 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/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, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65763f8b7..ba04aa082 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +### Bug Fixes + +- **dicomImageLoader:** :bug: set usingDefaultValues in ImagePlane metadata module in the WadoUri loader ([#2391](https://github.com/cornerstonejs/cornerstone3D/issues/2391)) ([d0ea9fd](https://github.com/cornerstonejs/cornerstone3D/commit/d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e)) + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 59c5c4b07..523d6ae91 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.13", + "version": "4.5.14", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 50bf92d3f..aaf37cb7a 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d5b1ffcce..38d80d82c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.13", + "version": "4.5.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 acdc26275..437c862a7 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 1ae083c52..b7b3a7171 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.13", + "version": "4.5.14", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index e0897bbbd..a32840b79 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 4bdcb4ad3..a18905efd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.13", + "version": "4.5.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 d6a28a522..9326e0fd9 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +### Bug Fixes + +- **dicomImageLoader:** :bug: set usingDefaultValues in ImagePlane metadata module in the WadoUri loader ([#2391](https://github.com/cornerstonejs/cornerstone3D/issues/2391)) ([d0ea9fd](https://github.com/cornerstonejs/cornerstone3D/commit/d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e)) + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 69482b649..c73f34639 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.13", + "version": "4.5.14", "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 81c657be3..340f1eb27 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 262f7014b..8f9f41981 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.13", + "version": "4.5.14", "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 72fcecc6c..c0e678df0 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **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 787145784..7652fc02f 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": "4.5.13", + "version": "4.5.14", "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 b5ac03904..8c55537c2 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index cc4f83899..4af3fb1e8 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.13", + "version": "4.5.14", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 7043f7fb3..2040f5aa4 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. +## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.13](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.12...v4.5.13) (2025-10-16) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 68955504c..677b47357 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.13", + "version": "4.5.14", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 9a1b80267671b4d627d4fde2398936456a049cf9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:27:37 +0000 Subject: [PATCH 064/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 867b6dccd..15d666b12 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.13'; +export const version = '4.5.14'; From a47b125193743290c8c412cea85c990738c339ab Mon Sep 17 00:00:00 2001 From: Serhii Kozik <38426822+Serhii-Kozik@users.noreply.github.com> Date: Fri, 17 Oct 2025 00:36:10 +0300 Subject: [PATCH 065/108] fix: set volume id on creation (#2345) (#2396) --- packages/core/src/cache/classes/ImageVolume.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/cache/classes/ImageVolume.ts b/packages/core/src/cache/classes/ImageVolume.ts index 70df8351e..1712f5971 100644 --- a/packages/core/src/cache/classes/ImageVolume.ts +++ b/packages/core/src/cache/classes/ImageVolume.ts @@ -133,6 +133,7 @@ export class ImageVolume { dimensions, imageIds, numberOfComponents, + id: volumeId, }); this.numVoxels = From e49b74d735789fa4b1e7c886fc3efd3f6ddd9de7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:39:36 +0000 Subject: [PATCH 066/108] 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 211bf2929..78362ed60 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e \ No newline at end of file +a47b125193743290c8c412cea85c990738c339ab \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 38d80d82c..b50e6153a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", - "@cornerstonejs/tools": "4.5.14" + "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/tools": "4.5.15" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index b7b3a7171..f09f321b6 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", - "@cornerstonejs/tools": "4.5.14" + "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/tools": "4.5.15" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c73f34639..046b9d662 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/core": "4.5.15", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ceec3a00d..ee782452b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.14", - "@cornerstonejs/core": "4.5.14", - "@cornerstonejs/dicom-image-loader": "4.5.14", - "@cornerstonejs/nifti-volume-loader": "4.5.14", - "@cornerstonejs/tools": "4.5.14", + "@cornerstonejs/adapters": "4.5.15", + "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/dicom-image-loader": "4.5.15", + "@cornerstonejs/nifti-volume-loader": "4.5.15", + "@cornerstonejs/tools": "4.5.15", "@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 8f9f41981..2f7224538 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", - "@cornerstonejs/tools": "4.5.14", + "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/tools": "4.5.15", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7652fc02f..db4ffa2aa 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14" + "@cornerstonejs/core": "4.5.15" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4af3fb1e8..2dadc0eb9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", - "@cornerstonejs/tools": "4.5.14", + "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/tools": "4.5.15", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 677b47357..045dfb95e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.14", + "@cornerstonejs/core": "4.5.15", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 654380fef..42273105a 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.14", - "commit": "d0ea9fdbd3af2df8dc538a5bba15ea8a241dfb0e" + "version": "4.5.15", + "commit": "a47b125193743290c8c412cea85c990738c339ab" } \ No newline at end of file diff --git a/version.txt b/version.txt index de8a68ea5..4659dc3f6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.14 \ No newline at end of file +4.5.15 \ No newline at end of file From e7032c88978b5c3632c92340fb58ab5294f0617a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:39:50 +0000 Subject: [PATCH 067/108] 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 | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba04aa082..bbd47537f 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +### Bug Fixes + +- set volume id on creation ([#2345](https://github.com/cornerstonejs/cornerstone3D/issues/2345)) ([#2396](https://github.com/cornerstonejs/cornerstone3D/issues/2396)) ([a47b125](https://github.com/cornerstonejs/cornerstone3D/commit/a47b125193743290c8c412cea85c990738c339ab)) + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 523d6ae91..9525c8c4f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.14", + "version": "4.5.15", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index aaf37cb7a..ec2dfc9c4 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b50e6153a..18afdfdf7 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.14", + "version": "4.5.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 437c862a7..bf01ecd43 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index f09f321b6..8399509a2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.14", + "version": "4.5.15", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a32840b79..4a5230580 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +### Bug Fixes + +- set volume id on creation ([#2345](https://github.com/cornerstonejs/cornerstone3D/issues/2345)) ([#2396](https://github.com/cornerstonejs/cornerstone3D/issues/2396)) ([a47b125](https://github.com/cornerstonejs/cornerstone3D/commit/a47b125193743290c8c412cea85c990738c339ab)) + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index a18905efd..1afc7cd98 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.14", + "version": "4.5.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 9326e0fd9..5f85b3fa6 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) ### Bug Fixes diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 046b9d662..908de462e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.14", + "version": "4.5.15", "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 340f1eb27..b42f70426 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 2f7224538..158cc39a7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.14", + "version": "4.5.15", "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 c0e678df0..768d88982 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **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 db4ffa2aa..381439a1a 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": "4.5.14", + "version": "4.5.15", "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 8c55537c2..5f873d652 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2dadc0eb9..876e221fe 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.14", + "version": "4.5.15", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 2040f5aa4..57ab1f1c7 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. +## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.14](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.13...v4.5.14) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 045dfb95e..5c7cd285c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.14", + "version": "4.5.15", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 881c6bcd44c444448be2b82177d0884b4880540e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 16 Oct 2025 21:39:59 +0000 Subject: [PATCH 068/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 15d666b12..b249b0b75 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.14'; +export const version = '4.5.15'; From 402820739678f8b9db0b2bddd8c03dc447fabc85 Mon Sep 17 00:00:00 2001 From: Celian-abd <101793092+Celian-abd@users.noreply.github.com> Date: Fri, 17 Oct 2025 21:43:52 +0200 Subject: [PATCH 069/108] fix(CrosshairTool): Fix "setToolCenter" to apply the modification to the viewports camera (#2402) * center debug * small fix --- packages/tools/src/tools/CrosshairsTool.ts | 56 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/packages/tools/src/tools/CrosshairsTool.ts b/packages/tools/src/tools/CrosshairsTool.ts index c122fb0ca..0dd3474be 100644 --- a/packages/tools/src/tools/CrosshairsTool.ts +++ b/packages/tools/src/tools/CrosshairsTool.ts @@ -4,7 +4,7 @@ import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder'; import { AnnotationTool } from './base'; -import type { Types } from '@cornerstonejs/core'; +import { getRenderingEngine, type Types } from '@cornerstonejs/core'; import { getEnabledElementByIds, getEnabledElement, @@ -412,13 +412,57 @@ class CrosshairsTool extends AnnotationTool { setToolCenter(toolCenter: Types.Point3, suppressEvents = false): void { // prettier-ignore - this.toolCenter = toolCenter; const viewportsInfo = this._getViewportsInfo(); - // assuming all viewports are in the same rendering engine - triggerAnnotationRenderForViewportIds( - viewportsInfo.map(({ viewportId }) => viewportId) - ); + viewportsInfo.map(({ renderingEngineId, viewportId }) => { + const renderingEngine = getRenderingEngine(renderingEngineId); + + const viewport = renderingEngine.getViewport(viewportId); + const camera = viewport.getCamera(); + const { focalPoint, position, viewPlaneNormal } = camera; + + // Calculate the delta between the current camera focal point and the new tool center + const delta = [ + toolCenter[0] - focalPoint[0], + toolCenter[1] - focalPoint[1], + toolCenter[2] - focalPoint[2], + ]; + + // Project this vector onto the view plane normal. + // This isolates the component of the movement that corresponds to the "scroll" (slice change). + const scroll = + delta[0] * viewPlaneNormal[0] + + delta[1] * viewPlaneNormal[1] + + delta[2] * viewPlaneNormal[2]; + + const scrollDelta = [ + scroll * viewPlaneNormal[0], + scroll * viewPlaneNormal[1], + scroll * viewPlaneNormal[2], + ]; + + // Apply this "scroll" to the position and focal point of the camera. + const newFocalPoint: Types.Point3 = [ + focalPoint[0] + scrollDelta[0], + focalPoint[1] + scrollDelta[1], + focalPoint[2] + scrollDelta[2], + ]; + const newPosition: Types.Point3 = [ + position[0] + scrollDelta[0], + position[1] + scrollDelta[1], + position[2] + scrollDelta[2], + ]; + + viewport.setCamera({ + focalPoint: newFocalPoint, + position: newPosition, + }); + + viewport.render(); + }); + + this.toolCenter = toolCenter; + if (!suppressEvents) { triggerEvent(eventTarget, Events.CROSSHAIR_TOOL_CENTER_CHANGED, { toolGroupId: this.toolGroupId, From 3e34616d7e9d3fca13dfb59d49307bc4963e6d2a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 17 Oct 2025 19:47:26 +0000 Subject: [PATCH 070/108] 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 78362ed60..f93cb3f5c 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a47b125193743290c8c412cea85c990738c339ab \ No newline at end of file +402820739678f8b9db0b2bddd8c03dc447fabc85 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 18afdfdf7..ed7265105 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", - "@cornerstonejs/tools": "4.5.15" + "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/tools": "4.5.16" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 8399509a2..0e038fff8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", - "@cornerstonejs/tools": "4.5.15" + "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/tools": "4.5.16" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 908de462e..ad871e6c8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/core": "4.5.16", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ee782452b..00b1bcd2d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.15", - "@cornerstonejs/core": "4.5.15", - "@cornerstonejs/dicom-image-loader": "4.5.15", - "@cornerstonejs/nifti-volume-loader": "4.5.15", - "@cornerstonejs/tools": "4.5.15", + "@cornerstonejs/adapters": "4.5.16", + "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/dicom-image-loader": "4.5.16", + "@cornerstonejs/nifti-volume-loader": "4.5.16", + "@cornerstonejs/tools": "4.5.16", "@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 158cc39a7..0c1d2da6f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", - "@cornerstonejs/tools": "4.5.15", + "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/tools": "4.5.16", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 381439a1a..683a95afc 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15" + "@cornerstonejs/core": "4.5.16" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 876e221fe..35dbadcdd 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", - "@cornerstonejs/tools": "4.5.15", + "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/tools": "4.5.16", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5c7cd285c..98a9868a7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.15", + "@cornerstonejs/core": "4.5.16", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 42273105a..a407f35a9 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.15", - "commit": "a47b125193743290c8c412cea85c990738c339ab" + "version": "4.5.16", + "commit": "402820739678f8b9db0b2bddd8c03dc447fabc85" } \ No newline at end of file diff --git a/version.txt b/version.txt index 4659dc3f6..79e517e4e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.15 \ No newline at end of file +4.5.16 \ No newline at end of file From 12ec92dee5921a93f49893e6ffcf0fec2b121ba9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 17 Oct 2025 19:47:38 +0000 Subject: [PATCH 071/108] 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 bbd47537f..2286a17df 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +### Bug Fixes + +- **CrosshairTool:** Fix "setToolCenter" to apply the modification to the viewports camera ([#2402](https://github.com/cornerstonejs/cornerstone3D/issues/2402)) ([4028207](https://github.com/cornerstonejs/cornerstone3D/commit/402820739678f8b9db0b2bddd8c03dc447fabc85)) + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 9525c8c4f..e617daecd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.15", + "version": "4.5.16", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ec2dfc9c4..52a09c3a4 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ed7265105..91f84caf9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.15", + "version": "4.5.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 bf01ecd43..aaf26112d 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 0e038fff8..2f1b504d4 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.15", + "version": "4.5.16", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 4a5230580..0696c296a 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 1afc7cd98..fa329637e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.15", + "version": "4.5.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 5f85b3fa6..926d5a105 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index ad871e6c8..105ba9f13 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.15", + "version": "4.5.16", "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 b42f70426..e561eb22e 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0c1d2da6f..42e090af9 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.15", + "version": "4.5.16", "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 768d88982..c81bd99cb 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **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 683a95afc..6b152b126 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": "4.5.15", + "version": "4.5.16", "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 5f873d652..a7c0501bb 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 35dbadcdd..7e73b866f 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.15", + "version": "4.5.16", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 57ab1f1c7..a9a541051 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. +## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) + +### Bug Fixes + +- **CrosshairTool:** Fix "setToolCenter" to apply the modification to the viewports camera ([#2402](https://github.com/cornerstonejs/cornerstone3D/issues/2402)) ([4028207](https://github.com/cornerstonejs/cornerstone3D/commit/402820739678f8b9db0b2bddd8c03dc447fabc85)) + ## [4.5.15](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.14...v4.5.15) (2025-10-16) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 98a9868a7..20f62d730 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.15", + "version": "4.5.16", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 77c3c6596746762086a9de26bf28fdde305b84b2 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 17 Oct 2025 19:47:47 +0000 Subject: [PATCH 072/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index b249b0b75..6d93fd0f5 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.15'; +export const version = '4.5.16'; From d3b607c2596aec33d93cb7f2834c01ca2783b412 Mon Sep 17 00:00:00 2001 From: arul-trenser Date: Sat, 18 Oct 2025 07:15:05 +0530 Subject: [PATCH 073/108] fix: planar freehand roi perimeter calculation (#2341) * fix: planar freehand roi perimeter calculation * fix: Perimeter calculation --------- Co-authored-by: Bill Wallace --- .../tools/annotation/PlanarFreehandROITool.ts | 14 +++------- .../utilities/contours/calculatePerimeter.ts | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts index 72d242fca..c6d727dde 100644 --- a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts +++ b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts @@ -865,13 +865,11 @@ class PlanarFreehandROITool extends ContourSegmentationBaseTool { } else { this.updateOpenCachedStats({ metadata, - canvasCoordinates, targetId, cachedStats, modalityUnit, calibratedScale, - deltaInX, - deltaInY, + points, }); } } @@ -946,8 +944,7 @@ class PlanarFreehandROITool extends ContourSegmentationBaseTool { // Convert from canvas_pixels ^2 to mm^2 area *= deltaInX * deltaInY; - let perimeter = calculatePerimeter(canvasCoordinates, closed) / scale; - perimeter *= Math.sqrt(Math.pow(deltaInX, 2) + Math.pow(deltaInY, 2)); + const perimeter = calculatePerimeter(points, closed) / scale; // Expand bounding box const iDelta = 0.01 * (iMax - iMin); @@ -1043,17 +1040,14 @@ class PlanarFreehandROITool extends ContourSegmentationBaseTool { protected updateOpenCachedStats({ targetId, metadata, - canvasCoordinates, cachedStats, modalityUnit, calibratedScale, - deltaInX, - deltaInY, + points, }) { const { scale, unit } = calibratedScale; - let length = calculatePerimeter(canvasCoordinates, closed) / scale; - length *= Math.sqrt(Math.pow(deltaInX, 2) + Math.pow(deltaInY, 2)); + const length = calculatePerimeter(points, closed) / scale; cachedStats[targetId] = { Modality: metadata.Modality, diff --git a/packages/tools/src/utilities/contours/calculatePerimeter.ts b/packages/tools/src/utilities/contours/calculatePerimeter.ts index 08fc4ba6b..a1208db32 100644 --- a/packages/tools/src/utilities/contours/calculatePerimeter.ts +++ b/packages/tools/src/utilities/contours/calculatePerimeter.ts @@ -1,3 +1,6 @@ +import type { Types } from '@cornerstonejs/core'; +import { vec3 } from 'gl-matrix'; + /** * Calculates the perimeter of a polyline. * @@ -5,24 +8,23 @@ * @param closed - Indicates whether the polyline is closed or not. * @returns The perimeter of the polyline. */ -function calculatePerimeter(polyline: number[][], closed: boolean): number { +export function calculatePerimeter( + polyline: number[][], + closed: boolean +): number { let perimeter = 0; for (let i = 0; i < polyline.length - 1; i++) { - const point1 = polyline[i]; - const point2 = polyline[i + 1]; - perimeter += Math.sqrt( - Math.pow(point2[0] - point1[0], 2) + Math.pow(point2[1] - point1[1], 2) - ); + const point1 = polyline[i] as Types.Point3; + const point2 = polyline[i + 1] as Types.Point3; + + perimeter += vec3.dist(point1, point2); } if (closed) { - const firstPoint = polyline[0]; - const lastPoint = polyline[polyline.length - 1]; - perimeter += Math.sqrt( - Math.pow(lastPoint[0] - firstPoint[0], 2) + - Math.pow(lastPoint[1] - firstPoint[1], 2) - ); + const firstPoint = polyline[0] as Types.Point3; + const lastPoint = polyline[polyline.length - 1] as Types.Point3; + perimeter += vec3.dist(firstPoint, lastPoint); } return perimeter; From 5a0882c44a650491ddaca29972ed4415eb9adcad Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:48:29 +0000 Subject: [PATCH 074/108] 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 f93cb3f5c..8c19c0303 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -402820739678f8b9db0b2bddd8c03dc447fabc85 \ No newline at end of file +d3b607c2596aec33d93cb7f2834c01ca2783b412 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 91f84caf9..2d04a22a1 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", - "@cornerstonejs/tools": "4.5.16" + "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/tools": "4.5.17" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 2f1b504d4..b86e5ebe2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", - "@cornerstonejs/tools": "4.5.16" + "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/tools": "4.5.17" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 105ba9f13..2d857f68d 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/core": "4.5.17", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 00b1bcd2d..cfe206df0 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.16", - "@cornerstonejs/core": "4.5.16", - "@cornerstonejs/dicom-image-loader": "4.5.16", - "@cornerstonejs/nifti-volume-loader": "4.5.16", - "@cornerstonejs/tools": "4.5.16", + "@cornerstonejs/adapters": "4.5.17", + "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/dicom-image-loader": "4.5.17", + "@cornerstonejs/nifti-volume-loader": "4.5.17", + "@cornerstonejs/tools": "4.5.17", "@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 42e090af9..dd9dcf8ee 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", - "@cornerstonejs/tools": "4.5.16", + "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/tools": "4.5.17", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 6b152b126..ed98d5b7d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16" + "@cornerstonejs/core": "4.5.17" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7e73b866f..c17d59fd8 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", - "@cornerstonejs/tools": "4.5.16", + "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/tools": "4.5.17", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 20f62d730..ed2a75ccb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.16", + "@cornerstonejs/core": "4.5.17", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index a407f35a9..1d66c3521 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.16", - "commit": "402820739678f8b9db0b2bddd8c03dc447fabc85" + "version": "4.5.17", + "commit": "d3b607c2596aec33d93cb7f2834c01ca2783b412" } \ No newline at end of file diff --git a/version.txt b/version.txt index 79e517e4e..276091461 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.16 \ No newline at end of file +4.5.17 \ No newline at end of file From c6109874c6fe1f6e863b539fd30592a0497fab19 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:48:41 +0000 Subject: [PATCH 075/108] 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 2286a17df..1d1a46cd0 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +### Bug Fixes + +- planar freehand roi perimeter calculation ([#2341](https://github.com/cornerstonejs/cornerstone3D/issues/2341)) ([d3b607c](https://github.com/cornerstonejs/cornerstone3D/commit/d3b607c2596aec33d93cb7f2834c01ca2783b412)) + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) ### Bug Fixes diff --git a/lerna.json b/lerna.json index e617daecd..44abc4edd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.16", + "version": "4.5.17", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 52a09c3a4..7e7456236 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2d04a22a1..2f6de4127 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.16", + "version": "4.5.17", "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 aaf26112d..9eaaf1f3c 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index b86e5ebe2..1b8b30221 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.16", + "version": "4.5.17", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0696c296a..6656e4b4e 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index fa329637e..337ff0d7f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.16", + "version": "4.5.17", "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 926d5a105..db61881c6 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2d857f68d..33466d14c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.16", + "version": "4.5.17", "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 e561eb22e..13787ab9e 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index dd9dcf8ee..2aaef46cf 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.16", + "version": "4.5.17", "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 c81bd99cb..c8e7d0b48 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **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 ed98d5b7d..b8275927e 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": "4.5.16", + "version": "4.5.17", "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 a7c0501bb..120813b78 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c17d59fd8..caf78444e 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.16", + "version": "4.5.17", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index a9a541051..1f0a4ef23 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. +## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) + +### Bug Fixes + +- planar freehand roi perimeter calculation ([#2341](https://github.com/cornerstonejs/cornerstone3D/issues/2341)) ([d3b607c](https://github.com/cornerstonejs/cornerstone3D/commit/d3b607c2596aec33d93cb7f2834c01ca2783b412)) + ## [4.5.16](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.15...v4.5.16) (2025-10-17) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index ed2a75ccb..df05efda6 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.16", + "version": "4.5.17", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From a00e6edba2b5e7e9105708d7e5f7bc91b2dc497c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:48:49 +0000 Subject: [PATCH 076/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 6d93fd0f5..d54450714 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.16'; +export const version = '4.5.17'; From ae84d0f69810dcce86a37919f47b8143bee8561a Mon Sep 17 00:00:00 2001 From: James Manners Date: Sat, 18 Oct 2025 09:50:41 +0800 Subject: [PATCH 077/108] test(dicomImageLoader): Adds unit tests for Wado-URI and Wado-RS Image Loaders (#2400) * test(dicomImageLoader): :white_check_mark: Adds tests for dicomImageLoaders and meatadata modules * chore(dicomImageLoader): :fire: remove unused file * test(dicomImageLoader): :white_check_mark: update dicomImageLoader tests with more metadata tests * revert(dicomImageLoader): :rewind: revert debugging changes * test(dicomImageLoader): :white_check_mark: add tests for wado-uri request callbacks * test(dicomImageLoader): :white_check_mark: remove fdescribe * test(dicomImageLoader): :recycle: improve cleanup after image loader tests * test(dicomImageLoader): :white_check_mark: Update expected hash for GH Actions --- karma.conf.js | 59 +- .../core/test/dicomImageLoader_wadors_test.js | 68 ++ .../test/dicomImageLoader_wadouri_test.js | 239 ++++ ...licitTransferSyntax_1.2.840.10008.1.2.2.ts | 170 +++ ...Syntax_1.2.840.10008.1.2.2.wado-rs-tags.ts | 1010 +++++++++++++++++ ...anTransferSyntax_1.2.840.10008.1.2.1.99.ts | 29 + ...lyTransferSyntax_1.2.840.10008.1.2.4.90.ts | 26 + ...00TransferSyntax_1.2.840.10008.1.2.4.91.ts | 25 + ...ssTransferSyntax_1.2.840.10008.1.2.4.80.ts | 26 + ...syTransferSyntax_1.2.840.10008.1.2.4.81.ts | 26 + ...12TransferSyntax_1.2.840.10008.1.2.4.55.ts | 30 + ...V1TransferSyntax_1.2.840.10008.1.2.4.70.ts | 26 + ...14TransferSyntax_1.2.840.10008.1.2.4.57.ts | 26 + ...s1TransferSyntax_1.2.840.10008.1.2.4.50.ts | 26 + ..._8TransferSyntax_1.2.840.10008.1.2.4.53.ts | 30 + ...licitTransferSyntax_1.2.840.10008.1.2.1.ts | 26 + ...mplicitTransferSyntax_1.2.840.10008.1.2.ts | 26 + ...slessTransferSyntax_1.2.840.10008.1.2.5.ts | 25 + .../TestPattern_JPEG-Baseline_YBR422.ts | 178 +++ ...ttern_JPEG-Baseline_YBR422.wado-rs-tags.ts | 220 ++++ .../TestPattern_JPEG-Baseline_YBRFull.ts | 179 +++ ...tern_JPEG-Baseline_YBRFull.wado-rs-tags.ts | 218 ++++ .../TestPattern_JPEG-LS-Lossless.ts | 126 ++ .../TestPattern_JPEG-LS-NearLossless.ts | 126 ++ .../TestPattern_JPEG-Lossless_RGB.ts | 96 ++ .../testImages/TestPattern_Palette.ts | 101 ++ .../testImages/TestPattern_Palette_16.ts | 101 ++ .../testImages/TestPattern_RGB.ts | 96 ++ .../testImages/no-pixel-spacing.ts | 100 ++ .../no-pixel-spacing.wado-rs-tags.ts | 739 ++++++++++++ .../testImages/paramap-float.ts | 180 +++ .../dicomImageLoader/testImages/paramap.ts | 181 +++ .../testImages/tests.models.ts | 108 ++ .../testImages/us-multiframe-ybr-full-422.ts | 195 ++++ ...us-multiframe-ybr-full-422.wado-rs-tags.ts | 299 +++++ utils/test/pixel-data-hash.ts | 21 + 36 files changed, 5156 insertions(+), 1 deletion(-) create mode 100644 packages/core/test/dicomImageLoader_wadors_test.js create mode 100644 packages/core/test/dicomImageLoader_wadouri_test.js create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.wado-rs-tags.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.ts create mode 100644 packages/dicomImageLoader/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.wado-rs-tags.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.wado-rs-tags.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-Lossless.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-NearLossless.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_JPEG-Lossless_RGB.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_Palette.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_Palette_16.ts create mode 100644 packages/dicomImageLoader/testImages/TestPattern_RGB.ts create mode 100644 packages/dicomImageLoader/testImages/no-pixel-spacing.ts create mode 100644 packages/dicomImageLoader/testImages/no-pixel-spacing.wado-rs-tags.ts create mode 100644 packages/dicomImageLoader/testImages/paramap-float.ts create mode 100644 packages/dicomImageLoader/testImages/paramap.ts create mode 100644 packages/dicomImageLoader/testImages/tests.models.ts create mode 100644 packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.ts create mode 100644 packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.wado-rs-tags.ts create mode 100644 utils/test/pixel-data-hash.ts diff --git a/karma.conf.js b/karma.conf.js index ec872ce94..e89e948a0 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,7 +1,33 @@ +// @ts-check const path = require('path'); +const os = require('os'); process.env.CHROME_BIN = require('puppeteer').executablePath(); +/** + * + * Tests for the dicomImageLoaders require support for Web Workers and loading + * wasm files required for image decoding. + * + * In order to support this, the karma config requires some customisation. This + * is based on + * https://github.com/codymikol/karma-webpack/issues/498#issuecomment-790040818 + * + * The changes are: + * - Define a custom output path for webpack to emit files to + * - Serve the output path via a `files` entry in the karma config + * + * Without this, webpack correctly bundles and outputs the worker and wasm + * files, but they can't be loaded by the tests. Trying to load the worker or + * wasm files returns a 404. + * + * Manually create an output path. This is the same as the default + * karma-webpack config + * https://github.com/codymikol/karma-webpack?tab=readme-ov-file#default-webpack-configuration + */ +const outputPath = path.join(os.tmpdir(), '_karma_webpack_') + Math.floor(Math.random() * 1000000) + +/** @param {import('karma').Config} config */ module.exports = function (config) { config.set({ reporters: ['junit', 'coverage', 'spec'], @@ -54,7 +80,28 @@ module.exports = function (config) { files: [ 'packages/core/test/**/*_test.js', 'packages/tools/test/**/*_test.js', + // Serve dicomImageLoad test images + { + pattern: 'packages/dicomImageLoader/testImages/**/*', + watched: false, + included: false, + served: true + }, + /** + * Required to allow karma to load wasm and worker files built via webpack. + * See the comment at the top of this file for more details. + */ + { + pattern: `${outputPath}/**/*`, + included: false, + served: true, + watched: false + } ], + proxies: { + // Simplified path to access test images in tests + '/testImages/': '/base/packages/dicomImageLoader/testImages/', + }, preprocessors: { 'packages/core/test/**/*_test.js': ['webpack'], 'packages/tools/test/**/*_test.js': ['webpack'], @@ -73,6 +120,15 @@ module.exports = function (config) { webpack: { devtool: 'eval-source-map', mode: 'development', + output: { + /** + * Override default karma-webpack output path with the one we defined + * above this allows webpack generated files including wasm and workers + * to be served by karma without this, the default config won't allow + * tests to load web workers or wasm files. + */ + path: outputPath, + }, module: { rules: [ { @@ -115,7 +171,7 @@ module.exports = function (config) { ], }, experiments: { - asyncWebAssembly: true, + asyncWebAssembly: true }, resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], @@ -126,6 +182,7 @@ module.exports = function (config) { alias: { '@cornerstonejs/core': path.resolve('packages/core/src/index'), '@cornerstonejs/tools': path.resolve('packages/tools/src/index'), + '@cornerstonejs/dicom-image-loader': path.resolve('packages/dicomImageLoader/src/index'), }, }, }, diff --git a/packages/core/test/dicomImageLoader_wadors_test.js b/packages/core/test/dicomImageLoader_wadors_test.js new file mode 100644 index 000000000..bbd0877ff --- /dev/null +++ b/packages/core/test/dicomImageLoader_wadors_test.js @@ -0,0 +1,68 @@ +// @ts-check +import { cache, imageLoader, metaData } from '@cornerstonejs/core'; +import { + init as dicomImageLoaderInit, + wadors, +} from '@cornerstonejs/dicom-image-loader'; +import { WADO_RS_TEST as CtBigEndian_1_2_840_10008_1_2_2 } from '../../dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2'; +import { WADO_RS_TEST as JpegBaselineWadoRS } from '../../dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422'; +import { WADO_RS_TEST as JpegBaselineYbrFullTest } from '../../dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull'; +import { WADO_RS_TEST as NoPixelSpacingWadoRS } from '../../dicomImageLoader/testImages/no-pixel-spacing'; + +/** @type {import("../../dicomImageLoader/testImages/tests.models").IWadoRsTest[]} */ +const WADO_RS_TESTS = [ + CtBigEndian_1_2_840_10008_1_2_2, + JpegBaselineWadoRS, + JpegBaselineYbrFullTest, + NoPixelSpacingWadoRS, +]; + +/** + * These are paramaterized tests for dicomImageLoader. Theses tests are for + * validating the WADO-RS loader works correctly for a wide variety of images. + * Currently, the WADO-RS tests only test the WADO-RS Metadata Provider. + * + * Future improvement can extend these tests to match the functionality of + * WADO-URI tests including: + * 1. Testing pixel data matches the expected hash + * 2. Testing the Image object returned by `loadImage` + */ +describe('dicomImageLoader - WADO-RS', () => { + beforeEach(() => { + wadors.register(); + dicomImageLoaderInit(); + }); + + afterEach(() => { + // Before each test, purge all the metadata tags so that they are + // loaded fresh + wadors.metaDataManager.purge(); + cache.purgeCache(); + imageLoader.unregisterAllImageLoaders(); + }); + + for (const t of WADO_RS_TESTS) { + describe(t.name, () => { + for (const frame of t.frames) { + // WADO-RS Loader Tests + if (frame.metadataModule && t.wadorsMetadata) { + for (const [ + metadataModuleName, + expectedModuleValues, + ] of Object.entries(frame.metadataModule)) { + it(`should get the ${metadataModuleName} metadata from the ${t.name} image`, async () => { + wadors.metaDataManager.add(t.wadorsUrl, t.wadorsMetadata); + + const actualModuleValue = metaData.get( + metadataModuleName, + t.wadorsUrl + ); + + expect(actualModuleValue).toEqual(expectedModuleValues); + }); + } + } + } + }); + } +}); diff --git a/packages/core/test/dicomImageLoader_wadouri_test.js b/packages/core/test/dicomImageLoader_wadouri_test.js new file mode 100644 index 000000000..81d5ccd16 --- /dev/null +++ b/packages/core/test/dicomImageLoader_wadouri_test.js @@ -0,0 +1,239 @@ +// @ts-check + +import { cache, imageLoader, metaData } from '@cornerstonejs/core'; +import { + init as dicomImageLoaderInit, + wadouri, +} from '@cornerstonejs/dicom-image-loader'; +import { createImageHash } from '../../../utils/test/pixel-data-hash'; +import { WADOURI_TEST as CtBigEndian_1_2_840_1008_1_2_2 } from '../../dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2'; +import { WADOURI_TEST as CtJpeg2000Lossless_1_2_840_10008_1_2_4_90 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90'; +import { WADOURI_TEST as CtJpeg2000_1_2_840_10008_1_2_4_91 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91'; +import { WADOURI_TEST as CtJpegLsLossless_1_2_840_10008_1_2_4_80 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80'; +import { WADOURI_TEST as CtJpegLsLossless_1_2_840_10008_1_2_4_81 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81'; +import { WADOURI_TEST as CtJpegProcess14V1_1_2_840_10008_1_2_4_70 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70'; +import { WADOURI_TEST as CtJpegProcess14_1_2_840_10008_1_2_4_57 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57'; +import { WADOURI_TEST as CtJpegProcess1_1_2_840_10008_1_2_4_50 } from '../../dicomImageLoader/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50'; +import { WADOURI_TEST as CtLittleEndian_1_2_840_10008_1_2_1 } from '../../dicomImageLoader/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1'; +import { WADOURI_TEST as CtLittleEndian_1_2_840_10008_1_2 } from '../../dicomImageLoader/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2'; +import { WADOURI_TEST as CtRLELossless_1_2_840_10008_1_2_5 } from '../../dicomImageLoader/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5'; +import { WADOURI_TEST as TestPattern_JpegBaselineYbr422 } from '../../dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422'; +import { WADOURI_TEST as TestPatternJpegBaselineYbrFull } from '../../dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull'; +import { WADOURI_TEST as TestPatternJpegLsLossless } from '../../dicomImageLoader/testImages/TestPattern_JPEG-LS-Lossless'; +import { WADOURI_TEST as TestPatternJpegLsNearLossless } from '../../dicomImageLoader/testImages/TestPattern_JPEG-LS-NearLossless'; +import { WADOURI_TEST as TestPatternJpegLosslessRgb } from '../../dicomImageLoader/testImages/TestPattern_JPEG-Lossless_RGB'; +import { WADOURI_TEST as TestPatternPalette } from '../../dicomImageLoader/testImages/TestPattern_Palette'; +import { WADOURI_TEST as TestPatternPalette_16 } from '../../dicomImageLoader/testImages/TestPattern_Palette_16'; +import { WADOURI_TEST as TestPatternRGB } from '../../dicomImageLoader/testImages/TestPattern_RGB'; +import { WADOURI_TEST as NoPixelSpacing } from '../../dicomImageLoader/testImages/no-pixel-spacing'; +import { WADOURI_TEST as ParamapTest } from '../../dicomImageLoader/testImages/paramap'; +import { WADOURI_TEST as ParamapFloatTest } from '../../dicomImageLoader/testImages/paramap-float'; +import { WADOURI_TEST as UsMultiframeYbrFull422 } from '../../dicomImageLoader/testImages/us-multiframe-ybr-full-422'; + +/** @type {import("../../dicomImageLoader/testImages/tests.models").IWadoUriTest[]} */ +const tests = [ + CtBigEndian_1_2_840_1008_1_2_2, + CtJpeg2000_1_2_840_10008_1_2_4_91, + CtJpeg2000Lossless_1_2_840_10008_1_2_4_90, + CtJpegLsLossless_1_2_840_10008_1_2_4_80, + CtJpegLsLossless_1_2_840_10008_1_2_4_81, + CtJpegProcess1_1_2_840_10008_1_2_4_50, + CtBigEndian_1_2_840_1008_1_2_2, + CtJpegProcess14_1_2_840_10008_1_2_4_57, + CtJpegProcess14V1_1_2_840_10008_1_2_4_70, + CtLittleEndian_1_2_840_10008_1_2_1, + CtLittleEndian_1_2_840_10008_1_2, + CtRLELossless_1_2_840_10008_1_2_5, + NoPixelSpacing, + ParamapFloatTest, + ParamapTest, + TestPattern_JpegBaselineYbr422, + TestPatternJpegBaselineYbrFull, + TestPatternJpegLosslessRgb, + TestPatternJpegLsLossless, + TestPatternJpegLsNearLossless, + TestPatternPalette_16, + TestPatternPalette, + TestPatternRGB, + UsMultiframeYbrFull422, +]; + +/** + * These are paramaterized tests for dicomImageLoader. It allows us to test + * that different images are loaded correctly, and that the metadata returned by + * the loader is as expected. + * + * These tests are setup to test different aspects from loading single and + * multi-frame dicom images via WADO-URI. The tests include: + * + * 1. Loading the image and comparing the pixelData hash with an expected hash. + * 2. Loading the image and comparing the returned image object with an expected + * image object. + * 3. Retrieving metadata modules and comparing them with expected metadata + * modules. + */ +describe('dicomImageLoader - WADO-URI', () => { + beforeEach(() => { + // register the wadouri loader + wadouri.register(); + // re-initialise the loader before each test to clear any previous config + dicomImageLoaderInit(); + }); + + afterEach(() => { + // Purge any loaded data so each test loads the image + wadouri.dataSetCacheManager.purge(); + cache.purgeCache(); + imageLoader.unregisterAllImageLoaders(); + }); + + it('should allow customising the http request with beforeSend', async () => { + const test = CtLittleEndian_1_2_840_10008_1_2; + const beforeSpy = jasmine.createSpy('beforeHandler').and.resolveTo(); + + dicomImageLoaderInit({ + beforeSend: beforeSpy, + }); + + await imageLoader.loadImage(test.wadouri); + + const expectedHeaders = {}; + const expectedImageId = test.wadouri; + const expectedUrl = test.wadouri.replace('wadouri:', ''); + + expect(beforeSpy).toHaveBeenCalledWith( + jasmine.any(XMLHttpRequest), + expectedImageId, + expectedHeaders, + { + url: expectedUrl, + deferred: { + resolve: jasmine.any(Function), + reject: jasmine.any(Function), + }, + imageId: expectedImageId, + } + ); + }); + + it('should call request lifecycle callbacks', async () => { + const test = CtLittleEndian_1_2_840_10008_1_2; + const onreadystatechangeSpy = jasmine.createSpy('onreadystatechange'); + const onprogressSpy = jasmine.createSpy('onprogress'); + const onloadendSpy = jasmine.createSpy('onloadend'); + const onloadstartSpy = jasmine.createSpy('onloadstart'); + + dicomImageLoaderInit({ + onreadystatechange: onreadystatechangeSpy, + onprogress: onprogressSpy, + onloadend: onloadendSpy, + onloadstart: onloadstartSpy, + }); + + await imageLoader.loadImage(test.wadouri); + + const expectedImageId = test.wadouri; + const expectedUrl = test.wadouri.replace('wadouri:', ''); + const expectedLoaderParams = { + url: expectedUrl, + deferred: { + resolve: jasmine.any(Function), + reject: jasmine.any(Function), + }, + imageId: expectedImageId, + }; + + expect(onloadstartSpy).toHaveBeenCalledOnceWith( + jasmine.any(Event), + expectedLoaderParams + ); + + expect(onprogressSpy).toHaveBeenCalled(); + + expect(onreadystatechangeSpy).toHaveBeenCalledTimes(3); + expect(onreadystatechangeSpy.calls.argsFor(0)).toEqual([ + jasmine.any(Event), + expectedLoaderParams, + ]); + + expect(onloadendSpy).toHaveBeenCalledOnceWith( + jasmine.any(Event), + expectedLoaderParams + ); + }); + + for (const t of tests) { + describe(t.name, () => { + for (const frame of t.frames) { + // Determine the frame to use (default to 1 if not specified) + const frameIndex = frame.index || 1; + + if (frame.pixelDataHash) { + it(`decodes the image and the pixel data hash for frame ${frameIndex} of ${t.name} is correct`, async () => { + // first load the image without the frame so that it is loaded into + // the cache + const { imageId } = await imageLoader.loadImage(t.wadouri); + /** + * If the test case has `.pixelDataHash` defined, then we want to + * load the image and check that the pixel data matches the expected + * hash. + */ + const image = await imageLoader.loadImage( + imageIdWithFrame(imageId, frameIndex) + ); + const hash = await createImageHash(image.getPixelData()); + + expect(hash).toBe(frame.pixelDataHash); + }); + } + + if ('image' in frame && frame.image) { + it(`returns the correct image object for ${frameIndex} of the ${t.name} image`, async () => { + // first load the image without the frame so that it is loaded into + // the cache + const { imageId } = await imageLoader.loadImage(t.wadouri); + + // now load the frame specific imageId + const imagObj = await imageLoader.loadImage( + imageIdWithFrame(imageId, frameIndex) + ); + + expect(imagObj).toEqual(frame.image); + }); + } + + // WADO-RS Loader Tests + if (frame.metadataModule) { + for (const [ + metadataModuleName, + expectedModuleValues, + ] of Object.entries(frame.metadataModule)) { + it(`returns the correct ${metadataModuleName} metadata for frame ${frameIndex} of ${t.name} image`, async () => { + const { imageId } = await imageLoader.loadImage(t.wadouri); + const imageIdWithFrameIndex = imageIdWithFrame( + imageId, + frameIndex + ); + const actualModuleValue = metaData.get( + metadataModuleName, + imageIdWithFrameIndex + ); + + expect(actualModuleValue).toEqual(expectedModuleValues); + }); + } + } + } + }); + } +}); + +/** + * + * @param {string} imageId + * @param {number} frame 1 based frame index. + * @returns {string} + */ +function imageIdWithFrame(imageId, frame) { + return `${imageId}?frame=${frame}`; +} diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.ts new file mode 100644 index 000000000..b1aed148e --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.ts @@ -0,0 +1,170 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; +import { tags } from './CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.wado-rs-tags'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Incorrect type + calibration: {}, + color: false, + columnPixelSpacing: 0.675781, + columns: 512, + dataType: 'Int16Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + getCanvas: undefined, + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 512, + imageFrame: { + bitsAllocated: 16, + bitsStored: 16, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 512, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 1378, + photometricInterpretation: 'MONOCHROME2', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Int16Array), + pixelDataLength: 262144, + pixelRepresentation: 1, + planarConfiguration: undefined, + preScale: { + enabled: true, + scalingParameters: { + rescaleSlope: 1, + rescaleIntercept: -1024, + modality: 'CT', + }, + scaled: true, + }, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 512, + samplesPerPixel: 1, + smallestPixelValue: -3024, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: -1024, + invert: false, + maxPixelValue: 1378, + minPixelValue: -3024, + numberOfComponents: 1, + preScale: { + enabled: true, + scalingParameters: { + rescaleSlope: 1, + rescaleIntercept: -1024, + modality: 'CT', + }, + scaled: true, + }, + rgba: false, + rowPixelSpacing: 0.675781, + rows: 512, + sizeInBytes: 524288, + slope: 1, + voiLUTFunction: undefined, + width: 512, + windowCenter: 40, + windowWidth: 400, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [0, 1, 0], + columnPixelSpacing: 0.675781, + columns: 512, + frameOfReferenceUID: + '1.2.840.113619.2.30.1.1762295590.1623.978668949.886.8493.0.12', + // @ts-expect-error invalid type in ImagePlaneModule + imageOrientationPatient: [1, 0, 0, 0, 1, 0], + imagePositionPatient: [-161.399994, -148.800003, 4.7], + pixelSpacing: [0.675781, 0.675781], + rowCosines: [1, 0, 0], + rowPixelSpacing: 0.675781, + rows: 512, + sliceLocation: 4.6999998093, + sliceThickness: 5, + usingDefaultValues: false, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 16, + bitsStored: 16, + columns: 512, + highBit: 15, + largestPixelValue: undefined, + photometricInterpretation: 'MONOCHROME2', + pixelAspectRatio: undefined, + pixelRepresentation: 1, + planarConfiguration: undefined, + rows: 512, + samplesPerPixel: 1, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + metadataModule: { + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + }, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.dcm`, + wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.wado-rs-tags.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.wado-rs-tags.ts new file mode 100644 index 000000000..c2c2207bd --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_BigEndianExplicitTransferSyntax_1.2.840.10008.1.2.2.wado-rs-tags.ts @@ -0,0 +1,1010 @@ +export const tags = { + '00080005': { + vr: 'CS', + Value: ['ISO_IR 192'], + }, + '00080008': { + vr: 'CS', + Value: ['ORIGINAL', 'PRIMARY', 'AXIAL'], + }, + '00080016': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.2'], + }, + '00080018': { + vr: 'UI', + Value: ['1.2.840.113619.2.30.1.1762295590.1623.978668950.109'], + }, + '00080020': { + vr: 'DA', + Value: ['20010105'], + }, + '00080021': { + vr: 'DA', + Value: ['20010105'], + }, + '00080022': { + vr: 'DA', + Value: ['20010105'], + }, + '00080023': { + vr: 'DA', + Value: ['20010105'], + }, + '00080030': { + vr: 'TM', + Value: ['083501'], + }, + '00080031': { + vr: 'TM', + Value: ['083709'], + }, + '00080032': { + vr: 'TM', + Value: ['083848'], + }, + '00080033': { + vr: 'TM', + Value: ['083852'], + }, + '00080050': { + vr: 'SH', + Value: ['0000000001'], + }, + '00080060': { + vr: 'CS', + Value: ['CT'], + }, + '00080070': { + vr: 'LO', + Value: ['GE MEDICAL SYSTEMS'], + }, + '00080080': { + vr: 'LO', + }, + '00080090': { + vr: 'PN', + }, + '00081010': { + vr: 'SH', + Value: ['STATION_NAME'], + }, + '00081030': { + vr: 'LO', + Value: ['CHEST'], + }, + '0008103E': { + vr: 'LO', + Value: ['HELICAL CHEST'], + }, + '00081060': { + vr: 'PN', + }, + '00081070': { + vr: 'PN', + }, + '00081090': { + vr: 'LO', + Value: ['HiSpeed CT/i'], + }, + '00090010': { + vr: 'LO', + Value: ['GEMS_IDEN_01'], + }, + '00091001': { + vr: 'UN', + InlineBinary: 'R0VfR0VORVNJU19GRiA=', + }, + '00091002': { + vr: 'UN', + InlineBinary: 'VFdEMQ==', + }, + '00091004': { + vr: 'UN', + InlineBinary: 'SGlTcGVlZCBDVC9p', + }, + '00091027': { + vr: 'UN', + InlineBinary: 'CohVOg==', + }, + '00091030': { + vr: 'UN', + }, + '00091031': { + vr: 'UN', + }, + '000910E6': { + vr: 'UN', + InlineBinary: 'MDU=', + }, + '000910E7': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '000910E9': { + vr: 'UN', + InlineBinary: 'tYdVOg==', + }, + '00100010': { + vr: 'PN', + Value: [ + { + Alphabetic: 'MISTER^CT', + }, + ], + }, + '00100020': { + vr: 'LO', + Value: ['2178309'], + }, + '00100030': { + vr: 'DA', + }, + '00100040': { + vr: 'CS', + }, + '00101010': { + vr: 'AS', + }, + '00101030': { + vr: 'DS', + }, + '001021B0': { + vr: 'LT', + }, + '00110010': { + vr: 'LO', + Value: ['GEMS_PATI_01'], + }, + '00111010': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00180022': { + vr: 'CS', + Value: ['HELICAL MODE'], + }, + '00180050': { + vr: 'DS', + Value: [5.0], + }, + '00180060': { + vr: 'DS', + Value: [120], + }, + '00180088': { + vr: 'DS', + Value: [6.5], + }, + '00180090': { + vr: 'DS', + Value: [480.0], + }, + '00181020': { + vr: 'LO', + Value: ['05'], + }, + '00181100': { + vr: 'DS', + Value: [346.0], + }, + '00181110': { + vr: 'DS', + Value: [1099.3100585938], + }, + '00181111': { + vr: 'DS', + Value: [630.0], + }, + '00181120': { + vr: 'DS', + Value: [0.0], + }, + '00181130': { + vr: 'DS', + Value: [167.100006], + }, + '00181140': { + vr: 'CS', + Value: ['CW'], + }, + '00181150': { + vr: 'IS', + Value: [800], + }, + '00181151': { + vr: 'IS', + Value: [200], + }, + '00181152': { + vr: 'IS', + Value: [200], + }, + '00181160': { + vr: 'SH', + Value: ['BODY FILTER'], + }, + '00181190': { + vr: 'DS', + Value: [0.7], + }, + '00181210': { + vr: 'SH', + Value: ['STANDARD'], + }, + '00185100': { + vr: 'CS', + Value: ['FFS'], + }, + '00190010': { + vr: 'LO', + Value: ['GEMS_ACQU_01'], + }, + '00191002': { + vr: 'UN', + InlineBinary: 'kAMAAA==', + }, + '00191003': { + vr: 'UN', + InlineBinary: 'MzczLjc1MDAwMA==', + }, + '00191004': { + vr: 'UN', + InlineBinary: 'MS4wMTY2MDA=', + }, + '0019100F': { + vr: 'UN', + InlineBinary: 'ODQ5LjI5OTk4OA==', + }, + '00191011': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191013': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191014': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191015': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191016': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191017': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '00191018': { + vr: 'UN', + InlineBinary: 'UyA=', + }, + '00191019': { + vr: 'UN', + InlineBinary: 'MTUwLjAwMDAwMA==', + }, + '0019101A': { + vr: 'UN', + InlineBinary: 'UyA=', + }, + '0019101B': { + vr: 'UN', + InlineBinary: 'MTUwLjAwMDAwMA==', + }, + '0019101E': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '00191023': { + vr: 'UN', + InlineBinary: 'OC4xMjUwMDA=', + }, + '00191024': { + vr: 'UN', + InlineBinary: 'MC40MDA1MTA=', + }, + '00191025': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '00191026': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00191027': { + vr: 'UN', + InlineBinary: 'MC44MDAwMDA=', + }, + '0019102A': { + vr: 'UN', + InlineBinary: 'MTcwLjU5NTcwMw==', + }, + '0019102B': { + vr: 'UN', + InlineBinary: 'MTUzNi42NjcxMTQg', + }, + '0019102C': { + vr: 'UN', + InlineBinary: 'nwsAAA==', + }, + '0019102E': { + vr: 'UN', + InlineBinary: 'OS40MDQyOTc=', + }, + '0019102F': { + vr: 'UN', + InlineBinary: 'OTgwLjAwMDAwMA==', + }, + '00191039': { + vr: 'UN', + InlineBinary: 'EAA=', + }, + '00191040': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191041': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '00191042': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191043': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191044': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '00191047': { + vr: 'UN', + InlineBinary: '6AM=', + }, + '0019104A': { + vr: 'UN', + InlineBinary: 'BgA=', + }, + '0019104B': { + vr: 'UN', + InlineBinary: 'PzkAAA==', + }, + '00191052': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '00191057': { + vr: 'UN', + InlineBinary: 'ov8=', + }, + '00191058': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '0019105E': { + vr: 'UN', + InlineBinary: '+wIAAA==', + }, + '0019105F': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00191060': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00191061': { + vr: 'UN', + InlineBinary: 'EAMAAA==', + }, + '00191062': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '0019106A': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '0019106B': { + vr: 'UN', + InlineBinary: 'VAM=', + }, + '00191070': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '00191071': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00191072': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '00191073': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '00191074': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '00191075': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '00191076': { + vr: 'UN', + InlineBinary: 'MS4wMDAwMDA=', + }, + '001910DA': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '001910DB': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '001910DC': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '001910DD': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '001910DE': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '0020000D': { + vr: 'UI', + Value: ['1.2.840.113619.2.30.1.1762295590.1623.978668949.886'], + }, + '0020000E': { + vr: 'UI', + Value: ['1.2.840.113619.2.30.1.1762295590.1623.978668949.890'], + }, + '00200010': { + vr: 'SH', + Value: ['40933'], + }, + '00200011': { + vr: 'IS', + Value: [2], + }, + '00200012': { + vr: 'IS', + Value: [1], + }, + '00200013': { + vr: 'IS', + Value: [1], + }, + '00200032': { + vr: 'DS', + Value: [-161.399994, -148.800003, 4.7], + }, + '00200037': { + vr: 'DS', + Value: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0], + }, + '00200052': { + vr: 'UI', + Value: ['1.2.840.113619.2.30.1.1762295590.1623.978668949.886.8493.0.12'], + }, + '00200060': { + vr: 'CS', + }, + '00201040': { + vr: 'LO', + Value: ['SN'], + }, + '00201041': { + vr: 'DS', + Value: [4.6999998093], + }, + '00210010': { + vr: 'LO', + Value: ['GEMS_RELA_01'], + }, + '00211003': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '00211005': { + vr: 'UN', + InlineBinary: 'MDU=', + }, + '00211007': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00211015': { + vr: 'UN', + InlineBinary: '5Z8=', + }, + '00211016': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '00211018': { + vr: 'UN', + InlineBinary: 'MDU=', + }, + '00211019': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00211037': { + vr: 'UN', + InlineBinary: 'EAA=', + }, + '0021104A': { + vr: 'UN', + }, + '00211090': { + vr: 'UN', + InlineBinary: 'twE=', + }, + '00211091': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00211092': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00211093': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00230010': { + vr: 'LO', + Value: ['GEMS_STDY_01'], + }, + '00231070': { + vr: 'UN', + InlineBinary: 'RtFLDMQqzUE=', + }, + '00231074': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '0023107D': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00250010': { + vr: 'LO', + Value: ['GEMS_SERS_01'], + }, + '00251006': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00251007': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00251010': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00251011': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00251017': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00251018': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00251019': { + vr: 'UN', + InlineBinary: 'AwAAAA==', + }, + '0025101A': { + vr: 'UN', + }, + '00270010': { + vr: 'LO', + Value: ['GEMS_IMAG_01'], + }, + '00271006': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00271010': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '0027101C': { + vr: 'UN', + InlineBinary: 'yAAAAA==', + }, + '0027101D': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '0027101E': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '0027101F': { + vr: 'UN', + InlineBinary: 'yAAAAA==', + }, + '00271020': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00271030': { + vr: 'UN', + }, + '00271035': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '00271040': { + vr: 'UN', + InlineBinary: 'UyA=', + }, + '00271041': { + vr: 'UN', + InlineBinary: 'ZmaWQA==', + }, + '00271042': { + vr: 'UN', + InlineBinary: 'mpk5wQ==', + }, + '00271043': { + vr: 'UN', + InlineBinary: 'mpnBwQ==', + }, + '00271044': { + vr: 'UN', + InlineBinary: 'ZmaWQA==', + }, + '00271045': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00271046': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00271047': { + vr: 'UN', + InlineBinary: 'AACAvw==', + }, + '00271048': { + vr: 'UN', + InlineBinary: 'mpk4ww==', + }, + '00271049': { + vr: 'UN', + InlineBinary: 'zcwUQw==', + }, + '0027104A': { + vr: 'UN', + InlineBinary: 'ZmaWQA==', + }, + '0027104B': { + vr: 'UN', + InlineBinary: 'mpk4ww==', + }, + '0027104C': { + vr: 'UN', + InlineBinary: 'MzNFww==', + }, + '0027104D': { + vr: 'UN', + InlineBinary: 'ZmaWQA==', + }, + '00271050': { + vr: 'UN', + InlineBinary: 'Zmb+QA==', + }, + '00271051': { + vr: 'UN', + InlineBinary: 'sLiFwQ==', + }, + '00271052': { + vr: 'UN', + InlineBinary: 'TCA=', + }, + '00271053': { + vr: 'UN', + InlineBinary: 'UCA=', + }, + '00271054': { + vr: 'UN', + InlineBinary: 'UyA=', + }, + '00271055': { + vr: 'UN', + InlineBinary: 'SSA=', + }, + '00280002': { + vr: 'US', + Value: [1], + }, + '00280004': { + vr: 'CS', + Value: ['MONOCHROME2'], + }, + '00280010': { + vr: 'US', + Value: [512], + }, + '00280011': { + vr: 'US', + Value: [512], + }, + '00280030': { + vr: 'DS', + Value: [0.675781, 0.675781], + }, + '00280100': { + vr: 'US', + Value: [16], + }, + '00280101': { + vr: 'US', + Value: [16], + }, + '00280102': { + vr: 'US', + Value: [15], + }, + '00280103': { + vr: 'US', + Value: [1], + }, + '00280120': { + vr: 'SS', + Value: [-32768], + }, + '00281050': { + vr: 'DS', + Value: [40], + }, + '00281051': { + vr: 'DS', + Value: [400], + }, + '00281052': { + vr: 'DS', + Value: [-1024], + }, + '00281053': { + vr: 'DS', + Value: [1], + }, + '00290010': { + vr: 'LO', + Value: ['GEMS_IMPS_01'], + }, + '00291004': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00291005': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '00291006': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '00291007': { + vr: 'UN', + InlineBinary: 'VwAAAA==', + }, + '00291008': { + vr: 'UN', + }, + '00291009': { + vr: 'UN', + }, + '0029100A': { + vr: 'UN', + InlineBinary: '/AI=', + }, + '00291026': { + vr: 'UN', + InlineBinary: 'AgA=', + }, + '00291034': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00291035': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00430010': { + vr: 'LO', + Value: ['GEMS_PARM_01'], + }, + '00431010': { + vr: 'UN', + InlineBinary: 'kAE=', + }, + '00431011': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00431012': { + vr: 'UN', + InlineBinary: 'DwACAAQA', + }, + '00431013': { + vr: 'UN', + InlineBinary: 'awAXAAQAAgAUAA==', + }, + '00431014': { + vr: 'UN', + InlineBinary: 'BAAEAAIA', + }, + '00431015': { + vr: 'UN', + InlineBinary: 'nws=', + }, + '00431016': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00431017': { + vr: 'UN', + InlineBinary: 'MC4wOTUwMDA=', + }, + '00431018': { + vr: 'UN', + InlineBinary: 'MC4wODUwMDBcMS4xMDIwMDBcMC4wOTUwMDA=', + }, + '00431019': { + vr: 'UN', + InlineBinary: 'XgE=', + }, + '0043101A': { + vr: 'UN', + InlineBinary: 'BwAAAA==', + }, + '0043101B': { + vr: 'UN', + InlineBinary: 'AAAAAAAAAAAAAA==', + }, + '0043101C': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '0043101D': { + vr: 'UN', + InlineBinary: 'KAA=', + }, + '0043101E': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '0043101F': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00431020': { + vr: 'UN', + InlineBinary: 'MC4wMDAwMDA=', + }, + '00431021': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '00431025': { + vr: 'UN', + InlineBinary: 'AQACAAMA7ALtAu4C', + }, + '00431026': { + vr: 'UN', + InlineBinary: 'AQABAAEAAQABAAEA', + }, + '00431027': { + vr: 'UN', + InlineBinary: 'LzEuMzox', + }, + '00431028': { + vr: 'UN', + InlineBinary: + 'AAAAAgAAAJpJ5dVZwdqF+gAIAAAAAyYkAAAAAAAAAAAAAAAAAAAAAPgw+DD4MPgw+DD4MPgw+DD4MPgw+DD4MPgw+DD4MPgw+DD4MPgw+DA=', + }, + '00431029': { + vr: 'UN', + InlineBinary: + 'AAAAAUPwGxICfwAACWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==', + }, + '0043102A': { + vr: 'UN', + InlineBinary: 'AAAAAgAAAJpJ5dVZwdqF+gAIAAAAAyYkAAAAAAAAAAAAAAAAAAAAAA==', + }, + '0043102B': { + vr: 'UN', + InlineBinary: 'AgAEAAAAAAA=', + }, + '00431031': { + vr: 'UN', + InlineBinary: 'LTExLjYwMDAwMFwtMjQuMjAwMDAxIA==', + }, + '00431040': { + vr: 'UN', + InlineBinary: 'gJgqQw==', + }, + '00431041': { + vr: 'UN', + InlineBinary: 'ScKqRA==', + }, + '00431042': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00431043': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '00431044': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00431045': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00431046': { + vr: 'UN', + InlineBinary: 'AwAAAA==', + }, + '00431047': { + vr: 'UN', + InlineBinary: '/////w==', + }, + '00431048': { + vr: 'UN', + InlineBinary: 'AQAAAA==', + }, + '00431049': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '0043104A': { + vr: 'UN', + InlineBinary: 'AQA=', + }, + '0043104B': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '0043104C': { + vr: 'UN', + InlineBinary: 'AAA=', + }, + '0043104D': { + vr: 'UN', + InlineBinary: 'AAAAAA==', + }, + '0043104E': { + vr: 'UN', + InlineBinary: 'JUlCQA==', + }, + '7FE00010': { + vr: 'OW', + }, +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.ts new file mode 100644 index 000000000..7deadba4a --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.ts @@ -0,0 +1,29 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +/** + * Currently decoding this isn't supported + */ +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_DeflatedExplicitVRLittleEndianTransferSyntax_1.2.840.10008.1.2.1.99.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.ts new file mode 100644 index 000000000..425f6a746 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEG2000LosslessOnlyTransferSyntax_1.2.840.10008.1.2.4.90.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.ts new file mode 100644 index 000000000..deef43f0e --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.ts @@ -0,0 +1,25 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + '0c1d1516c0619ce2482ae7aa6d45b099c83d29cd55c398626b5b07c607771b4c'; +const TEST_NAME = 'CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEG2000TransferSyntax_1.2.840.10008.1.2.4.91.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.ts new file mode 100644 index 000000000..b0df9d8f9 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGLSLosslessTransferSyntax_1.2.840.10008.1.2.4.80.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.ts new file mode 100644 index 000000000..562d7df25 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + '24558c9527160735784e5601f29a15b6939a213f141f871c7c4cfcc639ada493'; +const TEST_NAME = + 'CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGLSLossyTransferSyntax_1.2.840.10008.1.2.4.81.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.ts new file mode 100644 index 000000000..08504f6c2 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.ts @@ -0,0 +1,30 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +/** + * Not supported ?? + */ + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGProcess10_12TransferSyntax_1.2.840.10008.1.2.4.55.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.ts new file mode 100644 index 000000000..57d2a3e18 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + '4343dec9982c17612b714c36238cc64d3bff466d55b9da6e95af26e2e086d00c'; +const TEST_NAME = + 'CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGProcess14SV1TransferSyntax_1.2.840.10008.1.2.4.70.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.ts new file mode 100644 index 000000000..27d7426d2 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGProcess14TransferSyntax_1.2.840.10008.1.2.4.57.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.ts new file mode 100644 index 000000000..c64a79d31 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'e3f2fc815cfd235d2c3873ef35cff6771a11ba3b2bc77fa6ade776bb64174c5a'; +const TEST_NAME = + 'CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGProcess1TransferSyntax_1.2.840.10008.1.2.4.50.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.ts new file mode 100644 index 000000000..797648948 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.ts @@ -0,0 +1,30 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +/** + * Not supported?? + */ + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_JPEGProcess6_8TransferSyntax_1.2.840.10008.1.2.4.53.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.ts new file mode 100644 index 000000000..112d18318 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_LittleEndianExplicitTransferSyntax_1.2.840.10008.1.2.1.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.ts new file mode 100644 index 000000000..b20273335 --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.ts @@ -0,0 +1,26 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = + 'CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_LittleEndianImplicitTransferSyntax_1.2.840.10008.1.2.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.ts b/packages/dicomImageLoader/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.ts new file mode 100644 index 000000000..4b0ba152c --- /dev/null +++ b/packages/dicomImageLoader/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.ts @@ -0,0 +1,25 @@ +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const IMAGE_HASH = + 'd36b58a8274fd5882a3863693bb84d2fb5719fff73c0ee21c98bfcb9abbb05c4'; +const TEST_NAME = 'CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/CTImage.dcm_RLELosslessTransferSyntax_1.2.840.10008.1.2.5.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.ts new file mode 100644 index 000000000..5b1b10d22 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.ts @@ -0,0 +1,178 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import { tags } from './TestPattern_JPEG-Baseline_YBR422.wado-rs-tags'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + // @ts-expect-error jasmine matcher + imageData: jasmine.any(ImageData), + largestPixelValue: 255, + photometricInterpretation: 'YBR_FULL_422', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [0, 1, 0], + columnPixelSpacing: 1, + columns: 640, + frameOfReferenceUID: undefined, + // @ts-expect-error Incorrect type in core + imageOrientationPatient: [1, 0, 0, 0, 1, 0], + imagePositionPatient: [0.5, 0.5, 0.5], + pixelSpacing: [1, 1], + rowCosines: [1, 0, 0], + rowPixelSpacing: 1, + rows: 400, + sliceLocation: undefined, + sliceThickness: undefined, + usingDefaultValues: false, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 8, + bitsStored: 8, + columns: 640, + highBit: 7, + largestPixelValue: undefined, + photometricInterpretation: 'YBR_FULL_422', + pixelAspectRatio: undefined, + pixelRepresentation: 0, + planarConfiguration: 0, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const SERIES_MODULE: Types.GeneralSeriesModuleMetadata = { + modality: 'OT', + seriesDate: undefined, + seriesInstanceUID: '1.3.6.1.4.1.34261.90254037371867.41912.1553085024.3', + seriesNumber: 1, + seriesTime: undefined, + studyInstanceUID: '1.3.6.1.4.1.34261.90254037371867.41912.1553085024.2', + // @ts-expect-error The following fields are not defined in GeneralSeriesModuleMetadata + acquisitionDate: undefined, + acquisitionTime: undefined, + seriesDescription: undefined, +}; + +const CALIBRATION_MODULE = undefined; + +/** + * The expected image hash on MacOS is + * `16ceb0ebf838cf705ae3d641c0acda06c9122f2ed42fe8bf250555bd4faa41e5 In GH + * Actions it is + * `f8b3f1c75e9ac773a200bba9ce94f8fd1df97d6f27d4e164af002ddcab6a025b` + */ +const IMAGE_HASH = + 'f8b3f1c75e9ac773a200bba9ce94f8fd1df97d6f27d4e164af002ddcab6a025b'; +const TEST_NAME = 'JPEG Baseline YBR422'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_JPEG-Baseline_YBR422.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_JPEG-Baseline_YBR422.dcm`, + wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.wado-rs-tags.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.wado-rs-tags.ts new file mode 100644 index 000000000..62b947d60 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBR422.wado-rs-tags.ts @@ -0,0 +1,220 @@ +/** + * Created by `dcm2json TestPattern_JPEG-Baseline_YBR422.dcm` + */ +export const tags = { + '00080008': { + vr: 'CS', + Value: ['DERIVED', 'SECONDARY', 'OTHER', 'MEVISLAB'], + }, + '00080016': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.7'], + }, + '00080018': { + vr: 'UI', + Value: ['1.2.276.0.7230010.3.1.4.253549293.23032.1555332170.441'], + }, + '00080020': { + vr: 'DA', + Value: ['20190320'], + }, + '00080023': { + vr: 'DA', + Value: ['20190320'], + }, + '00080030': { + vr: 'TM', + Value: ['133024.526000'], + }, + '00080033': { + vr: 'TM', + Value: ['133024.526000'], + }, + '00080050': { + vr: 'SH', + Value: ['121320'], + }, + '00080060': { + vr: 'CS', + Value: ['OT'], + }, + '00080064': { + vr: 'CS', + Value: ['WSD'], + }, + '00080090': { + vr: 'PN', + Value: [''], + }, + '00082111': { + vr: 'ST', + Value: [ + 'Lossy compression with JPEG baseline, IJG quality factor 90, compression ratio 17.0447', + ], + }, + '00082112': { + vr: 'SQ', + Value: [ + { + '00081150': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.7'], + }, + '00081155': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.0'], + }, + '0040A170': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['121320'], + }, + '00080102': { + vr: 'SH', + Value: ['DCM'], + }, + '00080104': { + vr: 'LO', + Value: ['Uncompressed predecessor'], + }, + }, + ], + }, + }, + ], + }, + '00089215': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['113040'], + }, + '00080102': { + vr: 'SH', + Value: ['DCM'], + }, + '00080104': { + vr: 'LO', + Value: ['Lossy Compression'], + }, + }, + ], + }, + '00100010': { + vr: 'PN', + Value: [ + { + Alphabetic: 'Test^Pattern', + }, + ], + }, + '00100020': { + vr: 'LO', + Value: ['Test^Pattern'], + }, + '00100030': { + vr: 'DA', + Value: ['20131005'], + }, + '00100040': { + vr: 'CS', + Value: ['O'], + }, + '0020000D': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.2'], + }, + '0020000E': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.3'], + }, + '00200010': { + vr: 'SH', + Value: ['1'], + }, + '00200011': { + vr: 'IS', + Value: [1], + }, + '00200013': { + vr: 'IS', + Value: [1], + }, + '00200020': { + vr: 'CS', + }, + '00200032': { + vr: 'DS', + Value: [0.5, 0.5, 0.5], + }, + '00200037': { + vr: 'DS', + Value: [1, 0, 0, 0, 1, 0], + }, + '00204000': { + vr: 'LT', + Value: [ + 'MeVisLab, original image from https://pixabay.com/vectors/test-pattern-tv-tv-test-pattern-152459/', + ], + }, + '00280002': { + vr: 'US', + Value: [3], + }, + '00280004': { + vr: 'CS', + Value: ['YBR_FULL_422'], + }, + '00280006': { + vr: 'US', + Value: [0], + }, + '00280010': { + vr: 'US', + Value: [400], + }, + '00280011': { + vr: 'US', + Value: [640], + }, + '00280030': { + vr: 'DS', + Value: [1, 1], + }, + '00280100': { + vr: 'US', + Value: [8], + }, + '00280101': { + vr: 'US', + Value: [8], + }, + '00280102': { + vr: 'US', + Value: [7], + }, + '00280103': { + vr: 'US', + Value: [0], + }, + '00282110': { + vr: 'CS', + Value: ['01'], + }, + '00282112': { + vr: 'DS', + Value: [17.0447], + }, + '00282114': { + vr: 'CS', + Value: ['ISO_10918_1'], + }, + '7FE00010': { + vr: 'OB', + }, +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.ts new file mode 100644 index 000000000..dc8f55354 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.ts @@ -0,0 +1,179 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import { tags } from './TestPattern_JPEG-Baseline_YBRFull.wado-rs-tags'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageData: jasmine.any(ImageData), + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 255, + photometricInterpretation: 'YBR_FULL', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [0, 1, 0], + columnPixelSpacing: 1, + columns: 640, + frameOfReferenceUID: undefined, + // @ts-expect-error Incorrect type in core + imageOrientationPatient: [1, 0, 0, 0, 1, 0], + imagePositionPatient: [0.5, 0.5, 0.5], + pixelSpacing: [1, 1], + rowCosines: [1, 0, 0], + rowPixelSpacing: 1, + rows: 400, + sliceLocation: undefined, + sliceThickness: undefined, + usingDefaultValues: false, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 8, + bitsStored: 8, + columns: 640, + highBit: 7, + largestPixelValue: undefined, + photometricInterpretation: 'YBR_FULL', + pixelAspectRatio: undefined, + pixelRepresentation: 0, + planarConfiguration: 0, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const SERIES_MODULE: Types.GeneralSeriesModuleMetadata = { + modality: 'OT', + seriesDate: undefined, + seriesInstanceUID: '1.3.6.1.4.1.34261.90254037371867.41912.1553085024.3', + seriesNumber: 1, + seriesTime: undefined, + studyInstanceUID: '1.3.6.1.4.1.34261.90254037371867.41912.1553085024.2', + // @ts-expect-error The following fields are not defined in GeneralSeriesModuleMetadata + acquisitionDate: undefined, + acquisitionTime: undefined, + seriesDescription: undefined, +}; + +const CALIBRATION_MODULE = undefined; + +/** + * On MacOS the expected image hash is + * `1ba91b409f0cecc9f0605c3a1ce184782afec2984a56274d5f2abc895c57f540` + * In GH Actions it is + * `7e07e65b853f83c2239a253037dd29278d22638fbaaa8d80e7ae31f300606586` + */ +const IMAGE_HASH = + '1ba91b409f0cecc9f0605c3a1ce184782afec2984a56274d5f2abc895c57f540'; +const TEST_NAME = 'JPEG Baseline YBR Full'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_JPEG-Baseline_YBRFull.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_JPEG-Baseline_YBRFull.dcm`, + wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.wado-rs-tags.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.wado-rs-tags.ts new file mode 100644 index 000000000..17d1c709c --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Baseline_YBRFull.wado-rs-tags.ts @@ -0,0 +1,218 @@ +/** + * Created by `dcm2json TestPattern_JPEG-Baseline_YBRFull.dcm` + */ +export const tags = { + '00080008': { + vr: 'CS', + Value: ['DERIVED', 'SECONDARY', 'OTHER', 'MEVISLAB'], + }, + '00080016': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.7'], + }, + '00080018': { + vr: 'UI', + Value: ['1.2.276.0.7230010.3.1.4.253549293.26360.1555332281.164'], + }, + '00080020': { + vr: 'DA', + Value: ['20190320'], + }, + '00080023': { + vr: 'DA', + Value: ['20190320'], + }, + '00080030': { + vr: 'TM', + Value: ['133024.526000'], + }, + '00080033': { + vr: 'TM', + Value: ['133024.526000'], + }, + '00080050': { + vr: 'SH', + }, + '00080060': { + vr: 'CS', + Value: ['OT'], + }, + '00080064': { + vr: 'CS', + Value: ['WSD'], + }, + '00080090': { + vr: 'PN', + }, + '00082111': { + vr: 'ST', + Value: [ + 'Lossy compression with JPEG baseline, IJG quality factor 90, compression ratio 16.071', + ], + }, + '00082112': { + vr: 'SQ', + Value: [ + { + '00081150': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.7'], + }, + '00081155': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.0'], + }, + '0040A170': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['121320'], + }, + '00080102': { + vr: 'SH', + Value: ['DCM'], + }, + '00080104': { + vr: 'LO', + Value: ['Uncompressed predecessor'], + }, + }, + ], + }, + }, + ], + }, + '00089215': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['113040'], + }, + '00080102': { + vr: 'SH', + Value: ['DCM'], + }, + '00080104': { + vr: 'LO', + Value: ['Lossy Compression'], + }, + }, + ], + }, + '00100010': { + vr: 'PN', + Value: [ + { + Alphabetic: 'Test^Pattern', + }, + ], + }, + '00100020': { + vr: 'LO', + Value: ['Test^Pattern'], + }, + '00100030': { + vr: 'DA', + Value: ['20131005'], + }, + '00100040': { + vr: 'CS', + Value: ['O'], + }, + '0020000D': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.2'], + }, + '0020000E': { + vr: 'UI', + Value: ['1.3.6.1.4.1.34261.90254037371867.41912.1553085024.3'], + }, + '00200010': { + vr: 'SH', + Value: ['1'], + }, + '00200011': { + vr: 'IS', + Value: [1], + }, + '00200013': { + vr: 'IS', + Value: [1], + }, + '00200020': { + vr: 'CS', + }, + '00200032': { + vr: 'DS', + Value: [0.5, 0.5, 0.5], + }, + '00200037': { + vr: 'DS', + Value: [1, 0, 0, 0, 1, 0], + }, + '00204000': { + vr: 'LT', + Value: [ + 'MeVisLab, original image from https://pixabay.com/vectors/test-pattern-tv-tv-test-pattern-152459/', + ], + }, + '00280002': { + vr: 'US', + Value: [3], + }, + '00280004': { + vr: 'CS', + Value: ['YBR_FULL'], + }, + '00280006': { + vr: 'US', + Value: [0], + }, + '00280010': { + vr: 'US', + Value: [400], + }, + '00280011': { + vr: 'US', + Value: [640], + }, + '00280030': { + vr: 'DS', + Value: [1, 1], + }, + '00280100': { + vr: 'US', + Value: [8], + }, + '00280101': { + vr: 'US', + Value: [8], + }, + '00280102': { + vr: 'US', + Value: [7], + }, + '00280103': { + vr: 'US', + Value: [0], + }, + '00282110': { + vr: 'CS', + Value: ['01'], + }, + '00282112': { + vr: 'DS', + Value: [16.071], + }, + '00282114': { + vr: 'CS', + Value: ['ISO_10918_1'], + }, + '7FE00010': { + vr: 'OB', + }, +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-Lossless.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-Lossless.ts new file mode 100644 index 000000000..abf6a042d --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-Lossless.ts @@ -0,0 +1,126 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + bytesPerPixel: 1, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + nearLossless: 0, + interleaveMode: 1, + bitsPerPixel: 8, + componentsPerPixel: 3, + encodeOptions: { + nearLossless: 0, + interleaveMode: 1, + frameInfo: { + width: 640, + height: 400, + bitsPerSample: 8, + componentCount: 3, + }, + }, + frameInfo: { + bitsPerSample: 8, + componentCount: 3, + height: 400, + width: 640, + }, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + imageInfo: { + columns: 640, + rows: 400, + bitsPerPixel: 8, + signed: false, + bytesPerPixel: 1, + componentsPerPixel: 3, + }, + largestPixelValue: 255, + photometricInterpretation: 'RGB', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + signed: false, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + 'db754473cb0f7754a77e709c199e787285f68beb675a934f8d4567328ab8f107'; +const TEST_NAME = 'TestPattern_JPEG-LS-Lossless'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_JPEG-LS-Lossless.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_JPEG-LS-Lossless.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-NearLossless.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-NearLossless.ts new file mode 100644 index 000000000..184f682a1 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-LS-NearLossless.ts @@ -0,0 +1,126 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + bytesPerPixel: 1, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + nearLossless: 2, + interleaveMode: 1, + bitsPerPixel: 8, + componentsPerPixel: 3, + encodeOptions: { + nearLossless: 2, + interleaveMode: 1, + frameInfo: { + width: 640, + height: 400, + bitsPerSample: 8, + componentCount: 3, + }, + }, + frameInfo: { + bitsPerSample: 8, + componentCount: 3, + height: 400, + width: 640, + }, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + imageInfo: { + columns: 640, + rows: 400, + bitsPerPixel: 8, + signed: false, + bytesPerPixel: 1, + componentsPerPixel: 3, + }, + largestPixelValue: 255, + photometricInterpretation: 'RGB', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + signed: false, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + 'b004180226bc4fa4f5982f914e924b31ccb2cd19782c149ea303a773e465c4d7'; +const TEST_NAME = 'TestPattern_JPEG-LS-NearLossless'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_JPEG-LS-NearLossless.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_JPEG-LS-NearLossless.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_JPEG-Lossless_RGB.ts b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Lossless_RGB.ts new file mode 100644 index 000000000..fd2626e37 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_JPEG-Lossless_RGB.ts @@ -0,0 +1,96 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 255, + photometricInterpretation: 'RGB', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + 'db754473cb0f7754a77e709c199e787285f68beb675a934f8d4567328ab8f107'; +const TEST_NAME = 'JPEG Lossless RGB'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_JPEG-Lossless_RGB.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_JPEG-Lossless_RGB.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_Palette.ts b/packages/dicomImageLoader/testImages/TestPattern_Palette.ts new file mode 100644 index 000000000..c6e5a1c8b --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_Palette.ts @@ -0,0 +1,101 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8ClampedArray', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + // @ts-expect-error jasmine matcher + bluePaletteColorLookupTableData: jasmine.any(Array), + bluePaletteColorLookupTableDescriptor: [256, 0, 8], + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + greenPaletteColorLookupTableData: jasmine.any(Array), + greenPaletteColorLookupTableDescriptor: [256, 0, 8], + // @ts-expect-error jasmine matcher + imageData: { data: jasmine.any(Uint8ClampedArray) }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 0, + photometricInterpretation: 'PALETTE COLOR', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8ClampedArray), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: undefined, + // @ts-expect-error jasmine matcher + redPaletteColorLookupTableData: jasmine.any(Array), + redPaletteColorLookupTableDescriptor: [256, 0, 8], + rows: 400, + samplesPerPixel: 1, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 0, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + '7cd0371eb339cb41d63862964d8908a03d548427694a8918bd4debc94f54eeea'; +const TEST_NAME = 'TestPattern_Palette'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_Palette.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_Palette.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_Palette_16.ts b/packages/dicomImageLoader/testImages/TestPattern_Palette_16.ts new file mode 100644 index 000000000..bbc73476a --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_Palette_16.ts @@ -0,0 +1,101 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8ClampedArray', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + // @ts-expect-error jasmine matcher + bluePaletteColorLookupTableData: jasmine.any(Array), + bluePaletteColorLookupTableDescriptor: [256, 0, 16], + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + greenPaletteColorLookupTableData: jasmine.any(Array), + greenPaletteColorLookupTableDescriptor: [256, 0, 16], + // @ts-expect-error jasmine matcher + imageData: { data: jasmine.any(Uint8ClampedArray) }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 0, + photometricInterpretation: 'PALETTE COLOR', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8ClampedArray), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: undefined, + // @ts-expect-error jasmine matcher + redPaletteColorLookupTableData: jasmine.any(Array), + redPaletteColorLookupTableDescriptor: [256, 0, 16], + rows: 400, + samplesPerPixel: 1, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 0, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + '7cd0371eb339cb41d63862964d8908a03d548427694a8918bd4debc94f54eeea'; +const TEST_NAME = 'TestPattern_Palette_16'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_Palette_16.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_Palette_16.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/TestPattern_RGB.ts b/packages/dicomImageLoader/testImages/TestPattern_RGB.ts new file mode 100644 index 000000000..42e3d5895 --- /dev/null +++ b/packages/dicomImageLoader/testImages/TestPattern_RGB.ts @@ -0,0 +1,96 @@ +import type { Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: true, + columnPixelSpacing: 1, + columns: 640, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 400, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 640, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 255, + photometricInterpretation: 'RGB', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 768000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 400, + samplesPerPixel: 3, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 400, + sizeInBytes: 768000, + slope: 1, + voiLUTFunction: undefined, + width: 640, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const IMAGE_HASH = + 'db754473cb0f7754a77e709c199e787285f68beb675a934f8d4567328ab8f107'; +const TEST_NAME = 'TestPattern_RGB'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/TestPattern_RGB.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/TestPattern_RGB.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/no-pixel-spacing.ts b/packages/dicomImageLoader/testImages/no-pixel-spacing.ts new file mode 100644 index 000000000..d7c3ac2dc --- /dev/null +++ b/packages/dicomImageLoader/testImages/no-pixel-spacing.ts @@ -0,0 +1,100 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import { tags } from './no-pixel-spacing.wado-rs-tags'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const WADO_RS_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [0, 1, 0], + columnPixelSpacing: 1, + columns: 800, + frameOfReferenceUID: undefined, + // @ts-expect-error Incorrect type in core + imageOrientationPatient: [1, 0, 0, 0, 1, 0], + imagePositionPatient: [0, 0, 0], + pixelSpacing: undefined, + rowCosines: [1, 0, 0], + rowPixelSpacing: 1, + rows: 600, + sliceLocation: undefined, + sliceThickness: undefined, + usingDefaultValues: true, +}; + +/** + * WADO-URI Image Plan Module returns different values for some fields + */ +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + ...WADO_RS_IMAGE_PLANE_MODULE, + columnCosines: null, + imageOrientationPatient: undefined, + imagePositionPatient: undefined, + rowCosines: null, +}; + +const WADO_RS_IMAGE_PIXEL_MODULE: Types.ImagePixelModule = { + bitsAllocated: 8, + bitsStored: 8, + // @ts-expect-error Types.ImagePixelModule is missing bluePaletteColorLookupTableData + // greenPaletteColorLookupTableData, redPaletteColorLookupTableData + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: [256, 0, 16], + columns: 800, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: [256, 0, 16], + highBit: 7, + largestPixelValue: undefined, + photometricInterpretation: 'PALETTE COLOR', + pixelAspectRatio: undefined, + pixelRepresentation: 0, + planarConfiguration: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: [256, 0, 16], + rows: 600, + samplesPerPixel: 1, + smallestPixelValue: undefined, +}; + +/** + * WADO-URI Pixel Module returns arrays for the + * blue/gree/redPaletteColorLookupTableData where as WADO-RS returns undefined. + * + * Match using `jasmine.any(Array)` to just check that an array is returned. + */ +const WADO_URI_IMAGE_PIXEL_MODULE = { + ...WADO_RS_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: jasmine.any(Array), + greenPaletteColorLookupTableData: jasmine.any(Array), + redPaletteColorLookupTableData: jasmine.any(Array), +}; + +const IMAGE_HASH = + 'd4c564cf88bf9fe0654d380ad45744c9579b4e456150e40e5577f87103949c4a'; +const TEST_NAME = 'No Pixel Spacing'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/no-pixel-spacing.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + }, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/no-pixel-spacing.dcm`, + wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.IMAGE_PLANE]: WADO_RS_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/no-pixel-spacing.wado-rs-tags.ts b/packages/dicomImageLoader/testImages/no-pixel-spacing.wado-rs-tags.ts new file mode 100644 index 000000000..daa2f8c4e --- /dev/null +++ b/packages/dicomImageLoader/testImages/no-pixel-spacing.wado-rs-tags.ts @@ -0,0 +1,739 @@ +/** + * Created by `dcm2json no-pixel-spacing.dcm` + */ +export const tags = { + '00080005': { + vr: 'CS', + Value: ['ISO_IR 192'], + }, + '00080008': { + vr: 'CS', + Value: ['ORIGINAL', 'PRIMARY', 'INTRACARDIAC'], + }, + '00080016': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.6.1'], + }, + '00080018': { + vr: 'UI', + Value: ['1.3.46.670589.14.1000.312.2.101370.20180503030558.3.0'], + }, + '00080020': { + vr: 'DA', + Value: ['20180503'], + }, + '00080022': { + vr: 'DA', + Value: ['20180503'], + }, + '00080023': { + vr: 'DA', + Value: ['20180503'], + }, + '0008002A': { + vr: 'DT', + Value: ['20180503050558.170000'], + }, + '00080030': { + vr: 'TM', + Value: ['050544.000000'], + }, + '00080032': { + vr: 'TM', + Value: ['050558.170000'], + }, + '00080033': { + vr: 'TM', + Value: ['050558.170000'], + }, + '00080050': { + vr: 'SH', + }, + '00080060': { + vr: 'CS', + Value: ['US'], + }, + '00080070': { + vr: 'LO', + Value: ['Philips Medical Systems'], + }, + '00080080': { + vr: 'LO', + Value: ['Cardiologie LATOUR'], + }, + '00080090': { + vr: 'PN', + }, + '00081010': { + vr: 'SH', + Value: ['USCARD3'], + }, + '00081090': { + vr: 'LO', + Value: ['CX50'], + }, + '00100010': { + vr: 'PN', + Value: [ + { + Alphabetic: 'TEST', + }, + ], + }, + '00100020': { + vr: 'LO', + Value: ['1234'], + }, + '00100030': { + vr: 'DA', + }, + '00100040': { + vr: 'CS', + }, + '00181020': { + vr: 'LO', + Value: [ + 'CX50_3.1.2', + '"453561826131__PRINTERS.11.217__PRINTERS__[2015/07/02]-04:40"', + '453561845591__3.1.2.463__Ultrasound_Applicat--[2015/11/20]-16:41', + '"453561779031__DRIVERS.51.11__DRIVERS__[2014/06/27]-14:33"', + '453561726031__OS.12.676__OS__[2013/08/29]-15:43', + ], + }, + '00185010': { + vr: 'LO', + Value: ['S5-1', 'UNUSED', 'UNUSED'], + }, + '00185020': { + vr: 'LO', + Value: ['CARD_ADULT'], + }, + '00186011': { + vr: 'SQ', + Value: [ + { + '00186012': { + vr: 'US', + Value: [1], + }, + '00186014': { + vr: 'US', + Value: [1], + }, + '00186016': { + vr: 'UL', + Value: [3], + }, + '00186018': { + vr: 'UL', + Value: [120], + }, + '0018601A': { + vr: 'UL', + Value: [60], + }, + '0018601C': { + vr: 'UL', + Value: [800], + }, + '0018601E': { + vr: 'UL', + Value: [518], + }, + '00186020': { + vr: 'SL', + Value: [340], + }, + '00186022': { + vr: 'SL', + Value: [4], + }, + '00186024': { + vr: 'US', + Value: [3], + }, + '00186026': { + vr: 'US', + Value: [3], + }, + '00186028': { + vr: 'FD', + Value: [0], + }, + '0018602A': { + vr: 'FD', + Value: [0], + }, + '0018602C': { + vr: 'FD', + Value: [0.03305420890260027], + }, + '0018602E': { + vr: 'FD', + Value: [0.03305420890260027], + }, + }, + { + '00186012': { + vr: 'US', + Value: [4], + }, + '00186014': { + vr: 'US', + Value: [10], + }, + '00186016': { + vr: 'UL', + Value: [3], + }, + '00186018': { + vr: 'UL', + Value: [176], + }, + '0018601A': { + vr: 'UL', + Value: [522], + }, + '0018601C': { + vr: 'UL', + Value: [622], + }, + '0018601E': { + vr: 'UL', + Value: [576], + }, + '00186020': { + vr: 'SL', + Value: [-176], + }, + '00186022': { + vr: 'SL', + Value: [-522], + }, + '00186024': { + vr: 'US', + Value: [4], + }, + '00186026': { + vr: 'US', + Value: [0], + }, + '00186028': { + vr: 'FD', + Value: [0], + }, + '0018602A': { + vr: 'FD', + Value: [0], + }, + '0018602C': { + vr: 'FD', + Value: [0.004499943750703116], + }, + '0018602E': { + vr: 'FD', + Value: [0], + }, + }, + { + '00186012': { + vr: 'US', + Value: [4], + }, + '00186014': { + vr: 'US', + Value: [10], + }, + '00186016': { + vr: 'UL', + Value: [3], + }, + '00186018': { + vr: 'UL', + Value: [743], + }, + '0018601A': { + vr: 'UL', + Value: [522], + }, + '0018601C': { + vr: 'UL', + Value: [743], + }, + '0018601E': { + vr: 'UL', + Value: [576], + }, + '00186020': { + vr: 'SL', + Value: [-743], + }, + '00186022': { + vr: 'SL', + Value: [-522], + }, + '00186024': { + vr: 'US', + Value: [4], + }, + '00186026': { + vr: 'US', + Value: [0], + }, + '00186028': { + vr: 'FD', + Value: [0], + }, + '0018602A': { + vr: 'FD', + Value: [0], + }, + '0018602C': { + vr: 'FD', + Value: [0.004499943750703116], + }, + '0018602E': { + vr: 'FD', + Value: [0], + }, + }, + ], + }, + '00186031': { + vr: 'CS', + Value: ['SECTOR_PHASED'], + }, + '0020000D': { + vr: 'UI', + Value: ['1.3.46.670589.14.1000.312.4.101370.20180503030544.3.0'], + }, + '0020000E': { + vr: 'UI', + Value: ['1.3.46.670589.14.1000.312.3.101370.20180503030545.3.0'], + }, + '00200010': { + vr: 'SH', + Value: ['344'], + }, + '00200011': { + vr: 'IS', + Value: [1], + }, + '00200013': { + vr: 'IS', + Value: [1], + }, + '00200020': { + vr: 'CS', + }, + '00280002': { + vr: 'US', + Value: [1], + }, + '00280004': { + vr: 'CS', + Value: ['PALETTE COLOR'], + }, + '00280010': { + vr: 'US', + Value: [600], + }, + '00280011': { + vr: 'US', + Value: [800], + }, + '00280014': { + vr: 'US', + Value: [1], + }, + '00280100': { + vr: 'US', + Value: [8], + }, + '00280101': { + vr: 'US', + Value: [8], + }, + '00280102': { + vr: 'US', + Value: [7], + }, + '00280103': { + vr: 'US', + Value: [0], + }, + '00281101': { + vr: 'US', + Value: [256, 0, 16], + }, + '00281102': { + vr: 'US', + Value: [256, 0, 16], + }, + '00281103': { + vr: 'US', + Value: [256, 0, 16], + }, + '00281201': { + vr: 'OW', + InlineBinary: + 'AAAAAQABAAEAAQABAAIAAgACAAMAAwADAAMABAAEAAUABQAFAAUABQAGAAYABgAGAAcABwAHAAgACQAJAAkACQALAAsACwAMAAwADAANAA0ADgAPAA8ADwAQABEAEQARABIAEwATABQAFQAVABYAFgAXABcAGAAZABoAGgAbABwAHAAdAB4AHgAgACAAIQAiACIAJAAkACUAJgAnACgAKQApACoAKwAsAC0ALwAvADEAMQAyADMANAA1ADYAOAA4ADsAOwA8AD4APgA/AD8AQgBCAEQARABEAEUARwBIAEkATABNAE4AUABRAFIAUwBVAFcAWABbAFwAXQBeAGAAYQBjAGUAZgBnAGkAagBrAGwAbwBxAHQAdQB2AHcAegB7AH0AfgB/AIIAhACGAIkAiwCMAI4AjwCRAJQAlQCXAJkAmgCcAJ0AnwCiAKQApgCoAKkAqwCtAK8ArwCyALQAtgC4ALoAuwC7AL0AvwDFAMUAxwDJAMsAywDNANEA0QDWANYA2ADcANwA3gDeAOAA4wDlAOUA5wDnAOwA7ADsAO4A8ADwAPAA8ADwAPAA9QD1APUA+AD4APgA+AD4APoA+gD6APoA+gD6APoA+gD6AP8AugCmAKgAewAtABkAhgB1AHUARwAbAA8ADQAIAAUAAADlACYAMQAlAEQAMAAVAAE=', + }, + '00281202': { + vr: 'OW', + InlineBinary: + 'AAAAAQABAAEAAQABAAIAAgACAAMAAwADAAQABAAEAAUABQAGAAYABgAGAAcABwAHAAgACAAJAAkACgAKAAoACgALAAsADAAMAAwADQANAA4ADgAPABAAEAARABEAEgASABMAEwAUABUAFgAWABYAFwAYABgAGQAaABsAGwAcAB0AHQAeAB8AHwAhACEAIgAjACQAJQAlACYAKAAoACkAKgArACsALQAtAC4AMAAxADIAMwAzADUANQA2ADcAOQA6ADsAPAA9AD8APwBAAEEARABFAEcASABJAEoATABMAE0AUABRAFIAVABVAFYAVwBZAFwAXABeAGAAYQBiAGMAZgBmAGoAawBtAG8AcABxAHIAdQB2AHkAegB7AH0AfwCBAIIAhACFAIgAiQCLAI4AjwCRAJIAlACVAJkAmgCcAJ0AnwChAKIApACoAKkAqwCtAK8AsACyALYAtgC6ALsAvQC/AMEAwwDDAMUAxwDLAMsAywDNAM8AzwDRANMA0wDYANgA2gDcANwA3gDeAOAA5QDnAOcA6QDpAOwA7ADsAO4A8ADwAPAA8wDzAPMA9QD1APUA+AD4APgA+AD4APoA+gD6APoA+gD6APoA+gD6AP8AugCmAKgAewAtABkAcQA0AEMAagA2AB0AFwAOAAgA/wAFAJoAMQAlAGQATgApAAE=', + }, + '00281203': { + vr: 'OW', + InlineBinary: + 'AAAAAQABAAEAAQABAAIAAgADAAMAAwAEAAQABQAFAAYABgAHAAcACAAIAAkACQAKAAsACwAMAA0ADQAOAA4ADwARABEAEgATABMAFAAUABUAFgAXABgAGAAZABoAGgAbABwAHQAeAB4AIAAgACEAIQAiACMAJAAlACUAJgAoACgAKQAqACsAKwAtAC4ALwAwADAAMgAzADMANQA1ADUANwA4ADgAOgA7ADsAPgA/AEAAQQBCAEQARABFAEYASQBKAEsATABMAE4AUABRAFEAVABVAFcAVwBYAFkAWwBcAF0AYQBiAGMAZQBlAGYAZwBqAGwAbQBvAHAAcQByAHQAdgB3AHkAegB9AH4AfwCBAIIAhQCFAIgAiQCLAIwAjgCPAJEAkgCUAJcAmQCaAJ0AnwChAKIApACmAKgAqwCtAK8ArwCwALIAtgC4ALoAuwC9AL8AwQDDAMMAwwDHAMkAywDLAM0AzwDPANEA0wDWANYA2ADaANwA3ADeAOAA4ADjAOMA5QDnAOcA6QDpAOwA7ADuAO4A8ADwAPAA8ADwAPMA9QD1APUA9QD1APUA+AD4APgA+gD6APoA+gD6AP0A/QD9AP0A/QD9AP0A/QD9AP8AugCmAKgAewAtABkAJAAMABoApAB1ADYAKAAWAAsAGwAFAP8AMQAlAKIAjgBUAAE=', + }, + '00282110': { + vr: 'CS', + Value: ['00'], + }, + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 113'], + }, + '200D0011': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1001': { + vr: 'LO', + Value: ['1.3.46.670589.14.1000.312'], + }, + '200D1002': { + vr: 'UL', + Value: [1], + }, + '200D1003': { + vr: 'UL', + Value: [202], + }, + '200D1004': { + vr: 'UL', + Value: [0], + }, + '200D1005': { + vr: 'UL', + Value: [0], + }, + '200D1006': { + vr: 'UL', + Value: [1], + }, + '200D1007': { + vr: 'CS', + Value: ['NONE'], + }, + '200D100B': { + vr: 'CS', + Value: ['FALSE'], + }, + '200D1012': { + vr: 'UL', + Value: [6], + }, + '200D1013': { + vr: 'FL', + Value: [0, 4.49900007, 8.99800014, 13.4969997, 17.9960003, 22.4950008], + }, + '200D1014': { + vr: 'SS', + Value: [0, 0, 0, 0, 0, 0], + }, + '200D1015': { + vr: 'UL', + Value: [0], + }, + '200D1017': { + vr: 'FD', + Value: [340], + }, + '200D1018': { + vr: 'FD', + Value: [0.1], + }, + '200D1019': { + vr: 'FD', + Value: [0], + }, + '200D101A': { + vr: 'FD', + Value: [0.008726646259971648], + }, + '200D101B': { + vr: 'FD', + Value: [0], + }, + '200D101C': { + vr: 'FD', + Value: [0.15], + }, + '200D101D': { + vr: 'UL', + Value: [170], + }, + '200D101E': { + vr: 'UL', + Value: [0], + }, + '200D101F': { + vr: 'FD', + Value: [1], + }, + '200D1020': { + vr: 'FD', + Value: [0], + }, + '200D1021': { + vr: 'FD', + Value: [0], + }, + '200D1022': { + vr: 'UL', + Value: [0], + }, + '200D1024': { + vr: 'UL', + Value: [0], + }, + '200D1025': { + vr: 'UL', + Value: [0], + }, + '200D1026': { + vr: 'UL', + Value: [0], + }, + '200D1027': { + vr: 'UL', + Value: [4294967295], + }, + '200D1028': { + vr: 'UL', + Value: [0], + }, + '200D1031': { + vr: 'UL', + Value: [0], + }, + '200D1108': { + vr: 'CS', + Value: ['FALSE'], + }, + '200D110D': { + vr: 'SQ', + Value: [ + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1000': { + vr: 'US', + Value: [1], + }, + '200D1001': { + vr: 'SQ', + Value: [ + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1002': { + vr: 'ST', + Value: ['IFI_PN'], + }, + '200D1003': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1004': { + vr: 'SL', + Value: [95, 6, 559, 25], + }, + '200D1005': { + vr: 'UL', + Value: [255, 255, 255], + }, + '200D1006': { + vr: 'UL', + Value: [37, 62, 94], + }, + '200D1007': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1013': { + vr: 'US', + Value: [84, 69, 83, 84], + }, + }, + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1002': { + vr: 'ST', + Value: ['IFI_MRN'], + }, + '200D1003': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1004': { + vr: 'SL', + Value: [95, 33, 258, 52], + }, + '200D1005': { + vr: 'UL', + Value: [255, 255, 255], + }, + '200D1006': { + vr: 'UL', + Value: [37, 62, 94], + }, + '200D1007': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1013': { + vr: 'US', + Value: [49, 50, 51, 52], + }, + }, + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1002': { + vr: 'ST', + Value: ['IFI_INS'], + }, + '200D1003': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1004': { + vr: 'SL', + Value: [258, 33, 559, 52], + }, + '200D1005': { + vr: 'UL', + Value: [255, 255, 255], + }, + '200D1006': { + vr: 'UL', + Value: [37, 62, 94], + }, + '200D1007': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1013': { + vr: 'US', + Value: [ + 67, 97, 114, 100, 105, 111, 108, 111, 103, 105, 101, 32, 76, + 65, 84, 79, 85, 82, + ], + }, + }, + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1002': { + vr: 'ST', + Value: ['IFI_DT'], + }, + '200D1003': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1004': { + vr: 'SL', + Value: [670, 6, 794, 25], + }, + '200D1005': { + vr: 'UL', + Value: [255, 255, 255], + }, + '200D1006': { + vr: 'UL', + Value: [37, 62, 94], + }, + '200D1007': { + vr: 'CS', + Value: ['TRUE'], + }, + }, + { + '200D0010': { + vr: 'LO', + Value: ['Philips US Imaging DD 109'], + }, + '200D1002': { + vr: 'ST', + Value: ['IFI_TM'], + }, + '200D1003': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D1004': { + vr: 'SL', + Value: [670, 33, 794, 52], + }, + '200D1005': { + vr: 'UL', + Value: [255, 255, 255], + }, + '200D1006': { + vr: 'UL', + Value: [37, 62, 94], + }, + '200D1007': { + vr: 'CS', + Value: ['TRUE'], + }, + }, + ], + }, + '200D1014': { + vr: 'CS', + Value: ['FALSE'], + }, + }, + ], + }, + '200D110E': { + vr: 'CS', + Value: ['TRUE'], + }, + '200D110F': { + vr: 'LO', + Value: ['CARD_ADULT'], + }, + '200D1110': { + vr: 'SL', + Value: [1], + }, + '200D1111': { + vr: 'LO', + }, + '200D1112': { + vr: 'SL', + Value: [-1], + }, + '7FE00010': { + vr: 'OB', + }, +}; diff --git a/packages/dicomImageLoader/testImages/paramap-float.ts b/packages/dicomImageLoader/testImages/paramap-float.ts new file mode 100644 index 000000000..2765fe4ef --- /dev/null +++ b/packages/dicomImageLoader/testImages/paramap-float.ts @@ -0,0 +1,180 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: false, + columnPixelSpacing: 0.7031, + columns: 256, + dataType: 'Float32Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + getCanvas: undefined, + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 256, + imageFrame: { + bitsAllocated: 32, + bitsStored: undefined, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 256, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 0.004095000214874744, + photometricInterpretation: 'MONOCHROME2', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Float32Array), + pixelDataLength: 65536, + pixelRepresentation: undefined, + planarConfiguration: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 256, + samplesPerPixel: 1, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 0.004095000214874744, + minPixelValue: 0, + numberOfComponents: 1, + preScale: undefined, + rgba: false, + rowPixelSpacing: 0.7031, + rows: 256, + sizeInBytes: 262144, + slope: 1, + voiLUTFunction: undefined, + width: 256, + windowCenter: 0.5020475001074374, + windowWidth: 1.0040950002148747, + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [-0.005401652, 0.9847554, 0.1738611], + columnPixelSpacing: 0.7031, + columns: 256, + frameOfReferenceUID: + '1.3.6.1.4.1.14519.5.2.1.3671.7001.241598906086676267096591752663', + // @ts-expect-error Incorrect type in core + imageOrientationPatient: [ + 0.999981, 0.004800584, 0.003877514, -0.005401652, 0.9847554, 0.1738611, + ], + imagePositionPatient: [-90.0225, -108.462, -43.9748], + pixelSpacing: [0.7031, 0.7031], + rowCosines: [0.999981, 0.004800584, 0.003877514], + rowPixelSpacing: 0.7031, + rows: 256, + sliceLocation: undefined, + sliceThickness: 2.999902, + usingDefaultValues: false, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 32, + bitsStored: undefined, + columns: 256, + highBit: undefined, + largestPixelValue: undefined, + photometricInterpretation: 'MONOCHROME2', + pixelAspectRatio: undefined, + pixelRepresentation: undefined, + planarConfiguration: undefined, + rows: 256, + samplesPerPixel: 1, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const SERIES_MODULE: Types.GeneralSeriesModuleMetadata = { + modality: 'MR', + seriesDate: { year: 2016, month: 9, day: 29 }, + seriesInstanceUID: '1.2.276.0.7230010.3.1.3.0.50783.1475186871.651944', + seriesNumber: 701, + seriesTime: { + hours: 18, + minutes: 7, + seconds: 51, + fractionalSeconds: undefined, + }, + studyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.3671.7001.133687106572018334063091507027', + // @ts-expect-error The following fields are not defined in GeneralSeriesModuleMetadata + acquisitionDate: undefined, + acquisitionTime: undefined, + seriesDescription: 'Apparent Diffusion Coefficient', +}; + +const CALIBRATION_MODULE = undefined; + +const IMAGE_HASH = + '461466d00428dc8a55013aef870cb76bfa13cb41e4e3a0d211ccaf83162f4383'; +const TEST_NAME = 'paramap-float'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/paramap-float.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: EXPECTED_IMAGE, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; + +/** + * Disabled - dcm2json reports an error + */ +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/paramap-float.dcm`, + // wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/paramap.ts b/packages/dicomImageLoader/testImages/paramap.ts new file mode 100644 index 000000000..8aa3754e4 --- /dev/null +++ b/packages/dicomImageLoader/testImages/paramap.ts @@ -0,0 +1,181 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const CS_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: {}, + color: false, + columnPixelSpacing: 0.7031, + columns: 256, + dataType: 'Uint16Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + getCanvas: undefined, + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 256, + imageFrame: { + bitsAllocated: 32, + bitsStored: undefined, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 256, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + + largestPixelValue: 4095, + photometricInterpretation: 'MONOCHROME2', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint16Array), + pixelDataLength: 65536, + pixelRepresentation: undefined, + planarConfiguration: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 256, + samplesPerPixel: 1, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 4095, + minPixelValue: 0, + numberOfComponents: 1, + preScale: undefined, + rgba: false, + rowPixelSpacing: 0.7031, + rows: 256, + sizeInBytes: 131072, + slope: 1, + voiLUTFunction: undefined, + width: 256, + windowCenter: 2048, + windowWidth: 4096, + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: [-0.005401652, 0.9847554, 0.1738611], + columnPixelSpacing: 0.7031, + columns: 256, + frameOfReferenceUID: + '1.3.6.1.4.1.14519.5.2.1.3671.7001.241598906086676267096591752663', + // @ts-expect-error Incorrect type in core + imageOrientationPatient: [ + 0.999981, 0.004800584, 0.003877514, -0.005401652, 0.9847554, 0.1738611, + ], + imagePositionPatient: [-90.0225, -108.462, -43.9748], + pixelSpacing: [0.7031, 0.7031], + rowCosines: [0.999981, 0.004800584, 0.003877514], + rowPixelSpacing: 0.7031, + rows: 256, + sliceLocation: undefined, + sliceThickness: 2.999902, + usingDefaultValues: false, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 32, + bitsStored: undefined, + columns: 256, + highBit: undefined, + largestPixelValue: undefined, + photometricInterpretation: 'MONOCHROME2', + pixelAspectRatio: undefined, + pixelRepresentation: undefined, + planarConfiguration: undefined, + rows: 256, + samplesPerPixel: 1, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const SERIES_MODULE: Types.GeneralSeriesModuleMetadata = { + modality: 'MR', + seriesDate: { year: 2016, month: 9, day: 29 }, + seriesInstanceUID: '1.2.276.0.7230010.3.1.3.0.50782.1475186871.424076', + seriesNumber: 701, + seriesTime: { + hours: 18, + minutes: 7, + seconds: 51, + fractionalSeconds: undefined, + }, + studyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.3671.7001.133687106572018334063091507027', + // @ts-expect-error The following fields are not defined in GeneralSeriesModuleMetadata + acquisitionDate: undefined, + acquisitionTime: undefined, + seriesDescription: 'Apparent Diffusion Coefficient', +}; + +const CALIBRATION_MODULE = undefined; + +const IMAGE_HASH = + '5f5f97c3b88747f6498c38c99f41b484a1814acf7b1e140fcc77c3a2afe2d17c'; +const TEST_NAME = 'paramap'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/paramap.dcm`, + frames: [ + { + pixelDataHash: IMAGE_HASH, + image: CS_IMAGE, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; + +/** + * Disabled - dcm2json reports an error + */ +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/paramap.dcm`, + // wadorsMetadata: tags, + frames: [ + { + pixelDataHash: IMAGE_HASH, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.GENERAL_SERIES]: SERIES_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/tests.models.ts b/packages/dicomImageLoader/testImages/tests.models.ts new file mode 100644 index 000000000..3815ffe0c --- /dev/null +++ b/packages/dicomImageLoader/testImages/tests.models.ts @@ -0,0 +1,108 @@ +import type { Types } from '@cornerstonejs/core'; +import type { WADORSMetaData } from '../src/types'; + +/** + * This is an interface for defining parametrised tests for WADO-URL and WADO-RS + * image loaders. + * + * This interface is used in `packages/core/test/dicomImageLoader_wadors_test.js` and + * `packages/core/test/dicomImageLoader_wadouri_test.js`. + */ +export interface IWadoUriTest { + /** + * A descriptive name for the test case. + */ + name: string; + /** + * The Wado-uri url to load the image. + * Karma is setup to serve files in `packages/dicomImageLoader/testImages/` at + * the `/testImages/` path. + * + * So a file at `packages/dicomImageLoader/testImages/no-pixel-spacing.dcm` + * can be referenced as `wadouri:/testImages/no-pixel-spacing.dcm` + * + * Note: The `wadouri:` prefix is required to trigger the dicomImageLoader. + * + * Example: `wadouri:/testImages/no-pixel-spacing.dcm` + * + */ + wadouri: string; + /** + * Frame specific expected test values. + * + * This is useful for multi-frame images where the expected metadata + * modules/pixel data hash is different for each frame. + */ + frames: Array<{ + /** + * Frame index. If not specified, defaults to 1. + * Note: This is a 1-based index, so counts from frame 1 to numberOfFrames + */ + index?: number; + /** + * The expected SHA256 hash of the pixel data for the frame. This is used to + * verify that the pixel data was loaded and decoded correctly. + */ + pixelDataHash?: string; + /** + * Expected Cornerstone IImage object to return for this frame. + */ + image?: Types.IImage | unknown; + /** + * Expected metadata module values for this frame. + */ + metadataModule?: { + [key: string]: object | undefined; + }; + }>; +} + +export interface IWadoRsTest { + /** + * A descriptive name for the test case. + */ + name: string; + /** + * Not used currently. + * + * @todo add ability for tests to load images from + * a mock Wado-RS server. + */ + wadorsUrl: string; + /** + * + * Wado-RS JSON metadata to allow loading of metadata without + * having to fetch it from a Wado-RS server. This is used in the tess + * to verify that metadata is parsed correctly. + * + * This can be created using `dcm2json source.dcm` + */ + wadorsMetadata?: WADORSMetaData | Record; + /** + * Frame specific expected test values. + * + * This is useful for multi-frame images where the expected metadata + * modules/pixel data hash is different for each frame. + */ + frames: Array<{ + /** + * Frame index. If not specified, defaults to 1. + * Note: This is a 1-based index, so counts from frame 1 to numberOfFrames + */ + index?: number; + /** + * Not currently used - pending implementation of Wado-RS image loading. + */ + pixelDataHash?: string; + /** + * Not currently used - pending implementation of Wado-RS image loading. + */ + image?: Types.IImage | unknown; + /** + * Expected metadata module value for this frame. + */ + metadataModule?: { + [key: string]: object | undefined; + }; + }>; +} diff --git a/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.ts b/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.ts new file mode 100644 index 000000000..bd5ef1451 --- /dev/null +++ b/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.ts @@ -0,0 +1,195 @@ +import { Enums, type Types } from '@cornerstonejs/core'; +import { tags } from './us-multiframe-ybr-full-422.wado-rs-tags'; +import type { IWadoRsTest, IWadoUriTest } from './tests.models'; + +const CALIBRATION_MODULE = { + sequenceOfUltrasoundRegions: [ + { + physicalDeltaX: 0.041258670759110834, + physicalDeltaY: 0.041258670759110834, + physicalUnitsXDirection: 3, + physicalUnitsYDirection: 3, + referencePhysicalPixelValueX: undefined, + referencePhysicalPixelValueY: undefined, + referencePixelX0: null, + referencePixelY0: null, + regionDataType: 1, + regionFlags: 2, + regionLocationMaxX1: 788, + regionLocationMaxY1: 592, + regionLocationMinX0: 11, + regionLocationMinY0: 30, + regionSpatialFormat: 1, + transducerFrequency: undefined, + }, + ], +}; + +const EXPECTED_IMAGE: Types.IImage = { + // @ts-expect-error Extra fields not defined in IImage + calibration: CALIBRATION_MODULE, + color: true, + columnPixelSpacing: 1, + columns: 800, + dataType: 'Uint8Array', + data: jasmine.any(Object), + // @ts-expect-error Extra fields not defined in IImage + decodeTimeInMS: jasmine.any(Number), + floatPixelData: undefined, + // @ts-expect-error jasmine matcher + getCanvas: jasmine.any(Function), + // @ts-expect-error jasmine matcher + getPixelData: jasmine.any(Function), + height: 600, + imageFrame: { + bitsAllocated: 8, + bitsStored: 8, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + columns: 800, + decodeLevel: undefined, + // @ts-expect-error jasmine matcher + decodeTimeInMS: jasmine.any(Number), + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + largestPixelValue: 255, + photometricInterpretation: 'YBR_FULL_422', + // @ts-expect-error jasmine matcher + pixelData: jasmine.any(Uint8Array), + pixelDataLength: 960000, + pixelRepresentation: 0, + planarConfiguration: 0, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, + rows: 600, + samplesPerPixel: 3, + smallestPixelValue: 0, + }, + // @ts-expect-error jasmine matcher + imageId: jasmine.any(String), + intercept: 0, + invert: false, + maxPixelValue: 255, + minPixelValue: 0, + numberOfComponents: 3, + preScale: undefined, + rgba: undefined, + rowPixelSpacing: 1, + rows: 600, + sizeInBytes: 960000, + slope: 1, + voiLUTFunction: undefined, + width: 800, + windowCenter: 128, + windowWidth: 256, + // @todo - add tests for voxelManager. + // @ts-expect-error jasmine matcher + voxelManager: jasmine.any(Object), + // @ts-expect-error jasmine matcher + loadTimeInMS: jasmine.any(Number), + totalTimeInMS: jasmine.any(Number), + // @ts-expect-error jasmine matcher + imageQualityStatus: jasmine.any(Number), +}; + +const WADO_URI_IMAGE_PLANE_MODULE: Types.ImagePlaneModule = { + columnCosines: null, + columnPixelSpacing: 1, + columns: 800, + frameOfReferenceUID: undefined, + imageOrientationPatient: undefined, + imagePositionPatient: undefined, + pixelSpacing: undefined, + rowCosines: null, + rowPixelSpacing: 1, + rows: 600, + sliceLocation: undefined, + sliceThickness: undefined, + usingDefaultValues: true, +}; +// Should be `Types.ImagePixelModule` the actual metadata doesn't conform to it. +const WADO_URI_IMAGE_PIXEL_MODULE = { + bitsAllocated: 8, + bitsStored: 8, + columns: 800, + highBit: 7, + largestPixelValue: undefined, + photometricInterpretation: 'YBR_FULL_422', + pixelAspectRatio: undefined, + pixelRepresentation: 0, + planarConfiguration: 0, + rows: 600, + samplesPerPixel: 3, + smallestPixelValue: undefined, +}; + +/** + * WADO-RS Pixel Module contains additional fields that are not present in + * WADO-URI Pixel Module. + */ +const WADO_RS_IMAGE_PIXEL_MODULE = { + ...WADO_URI_IMAGE_PIXEL_MODULE, + bluePaletteColorLookupTableData: undefined, + bluePaletteColorLookupTableDescriptor: undefined, + greenPaletteColorLookupTableData: undefined, + greenPaletteColorLookupTableDescriptor: undefined, + redPaletteColorLookupTableData: undefined, + redPaletteColorLookupTableDescriptor: undefined, +}; + +const MULTIFRAME_MODULE = { + NumberOfFrames: 78, + PerFrameFunctionalInformation: {}, + SharedFunctionalInformation: {}, +}; +const TEST_NAME = 'US Multiframe YBR Full 422'; + +const FRAME_1_PIXEL_DATA_HASH = + '969155018b2b569d530b22bfdc537650c7162c56bad3783f1d1ecab2d558abf0'; +const FRAME_78_PIXEL_DATA_HASH = + '31f6c10f923f9b970dc81e7bd6b2a68376abceeb47b91efa6ea481391df1c6c0'; + +export const WADOURI_TEST: IWadoUriTest = { + name: TEST_NAME, + wadouri: `wadouri:/testImages/us-multiframe-ybr-full-422.dcm`, + frames: [ + { + index: 1, + pixelDataHash: FRAME_1_PIXEL_DATA_HASH, + image: EXPECTED_IMAGE, + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_URI_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.MULTIFRAME]: MULTIFRAME_MODULE, + }, + }, + { + index: 78, + pixelDataHash: FRAME_78_PIXEL_DATA_HASH, + }, + ], +}; + +export const WADO_RS_TEST: IWadoRsTest = { + name: TEST_NAME, + wadorsUrl: `wadors:/testImages/us-multiframe-ybr-full-422.dcm`, + wadorsMetadata: tags, + frames: [ + { + pixelDataHash: FRAME_1_PIXEL_DATA_HASH, + image: EXPECTED_IMAGE, + // these aren't working yet - the wado-rs metadata provider + // doesn't return anything for these modules. Need to fix + // how the data is being cached by the wado-rs loader. + metadataModule: { + [Enums.MetadataModules.CALIBRATION]: CALIBRATION_MODULE, + [Enums.MetadataModules.IMAGE_PLANE]: WADO_URI_IMAGE_PLANE_MODULE, + [Enums.MetadataModules.IMAGE_PIXEL]: WADO_RS_IMAGE_PIXEL_MODULE, + [Enums.MetadataModules.MULTIFRAME]: MULTIFRAME_MODULE, + }, + }, + ], +}; diff --git a/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.wado-rs-tags.ts b/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.wado-rs-tags.ts new file mode 100644 index 000000000..c67487ee6 --- /dev/null +++ b/packages/dicomImageLoader/testImages/us-multiframe-ybr-full-422.wado-rs-tags.ts @@ -0,0 +1,299 @@ +/** + * Created by `dcm2json us-multiframe-ybr-full-422.dcm` + */ +export const tags = { + '00080005': { + vr: 'CS', + Value: ['ISO_IR 192'], + }, + '00080008': { + vr: 'CS', + Value: ['DERIVED', 'PRIMARY', 'ABDOMINAL'], + }, + '00080013': { + vr: 'TM', + Value: ['133717'], + }, + '00080016': { + vr: 'UI', + Value: ['1.2.840.10008.5.1.4.1.1.3.1'], + }, + '00080018': { + vr: 'UI', + Value: ['9999.34338454114017967847836346716065726945'], + }, + '00080020': { + vr: 'DA', + Value: ['20121025'], + }, + '00080023': { + vr: 'DA', + Value: ['20121025'], + }, + '00080030': { + vr: 'TM', + }, + '00080033': { + vr: 'TM', + }, + '00080050': { + vr: 'SH', + Value: ['1291447253958726'], + }, + '00080060': { + vr: 'CS', + Value: ['US'], + }, + '00080068': { + vr: 'CS', + Value: ['FOR PRESENTATION'], + }, + '00080070': { + vr: 'LO', + }, + '00080090': { + vr: 'PN', + }, + '00081030': { + vr: 'LO', + Value: ['US KIDNEYS'], + }, + '00081032': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['IMG5038'], + }, + '00080102': { + vr: 'SH', + Value: ['RP'], + }, + '00080104': { + vr: 'LO', + Value: ['US KIDNEYS'], + }, + }, + ], + }, + '0008103E': { + vr: 'LO', + Value: ['US KIDNEYS'], + }, + '00082144': { + vr: 'IS', + Value: [26], + }, + '00100010': { + vr: 'PN', + Value: [ + { + Alphabetic: '2215832610', + }, + ], + }, + '00100020': { + vr: 'LO', + Value: ['2215832610'], + }, + '00100030': { + vr: 'DA', + Value: ['19630626'], + }, + '00100040': { + vr: 'CS', + }, + '00120062': { + vr: 'CS', + Value: ['YES'], + }, + '00180040': { + vr: 'IS', + Value: [26], + }, + '00181063': { + vr: 'DS', + Value: [38.714], + }, + '00181088': { + vr: 'IS', + Value: [0], + }, + '00185010': { + vr: 'LO', + Value: ['C5_1', '54629', null], + }, + '00185020': { + vr: 'LO', + Value: ['ABD_RENAL'], + }, + '00186011': { + vr: 'SQ', + Value: [ + { + '00186012': { + vr: 'US', + Value: [1], + }, + '00186014': { + vr: 'US', + Value: [1], + }, + '00186016': { + vr: 'UL', + Value: [2], + }, + '00186018': { + vr: 'UL', + Value: [11], + }, + '0018601A': { + vr: 'UL', + Value: [30], + }, + '0018601C': { + vr: 'UL', + Value: [788], + }, + '0018601E': { + vr: 'UL', + Value: [592], + }, + '00186024': { + vr: 'US', + Value: [3], + }, + '00186026': { + vr: 'US', + Value: [3], + }, + '0018602C': { + vr: 'FD', + Value: [0.0412587], + }, + '0018602E': { + vr: 'FD', + Value: [0.0412587], + }, + }, + ], + }, + '0020000D': { + vr: 'UI', + Value: ['9999.4873689601340706578125708148444354948'], + }, + '0020000E': { + vr: 'UI', + Value: ['9999.21671276797191441480984915045348094693'], + }, + '00200010': { + vr: 'SH', + }, + '00200011': { + vr: 'IS', + Value: [1], + }, + '00200013': { + vr: 'IS', + Value: [14], + }, + '00280002': { + vr: 'US', + Value: [3], + }, + '00280004': { + vr: 'CS', + Value: ['YBR_FULL_422'], + }, + '00280006': { + vr: 'US', + Value: [0], + }, + '00280008': { + vr: 'IS', + Value: [78], + }, + '00280009': { + vr: 'AT', + Value: ['00181063'], + }, + '00280010': { + vr: 'US', + Value: [600], + }, + '00280011': { + vr: 'US', + Value: [800], + }, + '00280014': { + vr: 'US', + Value: [0], + }, + '00280100': { + vr: 'US', + Value: [8], + }, + '00280101': { + vr: 'US', + Value: [8], + }, + '00280102': { + vr: 'US', + Value: [7], + }, + '00280103': { + vr: 'US', + Value: [0], + }, + '00280301': { + vr: 'CS', + Value: ['NO'], + }, + '00282110': { + vr: 'CS', + Value: ['01'], + }, + '00282112': { + vr: 'DS', + Value: [100], + }, + '00282114': { + vr: 'CS', + Value: ['ISO_10918_1'], + }, + '0032000A': { + vr: 'CS', + Value: ['READ'], + }, + '0032000C': { + vr: 'CS', + Value: ['MED'], + }, + '00400245': { + vr: 'TM', + Value: ['133414'], + }, + '00400260': { + vr: 'SQ', + Value: [ + { + '00080100': { + vr: 'SH', + Value: ['IMG5038'], + }, + '00080102': { + vr: 'SH', + Value: ['SA'], + }, + '00080104': { + vr: 'LO', + Value: ['US KIDNEYS'], + }, + }, + ], + }, + '7FE00010': { + vr: 'OW', + }, +}; diff --git a/utils/test/pixel-data-hash.ts b/utils/test/pixel-data-hash.ts new file mode 100644 index 000000000..8f8b48685 --- /dev/null +++ b/utils/test/pixel-data-hash.ts @@ -0,0 +1,21 @@ +/** + * + * @description Creates a SHA-256 hash of the given image's pixel data. + * This can be used to verify that the pixel data matches an expected value. + * + * @param {ArrayBufferLike} image + * @returns {Promise} + */ +export async function createImageHash( + image: BufferSource +): Promise { + const hashBuffer = await crypto.subtle.digest( + 'SHA-256', + image + ); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + const hashHex = hashArray + .map((b) => b.toString(16).padStart(2, '0')) + .join(''); + return hashHex; +} From 7becd95618911ce5ea25f78234dba06f2b1996d2 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:54:07 +0000 Subject: [PATCH 078/108] 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 8c19c0303..56cfa22f1 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d3b607c2596aec33d93cb7f2834c01ca2783b412 \ No newline at end of file +ae84d0f69810dcce86a37919f47b8143bee8561a \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2f6de4127..61ef9e370 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", - "@cornerstonejs/tools": "4.5.17" + "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/tools": "4.5.18" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 1b8b30221..66b9d4bbb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", - "@cornerstonejs/tools": "4.5.17" + "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/tools": "4.5.18" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 33466d14c..dabb4d4d2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/core": "4.5.18", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index cfe206df0..d23fdc4b4 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.17", - "@cornerstonejs/core": "4.5.17", - "@cornerstonejs/dicom-image-loader": "4.5.17", - "@cornerstonejs/nifti-volume-loader": "4.5.17", - "@cornerstonejs/tools": "4.5.17", + "@cornerstonejs/adapters": "4.5.18", + "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/dicom-image-loader": "4.5.18", + "@cornerstonejs/nifti-volume-loader": "4.5.18", + "@cornerstonejs/tools": "4.5.18", "@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 2aaef46cf..71050033e 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", - "@cornerstonejs/tools": "4.5.17", + "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/tools": "4.5.18", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b8275927e..e5795d314 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17" + "@cornerstonejs/core": "4.5.18" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index caf78444e..c26167b30 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", - "@cornerstonejs/tools": "4.5.17", + "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/tools": "4.5.18", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index df05efda6..b827c2bca 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.17", + "@cornerstonejs/core": "4.5.18", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index 1d66c3521..a72e77ce2 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.17", - "commit": "d3b607c2596aec33d93cb7f2834c01ca2783b412" + "version": "4.5.18", + "commit": "ae84d0f69810dcce86a37919f47b8143bee8561a" } \ No newline at end of file diff --git a/version.txt b/version.txt index 276091461..0ad697deb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.17 \ No newline at end of file +4.5.18 \ No newline at end of file From 160f6302cfeedd0583a92f95f05d5d17982bbee3 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:54:19 +0000 Subject: [PATCH 079/108] 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 1d1a46cd0..12c2b0b0d 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package root + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 44abc4edd..18c31664d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.17", + "version": "4.5.18", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 7e7456236..decc274fe 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 61ef9e370..4156dc457 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.17", + "version": "4.5.18", "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 9eaaf1f3c..6de00f719 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 66b9d4bbb..1b40e4bab 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.17", + "version": "4.5.18", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6656e4b4e..b6f0f9248 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 337ff0d7f..b30492a58 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.17", + "version": "4.5.18", "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 db61881c6..47afc35d3 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index dabb4d4d2..4a6671ba8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.17", + "version": "4.5.18", "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 13787ab9e..96b327f9d 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 71050033e..d9e9974e1 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.17", + "version": "4.5.18", "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 c8e7d0b48..bb7c4a9b3 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-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 e5795d314..52c107459 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": "4.5.17", + "version": "4.5.18", "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 120813b78..b83e4dd8d 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c26167b30..34f1a550d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.17", + "version": "4.5.18", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 1f0a4ef23..b2e87e511 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. +## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [4.5.17](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.16...v4.5.17) (2025-10-18) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index b827c2bca..9b776a5a1 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.17", + "version": "4.5.18", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b4f2778e604356be25dce9287216aa52c237f2f7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 01:54:27 +0000 Subject: [PATCH 080/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index d54450714..339ac4b98 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.17'; +export const version = '4.5.18'; From 1a84852e1448bed31925a623c2dbd09f0cab23fb Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Fri, 17 Oct 2025 21:59:29 -0400 Subject: [PATCH 081/108] fix: Wrong position on rehydrate annotation (#2404) --- .../Cornerstone3D/MeasurementReport.ts | 6 ++++-- .../planar/filterAnnotationsWithinSlice.ts | 20 ++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index 59e3c0634..f3ea820fe 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -309,11 +309,13 @@ export default class MeasurementReport { metadata }) { const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence; - const { ReferencedSOPInstanceUID, ReferencedFrameNumber } = + const { ReferencedSOPInstanceUID, ReferencedFrameNumber = 1 } = ReferencedSOPSequence; const referencedImageId = - sopInstanceUIDToImageIdMap[ReferencedSOPInstanceUID]; + sopInstanceUIDToImageIdMap[ + `${ReferencedSOPInstanceUID}:${ReferencedFrameNumber}` + ]; const imagePlaneModule = metadata.get( "imagePlaneModule", referencedImageId diff --git a/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts b/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts index ee9c5a2f8..bc02d66d0 100644 --- a/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts +++ b/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts @@ -119,13 +119,17 @@ export default function filterAnnotationsWithinSlice( const annotationsWithinSlice = []; for (const annotation of annotationsWithParallelNormals) { - const data = annotation.data; + const { data, metadata, isVisible } = annotation; - const point = data.handles.points[0] || data.contour?.polyline[0]; - - if (!annotation.isVisible) { + if (!isVisible) { continue; } + + const point = + metadata.planeRestriction?.point || + data.handles.points[0] || + data.contour?.polyline[0]; + // A = point // B = focal point // P = normal @@ -133,8 +137,6 @@ export default function filterAnnotationsWithinSlice( // B-A dot P => Distance in the view direction. // this should be less than half the slice distance. - const dir = vec3.create(); - // If the handles has no values, eg a key image or other annotation, it // should just be included. if (!point) { @@ -142,11 +144,11 @@ export default function filterAnnotationsWithinSlice( continue; } - vec3.sub(dir, focalPoint, point); + const dir = vec3.sub(vec3.create(), focalPoint, point); - const dot = vec3.dot(dir, viewPlaneNormal); + const dot = Math.abs(vec3.dot(dir, viewPlaneNormal)); - if (Math.abs(dot) < halfSpacingInNormalDirection) { + if (dot < halfSpacingInNormalDirection) { annotationsWithinSlice.push(annotation); } } From e2292d17da42c54763dd0b94e92a2a1e8a7741e4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 02:03:06 +0000 Subject: [PATCH 082/108] 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 56cfa22f1..68dee94cb 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -ae84d0f69810dcce86a37919f47b8143bee8561a \ No newline at end of file +1a84852e1448bed31925a623c2dbd09f0cab23fb \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4156dc457..eee727ebc 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", - "@cornerstonejs/tools": "4.5.18" + "@cornerstonejs/core": "4.5.19", + "@cornerstonejs/tools": "4.5.19" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 1b40e4bab..ecceee224 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", - "@cornerstonejs/tools": "4.5.18" + "@cornerstonejs/core": "4.5.19", + "@cornerstonejs/tools": "4.5.19" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4a6671ba8..5e8cb7a69 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "9.0.1" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/core": "4.5.19", "dicom-parser": "1.8.21" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index d23fdc4b4..f4e96ca12 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "4.5.18", - "@cornerstonejs/core": "4.5.18", - "@cornerstonejs/dicom-image-loader": "4.5.18", - "@cornerstonejs/nifti-volume-loader": "4.5.18", - "@cornerstonejs/tools": "4.5.18", + "@cornerstonejs/adapters": "4.5.19", + "@cornerstonejs/core": "4.5.19", + "@cornerstonejs/dicom-image-loader": "4.5.19", + "@cornerstonejs/nifti-volume-loader": "4.5.19", + "@cornerstonejs/tools": "4.5.19", "@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 d9e9974e1..3b9fd3769 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", - "@cornerstonejs/tools": "4.5.18", + "@cornerstonejs/core": "4.5.19", + "@cornerstonejs/tools": "4.5.19", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 52c107459..7894203fa 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "0.6.9" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18" + "@cornerstonejs/core": "4.5.19" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 34f1a550d..12d874650 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", - "@cornerstonejs/tools": "4.5.18", + "@cornerstonejs/core": "4.5.19", + "@cornerstonejs/tools": "4.5.19", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 9b776a5a1..4509c0d9a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.18", + "@cornerstonejs/core": "4.5.19", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", diff --git a/version.json b/version.json index a72e77ce2..35ff33958 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "4.5.18", - "commit": "ae84d0f69810dcce86a37919f47b8143bee8561a" + "version": "4.5.19", + "commit": "1a84852e1448bed31925a623c2dbd09f0cab23fb" } \ No newline at end of file diff --git a/version.txt b/version.txt index 0ad697deb..dbde476f1 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.5.18 \ No newline at end of file +4.5.19 \ No newline at end of file From eac8f1cff804ffcff94ad9585eaca93f4ab794a9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 02:03:18 +0000 Subject: [PATCH 083/108] 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 | 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, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12c2b0b0d..ddc2a5009 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +### Bug Fixes + +- Wrong position on rehydrate annotation ([#2404](https://github.com/cornerstonejs/cornerstone3D/issues/2404)) ([1a84852](https://github.com/cornerstonejs/cornerstone3D/commit/1a84852e1448bed31925a623c2dbd09f0cab23fb)) + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 18c31664d..5acbbaa85 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.5.18", + "version": "4.5.19", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index decc274fe..104c92a3a 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +### Bug Fixes + +- Wrong position on rehydrate annotation ([#2404](https://github.com/cornerstonejs/cornerstone3D/issues/2404)) ([1a84852](https://github.com/cornerstonejs/cornerstone3D/commit/1a84852e1448bed31925a623c2dbd09f0cab23fb)) + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index eee727ebc..28ccdcfe9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "4.5.18", + "version": "4.5.19", "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 6de00f719..12dad4a9d 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index ecceee224..865b4923a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "4.5.18", + "version": "4.5.19", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b6f0f9248..fe9dcf20c 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index b30492a58..71cde19f8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "4.5.18", + "version": "4.5.19", "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 47afc35d3..2a650aa1e 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 5e8cb7a69..dffac2763 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "4.5.18", + "version": "4.5.19", "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 96b327f9d..fd0501f8c 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3b9fd3769..8a7b129be 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "4.5.18", + "version": "4.5.19", "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 bb7c4a9b3..9f3f863bd 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-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 7894203fa..f22762697 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": "4.5.18", + "version": "4.5.19", "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 b83e4dd8d..d42deadc4 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 12d874650..1149ad333 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "4.5.18", + "version": "4.5.19", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index b2e87e511..89da7e0fc 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. +## [4.5.19](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.18...v4.5.19) (2025-10-18) + +### Bug Fixes + +- Wrong position on rehydrate annotation ([#2404](https://github.com/cornerstonejs/cornerstone3D/issues/2404)) ([1a84852](https://github.com/cornerstonejs/cornerstone3D/commit/1a84852e1448bed31925a623c2dbd09f0cab23fb)) + ## [4.5.18](https://github.com/cornerstonejs/cornerstone3D/compare/v4.5.17...v4.5.18) (2025-10-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 4509c0d9a..e28cdec7b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "4.5.18", + "version": "4.5.19", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b9646c3c5eaf643fd8f7f193d97d3a1c50bc1cab Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Sat, 18 Oct 2025 02:03:27 +0000 Subject: [PATCH 084/108] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 339ac4b98..c4612f26a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '4.5.18'; +export const version = '4.5.19'; From 832e0d4af279c5c2ef6c0e5791952443323b8ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sat, 4 Oct 2025 16:13:49 +0200 Subject: [PATCH 085/108] feat: initial version of LengthToolZoom Starting to implement own length tool which is currently a plain copy of LengthTool but already has another cursor. --- packages/tools/src/index.ts | 2 + .../src/store/ToolGroupManager/ToolGroup.ts | 7 + .../src/tools/annotation/LengthToolZoom.ts | 907 ++++++++++++++++++ packages/tools/src/tools/index.ts | 2 + 4 files changed, 918 insertions(+) create mode 100644 packages/tools/src/tools/annotation/LengthToolZoom.ts diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index 670f962cf..17090d15a 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -39,6 +39,7 @@ import { MIPJumpToClickTool, LabelTool, LengthTool, + LengthToolZoom, HeightTool, ProbeTool, RectangleROITool, @@ -120,6 +121,7 @@ export { // Annotation Tools LabelTool, LengthTool, + LengthToolZoom, HeightTool, CrosshairsTool, ReferenceLinesTool, diff --git a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts index 8537b8aba..026f536be 100644 --- a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts +++ b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts @@ -653,6 +653,13 @@ export default class ToolGroup { return cursor; } + // Fall back to a standard CSS cursor registered for the tool name. + cursor = MouseCursor.getDefinedCursor(cursorName); + + if (cursor) { + return cursor; + } + return MouseCursor.getDefinedCursor('default'); } diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts new file mode 100644 index 000000000..2c5e5a98a --- /dev/null +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -0,0 +1,907 @@ +import { Events, ChangeTypes } from '../../enums'; +import { + getEnabledElement, + utilities as csUtils, + utilities, + getEnabledElementByViewportId, +} from '@cornerstonejs/core'; +import type { Types } from '@cornerstonejs/core'; + +import { getCalibratedLengthUnitsAndScale } from '../../utilities/getCalibratedUnits'; +import { AnnotationTool } from '../base'; +import throttle from '../../utilities/throttle'; +import { + addAnnotation, + getAnnotations, + removeAnnotation, +} from '../../stateManagement/annotation/annotationState'; +import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking'; +import { isAnnotationVisible } from '../../stateManagement/annotation/annotationVisibility'; +import { + triggerAnnotationCompleted, + triggerAnnotationModified, +} from '../../stateManagement/annotation/helpers/state'; +import * as lineSegment from '../../utilities/math/line'; + +import { + drawHandles as drawHandlesSvg, + drawLine as drawLineSvg, + drawLinkedTextBox as drawLinkedTextBoxSvg, +} from '../../drawingSvg'; +import { state } from '../../store/state'; +import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters'; +import { getTextBoxCoordsCanvas } from '../../utilities/drawing'; +import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds'; + +import { + resetElementCursor, + hideElementCursor, +} from '../../cursors/elementCursor'; +import { MouseCursor } from '../../cursors'; + +import type { + EventTypes, + ToolHandle, + TextBoxHandle, + PublicToolProps, + ToolProps, + SVGDrawingHelper, + Annotation, +} from '../../types'; +import type { LengthAnnotation } from '../../types/ToolSpecificAnnotationTypes'; +import type { StyleSpecifier } from '../../types/AnnotationStyle'; +import { getStyleProperty } from '../../stateManagement/annotation/config/helpers'; + +const { transformWorldToIndex } = csUtils; + +const pointerCursor = MouseCursor.getDefinedCursor('pointer'); + +if (pointerCursor) { + MouseCursor.setDefinedCursor('LengthZoom', pointerCursor); +} + +/** + * LengthToolZoom let you draw annotations that measures the length of two drawing + * points on a slice. You can use the LengthToolZoom in all imaging planes even in oblique + * reconstructed planes. Note: annotation tools in cornerstone3DTools exists in the exact location + * in the physical 3d space, as a result, by default, all annotations that are + * drawing in the same frameOfReference will get shared between viewports that + * are in the same frameOfReference. + * + * The resulting annotation's data (statistics) and metadata (the + * state of the viewport while drawing was happening) will get added to the + * ToolState manager and can be accessed from the ToolState by calling getAnnotations + * or similar methods. + * + * ```js + * cornerstoneTools.addTool(LengthToolZoom) + * + * const toolGroup = ToolGroupManager.createToolGroup('toolGroupId') + * + * toolGroup.addTool(LengthToolZoom.toolName) + * + * toolGroup.addViewport('viewportId', 'renderingEngineId') + * + * toolGroup.setToolActive(LengthToolZoom.toolName, { + * bindings: [ + * { + * mouseButton: MouseBindings.Primary, // Left Click + * }, + * ], + * }) + * ``` + * + * Read more in the Docs section of the website. + + */ + +class LengthToolZoom extends AnnotationTool { + static toolName = 'LengthZoom'; + + _throttledCalculateCachedStats: Function; + editData: { + annotation: Annotation; + viewportIdsToRender: string[]; + handleIndex?: number; + movingTextBox?: boolean; + newAnnotation?: boolean; + hasMoved?: boolean; + } | null; + isDrawing: boolean; + isHandleOutsideImage: boolean; + + constructor( + toolProps: PublicToolProps = {}, + defaultToolProps: ToolProps = { + supportedInteractionTypes: ['Mouse', 'Touch'], + configuration: { + preventHandleOutsideImage: false, + getTextLines: defaultGetTextLines, + actions: { + // TODO - bind globally - but here is actually pretty good as it + // is almost always active. + undo: { + method: 'undo', + bindings: [{ key: 'z' }], + }, + redo: { + method: 'redo', + bindings: [{ key: 'y' }], + }, + }, + }, + } + ) { + super(toolProps, defaultToolProps); + + this._throttledCalculateCachedStats = throttle( + this._calculateCachedStats, + 100, + { trailing: true } + ); + } + + static hydrate = ( + viewportId: string, + points: Types.Point3[], + options?: { + annotationUID?: string; + toolInstance?: LengthToolZoom; + referencedImageId?: string; + viewplaneNormal?: Types.Point3; + viewUp?: Types.Point3; + } + ): LengthAnnotation => { + const enabledElement = getEnabledElementByViewportId(viewportId); + if (!enabledElement) { + return; + } + const { + FrameOfReferenceUID, + referencedImageId, + viewPlaneNormal, + instance, + viewport, + } = this.hydrateBase( + LengthToolZoom, + enabledElement, + points, + options + ); + + // Exclude toolInstance from the options passed into the metadata + const { toolInstance, ...serializableOptions } = options || {}; + + const annotation = { + annotationUID: options?.annotationUID || utilities.uuidv4(), + data: { + handles: { + points, + }, + }, + highlighted: false, + autoGenerated: false, + invalidated: false, + isLocked: false, + isVisible: true, + metadata: { + toolName: instance.getToolName(), + viewPlaneNormal, + FrameOfReferenceUID, + referencedImageId, + ...serializableOptions, + }, + }; + addAnnotation(annotation, viewport.element); + + triggerAnnotationRenderForViewportIds([viewport.id]); + }; + + /** + * Based on the current position of the mouse and the current imageId to create + * a Length Annotation and stores it in the annotationManager + * + * @param evt - EventTypes.NormalizedMouseEventType + * @returns The annotation object. + * + */ + addNewAnnotation = ( + evt: EventTypes.InteractionEventType + ): LengthAnnotation => { + const eventDetail = evt.detail; + const { currentPoints, element } = eventDetail; + const worldPos = currentPoints.world; + + hideElementCursor(element); + this.isDrawing = true; + + const annotation = ( + this.createAnnotation(evt, [ + [...worldPos], + [...worldPos], + ]) + ); + + addAnnotation(annotation, element); + + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + + this.editData = { + annotation, + viewportIdsToRender, + handleIndex: 1, + movingTextBox: false, + newAnnotation: true, + hasMoved: false, + }; + this._activateDraw(element); + + evt.preventDefault(); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + return annotation; + }; + + /** + * 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 + * proximity of the point to the annotation in number of pixels. + * + * @param element - HTML Element + * @param annotation - Annotation + * @param canvasCoords - Canvas coordinates + * @param proximity - Proximity to tool to consider + * @returns Boolean, whether the canvas point is near tool + */ + isPointNearTool = ( + element: HTMLDivElement, + annotation: LengthAnnotation, + canvasCoords: Types.Point2, + proximity: number + ): boolean => { + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + const { data } = annotation; + const [point1, point2] = data.handles.points; + const canvasPoint1 = viewport.worldToCanvas(point1); + const canvasPoint2 = viewport.worldToCanvas(point2); + + const line = { + start: { + x: canvasPoint1[0], + y: canvasPoint1[1], + }, + end: { + x: canvasPoint2[0], + y: canvasPoint2[1], + }, + }; + + const distanceToPoint = lineSegment.distanceToPoint( + [line.start.x, line.start.y], + [line.end.x, line.end.y], + [canvasCoords[0], canvasCoords[1]] + ); + + if (distanceToPoint <= proximity) { + return true; + } + + return false; + }; + + toolSelectedCallback = ( + evt: EventTypes.InteractionEventType, + annotation: LengthAnnotation + ): void => { + const eventDetail = evt.detail; + const { element } = eventDetail; + + annotation.highlighted = true; + + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + + this.editData = { + annotation, + viewportIdsToRender, + movingTextBox: false, + }; + + this._activateModify(element); + + hideElementCursor(element); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + evt.preventDefault(); + }; + + handleSelectedCallback( + evt: EventTypes.InteractionEventType, + annotation: LengthAnnotation, + handle: ToolHandle + ): void { + const eventDetail = evt.detail; + const { element } = eventDetail; + const { data } = annotation; + + annotation.highlighted = true; + + let movingTextBox = false; + let handleIndex; + + if ((handle as TextBoxHandle).worldPosition) { + movingTextBox = true; + } else { + handleIndex = data.handles.points.findIndex((p) => p === handle); + } + + // Find viewports to render on drag. + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + + this.editData = { + annotation, + viewportIdsToRender, + handleIndex, + movingTextBox, + }; + this._activateModify(element); + + hideElementCursor(element); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + evt.preventDefault(); + } + + _endCallback = (evt: EventTypes.InteractionEventType): void => { + const eventDetail = evt.detail; + const { element } = eventDetail; + + const { annotation, viewportIdsToRender, newAnnotation, hasMoved } = + this.editData; + const { data } = annotation; + + if (newAnnotation && !hasMoved) { + // when user starts the drawing by click, and moving the mouse, instead + // of click and drag + return; + } + + data.handles.activeHandleIndex = null; + + this._deactivateModify(element); + this._deactivateDraw(element); + resetElementCursor(element); + + if ( + this.isHandleOutsideImage && + this.configuration.preventHandleOutsideImage + ) { + removeAnnotation(annotation.annotationUID); + } + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + this.doneEditMemo(); + + if (newAnnotation) { + triggerAnnotationCompleted(annotation); + } + + this.editData = null; + this.isDrawing = false; + }; + + _dragCallback = (evt: EventTypes.InteractionEventType): void => { + this.isDrawing = true; + const eventDetail = evt.detail; + const { element } = eventDetail; + + const { + annotation, + viewportIdsToRender, + handleIndex, + movingTextBox, + newAnnotation, + } = this.editData; + const { data } = annotation; + + this.createMemo(element, annotation, { newAnnotation }); + + if (movingTextBox) { + // Drag mode - moving text box + const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; + const worldPosDelta = deltaPoints.world; + + const { textBox } = data.handles; + const { worldPosition } = textBox; + + worldPosition[0] += worldPosDelta[0]; + worldPosition[1] += worldPosDelta[1]; + worldPosition[2] += worldPosDelta[2]; + + textBox.hasMoved = true; + } else if (handleIndex === undefined) { + // Drag mode - moving handle + const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; + const worldPosDelta = deltaPoints.world; + + const points = data.handles.points; + + points.forEach((point) => { + point[0] += worldPosDelta[0]; + point[1] += worldPosDelta[1]; + point[2] += worldPosDelta[2]; + }); + annotation.invalidated = true; + } else { + // Move mode - after double click, and mouse move to draw + const { currentPoints } = eventDetail; + const worldPos = currentPoints.world; + + data.handles.points[handleIndex] = [...worldPos]; + annotation.invalidated = true; + } + + this.editData.hasMoved = true; + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + if (annotation.invalidated) { + triggerAnnotationModified( + annotation, + element, + ChangeTypes.HandlesUpdated + ); + } + }; + + cancel = (element: HTMLDivElement) => { + // If it is mid-draw or mid-modify + if (this.isDrawing) { + this.isDrawing = false; + this._deactivateDraw(element); + 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: HTMLDivElement) => { + state.isInteractingWithTool = true; + + element.addEventListener( + Events.MOUSE_UP, + this._endCallback as EventListener + ); + element.addEventListener( + Events.MOUSE_DRAG, + this._dragCallback as EventListener + ); + element.addEventListener( + Events.MOUSE_CLICK, + this._endCallback as EventListener + ); + + element.addEventListener( + Events.TOUCH_END, + this._endCallback as EventListener + ); + element.addEventListener( + Events.TOUCH_DRAG, + this._dragCallback as EventListener + ); + element.addEventListener( + Events.TOUCH_TAP, + this._endCallback as EventListener + ); + }; + + _deactivateModify = (element: HTMLDivElement) => { + state.isInteractingWithTool = false; + + element.removeEventListener( + Events.MOUSE_UP, + this._endCallback as EventListener + ); + element.removeEventListener( + Events.MOUSE_DRAG, + this._dragCallback as EventListener + ); + element.removeEventListener( + Events.MOUSE_CLICK, + this._endCallback as EventListener + ); + + element.removeEventListener( + Events.TOUCH_END, + this._endCallback as EventListener + ); + element.removeEventListener( + Events.TOUCH_DRAG, + this._dragCallback as EventListener + ); + element.removeEventListener( + Events.TOUCH_TAP, + this._endCallback as EventListener + ); + }; + + _activateDraw = (element: HTMLDivElement) => { + state.isInteractingWithTool = true; + + element.addEventListener( + Events.MOUSE_UP, + this._endCallback as EventListener + ); + element.addEventListener( + Events.MOUSE_DRAG, + this._dragCallback as EventListener + ); + element.addEventListener( + Events.MOUSE_MOVE, + this._dragCallback as EventListener + ); + element.addEventListener( + Events.MOUSE_CLICK, + this._endCallback as EventListener + ); + + element.addEventListener( + Events.TOUCH_END, + this._endCallback as EventListener + ); + element.addEventListener( + Events.TOUCH_DRAG, + this._dragCallback as EventListener + ); + element.addEventListener( + Events.TOUCH_TAP, + this._endCallback as EventListener + ); + }; + + _deactivateDraw = (element: HTMLDivElement) => { + state.isInteractingWithTool = false; + + element.removeEventListener( + Events.MOUSE_UP, + this._endCallback as EventListener + ); + element.removeEventListener( + Events.MOUSE_DRAG, + this._dragCallback as EventListener + ); + element.removeEventListener( + Events.MOUSE_MOVE, + this._dragCallback as EventListener + ); + element.removeEventListener( + Events.MOUSE_CLICK, + this._endCallback as EventListener + ); + + element.removeEventListener( + Events.TOUCH_END, + this._endCallback as EventListener + ); + element.removeEventListener( + Events.TOUCH_DRAG, + this._dragCallback as EventListener + ); + element.removeEventListener( + Events.TOUCH_TAP, + this._endCallback as EventListener + ); + }; + + /** + * it is used to draw the length annotation in each + * request animation frame. It calculates the updated cached statistics if + * data is invalidated and cache it. + * + * @param enabledElement - The Cornerstone's enabledElement. + * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing. + */ + renderAnnotation = ( + enabledElement: Types.IEnabledElement, + svgDrawingHelper: SVGDrawingHelper + ): boolean => { + let renderStatus = false; + const { viewport } = enabledElement; + const { element } = viewport; + + let annotations = getAnnotations(this.getToolName(), element); + + // Todo: We don't need this anymore, filtering happens in triggerAnnotationRender + if (!annotations?.length) { + return renderStatus; + } + + annotations = this.filterInteractableAnnotationsForElement( + element, + annotations + ); + + if (!annotations?.length) { + return renderStatus; + } + + const targetId = this.getTargetId(viewport); + const renderingEngine = viewport.getRenderingEngine(); + + const styleSpecifier: StyleSpecifier = { + toolGroupId: this.toolGroupId, + toolName: this.getToolName(), + viewportId: enabledElement.viewport.id, + }; + + // Draw SVG + for (let i = 0; i < annotations.length; i++) { + const annotation = annotations[i] as LengthAnnotation; + const { annotationUID, data } = annotation; + const { points, activeHandleIndex } = data.handles; + + styleSpecifier.annotationUID = annotationUID; + + const { color, lineWidth, lineDash, shadow } = this.getAnnotationStyle({ + annotation, + styleSpecifier, + }); + + const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)); + + // If cachedStats does not exist, or the unit is missing (as part of import/hydration etc.), + // force to recalculate the stats from the points + if ( + !data.cachedStats[targetId] || + data.cachedStats[targetId].unit == null + ) { + data.cachedStats[targetId] = { + length: null, + unit: null, + }; + + this._calculateCachedStats(annotation, renderingEngine, enabledElement); + } else if (annotation.invalidated) { + this._throttledCalculateCachedStats( + annotation, + renderingEngine, + enabledElement + ); + } + + // If rendering engine has been destroyed while rendering + if (!viewport.getRenderingEngine()) { + console.warn('Rendering Engine has been destroyed'); + return renderStatus; + } + + let activeHandleCanvasCoords; + + if (!isAnnotationVisible(annotationUID)) { + continue; + } + + if ( + !isAnnotationLocked(annotationUID) && + !this.editData && + activeHandleIndex !== null + ) { + // Not locked or creating and hovering over handle, so render handle. + activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]]; + } + + const showHandlesAlways = Boolean( + getStyleProperty('showHandlesAlways', {} as StyleSpecifier) + ); + if (activeHandleCanvasCoords || showHandlesAlways) { + const handleGroupUID = '0'; + + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + handleGroupUID, + canvasCoordinates, + { + color, + lineDash, + lineWidth, + } + ); + } + + const dataId = `${annotationUID}-line`; + const lineUID = '1'; + drawLineSvg( + svgDrawingHelper, + annotationUID, + lineUID, + canvasCoordinates[0], + canvasCoordinates[1], + { + color, + width: lineWidth, + lineDash, + shadow, + }, + dataId + ); + + renderStatus = true; + + // If rendering engine has been destroyed while rendering + if (!viewport.getRenderingEngine()) { + console.warn('Rendering Engine has been destroyed'); + return renderStatus; + } + + const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation); + if (!options.visibility) { + data.handles.textBox = { + hasMoved: false, + worldPosition: [0, 0, 0], + worldBoundingBox: { + topLeft: [0, 0, 0], + topRight: [0, 0, 0], + bottomLeft: [0, 0, 0], + bottomRight: [0, 0, 0], + }, + }; + continue; + } + + const textLines = this.configuration.getTextLines(data, targetId); + + // Need to update to sync with annotation while unlinked/not moved + if (!data.handles.textBox.hasMoved) { + const canvasTextBoxCoords = getTextBoxCoordsCanvas(canvasCoordinates); + + data.handles.textBox.worldPosition = + viewport.canvasToWorld(canvasTextBoxCoords); + } + + const textBoxPosition = viewport.worldToCanvas( + data.handles.textBox.worldPosition + ); + + const textBoxUID = '1'; + const boundingBox = drawLinkedTextBoxSvg( + svgDrawingHelper, + annotationUID, + textBoxUID, + textLines, + textBoxPosition, + canvasCoordinates, + {}, + options + ); + + const { x: left, y: top, width, height } = boundingBox; + + data.handles.textBox.worldBoundingBox = { + topLeft: viewport.canvasToWorld([left, top]), + topRight: viewport.canvasToWorld([left + width, top]), + bottomLeft: viewport.canvasToWorld([left, top + height]), + bottomRight: viewport.canvasToWorld([left + width, top + height]), + }; + } + + return renderStatus; + }; + + _calculateLength(pos1, pos2) { + const dx = pos1[0] - pos2[0]; + const dy = pos1[1] - pos2[1]; + const dz = pos1[2] - pos2[2]; + + return Math.sqrt(dx * dx + dy * dy + dz * dz); + } + + _calculateCachedStats(annotation, renderingEngine, enabledElement) { + const data = annotation.data; + const { element } = enabledElement.viewport; + + const worldPos1 = data.handles.points[0]; + const worldPos2 = data.handles.points[1]; + const { cachedStats } = data; + const targetIds = Object.keys(cachedStats); + + // TODO clean up, this doesn't need a length per volume, it has no stats derived from volumes. + + for (let i = 0; i < targetIds.length; i++) { + const targetId = targetIds[i]; + + const image = this.getTargetImageData(targetId); + + // If image does not exists for the targetId, skip. This can be due + // to various reasons such as if the target was a volumeViewport, and + // the volumeViewport has been decached in the meantime. + if (!image) { + continue; + } + + const { imageData, dimensions } = image; + + const index1 = transformWorldToIndex(imageData, worldPos1); + const index2 = transformWorldToIndex(imageData, worldPos2); + const handles = [index1, index2]; + const { scale, unit } = getCalibratedLengthUnitsAndScale(image, handles); + + const length = this._calculateLength(worldPos1, worldPos2) / scale; + + if (this._isInsideVolume(index1, index2, dimensions)) { + this.isHandleOutsideImage = false; + } else { + this.isHandleOutsideImage = true; + } + + // TODO -> Do we instead want to clip to the bounds of the volume and only include that portion? + // Seems like a lot of work for an unrealistic case. At the moment bail out of stat calculation if either + // corner is off the canvas. + + // todo: add insideVolume calculation, for removing tool if outside + cachedStats[targetId] = { + length, + unit, + }; + } + + const invalidated = annotation.invalidated; + annotation.invalidated = false; + + // Dispatching annotation modified only if it was invalidated + if (invalidated) { + triggerAnnotationModified(annotation, element, ChangeTypes.StatsUpdated); + } + + return cachedStats; + } + + _isInsideVolume(index1, index2, dimensions) { + return ( + csUtils.indexWithinDimensions(index1, dimensions) && + csUtils.indexWithinDimensions(index2, dimensions) + ); + } +} + +function defaultGetTextLines(data, targetId): string[] { + const cachedVolumeStats = data.cachedStats[targetId]; + const { length, unit } = cachedVolumeStats; + + // Can be null on load + if (length === undefined || length === null || isNaN(length)) { + return; + } + + const textLines = [`${csUtils.roundNumber(length)} ${unit}`]; + + return textLines; +} + +export default LengthToolZoom; diff --git a/packages/tools/src/tools/index.ts b/packages/tools/src/tools/index.ts index 186d2c7d7..94b879a6c 100644 --- a/packages/tools/src/tools/index.ts +++ b/packages/tools/src/tools/index.ts @@ -24,6 +24,7 @@ import VolumeRotateTool from './VolumeRotateTool'; import BidirectionalTool from './annotation/BidirectionalTool'; import LabelTool from './annotation/LabelTool'; import LengthTool from './annotation/LengthTool'; +import LengthToolZoom from './annotation/LengthToolZoom'; import HeightTool from './annotation/HeightTool'; import ProbeTool from './annotation/ProbeTool'; import DragProbeTool from './annotation/DragProbeTool'; @@ -92,6 +93,7 @@ export { BidirectionalTool, LabelTool, LengthTool, + LengthToolZoom, HeightTool, ProbeTool, RectangleROITool, From a26413d70459e8c421d4e806ea15e4d8467cd764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sat, 4 Oct 2025 16:14:45 +0200 Subject: [PATCH 086/108] feat: abuse volumeAnnoationTools for testing LengthToolZoom Replaced LengthTool by LengthToolZoom for testin. --- packages/tools/examples/volumeAnnotationTools/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tools/examples/volumeAnnotationTools/index.ts b/packages/tools/examples/volumeAnnotationTools/index.ts index cbbeb3ee6..fcd36a6b3 100644 --- a/packages/tools/examples/volumeAnnotationTools/index.ts +++ b/packages/tools/examples/volumeAnnotationTools/index.ts @@ -18,7 +18,7 @@ console.warn( ); const { - LengthTool, + LengthToolZoom, ToolGroupManager, StackScrollTool, ZoomTool, @@ -87,7 +87,7 @@ async function run() { const toolGroupId = 'STACK_TOOL_GROUP_ID'; // Add tools to Cornerstone3D - cornerstoneTools.addTool(LengthTool); + cornerstoneTools.addTool(LengthToolZoom); cornerstoneTools.addTool(ZoomTool); cornerstoneTools.addTool(StackScrollTool); @@ -96,13 +96,13 @@ async function run() { const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); // Add the tools to the tool group and specify which volume they are pointing at - toolGroup.addTool(LengthTool.toolName, { volumeId }); + toolGroup.addTool(LengthToolZoom.toolName, { volumeId }); toolGroup.addTool(ZoomTool.toolName, { volumeId }); toolGroup.addTool(StackScrollTool.toolName); // Set the initial state of the tools, here we set one tool active on left click. // This means left click will draw that tool. - toolGroup.setToolActive(LengthTool.toolName, { + toolGroup.setToolActive(LengthToolZoom.toolName, { bindings: [ { mouseButton: MouseBindings.Primary, // Left Click From 4464502fa850eece13865a6bfb06e22df5883056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sat, 4 Oct 2025 18:13:32 +0200 Subject: [PATCH 087/108] feat: drag handles for placing two points separately Adjust code such that click and drag does not immediately draw the line but instead only one point will be placed and after a second click and drag was done for choosing the second point, the line will be drawn. --- .../src/tools/annotation/LengthToolZoom.ts | 484 +++++++++++++++++- 1 file changed, 473 insertions(+), 11 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index 2c5e5a98a..bc8d297b1 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -60,6 +60,16 @@ if (pointerCursor) { MouseCursor.setDefinedCursor('LengthZoom', pointerCursor); } +const HANDLE_RADIUS = 8; +const HANDLE_COLOR = '#1284FF'; +const HANDLE_FILL = '#ffffff'; +const HANDLE_LINE_WIDTH = 2; +const ACTIVE_HANDLE_RADIUS = 12; +const MOVEMENT_EPSILON = 1e-3; +const HANDLE_MOVE_LINGER_FRAMES = 20; +const HANDLE_GLOW_RADIUS = 26; +const HANDLE_GLOW_COLOR = 'rgba(18, 132, 255, 0.3)'; + /** * LengthToolZoom let you draw annotations that measures the length of two drawing * points on a slice. You can use the LengthToolZoom in all imaging planes even in oblique @@ -106,9 +116,14 @@ class LengthToolZoom extends AnnotationTool { movingTextBox?: boolean; newAnnotation?: boolean; hasMoved?: boolean; + stage?: 'placingFirst' | 'placingSecond'; + isHandleMoving?: boolean; + handleMoveLinger?: number; } | null; isDrawing: boolean; isHandleOutsideImage: boolean; + private pendingAnnotation: LengthAnnotation | null; + private _handleMoveAnimationFrame: number | null; constructor( toolProps: PublicToolProps = {}, @@ -139,6 +154,13 @@ class LengthToolZoom extends AnnotationTool { 100, { trailing: true } ); + + this.pendingAnnotation = null; + this._handleMoveAnimationFrame = null; + + if (!toolProps.configuration?.getTextLines) { + this.configuration.getTextLines = this._getTextLinesWithLabel; + } } static hydrate = ( @@ -210,6 +232,14 @@ class LengthToolZoom extends AnnotationTool { ): LengthAnnotation => { const eventDetail = evt.detail; const { currentPoints, element } = eventDetail; + + if ( + this.pendingAnnotation && + this.pendingAnnotation.metadata?.creationStage === 'waitingSecond' + ) { + return this._beginSecondPointPlacement(evt, this.pendingAnnotation); + } + const worldPos = currentPoints.world; hideElementCursor(element); @@ -222,6 +252,10 @@ class LengthToolZoom extends AnnotationTool { ]) ); + annotation.metadata.creationStage = 'placingFirst'; + annotation.data.handles.activeHandleIndex = 0; + + this._assignAnnotationLabel(annotation, element); addAnnotation(annotation, element); const viewportIdsToRender = getViewportIdsWithToolToRender( @@ -232,10 +266,13 @@ class LengthToolZoom extends AnnotationTool { this.editData = { annotation, viewportIdsToRender, - handleIndex: 1, + handleIndex: 0, movingTextBox: false, newAnnotation: true, hasMoved: false, + stage: 'placingFirst', + isHandleMoving: false, + handleMoveLinger: 0, }; this._activateDraw(element); @@ -243,9 +280,57 @@ class LengthToolZoom extends AnnotationTool { triggerAnnotationRenderForViewportIds(viewportIdsToRender); + this.pendingAnnotation = annotation; + return annotation; }; + private _beginSecondPointPlacement( + evt: EventTypes.InteractionEventType, + annotation: LengthAnnotation + ): LengthAnnotation { + const eventDetail = evt.detail; + const { currentPoints, element } = eventDetail; + const worldPos = currentPoints.world; + + hideElementCursor(element); + this.isDrawing = true; + + const points = annotation.data.handles.points; + points[1] = [...worldPos]; + annotation.metadata.creationStage = 'placingSecond'; + annotation.data.handles.activeHandleIndex = 1; + annotation.highlighted = true; + annotation.invalidated = true; + + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + + this.editData = { + annotation, + viewportIdsToRender, + handleIndex: 1, + movingTextBox: false, + newAnnotation: true, + hasMoved: false, + stage: 'placingSecond', + isHandleMoving: false, + handleMoveLinger: 0, + }; + + this._activateDraw(element); + + evt.preventDefault(); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + this.pendingAnnotation = annotation; + + return annotation; + } + /** * 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 @@ -302,6 +387,7 @@ class LengthToolZoom extends AnnotationTool { const { element } = eventDetail; annotation.highlighted = true; + annotation.data.handles.activeHandleIndex = null; const viewportIdsToRender = getViewportIdsWithToolToRender( element, @@ -312,6 +398,8 @@ class LengthToolZoom extends AnnotationTool { annotation, viewportIdsToRender, movingTextBox: false, + isHandleMoving: false, + handleMoveLinger: 0, }; this._activateModify(element); @@ -343,6 +431,12 @@ class LengthToolZoom extends AnnotationTool { handleIndex = data.handles.points.findIndex((p) => p === handle); } + if (movingTextBox || handleIndex === undefined || handleIndex === -1) { + data.handles.activeHandleIndex = null; + } else { + data.handles.activeHandleIndex = handleIndex; + } + // Find viewports to render on drag. const viewportIdsToRender = getViewportIdsWithToolToRender( element, @@ -354,6 +448,8 @@ class LengthToolZoom extends AnnotationTool { viewportIdsToRender, handleIndex, movingTextBox, + isHandleMoving: false, + handleMoveLinger: 0, }; this._activateModify(element); @@ -368,11 +464,32 @@ class LengthToolZoom extends AnnotationTool { const eventDetail = evt.detail; const { element } = eventDetail; - const { annotation, viewportIdsToRender, newAnnotation, hasMoved } = + if (!this.editData) { + return; + } + + const { annotation, viewportIdsToRender, newAnnotation, hasMoved, stage } = this.editData; const { data } = annotation; - if (newAnnotation && !hasMoved) { + if (stage === 'placingFirst') { + annotation.metadata.creationStage = 'waitingSecond'; + data.handles.activeHandleIndex = null; + + this._deactivateModify(element); + this._deactivateDraw(element); + resetElementCursor(element); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + this.doneEditMemo(); + + this.editData = null; + this.isDrawing = false; + + return; + } + + if (stage !== 'placingSecond' && newAnnotation && !hasMoved) { // when user starts the drawing by click, and moving the mouse, instead // of click and drag return; @@ -383,6 +500,7 @@ class LengthToolZoom extends AnnotationTool { this._deactivateModify(element); this._deactivateDraw(element); resetElementCursor(element); + this._cancelHandleMoveLingerTick(); if ( this.isHandleOutsideImage && @@ -400,6 +518,8 @@ class LengthToolZoom extends AnnotationTool { this.editData = null; this.isDrawing = false; + delete annotation.metadata.creationStage; + this.pendingAnnotation = null; }; _dragCallback = (evt: EventTypes.InteractionEventType): void => { @@ -413,16 +533,65 @@ class LengthToolZoom extends AnnotationTool { handleIndex, movingTextBox, newAnnotation, + stage, } = this.editData; const { data } = annotation; this.createMemo(element, annotation, { newAnnotation }); + const deltaPointsWorld = ( + eventDetail as { deltaPoints?: { world?: Types.Point3 } } + ).deltaPoints?.world as Types.Point3 | undefined; + + const movedByWorld = Boolean( + deltaPointsWorld && + (Math.abs(deltaPointsWorld[0]) > MOVEMENT_EPSILON || + Math.abs(deltaPointsWorld[1]) > MOVEMENT_EPSILON || + Math.abs(deltaPointsWorld[2]) > MOVEMENT_EPSILON) + ); + + let movedThisFrame = false; + + const mouseEvent = eventDetail.event as MouseEvent; + const buttons = + (eventDetail as unknown as { buttons?: number }).buttons ?? + (mouseEvent instanceof MouseEvent ? mouseEvent.buttons : undefined); + + if (stage && typeof buttons === 'number' && buttons === 0) { + return; + } + + if (stage === 'placingFirst') { + const { currentPoints } = eventDetail; + const worldPos = currentPoints.world; + const previousPoint = data.handles.points[0]; + const moved = + movedByWorld || this._hasPointChanged(previousPoint, worldPos); + + data.handles.points[0] = [...worldPos]; + data.handles.points[1] = [...worldPos]; + annotation.invalidated = true; + + movedThisFrame = moved; + if (moved) { + this.editData.handleMoveLinger = HANDLE_MOVE_LINGER_FRAMES; + this.editData.isHandleMoving = true; + this._scheduleHandleMoveLingerTick(); + } + this.editData.hasMoved = this.editData.hasMoved || moved; + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + + return; + } + if (movingTextBox) { // Drag mode - moving text box const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; const worldPosDelta = deltaPoints.world; + data.handles.activeHandleIndex = null; + const { textBox } = data.handles; const { worldPosition } = textBox; @@ -431,6 +600,7 @@ class LengthToolZoom extends AnnotationTool { worldPosition[2] += worldPosDelta[2]; textBox.hasMoved = true; + movedThisFrame = movedByWorld; } else if (handleIndex === undefined) { // Drag mode - moving handle const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; @@ -438,22 +608,39 @@ class LengthToolZoom extends AnnotationTool { const points = data.handles.points; + if (stage !== 'placingFirst' && stage !== 'placingSecond') { + data.handles.activeHandleIndex = null; + } + points.forEach((point) => { point[0] += worldPosDelta[0]; point[1] += worldPosDelta[1]; point[2] += worldPosDelta[2]; }); - annotation.invalidated = true; + annotation.invalidated = annotation.invalidated || movedByWorld; + movedThisFrame = movedByWorld; } else { // Move mode - after double click, and mouse move to draw const { currentPoints } = eventDetail; const worldPos = currentPoints.world; + const previousPoint = data.handles.points[handleIndex]; + const moved = + movedByWorld || this._hasPointChanged(previousPoint, worldPos); - data.handles.points[handleIndex] = [...worldPos]; - annotation.invalidated = true; + if (moved) { + data.handles.points[handleIndex] = [...worldPos]; + annotation.invalidated = true; + } + + movedThisFrame = moved; } - this.editData.hasMoved = true; + if (movedThisFrame && !movingTextBox) { + this.editData.handleMoveLinger = HANDLE_MOVE_LINGER_FRAMES; + this.editData.isHandleMoving = true; + this._scheduleHandleMoveLingerTick(); + } + this.editData.hasMoved = this.editData.hasMoved || movedThisFrame; triggerAnnotationRenderForViewportIds(viewportIdsToRender); @@ -473,8 +660,10 @@ class LengthToolZoom extends AnnotationTool { this._deactivateDraw(element); this._deactivateModify(element); resetElementCursor(element); + this._cancelHandleMoveLingerTick(); - const { annotation, viewportIdsToRender, newAnnotation } = this.editData; + const { annotation, viewportIdsToRender, newAnnotation, stage } = + this.editData; const { data } = annotation; annotation.highlighted = false; @@ -482,11 +671,29 @@ class LengthToolZoom extends AnnotationTool { triggerAnnotationRenderForViewportIds(viewportIdsToRender); - if (newAnnotation) { + if (stage === 'placingFirst') { + removeAnnotation(annotation.annotationUID); + } else if (newAnnotation) { triggerAnnotationCompleted(annotation); } this.editData = null; + delete annotation.metadata.creationStage; + this.pendingAnnotation = null; + return annotation.annotationUID; + } + + if ( + this.pendingAnnotation && + this.pendingAnnotation.metadata?.creationStage === 'waitingSecond' + ) { + const annotation = this.pendingAnnotation; + removeAnnotation(annotation.annotationUID); + triggerAnnotationRenderForViewportIds( + getViewportIdsWithToolToRender(element, this.getToolName()) + ); + delete annotation.metadata.creationStage; + this.pendingAnnotation = null; return annotation.annotationUID; } }; @@ -617,6 +824,8 @@ class LengthToolZoom extends AnnotationTool { Events.TOUCH_TAP, this._endCallback as EventListener ); + + this._cancelHandleMoveLingerTick(); }; /** @@ -675,6 +884,69 @@ class LengthToolZoom extends AnnotationTool { const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)); + const editDataForAnnotation = + this.editData && this.editData.annotation === annotation + ? this.editData + : null; + + const creationStage = annotation.metadata?.creationStage as + | 'placingFirst' + | 'waitingSecond' + | 'placingSecond' + | undefined; + + if ( + creationStage === 'placingFirst' || + creationStage === 'waitingSecond' + ) { + const handleGroupUID = 'preview'; + const isFirstHandleGrabbed = creationStage === 'placingFirst'; + const isDraggingFirstHandle = + isFirstHandleGrabbed && + Boolean(editDataForAnnotation?.isHandleMoving); + const previewHandleStyle = isFirstHandleGrabbed + ? { + color: HANDLE_FILL, + lineWidth: HANDLE_LINE_WIDTH, + handleRadius: `${ACTIVE_HANDLE_RADIUS}`, + fill: HANDLE_COLOR, + } + : { + color: HANDLE_COLOR, + lineWidth: HANDLE_LINE_WIDTH, + handleRadius: `${HANDLE_RADIUS}`, + fill: HANDLE_FILL, + }; + + if (isDraggingFirstHandle) { + const previewGlowUID = 'preview-glow'; + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + previewGlowUID, + [canvasCoordinates[0]], + { + color: HANDLE_GLOW_COLOR, + lineDash: undefined, + lineWidth: 0, + handleRadius: `${HANDLE_GLOW_RADIUS}`, + fill: HANDLE_GLOW_COLOR, + } + ); + } + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + handleGroupUID, + [canvasCoordinates[0]], + previewHandleStyle + ); + renderStatus = true; + continue; + } + + const isPreviewingSecondPoint = creationStage === 'placingSecond'; + // If cachedStats does not exist, or the unit is missing (as part of import/hydration etc.), // force to recalculate the stats from the points if ( @@ -719,7 +991,20 @@ class LengthToolZoom extends AnnotationTool { const showHandlesAlways = Boolean( getStyleProperty('showHandlesAlways', {} as StyleSpecifier) ); - if (activeHandleCanvasCoords || showHandlesAlways) { + const dragHandleIndex = + editDataForAnnotation && + typeof editDataForAnnotation.handleIndex === 'number' && + !editDataForAnnotation.movingTextBox + ? editDataForAnnotation.handleIndex + : null; + + const shouldDrawHandles = + isPreviewingSecondPoint || + Boolean(activeHandleCanvasCoords?.length) || + showHandlesAlways || + dragHandleIndex !== null; + + if (shouldDrawHandles) { const handleGroupUID = '0'; drawHandlesSvg( @@ -730,9 +1015,57 @@ class LengthToolZoom extends AnnotationTool { { color, lineDash, - lineWidth, + lineWidth: HANDLE_LINE_WIDTH, + handleRadius: `${HANDLE_RADIUS}`, + fill: HANDLE_FILL, } ); + + const highlightHandleIndex = dragHandleIndex; + const highlightIsMoving = Boolean( + editDataForAnnotation?.isHandleMoving + ); + + if ( + highlightHandleIndex !== null && + highlightHandleIndex >= 0 && + highlightHandleIndex < canvasCoordinates.length + ) { + const activeHandleGroupUID = 'active'; + const highlightStroke = HANDLE_FILL; + const highlightFill = HANDLE_COLOR; + + if (highlightIsMoving) { + const glowGroupUID = 'active-glow'; + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + glowGroupUID, + [canvasCoordinates[highlightHandleIndex]], + { + color: HANDLE_GLOW_COLOR, + lineDash: undefined, + lineWidth: 0, + handleRadius: `${HANDLE_GLOW_RADIUS}`, + fill: HANDLE_GLOW_COLOR, + } + ); + } + + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + activeHandleGroupUID, + [canvasCoordinates[highlightHandleIndex]], + { + color: highlightStroke, + lineDash, + lineWidth: HANDLE_LINE_WIDTH, + handleRadius: `${ACTIVE_HANDLE_RADIUS}`, + fill: highlightFill, + } + ); + } } const dataId = `${annotationUID}-line`; @@ -814,6 +1147,135 @@ class LengthToolZoom extends AnnotationTool { return renderStatus; }; + private _assignAnnotationLabel( + annotation: LengthAnnotation, + element: HTMLDivElement + ): void { + const existingAnnotations = + getAnnotations(this.getToolName(), element) ?? []; + + const existingMaxIndex = existingAnnotations.reduce((maxIndex, ann) => { + if (ann === annotation) { + return maxIndex; + } + + const label = (ann as LengthAnnotation)?.data?.label; + const match = label && /^d(\d+)$/i.exec(label); + + if (!match) { + return maxIndex; + } + + const index = Number(match[1]); + + return Number.isFinite(index) && index > maxIndex ? index : maxIndex; + }, 0); + + const currentLabel = annotation.data?.label; + + if (currentLabel && /^d\d+$/i.test(currentLabel)) { + return; + } + + annotation.data.label = `d${existingMaxIndex + 1}`; + } + + private _getTextLinesWithLabel(data, targetId): string[] | undefined { + const cachedStats = data?.cachedStats?.[targetId]; + + if (!cachedStats) { + return; + } + + const { length, unit } = cachedStats; + + if (length === undefined || length === null || isNaN(length)) { + return; + } + + const lengthText = `${csUtils.roundNumber(length)} ${unit}`; + const label = data?.label; + + return [label ? `${label}: ${lengthText}` : lengthText]; + } + + private _scheduleHandleMoveLingerTick(): void { + if (typeof window === 'undefined') { + return; + } + + if (this._handleMoveAnimationFrame !== null) { + return; + } + + const tick = () => { + this._handleMoveAnimationFrame = null; + + const editData = this.editData; + + if (!editData) { + return; + } + + const linger = editData.handleMoveLinger ?? 0; + + if (linger <= 0) { + editData.handleMoveLinger = 0; + editData.isHandleMoving = false; + + const viewportIds = editData.viewportIdsToRender?.length + ? editData.viewportIdsToRender + : []; + + if (viewportIds.length) { + triggerAnnotationRenderForViewportIds(viewportIds); + } + + return; + } + + editData.handleMoveLinger = linger - 1; + editData.isHandleMoving = editData.handleMoveLinger > 0; + + const viewportIds = editData.viewportIdsToRender?.length + ? editData.viewportIdsToRender + : []; + + if (viewportIds.length) { + triggerAnnotationRenderForViewportIds(viewportIds); + } + + if (editData.handleMoveLinger > 0) { + this._handleMoveAnimationFrame = window.requestAnimationFrame(tick); + } else { + editData.isHandleMoving = false; + } + }; + + this._handleMoveAnimationFrame = window.requestAnimationFrame(tick); + } + + private _cancelHandleMoveLingerTick(): void { + if ( + typeof window !== 'undefined' && + this._handleMoveAnimationFrame !== null + ) { + window.cancelAnimationFrame(this._handleMoveAnimationFrame); + this._handleMoveAnimationFrame = null; + } + } + + private _hasPointChanged( + previous: Types.Point3, + current: Types.Point3 + ): boolean { + return ( + Math.abs(previous[0] - current[0]) > MOVEMENT_EPSILON || + Math.abs(previous[1] - current[1]) > MOVEMENT_EPSILON || + Math.abs(previous[2] - current[2]) > MOVEMENT_EPSILON + ); + } + _calculateLength(pos1, pos2) { const dx = pos1[0] - pos2[0]; const dy = pos1[1] - pos2[1]; From c560c3343f6aa7f96d9fe87fd9b235ddbeac7e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sat, 4 Oct 2025 21:16:45 +0200 Subject: [PATCH 088/108] feat: style idle line colored the idle line orange and added cross bars. --- .../src/tools/annotation/LengthToolZoom.ts | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index bc8d297b1..3b24e1eb7 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -69,6 +69,7 @@ const MOVEMENT_EPSILON = 1e-3; const HANDLE_MOVE_LINGER_FRAMES = 20; const HANDLE_GLOW_RADIUS = 26; const HANDLE_GLOW_COLOR = 'rgba(18, 132, 255, 0.3)'; +const CROSSBAR_HALF_LENGTH = 8; /** * LengthToolZoom let you draw annotations that measures the length of two drawing @@ -1077,14 +1078,68 @@ class LengthToolZoom extends AnnotationTool { canvasCoordinates[0], canvasCoordinates[1], { - color, - width: lineWidth, + color: 'var(--ui-2, #EC6602)', + width: 2, lineDash, - shadow, + shadow: { + color: 'rgba(0, 0, 0, 0.8)', + offsetX: 0, + offsetY: 1, + blur: 1, + }, }, dataId ); + const crossbarStyle = { + color: 'var(--ui-2, #EC6602)', + width: 2, + lineDash: undefined, + shadow: { + color: 'rgba(0, 0, 0, 0.8)', + offsetX: 0, + offsetY: 1, + blur: 1, + }, + }; + + const [startPoint, endPoint] = canvasCoordinates; + const dx = endPoint[0] - startPoint[0]; + const dy = endPoint[1] - startPoint[1]; + const length = Math.sqrt(dx * dx + dy * dy); + + if (length > 0.0001) { + const invLength = 1 / length; + const perpX = -dy * invLength * CROSSBAR_HALF_LENGTH; + const perpY = dx * invLength * CROSSBAR_HALF_LENGTH; + + const startCrossStart = [startPoint[0] - perpX, startPoint[1] - perpY]; + const startCrossEnd = [startPoint[0] + perpX, startPoint[1] + perpY]; + + const endCrossStart = [endPoint[0] - perpX, endPoint[1] - perpY]; + const endCrossEnd = [endPoint[0] + perpX, endPoint[1] + perpY]; + + drawLineSvg( + svgDrawingHelper, + annotationUID, + 'start-crossbar', + startCrossStart, + startCrossEnd, + crossbarStyle, + `${annotationUID}-start-crossbar` + ); + + drawLineSvg( + svgDrawingHelper, + annotationUID, + 'end-crossbar', + endCrossStart, + endCrossEnd, + crossbarStyle, + `${annotationUID}-end-crossbar` + ); + } + renderStatus = true; // If rendering engine has been destroyed while rendering From e7b15eeb3534c001a021127656964e784ac5f491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 09:49:10 +0200 Subject: [PATCH 089/108] feat: allow groups in SVG drawings Adjusted SVG drawing helpers to allow using groups to enable an order of renderings. --- packages/tools/src/drawingSvg/drawLine.ts | 5 ++- .../src/drawingSvg/getSvgDrawingHelper.ts | 40 ++++++++++++++----- packages/tools/src/types/SVGDrawingHelper.ts | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawLine.ts b/packages/tools/src/drawingSvg/drawLine.ts index 1d324b442..45acf6687 100644 --- a/packages/tools/src/drawingSvg/drawLine.ts +++ b/packages/tools/src/drawingSvg/drawLine.ts @@ -28,6 +28,7 @@ export default function drawLine( markerEndId = null, shadow = false, strokeOpacity = 1, + lineCap, } = options as { color?: string; width?: string; @@ -37,6 +38,7 @@ export default function drawLine( markerEndId?: string; shadow?: boolean; strokeOpacity?: number; + lineCap?: 'butt' | 'round' | 'square'; }; // for supporting both lineWidth and width options @@ -60,7 +62,8 @@ export default function drawLine( 'marker-start': markerStartId ? `url(#${markerStartId})` : '', 'marker-end': markerEndId ? `url(#${markerEndId})` : '', 'stroke-opacity': strokeOpacity, - }; + ...(lineCap ? { 'stroke-linecap': lineCap } : {}), + } as Record; if (existingLine) { // This is run to avoid re-rendering annotations that actually haven't changed diff --git a/packages/tools/src/drawingSvg/getSvgDrawingHelper.ts b/packages/tools/src/drawingSvg/getSvgDrawingHelper.ts index 3cc8698cb..5e431baf0 100644 --- a/packages/tools/src/drawingSvg/getSvgDrawingHelper.ts +++ b/packages/tools/src/drawingSvg/getSvgDrawingHelper.ts @@ -20,14 +20,17 @@ function getSvgDrawingHelper(element: HTMLDivElement): SVGDrawingHelper { state.svgNodeCache[canvasHash][cacheKey].touched = false; }); - return { - svgLayerElement: svgLayerElement, + const svgDrawingHelper = { + svgLayerElement: svgLayerElement as unknown as Element, svgNodeCacheForCanvas: state.svgNodeCache, getSvgNode: getSvgNode.bind(this, canvasHash), - appendNode: appendNode.bind(this, svgLayerElement, canvasHash), + appendNode: (svgNode: SVGElement, cacheKey: string) => + appendNode(svgDrawingHelper, canvasHash, svgNode, cacheKey), setNodeTouched: setNodeTouched.bind(this, canvasHash), - clearUntouched: clearUntouched.bind(this, svgLayerElement, canvasHash), - }; + clearUntouched: () => clearUntouched(svgDrawingHelper, canvasHash), + } as SVGDrawingHelper; + + return svgDrawingHelper; } /** @@ -57,10 +60,15 @@ function getSvgNode(canvasHash, cacheKey) { } } -function appendNode(svgLayerElement, canvasHash, svgNode, cacheKey) { +function appendNode( + svgDrawingHelper: SVGDrawingHelper, + canvasHash, + svgNode, + cacheKey +) { // If state has been reset if (!state.svgNodeCache[canvasHash]) { - return null; + return; } state.svgNodeCache[canvasHash][cacheKey] = { @@ -68,7 +76,11 @@ function appendNode(svgLayerElement, canvasHash, svgNode, cacheKey) { domRef: svgNode, }; - svgLayerElement.appendChild(svgNode); + const targetLayer = svgDrawingHelper.svgLayerElement; + + if (targetLayer) { + targetLayer.appendChild(svgNode); + } } function setNodeTouched(canvasHash, cacheKey) { @@ -82,17 +94,25 @@ function setNodeTouched(canvasHash, cacheKey) { } } -function clearUntouched(svgLayerElement, canvasHash) { +function clearUntouched(svgDrawingHelper: SVGDrawingHelper, canvasHash) { // If state has been reset if (!state.svgNodeCache[canvasHash]) { return; } + const rootLayer = svgDrawingHelper.svgLayerElement; + Object.keys(state.svgNodeCache[canvasHash]).forEach((cacheKey) => { const cacheEntry = state.svgNodeCache[canvasHash][cacheKey]; if (!cacheEntry.touched && cacheEntry.domRef) { - svgLayerElement.removeChild(cacheEntry.domRef); + const parent = cacheEntry.domRef.parentNode; + + if (parent) { + parent.removeChild(cacheEntry.domRef); + } else if (rootLayer?.contains(cacheEntry.domRef)) { + rootLayer.removeChild(cacheEntry.domRef); + } delete state.svgNodeCache[canvasHash][cacheKey]; } }); diff --git a/packages/tools/src/types/SVGDrawingHelper.ts b/packages/tools/src/types/SVGDrawingHelper.ts index 81a3839fe..b8cdf6191 100644 --- a/packages/tools/src/types/SVGDrawingHelper.ts +++ b/packages/tools/src/types/SVGDrawingHelper.ts @@ -1,5 +1,5 @@ type SVGDrawingHelper = { - svgLayerElement: HTMLDivElement; + svgLayerElement: Element; svgNodeCacheForCanvas: Record; getSvgNode: (cacheKey: string) => SVGGElement | undefined; appendNode: (svgNode: SVGElement, cacheKey: string) => void; From 85aa525b85e845f9ca51ca041610443f480f1a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 09:50:29 +0200 Subject: [PATCH 090/108] feat: finalize correct drawing of lines The handles are now only enabled when selected. Highlight border was added and introduced SVG group layers in order to draw the objects in correct order. --- .../src/tools/annotation/LengthToolZoom.ts | 325 ++++++++++++------ 1 file changed, 221 insertions(+), 104 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index 3b24e1eb7..4749edbea 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -21,6 +21,10 @@ import { triggerAnnotationCompleted, triggerAnnotationModified, } from '../../stateManagement/annotation/helpers/state'; +import { + deselectAnnotation, + isAnnotationSelected, +} from '../../stateManagement/annotation/annotationSelection'; import * as lineSegment from '../../utilities/math/line'; import { @@ -43,6 +47,7 @@ import type { EventTypes, ToolHandle, TextBoxHandle, + Annotations, PublicToolProps, ToolProps, SVGDrawingHelper, @@ -70,6 +75,9 @@ const HANDLE_MOVE_LINGER_FRAMES = 20; const HANDLE_GLOW_RADIUS = 26; const HANDLE_GLOW_COLOR = 'rgba(18, 132, 255, 0.3)'; const CROSSBAR_HALF_LENGTH = 8; +const HIGHLIGHT_LAYER_CLASS = 'lengthtool-zoom__highlight-layer'; +const MAIN_LAYER_CLASS = 'lengthtool-zoom__main-layer'; +const HANDLE_LAYER_CLASS = 'lengthtool-zoom__handle-layer'; /** * LengthToolZoom let you draw annotations that measures the length of two drawing @@ -164,6 +172,17 @@ class LengthToolZoom extends AnnotationTool { } } + public mouseMoveCallback( + evt: EventTypes.MouseMoveEventType, + filteredAnnotations?: Annotations + ): boolean { + if (this.editData) { + return super.mouseMoveCallback(evt, filteredAnnotations); + } + + return false; + } + static hydrate = ( viewportId: string, points: Types.Point3[], @@ -461,6 +480,26 @@ class LengthToolZoom extends AnnotationTool { evt.preventDefault(); } + public getHandleNearImagePoint( + element: HTMLDivElement, + annotation: Annotation, + canvasCoords: Types.Point2, + proximity: number + ): ToolHandle | undefined { + const selected = isAnnotationSelected(annotation.annotationUID); + + if (!this.editData && !selected) { + return; + } + + return super.getHandleNearImagePoint( + element, + annotation, + canvasCoords, + proximity + ); + } + _endCallback = (evt: EventTypes.InteractionEventType): void => { const eventDetail = evt.detail; const { element } = eventDetail; @@ -517,6 +556,11 @@ class LengthToolZoom extends AnnotationTool { triggerAnnotationCompleted(annotation); } + if (newAnnotation && stage !== 'placingFirst') { + annotation.highlighted = false; + deselectAnnotation(annotation.annotationUID); + } + this.editData = null; this.isDrawing = false; delete annotation.metadata.creationStage; @@ -869,6 +913,18 @@ class LengthToolZoom extends AnnotationTool { toolName: this.getToolName(), viewportId: enabledElement.viewport.id, }; + const highlightLayer = this._getOrCreateLayer( + svgDrawingHelper, + HIGHLIGHT_LAYER_CLASS + ); + const mainLayer = this._getOrCreateLayer( + svgDrawingHelper, + MAIN_LAYER_CLASS + ); + const handleLayer = this._getOrCreateLayer( + svgDrawingHelper, + HANDLE_LAYER_CLASS + ); // Draw SVG for (let i = 0; i < annotations.length; i++) { @@ -901,7 +957,9 @@ class LengthToolZoom extends AnnotationTool { creationStage === 'waitingSecond' ) { const handleGroupUID = 'preview'; - const isFirstHandleGrabbed = creationStage === 'placingFirst'; + const annotationIsSelected = isAnnotationSelected(annotationUID); + const isFirstHandleGrabbed = + creationStage === 'placingFirst' && annotationIsSelected; const isDraggingFirstHandle = isFirstHandleGrabbed && Boolean(editDataForAnnotation?.isHandleMoving); @@ -919,29 +977,33 @@ class LengthToolZoom extends AnnotationTool { fill: HANDLE_FILL, }; - if (isDraggingFirstHandle) { - const previewGlowUID = 'preview-glow'; + this._withLayer(svgDrawingHelper, handleLayer, () => { + if (isDraggingFirstHandle) { + const previewGlowUID = 'preview-glow'; + drawHandlesSvg( + svgDrawingHelper, + annotationUID, + previewGlowUID, + [canvasCoordinates[0]], + { + color: HANDLE_GLOW_COLOR, + lineDash: undefined, + lineWidth: 0, + handleRadius: `${HANDLE_GLOW_RADIUS}`, + fill: HANDLE_GLOW_COLOR, + } + ); + } + drawHandlesSvg( svgDrawingHelper, annotationUID, - previewGlowUID, + handleGroupUID, [canvasCoordinates[0]], - { - color: HANDLE_GLOW_COLOR, - lineDash: undefined, - lineWidth: 0, - handleRadius: `${HANDLE_GLOW_RADIUS}`, - fill: HANDLE_GLOW_COLOR, - } + previewHandleStyle ); - } - drawHandlesSvg( - svgDrawingHelper, - annotationUID, - handleGroupUID, - [canvasCoordinates[0]], - previewHandleStyle - ); + }); + renderStatus = true; continue; } @@ -974,20 +1036,12 @@ class LengthToolZoom extends AnnotationTool { return renderStatus; } - let activeHandleCanvasCoords; - if (!isAnnotationVisible(annotationUID)) { continue; } - if ( - !isAnnotationLocked(annotationUID) && - !this.editData && - activeHandleIndex !== null - ) { - // Not locked or creating and hovering over handle, so render handle. - activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]]; - } + const annotationIsSelected = + Boolean(editDataForAnnotation) || isAnnotationSelected(annotationUID); const showHandlesAlways = Boolean( getStyleProperty('showHandlesAlways', {} as StyleSpecifier) @@ -1001,11 +1055,112 @@ class LengthToolZoom extends AnnotationTool { const shouldDrawHandles = isPreviewingSecondPoint || - Boolean(activeHandleCanvasCoords?.length) || + annotationIsSelected || showHandlesAlways || dragHandleIndex !== null; - if (shouldDrawHandles) { + const [startPoint, endPoint] = canvasCoordinates; + const dx = endPoint[0] - startPoint[0]; + const dy = endPoint[1] - startPoint[1]; + const length = Math.sqrt(dx * dx + dy * dy); + + if (annotationIsSelected) { + this._withLayer(svgDrawingHelper, highlightLayer, () => { + const highlightLineUID = 'selected-highlight'; + drawLineSvg( + svgDrawingHelper, + annotationUID, + highlightLineUID, + canvasCoordinates[0], + canvasCoordinates[1], + { + color: 'rgba(18, 132, 255, 0.5)', + width: 16, + lineDash: undefined, + shadow: false, + lineCap: 'round', + }, + `${annotationUID}-selected-highlight` + ); + }); + } + + this._withLayer(svgDrawingHelper, mainLayer, () => { + const dataId = `${annotationUID}-line`; + const lineUID = '1'; + drawLineSvg( + svgDrawingHelper, + annotationUID, + lineUID, + canvasCoordinates[0], + canvasCoordinates[1], + { + color: 'var(--ui-2, #EC6602)', + width: 2, + lineDash, + shadow: { + color: 'rgba(0, 0, 0, 0.8)', + offsetX: 0, + offsetY: 1, + blur: 1, + }, + }, + dataId + ); + + const crossbarStyle = { + color: 'var(--ui-2, #EC6602)', + width: 2, + lineDash: undefined, + shadow: { + color: 'rgba(0, 0, 0, 0.8)', + offsetX: 0, + offsetY: 1, + blur: 1, + }, + }; + + if (length > 0.0001) { + const invLength = 1 / length; + const perpX = -dy * invLength * CROSSBAR_HALF_LENGTH; + const perpY = dx * invLength * CROSSBAR_HALF_LENGTH; + + const startCrossStart = [ + startPoint[0] - perpX, + startPoint[1] - perpY, + ]; + const startCrossEnd = [startPoint[0] + perpX, startPoint[1] + perpY]; + + const endCrossStart = [endPoint[0] - perpX, endPoint[1] - perpY]; + const endCrossEnd = [endPoint[0] + perpX, endPoint[1] + perpY]; + + drawLineSvg( + svgDrawingHelper, + annotationUID, + 'start-crossbar', + startCrossStart, + startCrossEnd, + crossbarStyle, + `${annotationUID}-start-crossbar` + ); + + drawLineSvg( + svgDrawingHelper, + annotationUID, + 'end-crossbar', + endCrossStart, + endCrossEnd, + crossbarStyle, + `${annotationUID}-end-crossbar` + ); + } + }); + + this._withLayer(svgDrawingHelper, handleLayer, () => { + if (!shouldDrawHandles) { + return; + } + const handleGroupUID = '0'; drawHandlesSvg( @@ -1014,7 +1169,7 @@ class LengthToolZoom extends AnnotationTool { handleGroupUID, canvasCoordinates, { - color, + color: HANDLE_COLOR, lineDash, lineWidth: HANDLE_LINE_WIDTH, handleRadius: `${HANDLE_RADIUS}`, @@ -1067,78 +1222,7 @@ class LengthToolZoom extends AnnotationTool { } ); } - } - - const dataId = `${annotationUID}-line`; - const lineUID = '1'; - drawLineSvg( - svgDrawingHelper, - annotationUID, - lineUID, - canvasCoordinates[0], - canvasCoordinates[1], - { - color: 'var(--ui-2, #EC6602)', - width: 2, - lineDash, - shadow: { - color: 'rgba(0, 0, 0, 0.8)', - offsetX: 0, - offsetY: 1, - blur: 1, - }, - }, - dataId - ); - - const crossbarStyle = { - color: 'var(--ui-2, #EC6602)', - width: 2, - lineDash: undefined, - shadow: { - color: 'rgba(0, 0, 0, 0.8)', - offsetX: 0, - offsetY: 1, - blur: 1, - }, - }; - - const [startPoint, endPoint] = canvasCoordinates; - const dx = endPoint[0] - startPoint[0]; - const dy = endPoint[1] - startPoint[1]; - const length = Math.sqrt(dx * dx + dy * dy); - - if (length > 0.0001) { - const invLength = 1 / length; - const perpX = -dy * invLength * CROSSBAR_HALF_LENGTH; - const perpY = dx * invLength * CROSSBAR_HALF_LENGTH; - - const startCrossStart = [startPoint[0] - perpX, startPoint[1] - perpY]; - const startCrossEnd = [startPoint[0] + perpX, startPoint[1] + perpY]; - - const endCrossStart = [endPoint[0] - perpX, endPoint[1] - perpY]; - const endCrossEnd = [endPoint[0] + perpX, endPoint[1] + perpY]; - - drawLineSvg( - svgDrawingHelper, - annotationUID, - 'start-crossbar', - startCrossStart, - startCrossEnd, - crossbarStyle, - `${annotationUID}-start-crossbar` - ); - - drawLineSvg( - svgDrawingHelper, - annotationUID, - 'end-crossbar', - endCrossStart, - endCrossEnd, - crossbarStyle, - `${annotationUID}-end-crossbar` - ); - } + }); renderStatus = true; @@ -1149,6 +1233,7 @@ class LengthToolZoom extends AnnotationTool { } const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation); + if (!options.visibility) { data.handles.textBox = { hasMoved: false, @@ -1320,6 +1405,38 @@ class LengthToolZoom extends AnnotationTool { } } + private _getOrCreateLayer( + svgDrawingHelper: SVGDrawingHelper, + className: string + ): SVGGElement { + const root = svgDrawingHelper.svgLayerElement as unknown as SVGGElement; + let layer = root.querySelector(`:scope > g.${className}`) as SVGGElement; + if (!layer) { + layer = document.createElementNS('http://www.w3.org/2000/svg', 'g'); + layer.classList.add(className); + if (!layer.id) { + const baseId = root.id ? `${root.id}-${className}` : className; + layer.id = baseId; + } + root.appendChild(layer); + } + return layer; + } + + private _withLayer( + svgDrawingHelper: SVGDrawingHelper, + layer: SVGGElement, + drawFn: () => void + ): void { + const originalLayer = svgDrawingHelper.svgLayerElement; + svgDrawingHelper.svgLayerElement = layer; + try { + drawFn(); + } finally { + svgDrawingHelper.svgLayerElement = originalLayer; + } + } + private _hasPointChanged( previous: Types.Point3, current: Types.Point3 From 61a8403fc57e270aabdc64a473c44b872466fe5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 10:49:27 +0200 Subject: [PATCH 091/108] feat: place textbox above/below first point --- .../src/tools/annotation/LengthToolZoom.ts | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index 4749edbea..c1f03f8d0 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -78,6 +78,9 @@ const CROSSBAR_HALF_LENGTH = 8; const HIGHLIGHT_LAYER_CLASS = 'lengthtool-zoom__highlight-layer'; const MAIN_LAYER_CLASS = 'lengthtool-zoom__main-layer'; const HANDLE_LAYER_CLASS = 'lengthtool-zoom__handle-layer'; +const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 4; +const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 8; +const TEXTBOX_PADDING = 37; // Must stay in sync with default padding in drawTextBox /** * LengthToolZoom let you draw annotations that measures the length of two drawing @@ -1252,7 +1255,8 @@ class LengthToolZoom extends AnnotationTool { // Need to update to sync with annotation while unlinked/not moved if (!data.handles.textBox.hasMoved) { - const canvasTextBoxCoords = getTextBoxCoordsCanvas(canvasCoordinates); + const canvasTextBoxCoords = + this._getAnchoredTextBoxCanvasCoords(canvasCoordinates); data.handles.textBox.worldPosition = viewport.canvasToWorld(canvasTextBoxCoords); @@ -1437,6 +1441,26 @@ class LengthToolZoom extends AnnotationTool { } } + private _getAnchoredTextBoxCanvasCoords( + canvasCoordinates: Array + ): Types.Point2 { + const [firstPoint, secondPoint] = canvasCoordinates; + + if (!firstPoint || !secondPoint) { + return getTextBoxCoordsCanvas(canvasCoordinates); + } + + const isSecondAboveFirst = secondPoint[1] < firstPoint[1]; + const verticalOffset = isSecondAboveFirst + ? TEXTBOX_VERTICAL_OFFSET + : -TEXTBOX_VERTICAL_OFFSET; + + return [ + firstPoint[0] + TEXTBOX_HORIZONTAL_OFFSET - TEXTBOX_PADDING, + firstPoint[1] + verticalOffset - TEXTBOX_PADDING, + ]; + } + private _hasPointChanged( previous: Types.Point3, current: Types.Point3 From 2b2ba4fb0114cb7e23d2ff12cc34a124ae29c60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 11:01:15 +0200 Subject: [PATCH 092/108] feat: style textbox --- packages/tools/src/drawingSvg/drawTextBox.ts | 79 ++++++++++++++++--- .../src/tools/annotation/LengthToolZoom.ts | 17 +++- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawTextBox.ts b/packages/tools/src/drawingSvg/drawTextBox.ts index 8289fe1af..ecbe677ed 100644 --- a/packages/tools/src/drawingSvg/drawTextBox.ts +++ b/packages/tools/src/drawingSvg/drawTextBox.ts @@ -24,6 +24,10 @@ function drawTextBox( { fontFamily: 'Helvetica, Arial, sans-serif', fontSize: '14px', + fontWeight: 'normal', + fontStyle: 'normal', + lineHeight: '1.2em', + textShadow: '', color: 'rgb(255, 255, 0)', background: '', padding: 25, @@ -55,7 +59,19 @@ function _drawTextGroup( // eslint-disable-next-line @typescript-eslint/no-explicit-any options: Record ): SVGRect { - const { padding, color, fontFamily, fontSize, background } = options; + const { + padding, + color, + fontFamily, + fontSize, + background, + fontWeight, + fontStyle, + lineHeight, + } = options; + + const defaultLineHeight = lineHeight || '1.2em'; + const lineHeightDy = _resolveLineHeightDy(defaultLineHeight); let textGroupBoundingBox; const [x, y] = [position[0] + padding, position[1] + padding]; @@ -75,13 +91,14 @@ function _drawTextGroup( const text = textLines[i] || ''; textSpanElement.textContent = text; + textSpanElement.setAttribute('dy', lineHeightDy); } // if the textLines have changed size, we need to create textSpans for them if (textLines.length > textSpans.length) { for (let i = 0; i < textLines.length - textSpans.length; i++) { const textLine = textLines[i + textSpans.length]; - const textSpan = _createTextSpan(textLine); + const textSpan = _createTextSpan(textLine, lineHeightDy); textElement.appendChild(textSpan); } @@ -90,10 +107,15 @@ function _drawTextGroup( svgDrawingHelper.appendNode(existingTextGroup, svgNodeHash); } + const combinedStyle = _getTextElementStyle(svgDrawingHelper, options); + const textAttributes = { fill: color, 'font-size': fontSize, 'font-family': fontFamily, + ...(fontStyle ? { 'font-style': fontStyle } : {}), + ...(fontWeight ? { 'font-weight': fontWeight } : {}), + style: combinedStyle, }; const textGroupAttributes = { @@ -121,7 +143,7 @@ function _drawTextGroup( const textElement = _createTextElement(svgDrawingHelper, options); for (let i = 0; i < textLines.length; i++) { const textLine = textLines[i]; - const textSpan = _createTextSpan(textLine); + const textSpan = _createTextSpan(textLine, lineHeightDy); textElement.appendChild(textSpan); } @@ -147,26 +169,29 @@ function _createTextElement( // eslint-disable-next-line @typescript-eslint/no-explicit-any options: Record ): SVGElement { - const { color, fontFamily, fontSize } = options; + const { color, fontFamily, fontSize, fontWeight, fontStyle } = options; const svgns = 'http://www.w3.org/2000/svg'; const textElement = document.createElementNS(svgns, 'text'); - const noSelectStyle = - 'user-select: none; pointer-events: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0);'; - const dropShadowStyle = `filter:url(#shadow-${svgDrawingHelper.svgLayerElement.id});`; - const combinedStyle = `${noSelectStyle}${dropShadowStyle}`; + const combinedStyle = _getTextElementStyle(svgDrawingHelper, options); textElement.setAttribute('x', '0'); textElement.setAttribute('y', '0'); textElement.setAttribute('fill', color); textElement.setAttribute('font-family', fontFamily); textElement.setAttribute('font-size', fontSize); + if (fontWeight) { + textElement.setAttribute('font-weight', fontWeight); + } + if (fontStyle) { + textElement.setAttribute('font-style', fontStyle); + } textElement.setAttribute('style', combinedStyle); textElement.setAttribute('pointer-events', 'visible'); return textElement; } -function _createTextSpan(text): SVGElement { +function _createTextSpan(text, lineHeight): SVGElement { const svgns = 'http://www.w3.org/2000/svg'; const textSpanElement = document.createElementNS(svgns, 'tspan'); @@ -175,12 +200,46 @@ function _createTextSpan(text): SVGElement { // TODO: centerY textSpanElement.setAttribute('x', '0'); - textSpanElement.setAttribute('dy', '1.2em'); + textSpanElement.setAttribute('dy', lineHeight || '1.2em'); textSpanElement.textContent = text; return textSpanElement; } +function _resolveLineHeightDy(lineHeight: string): string { + if (!lineHeight) { + return '1.2em'; + } + + if (lineHeight.startsWith('var(')) { + const fallbackMatch = lineHeight.match(/var\([^,]+,\s*([^)]+)\)/); + + if (fallbackMatch && fallbackMatch[1]) { + return fallbackMatch[1].trim(); + } + } + + return lineHeight; +} + +function _getTextElementStyle( + svgDrawingHelper: SVGDrawingHelper, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + options: Record +): string { + const noSelectStyle = + 'user-select: none; pointer-events: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0);'; + const dropShadowStyle = `filter:url(#shadow-${svgDrawingHelper.svgLayerElement.id});`; + const textShadowStyle = options.textShadow + ? `text-shadow: ${options.textShadow};` + : ''; + const lineHeightStyle = options.lineHeight + ? `line-height: ${options.lineHeight};` + : ''; + + return `${noSelectStyle}${dropShadowStyle}${textShadowStyle}${lineHeightStyle}`; +} + function _drawTextBackground(group: SVGGElement, color: string) { let element = group.querySelector('rect.background'); diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index c1f03f8d0..aaed03f52 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -81,6 +81,16 @@ const HANDLE_LAYER_CLASS = 'lengthtool-zoom__handle-layer'; const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 4; const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 8; const TEXTBOX_PADDING = 37; // Must stay in sync with default padding in drawTextBox +const TEXTBOX_FIXED_STYLE = { + color: 'var(--text-white, #FFF)', + textShadow: + '0 0 2px #000, 0 0 4px #000, -1px -1px 4px #000, 1px 1px 4px #000', + fontFamily: 'var(--font-body-font, "Siemens Sans")', + fontSize: 'var(--text-classes-body-200-font-size, 14px)', + fontStyle: 'normal', + fontWeight: '400', + lineHeight: 'var(--text-classes-body-200-line-height, 20px)', +}; /** * LengthToolZoom let you draw annotations that measures the length of two drawing @@ -1267,6 +1277,11 @@ class LengthToolZoom extends AnnotationTool { ); const textBoxUID = '1'; + const textBoxOptions = { + ...options, + ...TEXTBOX_FIXED_STYLE, + }; + const boundingBox = drawLinkedTextBoxSvg( svgDrawingHelper, annotationUID, @@ -1275,7 +1290,7 @@ class LengthToolZoom extends AnnotationTool { textBoxPosition, canvasCoordinates, {}, - options + textBoxOptions ); const { x: left, y: top, width, height } = boundingBox; From 95b6134df55d08e6e77a11dd8f4e60fe4fc928e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 16:38:59 +0200 Subject: [PATCH 093/108] feat: deselect all annotations on click --- .../src/tools/annotation/LengthToolZoom.ts | 147 +++++++++++++++--- 1 file changed, 123 insertions(+), 24 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index aaed03f52..d1841595b 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -92,6 +92,11 @@ const TEXTBOX_FIXED_STYLE = { lineHeight: 'var(--text-classes-body-200-line-height, 20px)', }; +type CreationStage = 'placingFirst' | 'placingSecond' | 'waitingSecond'; +type LengthZoomMetadata = LengthAnnotation['metadata'] & { + creationStage?: CreationStage; +}; + /** * LengthToolZoom let you draw annotations that measures the length of two drawing * points on a slice. You can use the LengthToolZoom in all imaging planes even in oblique @@ -185,16 +190,17 @@ class LengthToolZoom extends AnnotationTool { } } - public mouseMoveCallback( + private _baseMouseMoveCallback = this.mouseMoveCallback; + + public mouseMoveCallback = ( evt: EventTypes.MouseMoveEventType, filteredAnnotations?: Annotations - ): boolean { + ): boolean => { if (this.editData) { - return super.mouseMoveCallback(evt, filteredAnnotations); + return this._baseMouseMoveCallback(evt, filteredAnnotations); } - return false; - } + }; static hydrate = ( viewportId: string, @@ -268,7 +274,8 @@ class LengthToolZoom extends AnnotationTool { if ( this.pendingAnnotation && - this.pendingAnnotation.metadata?.creationStage === 'waitingSecond' + (this.pendingAnnotation.metadata as LengthZoomMetadata)?.creationStage === + 'waitingSecond' ) { return this._beginSecondPointPlacement(evt, this.pendingAnnotation); } @@ -285,7 +292,7 @@ class LengthToolZoom extends AnnotationTool { ]) ); - annotation.metadata.creationStage = 'placingFirst'; + (annotation.metadata as LengthZoomMetadata).creationStage = 'placingFirst'; annotation.data.handles.activeHandleIndex = 0; this._assignAnnotationLabel(annotation, element); @@ -318,6 +325,52 @@ class LengthToolZoom extends AnnotationTool { return annotation; }; + public postMouseDownCallback = ( + evt: EventTypes.MouseDownEventType + ): boolean => { + if ( + this.pendingAnnotation && + (this.pendingAnnotation.metadata as LengthZoomMetadata)?.creationStage === + 'waitingSecond' + ) { + return false; + } + + if (this.editData?.stage === 'placingFirst' || this.isDrawing) { + return false; + } + + const { element } = evt.detail; + const annotations = getAnnotations(this.getToolName(), element) ?? []; + + const shouldDeselect = annotations.some((annotation) => { + const isSelected = isAnnotationSelected(annotation.annotationUID); + const hasActiveHandle = + annotation.data?.handles?.activeHandleIndex !== null && + annotation.data?.handles?.activeHandleIndex !== undefined; + + return isSelected || annotation.highlighted || hasActiveHandle; + }); + + if (!shouldDeselect) { + return false; + } + + const changed = this._deselectAllLengthAnnotations(element); + + if (changed) { + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + } + + evt.preventDefault(); + + return true; + }; + private _beginSecondPointPlacement( evt: EventTypes.InteractionEventType, annotation: LengthAnnotation @@ -331,7 +384,7 @@ class LengthToolZoom extends AnnotationTool { const points = annotation.data.handles.points; points[1] = [...worldPos]; - annotation.metadata.creationStage = 'placingSecond'; + (annotation.metadata as LengthZoomMetadata).creationStage = 'placingSecond'; annotation.data.handles.activeHandleIndex = 1; annotation.highlighted = true; annotation.invalidated = true; @@ -526,7 +579,8 @@ class LengthToolZoom extends AnnotationTool { const { data } = annotation; if (stage === 'placingFirst') { - annotation.metadata.creationStage = 'waitingSecond'; + (annotation.metadata as LengthZoomMetadata).creationStage = + 'waitingSecond'; data.handles.activeHandleIndex = null; this._deactivateModify(element); @@ -569,14 +623,14 @@ class LengthToolZoom extends AnnotationTool { triggerAnnotationCompleted(annotation); } - if (newAnnotation && stage !== 'placingFirst') { + if (newAnnotation) { annotation.highlighted = false; deselectAnnotation(annotation.annotationUID); } this.editData = null; this.isDrawing = false; - delete annotation.metadata.creationStage; + delete (annotation.metadata as LengthZoomMetadata).creationStage; this.pendingAnnotation = null; }; @@ -666,7 +720,7 @@ class LengthToolZoom extends AnnotationTool { const points = data.handles.points; - if (stage !== 'placingFirst' && stage !== 'placingSecond') { + if (!['placingFirst', 'placingSecond'].includes(stage)) { data.handles.activeHandleIndex = null; } @@ -736,21 +790,22 @@ class LengthToolZoom extends AnnotationTool { } this.editData = null; - delete annotation.metadata.creationStage; + delete (annotation.metadata as LengthZoomMetadata).creationStage; this.pendingAnnotation = null; return annotation.annotationUID; } if ( this.pendingAnnotation && - this.pendingAnnotation.metadata?.creationStage === 'waitingSecond' + (this.pendingAnnotation.metadata as LengthZoomMetadata)?.creationStage === + 'waitingSecond' ) { const annotation = this.pendingAnnotation; removeAnnotation(annotation.annotationUID); triggerAnnotationRenderForViewportIds( getViewportIdsWithToolToRender(element, this.getToolName()) ); - delete annotation.metadata.creationStage; + delete (annotation.metadata as LengthZoomMetadata).creationStage; this.pendingAnnotation = null; return annotation.annotationUID; } @@ -959,11 +1014,8 @@ class LengthToolZoom extends AnnotationTool { ? this.editData : null; - const creationStage = annotation.metadata?.creationStage as - | 'placingFirst' - | 'waitingSecond' - | 'placingSecond' - | undefined; + const creationStage = (annotation.metadata as LengthZoomMetadata) + ?.creationStage; if ( creationStage === 'placingFirst' || @@ -1138,14 +1190,23 @@ class LengthToolZoom extends AnnotationTool { const perpX = -dy * invLength * CROSSBAR_HALF_LENGTH; const perpY = dx * invLength * CROSSBAR_HALF_LENGTH; - const startCrossStart = [ + const startCrossStart: Types.Point2 = [ startPoint[0] - perpX, startPoint[1] - perpY, ]; - const startCrossEnd = [startPoint[0] + perpX, startPoint[1] + perpY]; + const startCrossEnd: Types.Point2 = [ + startPoint[0] + perpX, + startPoint[1] + perpY, + ]; - const endCrossStart = [endPoint[0] - perpX, endPoint[1] - perpY]; - const endCrossEnd = [endPoint[0] + perpX, endPoint[1] + perpY]; + const endCrossStart: Types.Point2 = [ + endPoint[0] - perpX, + endPoint[1] - perpY, + ]; + const endCrossEnd: Types.Point2 = [ + endPoint[0] + perpX, + endPoint[1] + perpY, + ]; drawLineSvg( svgDrawingHelper, @@ -1456,6 +1517,44 @@ class LengthToolZoom extends AnnotationTool { } } + private _deselectAllLengthAnnotations(element: HTMLDivElement): boolean { + let changed = false; + const annotations = getAnnotations(this.getToolName(), element) ?? []; + + annotations.forEach((annotation) => { + if (annotation.highlighted) { + annotation.highlighted = false; + changed = true; + } + + const handles = annotation.data?.handles; + + if (handles && handles.activeHandleIndex !== null) { + handles.activeHandleIndex = null; + changed = true; + } + + if (isAnnotationSelected(annotation.annotationUID)) { + deselectAnnotation(annotation.annotationUID); + changed = true; + } + }); + + if (changed && this.editData) { + this._deactivateModify(element); + this._deactivateDraw(element); + resetElementCursor(element); + this._cancelHandleMoveLingerTick(); + this.editData = null; + this.isDrawing = false; + this.doneEditMemo(); + } + + this.pendingAnnotation = null; + + return changed; + } + private _getAnchoredTextBoxCanvasCoords( canvasCoordinates: Array ): Types.Point2 { From f9514e7acc5080076e1c496510fd8448e4ca3d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 17:00:42 +0200 Subject: [PATCH 094/108] fix: calculating orange color --- packages/tools/src/tools/annotation/LengthToolZoom.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index d1841595b..dbd3938cd 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -81,6 +81,7 @@ const HANDLE_LAYER_CLASS = 'lengthtool-zoom__handle-layer'; const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 4; const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 8; const TEXTBOX_PADDING = 37; // Must stay in sync with default padding in drawTextBox +const LENGTH_COLOR = 'rgb(var(--ui-2, 236, 102, 2))'; const TEXTBOX_FIXED_STYLE = { color: 'var(--text-white, #FFF)', textShadow: @@ -1160,7 +1161,7 @@ class LengthToolZoom extends AnnotationTool { canvasCoordinates[0], canvasCoordinates[1], { - color: 'var(--ui-2, #EC6602)', + color: LENGTH_COLOR, width: 2, lineDash, shadow: { @@ -1174,7 +1175,7 @@ class LengthToolZoom extends AnnotationTool { ); const crossbarStyle = { - color: 'var(--ui-2, #EC6602)', + color: LENGTH_COLOR, width: 2, lineDash: undefined, shadow: { From 43d97f5dc925575b4004d20d8260b9500dedefd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 21:55:11 +0200 Subject: [PATCH 095/108] feat: add border to textbox --- packages/tools/src/drawingSvg/drawTextBox.ts | 77 +++++++++++++++---- .../src/tools/annotation/LengthToolZoom.ts | 19 +++-- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawTextBox.ts b/packages/tools/src/drawingSvg/drawTextBox.ts index ecbe677ed..61d8a7817 100644 --- a/packages/tools/src/drawingSvg/drawTextBox.ts +++ b/packages/tools/src/drawingSvg/drawTextBox.ts @@ -33,6 +33,10 @@ function drawTextBox( padding: 25, centerX: false, centerY: true, + borderColor: '', + borderWidth: 0, + borderRadius: 0, + backgroundPadding: 0, }, options ); @@ -129,7 +133,7 @@ function _drawTextGroup( // Add data attribute for annotation UID existingTextGroup.setAttribute('data-annotation-uid', annotationUID); - textGroupBoundingBox = _drawTextBackground(existingTextGroup, background); + textGroupBoundingBox = _drawTextBackground(existingTextGroup, options); svgDrawingHelper.setNodeTouched(svgNodeHash); } else { @@ -150,7 +154,7 @@ function _drawTextGroup( textGroup.appendChild(textElement); svgDrawingHelper.appendNode(textGroup, svgNodeHash); - textGroupBoundingBox = _drawTextBackground(textGroup, background); + textGroupBoundingBox = _drawTextBackground(textGroup, options); } // We translate the group using `position` @@ -240,12 +244,46 @@ function _getTextElementStyle( return `${noSelectStyle}${dropShadowStyle}${textShadowStyle}${lineHeightStyle}`; } -function _drawTextBackground(group: SVGGElement, color: string) { +function _drawTextBackground( + group: SVGGElement, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + options: Record +) { + const { + background: color, + borderColor, + borderWidth, + borderRadius, + backgroundPadding, + } = options; let element = group.querySelector('rect.background'); - // If we have no background color, remove any element that exists and return - // the bounding box of the text - if (!color) { + const borderWidthValue = + borderWidth === undefined + ? 0 + : typeof borderWidth === 'number' + ? borderWidth + : parseFloat(borderWidth); + const borderRadiusValue = + borderRadius === undefined + ? 0 + : typeof borderRadius === 'number' + ? borderRadius + : parseFloat(borderRadius); + const backgroundPaddingValue = + backgroundPadding === undefined + ? 0 + : typeof backgroundPadding === 'number' + ? backgroundPadding + : parseFloat(backgroundPadding); + + const hasBorderColor = typeof borderColor === 'string' && borderColor !== ''; + const hasBorder = Boolean(hasBorderColor && borderWidthValue > 0); + const shouldDrawRect = Boolean(color || hasBorder); + + // If we have no background color and no border, remove any element that exists + // and return the bounding box of the text + if (!shouldDrawRect) { if (element) { group.removeChild(element); } @@ -260,20 +298,31 @@ function _drawTextBackground(group: SVGGElement, color: string) { group.insertBefore(element, group.firstChild); } - // Get the text groups's bounding box and use it to draw the background rectangle - const bBox = group.getBBox(); + // Measure the text bounding box to expand it with background padding + const textElement = group.querySelector('text'); + const textBBox = textElement?.getBBox + ? textElement.getBBox() + : group.getBBox(); + const xWithPadding = textBBox.x - backgroundPaddingValue; + const yWithPadding = textBBox.y - backgroundPaddingValue; + const widthWithPadding = textBBox.width + backgroundPaddingValue * 2; + const heightWithPadding = textBBox.height + backgroundPaddingValue * 2; const attributes = { - x: `${bBox.x}`, - y: `${bBox.y}`, - width: `${bBox.width}`, - height: `${bBox.height}`, - fill: color, + x: `${xWithPadding}`, + y: `${yWithPadding}`, + width: `${widthWithPadding}`, + height: `${heightWithPadding}`, + fill: color || 'none', + stroke: hasBorder ? borderColor : 'none', + 'stroke-width': hasBorder ? `${borderWidthValue}` : '0', + rx: borderRadiusValue > 0 ? `${borderRadiusValue}` : '0', + ry: borderRadiusValue > 0 ? `${borderRadiusValue}` : '0', }; setAttributesIfNecessary(attributes, element); - return bBox; + return element.getBBox(); } export default drawTextBox; diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index dbd3938cd..d26f10ade 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -78,9 +78,10 @@ const CROSSBAR_HALF_LENGTH = 8; const HIGHLIGHT_LAYER_CLASS = 'lengthtool-zoom__highlight-layer'; const MAIN_LAYER_CLASS = 'lengthtool-zoom__main-layer'; const HANDLE_LAYER_CLASS = 'lengthtool-zoom__handle-layer'; -const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 4; -const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 8; -const TEXTBOX_PADDING = 37; // Must stay in sync with default padding in drawTextBox +const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 10; +const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 16; +const TEXTBOX_PADDING = 12; // Must stay in sync with TEXTBOX_FIXED_STYLE padding +const TEXTBOX_BACKGROUND_PADDING = 4; const LENGTH_COLOR = 'rgb(var(--ui-2, 236, 102, 2))'; const TEXTBOX_FIXED_STYLE = { color: 'var(--text-white, #FFF)', @@ -91,6 +92,11 @@ const TEXTBOX_FIXED_STYLE = { fontStyle: 'normal', fontWeight: '400', lineHeight: 'var(--text-classes-body-200-line-height, 20px)', + borderColor: LENGTH_COLOR, + borderWidth: 2, + borderRadius: 3, + padding: TEXTBOX_PADDING, + backgroundPadding: TEXTBOX_BACKGROUND_PADDING, }; type CreationStage = 'placingFirst' | 'placingSecond' | 'waitingSecond'; @@ -1570,9 +1576,12 @@ class LengthToolZoom extends AnnotationTool { ? TEXTBOX_VERTICAL_OFFSET : -TEXTBOX_VERTICAL_OFFSET; + const anchorPaddingCorrection = + TEXTBOX_PADDING * 2 + TEXTBOX_BACKGROUND_PADDING; + return [ - firstPoint[0] + TEXTBOX_HORIZONTAL_OFFSET - TEXTBOX_PADDING, - firstPoint[1] + verticalOffset - TEXTBOX_PADDING, + firstPoint[0] + TEXTBOX_HORIZONTAL_OFFSET - anchorPaddingCorrection, + firstPoint[1] + verticalOffset - anchorPaddingCorrection, ]; } From 66b60ac46b5c20082d34253b9177b6ba597bd583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 22:06:14 +0200 Subject: [PATCH 096/108] feat: allow moving textbox without selecting line --- .../src/tools/annotation/LengthToolZoom.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index d26f10ade..254216809 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -562,6 +562,31 @@ class LengthToolZoom extends AnnotationTool { const selected = isAnnotationSelected(annotation.annotationUID); if (!this.editData && !selected) { + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + const { textBox } = annotation.data.handles; + const worldBoundingBox = textBox?.worldBoundingBox; + + if (textBox && worldBoundingBox) { + const canvasBoundingBox = { + topLeft: viewport.worldToCanvas(worldBoundingBox.topLeft), + topRight: viewport.worldToCanvas(worldBoundingBox.topRight), + bottomLeft: viewport.worldToCanvas(worldBoundingBox.bottomLeft), + bottomRight: viewport.worldToCanvas(worldBoundingBox.bottomRight), + }; + + const withinBounds = + canvasCoords[0] >= canvasBoundingBox.topLeft[0] && + canvasCoords[0] <= canvasBoundingBox.bottomRight[0] && + canvasCoords[1] >= canvasBoundingBox.topLeft[1] && + canvasCoords[1] <= canvasBoundingBox.bottomRight[1]; + + if (withinBounds) { + annotation.data.handles.activeHandleIndex = null; + return textBox as ToolHandle; + } + } + return; } From 6c3a3a878a676a6ca608d5bb851229e18d806f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 22:13:59 +0200 Subject: [PATCH 097/108] feat: style dashed link line --- packages/tools/src/drawingSvg/drawLink.ts | 6 ++++++ packages/tools/src/tools/annotation/LengthToolZoom.ts | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/packages/tools/src/drawingSvg/drawLink.ts b/packages/tools/src/drawingSvg/drawLink.ts index 1e5dd70e2..7d1f14dab 100644 --- a/packages/tools/src/drawingSvg/drawLink.ts +++ b/packages/tools/src/drawingSvg/drawLink.ts @@ -41,6 +41,12 @@ function drawLink( options ); + const linkColor = (mergedOptions as { linkColor?: string }).linkColor; + + if (linkColor) { + mergedOptions.color = linkColor; + } + drawLine( svgDrawingHelper, annotationUID, diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index 254216809..cbf9485bd 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -83,6 +83,7 @@ const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 16; const TEXTBOX_PADDING = 12; // Must stay in sync with TEXTBOX_FIXED_STYLE padding const TEXTBOX_BACKGROUND_PADDING = 4; const LENGTH_COLOR = 'rgb(var(--ui-2, 236, 102, 2))'; +const LINK_LINE_DASH = '8,8'; const TEXTBOX_FIXED_STYLE = { color: 'var(--text-white, #FFF)', textShadow: @@ -1373,6 +1374,9 @@ class LengthToolZoom extends AnnotationTool { const textBoxOptions = { ...options, ...TEXTBOX_FIXED_STYLE, + linkColor: LENGTH_COLOR, + lineDash: LINK_LINE_DASH, + lineWidth: 2, }; const boundingBox = drawLinkedTextBoxSvg( From d98b1c96336a34760a113eb88a3b9ef58c93996b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 23:06:45 +0200 Subject: [PATCH 098/108] feat: blue background when moving textbox --- .../src/tools/annotation/LengthToolZoom.ts | 55 +++++++++++++++---- packages/tools/src/types/AnnotationTypes.ts | 2 + packages/tools/src/types/ToolHandle.ts | 1 + 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index cbf9485bd..c2c0a3fe0 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -73,7 +73,8 @@ const ACTIVE_HANDLE_RADIUS = 12; const MOVEMENT_EPSILON = 1e-3; const HANDLE_MOVE_LINGER_FRAMES = 20; const HANDLE_GLOW_RADIUS = 26; -const HANDLE_GLOW_COLOR = 'rgba(18, 132, 255, 0.3)'; +const HANDLE_GLOW_COLOR_30 = 'rgba(18, 132, 255, 0.3)'; +const HANDLE_GLOW_COLOR_50 = 'rgba(18, 132, 255, 0.5)'; const CROSSBAR_HALF_LENGTH = 8; const HIGHLIGHT_LAYER_CLASS = 'lengthtool-zoom__highlight-layer'; const MAIN_LAYER_CLASS = 'lengthtool-zoom__main-layer'; @@ -82,17 +83,13 @@ const TEXTBOX_HORIZONTAL_OFFSET = HANDLE_RADIUS + 10; const TEXTBOX_VERTICAL_OFFSET = ACTIVE_HANDLE_RADIUS + 16; const TEXTBOX_PADDING = 12; // Must stay in sync with TEXTBOX_FIXED_STYLE padding const TEXTBOX_BACKGROUND_PADDING = 4; +const MOVING_BACKGROUND_PADDING = 6; const LENGTH_COLOR = 'rgb(var(--ui-2, 236, 102, 2))'; const LINK_LINE_DASH = '8,8'; const TEXTBOX_FIXED_STYLE = { color: 'var(--text-white, #FFF)', textShadow: '0 0 2px #000, 0 0 4px #000, -1px -1px 4px #000, 1px 1px 4px #000', - fontFamily: 'var(--font-body-font, "Siemens Sans")', - fontSize: 'var(--text-classes-body-200-font-size, 14px)', - fontStyle: 'normal', - fontWeight: '400', - lineHeight: 'var(--text-classes-body-200-line-height, 20px)', borderColor: LENGTH_COLOR, borderWidth: 2, borderRadius: 3, @@ -611,6 +608,10 @@ class LengthToolZoom extends AnnotationTool { this.editData; const { data } = annotation; + if (data?.handles?.textBox) { + data.handles.textBox.isMoving = false; + } + if (stage === 'placingFirst') { (annotation.metadata as LengthZoomMetadata).creationStage = 'waitingSecond'; @@ -744,6 +745,7 @@ class LengthToolZoom extends AnnotationTool { worldPosition[1] += worldPosDelta[1]; worldPosition[2] += worldPosDelta[2]; + textBox.isMoving = true; textBox.hasMoved = true; movedThisFrame = movedByWorld; } else if (handleIndex === undefined) { @@ -814,6 +816,10 @@ class LengthToolZoom extends AnnotationTool { annotation.highlighted = false; data.handles.activeHandleIndex = null; + if (data?.handles?.textBox) { + data.handles.textBox.isMoving = false; + } + triggerAnnotationRenderForViewportIds(viewportIdsToRender); if (stage === 'placingFirst') { @@ -1084,11 +1090,11 @@ class LengthToolZoom extends AnnotationTool { previewGlowUID, [canvasCoordinates[0]], { - color: HANDLE_GLOW_COLOR, + color: HANDLE_GLOW_COLOR_30, lineDash: undefined, lineWidth: 0, handleRadius: `${HANDLE_GLOW_RADIUS}`, - fill: HANDLE_GLOW_COLOR, + fill: HANDLE_GLOW_COLOR_30, } ); } @@ -1306,11 +1312,11 @@ class LengthToolZoom extends AnnotationTool { glowGroupUID, [canvasCoordinates[highlightHandleIndex]], { - color: HANDLE_GLOW_COLOR, + color: HANDLE_GLOW_COLOR_30, lineDash: undefined, lineWidth: 0, handleRadius: `${HANDLE_GLOW_RADIUS}`, - fill: HANDLE_GLOW_COLOR, + fill: HANDLE_GLOW_COLOR_30, } ); } @@ -1344,6 +1350,7 @@ class LengthToolZoom extends AnnotationTool { if (!options.visibility) { data.handles.textBox = { hasMoved: false, + isMoving: false, worldPosition: [0, 0, 0], worldBoundingBox: { topLeft: [0, 0, 0], @@ -1357,6 +1364,10 @@ class LengthToolZoom extends AnnotationTool { const textLines = this.configuration.getTextLines(data, targetId); + if (data.handles.textBox.isMoving === undefined) { + data.handles.textBox.isMoving = false; + } + // Need to update to sync with annotation while unlinked/not moved if (!data.handles.textBox.hasMoved) { const canvasTextBoxCoords = @@ -1379,6 +1390,21 @@ class LengthToolZoom extends AnnotationTool { lineWidth: 2, }; + if (data.handles.textBox.isMoving) { + textBoxOptions.borderColor = ''; + textBoxOptions.borderWidth = 0; + textBoxOptions.borderRadius = 6; + textBoxOptions.background = HANDLE_GLOW_COLOR_50; + textBoxOptions.backgroundPadding = MOVING_BACKGROUND_PADDING; + } else { + textBoxOptions.borderColor = TEXTBOX_FIXED_STYLE.borderColor; + textBoxOptions.borderWidth = TEXTBOX_FIXED_STYLE.borderWidth; + textBoxOptions.borderRadius = TEXTBOX_FIXED_STYLE.borderRadius; + textBoxOptions.background = ''; + textBoxOptions.backgroundPadding = + TEXTBOX_FIXED_STYLE.backgroundPadding; + } + const boundingBox = drawLinkedTextBoxSvg( svgDrawingHelper, annotationUID, @@ -1448,8 +1474,15 @@ class LengthToolZoom extends AnnotationTool { if (length === undefined || length === null || isNaN(length)) { return; } + const hasMillimeterUnit = + typeof unit === 'string' && unit.toLowerCase().startsWith('mm'); + + const convertedLength = hasMillimeterUnit ? length / 10 : length; + const convertedUnit = hasMillimeterUnit + ? unit.replace(/mm/i, 'cm') + : (unit ?? ''); - const lengthText = `${csUtils.roundNumber(length)} ${unit}`; + const lengthText = `${convertedLength.toFixed(1)} ${convertedUnit}`; const label = data?.label; return [label ? `${label}: ${lengthText}` : lengthText]; diff --git a/packages/tools/src/types/AnnotationTypes.ts b/packages/tools/src/types/AnnotationTypes.ts index 7baa0d9ce..cc6b9c0a5 100644 --- a/packages/tools/src/types/AnnotationTypes.ts +++ b/packages/tools/src/types/AnnotationTypes.ts @@ -130,6 +130,8 @@ export type Handles = { textBox?: { /** whether the text box has moved */ hasMoved?: boolean; + /** whether the text box is currently moving */ + isMoving?: boolean; /** the world location of the text box */ worldPosition?: Types.Point3; /** text box bounding box information */ diff --git a/packages/tools/src/types/ToolHandle.ts b/packages/tools/src/types/ToolHandle.ts index 2a24f934b..90215bce3 100644 --- a/packages/tools/src/types/ToolHandle.ts +++ b/packages/tools/src/types/ToolHandle.ts @@ -10,6 +10,7 @@ type AnnotationHandle = Types.Point3; */ type TextBoxHandle = { hasMoved: boolean; + isMoving?: boolean; worldBoundingBox: { bottomLeft: Types.Point3; bottomRight: Types.Point3; From 95e6a112cff52776ad86acddbdcaf8e199824f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 23:15:56 +0200 Subject: [PATCH 099/108] fix: resolve several linter errors --- .../src/tools/annotation/LengthToolZoom.ts | 36 +++++++++---------- .../src/types/ToolSpecificAnnotationTypes.ts | 1 + 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index c2c0a3fe0..aecb772c6 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -1364,9 +1364,7 @@ class LengthToolZoom extends AnnotationTool { const textLines = this.configuration.getTextLines(data, targetId); - if (data.handles.textBox.isMoving === undefined) { - data.handles.textBox.isMoving = false; - } + data.handles.textBox.isMoving ??= false; // Need to update to sync with annotation while unlinked/not moved if (!data.handles.textBox.hasMoved) { @@ -1382,29 +1380,31 @@ class LengthToolZoom extends AnnotationTool { ); const textBoxUID = '1'; + const textBoxStyleOverrides = data.handles.textBox.isMoving + ? { + borderColor: '', + borderWidth: 0, + borderRadius: 6, + background: HANDLE_GLOW_COLOR_50, + backgroundPadding: MOVING_BACKGROUND_PADDING, + } + : { + borderColor: TEXTBOX_FIXED_STYLE.borderColor, + borderWidth: TEXTBOX_FIXED_STYLE.borderWidth, + borderRadius: TEXTBOX_FIXED_STYLE.borderRadius, + background: '', + backgroundPadding: TEXTBOX_FIXED_STYLE.backgroundPadding, + }; + const textBoxOptions = { ...options, ...TEXTBOX_FIXED_STYLE, linkColor: LENGTH_COLOR, lineDash: LINK_LINE_DASH, lineWidth: 2, + ...textBoxStyleOverrides, }; - if (data.handles.textBox.isMoving) { - textBoxOptions.borderColor = ''; - textBoxOptions.borderWidth = 0; - textBoxOptions.borderRadius = 6; - textBoxOptions.background = HANDLE_GLOW_COLOR_50; - textBoxOptions.backgroundPadding = MOVING_BACKGROUND_PADDING; - } else { - textBoxOptions.borderColor = TEXTBOX_FIXED_STYLE.borderColor; - textBoxOptions.borderWidth = TEXTBOX_FIXED_STYLE.borderWidth; - textBoxOptions.borderRadius = TEXTBOX_FIXED_STYLE.borderRadius; - textBoxOptions.background = ''; - textBoxOptions.backgroundPadding = - TEXTBOX_FIXED_STYLE.backgroundPadding; - } - const boundingBox = drawLinkedTextBoxSvg( svgDrawingHelper, annotationUID, diff --git a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts index 6bf88df04..a770f779f 100644 --- a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts +++ b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts @@ -73,6 +73,7 @@ export interface LengthAnnotation extends Annotation { activeHandleIndex: number | null; textBox: { hasMoved: boolean; + isMoving?: boolean; worldPosition: Types.Point3; worldBoundingBox: { topLeft: Types.Point3; From 6c0a444ee7fc24f503e7039e7b97f2fc354102ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Sun, 5 Oct 2025 23:56:49 +0200 Subject: [PATCH 100/108] feat: detach textbox when dragging --- .../tools/src/drawingSvg/drawLinkedTextBox.ts | 27 +++++++----- .../src/tools/annotation/LengthToolZoom.ts | 43 +++++++++++++++++++ 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawLinkedTextBox.ts b/packages/tools/src/drawingSvg/drawLinkedTextBox.ts index 987a6e654..0e6ff82dc 100644 --- a/packages/tools/src/drawingSvg/drawLinkedTextBox.ts +++ b/packages/tools/src/drawingSvg/drawLinkedTextBox.ts @@ -23,10 +23,15 @@ function drawLinkedTextBox( x: false, y: true, // yCenter, }, + drawLink: true, }, options ); + const { drawLink: shouldDrawLink, ...forwardedOptions } = mergedOptions as { + drawLink?: boolean; + } & Record; + // Draw the text box const canvasBoundingBox = drawTextBox( svgDrawingHelper, @@ -34,19 +39,21 @@ function drawLinkedTextBox( textBoxUID, textLines, textBoxPosition, - mergedOptions + forwardedOptions ); // if (textBox.hasMoved) { // // Draw dashed link line between tool and text - drawLink( - svgDrawingHelper, - annotationUID, - textBoxUID, - annotationAnchorPoints, // annotationAnchorPoints - textBoxPosition, // refPoint (text) - canvasBoundingBox, // textBoxBoundingBox - mergedOptions - ); + if (shouldDrawLink) { + drawLink( + svgDrawingHelper, + annotationUID, + textBoxUID, + annotationAnchorPoints, // annotationAnchorPoints + textBoxPosition, // refPoint (text) + canvasBoundingBox, // textBoxBoundingBox + forwardedOptions + ); + } // } // const { top, left, width, height } = canvasBoundingBox diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index aecb772c6..0a80cfb59 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -1380,6 +1380,7 @@ class LengthToolZoom extends AnnotationTool { ); const textBoxUID = '1'; + const hasDetachedTextBox = Boolean(data.handles.textBox.hasMoved); const textBoxStyleOverrides = data.handles.textBox.isMoving ? { borderColor: '', @@ -1403,6 +1404,7 @@ class LengthToolZoom extends AnnotationTool { lineDash: LINK_LINE_DASH, lineWidth: 2, ...textBoxStyleOverrides, + ...(hasDetachedTextBox ? { drawLink: false } : {}), }; const boundingBox = drawLinkedTextBoxSvg( @@ -1424,6 +1426,35 @@ class LengthToolZoom extends AnnotationTool { bottomLeft: viewport.canvasToWorld([left, top + height]), bottomRight: viewport.canvasToWorld([left + width, top + height]), }; + + if (hasDetachedTextBox) { + const labelTextLines = this._getLabelOnlyTextLines(annotation.data); + + if (labelTextLines?.length) { + const anchoredCanvasCoords = + this._getAnchoredTextBoxCanvasCoords(canvasCoordinates); + + const labelTextBoxOptions = { + ...options, + ...TEXTBOX_FIXED_STYLE, + linkColor: LENGTH_COLOR, + lineDash: LINK_LINE_DASH, + lineWidth: 2, + drawLink: false, + }; + + drawLinkedTextBoxSvg( + svgDrawingHelper, + annotationUID, + 'label', + labelTextLines, + anchoredCanvasCoords, + canvasCoordinates, + {}, + labelTextBoxOptions + ); + } + } } return renderStatus; @@ -1488,6 +1519,18 @@ class LengthToolZoom extends AnnotationTool { return [label ? `${label}: ${lengthText}` : lengthText]; } + private _getLabelOnlyTextLines( + data: LengthAnnotation['data'] | undefined + ): string[] | undefined { + const label = data?.label; + + if (!label) { + return; + } + + return [label]; + } + private _scheduleHandleMoveLingerTick(): void { if (typeof window === 'undefined') { return; From cfb51c450ac0bce7236599405c3ca8d8baa14002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Mon, 6 Oct 2025 13:11:55 +0200 Subject: [PATCH 101/108] docs: add notes how to link this repo locally to another project --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index 246b19b31..23554a6d6 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,28 @@ Read our guide on [How-to Contribute](https://cornerstonejs.org/docs/category/co ### License Cornerstone is [MIT licensed](./LICENSE). + + +## Development notes + +For developing locally and instantly testing with another test project, we need +to link this repository to the other project. This can be done as follows: + +- In this project: + +``` +yarn install +yarn build +``` + +- In the test project: `npm install /path/to/this/repository` +- In this project: `npm link` +- In the test project: `npm link cornerstone-core` + + +To immediately reload the test project when something changes here (e.g. in the +tools package), run the build server as follow: + +``` +yarn workspace @cornerstonejs/tools build:esm:watch +``` From 9051888553064e313a8e74618d141e2bab75038d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Mon, 6 Oct 2025 19:00:51 +0200 Subject: [PATCH 102/108] feat: detach textbox after a certain threshold distance The textbox now only detaches if it is further than 50px away from the attached point. --- .../src/tools/annotation/LengthToolZoom.ts | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom.ts index 0a80cfb59..a954925ee 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom.ts @@ -151,6 +151,7 @@ class LengthToolZoom extends AnnotationTool { stage?: 'placingFirst' | 'placingSecond'; isHandleMoving?: boolean; handleMoveLinger?: number; + textBoxAnchorCanvas?: Types.Point2; } | null; isDrawing: boolean; isHandleOutsideImage: boolean; @@ -164,6 +165,7 @@ class LengthToolZoom extends AnnotationTool { configuration: { preventHandleOutsideImage: false, getTextLines: defaultGetTextLines, + textBoxDetachThreshold: 75, // Canvas pixels distance before label detaches actions: { // TODO - bind globally - but here is actually pretty good as it // is almost always active. @@ -611,6 +613,10 @@ class LengthToolZoom extends AnnotationTool { if (data?.handles?.textBox) { data.handles.textBox.isMoving = false; } + // Clear stored anchor (will be re-established on next drag if needed) + if (this.editData) { + this.editData.textBoxAnchorCanvas = undefined; + } if (stage === 'placingFirst') { (annotation.metadata as LengthZoomMetadata).creationStage = @@ -732,7 +738,7 @@ class LengthToolZoom extends AnnotationTool { } if (movingTextBox) { - // Drag mode - moving text box + // Drag mode - moving text box (refactored to use editData.textBoxAnchorCanvas) const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; const worldPosDelta = deltaPoints.world; @@ -740,14 +746,58 @@ class LengthToolZoom extends AnnotationTool { const { textBox } = data.handles; const { worldPosition } = textBox; + const enabledEl = getEnabledElement(element); + const { viewport } = enabledEl; + const prevCanvas = viewport.worldToCanvas(worldPosition); + + // Apply delta worldPosition[0] += worldPosDelta[0]; worldPosition[1] += worldPosDelta[1]; worldPosition[2] += worldPosDelta[2]; + const newCanvas = viewport.worldToCanvas(worldPosition); + + // Establish persistent anchor (first point canvas position) once while still attached + if (!textBox.hasMoved && !this.editData.textBoxAnchorCanvas) { + const firstPointWorld = data.handles.points[0]; + this.editData.textBoxAnchorCanvas = viewport.worldToCanvas( + firstPointWorld + ) as Types.Point2; + } + + const anchorCanvas: Types.Point2 = this.editData.textBoxAnchorCanvas + ? { ...this.editData.textBoxAnchorCanvas } + : (viewport.worldToCanvas(data.handles.points[0]) as Types.Point2); + + // Approximate center of textbox (prefer last rendered bounding box) + let centerCanvas: Types.Point2 = newCanvas as Types.Point2; + const lastBBox = textBox.worldBoundingBox; + if (lastBBox) { + const tl = viewport.worldToCanvas(lastBBox.topLeft); + const br = viewport.worldToCanvas(lastBBox.bottomRight); + if (tl && br) { + centerCanvas = [ + tl[0] + (br[0] - tl[0]) / 2, + tl[1] + (br[1] - tl[1]) / 2, + ]; + } + } + + const dx = centerCanvas[0] - anchorCanvas[0]; + const dy = centerCanvas[1] - anchorCanvas[1]; + const distToAnchor = Math.sqrt(dx * dx + dy * dy); + + const threshold = this.configuration.textBoxDetachThreshold ?? 75; + if (!textBox.hasMoved && distToAnchor >= threshold) { + textBox.hasMoved = true; + } + textBox.isMoving = true; - textBox.hasMoved = true; - movedThisFrame = movedByWorld; + movedThisFrame = + movedByWorld || + Math.abs(newCanvas[0] - prevCanvas[0]) > 0.01 || + Math.abs(newCanvas[1] - prevCanvas[1]) > 0.01; } else if (handleIndex === undefined) { // Drag mode - moving handle const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail; @@ -819,6 +869,9 @@ class LengthToolZoom extends AnnotationTool { if (data?.handles?.textBox) { data.handles.textBox.isMoving = false; } + if (this.editData) { + this.editData.textBoxAnchorCanvas = undefined; + } triggerAnnotationRenderForViewportIds(viewportIdsToRender); @@ -1366,11 +1419,11 @@ class LengthToolZoom extends AnnotationTool { data.handles.textBox.isMoving ??= false; - // Need to update to sync with annotation while unlinked/not moved - if (!data.handles.textBox.hasMoved) { + // While the textbox is not detached we only re-anchor it if the user is NOT actively dragging it. + // This allows immediate visual feedback: during drag the box follows the cursor even before threshold. + if (!data.handles.textBox.hasMoved && !data.handles.textBox.isMoving) { const canvasTextBoxCoords = this._getAnchoredTextBoxCanvasCoords(canvasCoordinates); - data.handles.textBox.worldPosition = viewport.canvasToWorld(canvasTextBoxCoords); } @@ -1381,6 +1434,8 @@ class LengthToolZoom extends AnnotationTool { const textBoxUID = '1'; const hasDetachedTextBox = Boolean(data.handles.textBox.hasMoved); + // hasMoved becomes true only after the drag distance from the anchor exceeds textBoxDetachThreshold. + // Until then the label is logically attached (auto re-anchored when not being dragged) but still follows the cursor during drag. const textBoxStyleOverrides = data.handles.textBox.isMoving ? { borderColor: '', From 6878857a333700cc68cf1889e8a466884d3bcff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Mon, 6 Oct 2025 19:19:01 +0200 Subject: [PATCH 103/108] fix: compile error getBBox call was not recognized and lead to an error. --- packages/tools/src/drawingSvg/drawTextBox.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawTextBox.ts b/packages/tools/src/drawingSvg/drawTextBox.ts index 61d8a7817..7bf926d74 100644 --- a/packages/tools/src/drawingSvg/drawTextBox.ts +++ b/packages/tools/src/drawingSvg/drawTextBox.ts @@ -256,7 +256,7 @@ function _drawTextBackground( borderRadius, backgroundPadding, } = options; - let element = group.querySelector('rect.background'); + let element = group.querySelector('rect.background') as SVGRectElement | null; const borderWidthValue = borderWidth === undefined @@ -293,16 +293,17 @@ function _drawTextBackground( // Otherwise, check if we have a element. If not, create one if (!element) { - element = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); + element = document.createElementNS( + 'http://www.w3.org/2000/svg', + 'rect' + ) as SVGRectElement; element.setAttribute('class', 'background'); group.insertBefore(element, group.firstChild); } // Measure the text bounding box to expand it with background padding - const textElement = group.querySelector('text'); - const textBBox = textElement?.getBBox - ? textElement.getBBox() - : group.getBBox(); + const textElement = group.querySelector('text') as SVGGraphicsElement | null; + const textBBox = textElement ? textElement.getBBox() : group.getBBox(); const xWithPadding = textBBox.x - backgroundPaddingValue; const yWithPadding = textBBox.y - backgroundPaddingValue; const widthWithPadding = textBBox.width + backgroundPaddingValue * 2; @@ -322,7 +323,7 @@ function _drawTextBackground( setAttributesIfNecessary(attributes, element); - return element.getBBox(); + return element!.getBBox(); } export default drawTextBox; From d9a9fddc7534983f6e8728caf8e898ecb80c91ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Mon, 6 Oct 2025 19:19:13 +0200 Subject: [PATCH 104/108] fix: render lines in Safari --- packages/tools/src/drawingSvg/drawLine.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/drawingSvg/drawLine.ts b/packages/tools/src/drawingSvg/drawLine.ts index 45acf6687..156cdcc85 100644 --- a/packages/tools/src/drawingSvg/drawLine.ts +++ b/packages/tools/src/drawingSvg/drawLine.ts @@ -47,8 +47,21 @@ export default function drawLine( const svgns = 'http://www.w3.org/2000/svg'; const svgNodeHash = _getHash(annotationUID, 'line', lineUID); const existingLine = svgDrawingHelper.getSvgNode(svgNodeHash); - const layerId = svgDrawingHelper.svgLayerElement.id; - const dropShadowStyle = shadow ? `filter:url(#shadow-${layerId});` : ''; + // Ursprünglich wurde die ID des aktuellen Layer- verwendet. Der Shadow-Filter + // ist jedoch auf dem Root- ("svg-layer-") definiert. + // In Safari führt eine Referenz auf einen nicht existierenden Filter dazu, dass die Linie + // (teilweise) nicht gerendert wird. Wir traversieren daher zum übergeordneten . + let filterHost: Element | null = svgDrawingHelper.svgLayerElement as Element; + if (filterHost && filterHost.tagName.toLowerCase() !== 'svg') { + // Nutzung von closest('svg') ist breit unterstützt; Falls nicht vorhanden, fallback auf ursprüngliches Element + const parentSvg = (filterHost as HTMLElement).closest('svg'); + if (parentSvg) { + filterHost = parentSvg; + } + } + const rootSvgId = (filterHost as SVGElement)?.id; + const dropShadowStyle = + shadow && rootSvgId ? `filter:url(#shadow-${rootSvgId});` : ''; const attributes = { x1: `${start[0]}`, From 17deb54e108a1325b868e08b004fffe8406ec7a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Tue, 7 Oct 2025 09:32:18 +0200 Subject: [PATCH 105/108] feat: add magnifier lens to LengthToolZoom --- packages/tools/src/index.ts | 3 +- .../{ => LengthToolZoom}/LengthToolZoom.ts | 119 ++++++-- .../annotation/LengthToolZoom/LensOverlay.ts | 269 ++++++++++++++++++ .../tools/annotation/LengthToolZoom/index.ts | 2 + 4 files changed, 367 insertions(+), 26 deletions(-) rename packages/tools/src/tools/annotation/{ => LengthToolZoom}/LengthToolZoom.ts (93%) create mode 100644 packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts create mode 100644 packages/tools/src/tools/annotation/LengthToolZoom/index.ts diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index 17090d15a..94cc70aa4 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -39,7 +39,6 @@ import { MIPJumpToClickTool, LabelTool, LengthTool, - LengthToolZoom, HeightTool, ProbeTool, RectangleROITool, @@ -89,6 +88,8 @@ import { LabelMapEditWithContourTool, } from './tools'; +import LengthToolZoom from './tools/annotation/LengthToolZoom/LengthToolZoom'; + import VideoRedactionTool from './tools/annotation/VideoRedactionTool'; import * as Enums from './enums'; diff --git a/packages/tools/src/tools/annotation/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts similarity index 93% rename from packages/tools/src/tools/annotation/LengthToolZoom.ts rename to packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts index a954925ee..ae95ff2b5 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts @@ -1,4 +1,4 @@ -import { Events, ChangeTypes } from '../../enums'; +import { Events, ChangeTypes } from '../../../enums'; import { getEnabledElement, utilities as csUtils, @@ -7,41 +7,40 @@ import { } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; -import { getCalibratedLengthUnitsAndScale } from '../../utilities/getCalibratedUnits'; -import { AnnotationTool } from '../base'; -import throttle from '../../utilities/throttle'; +import { getCalibratedLengthUnitsAndScale } from '../../../utilities/getCalibratedUnits'; +import { AnnotationTool } from '../../base'; +import throttle from '../../../utilities/throttle'; import { addAnnotation, getAnnotations, removeAnnotation, -} from '../../stateManagement/annotation/annotationState'; -import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking'; -import { isAnnotationVisible } from '../../stateManagement/annotation/annotationVisibility'; +} from '../../../stateManagement/annotation/annotationState'; +import { isAnnotationVisible } from '../../../stateManagement/annotation/annotationVisibility'; import { triggerAnnotationCompleted, triggerAnnotationModified, -} from '../../stateManagement/annotation/helpers/state'; +} from '../../../stateManagement/annotation/helpers/state'; import { deselectAnnotation, isAnnotationSelected, -} from '../../stateManagement/annotation/annotationSelection'; -import * as lineSegment from '../../utilities/math/line'; +} from '../../../stateManagement/annotation/annotationSelection'; +import * as lineSegment from '../../../utilities/math/line'; import { drawHandles as drawHandlesSvg, drawLine as drawLineSvg, drawLinkedTextBox as drawLinkedTextBoxSvg, -} from '../../drawingSvg'; -import { state } from '../../store/state'; -import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters'; -import { getTextBoxCoordsCanvas } from '../../utilities/drawing'; -import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds'; +} from '../../../drawingSvg'; +import { state } from '../../../store/state'; +import { getViewportIdsWithToolToRender } from '../../../utilities/viewportFilters'; +import { getTextBoxCoordsCanvas } from '../../../utilities/drawing'; +import triggerAnnotationRenderForViewportIds from '../../../utilities/triggerAnnotationRenderForViewportIds'; import { resetElementCursor, hideElementCursor, -} from '../../cursors/elementCursor'; -import { MouseCursor } from '../../cursors'; +} from '../../../cursors/elementCursor'; +import { MouseCursor } from '../../../cursors'; import type { EventTypes, @@ -52,10 +51,12 @@ import type { ToolProps, SVGDrawingHelper, Annotation, -} from '../../types'; -import type { LengthAnnotation } from '../../types/ToolSpecificAnnotationTypes'; -import type { StyleSpecifier } from '../../types/AnnotationStyle'; -import { getStyleProperty } from '../../stateManagement/annotation/config/helpers'; +} from '../../../types'; +import type { LengthAnnotation } from '../../../types/ToolSpecificAnnotationTypes'; +import type { StyleSpecifier } from '../../../types/AnnotationStyle'; +import { getStyleProperty } from '../../../stateManagement/annotation/config/helpers'; + +import { LensOverlay, type LensOverlayConfig } from './LensOverlay'; const { transformWorldToIndex } = csUtils; @@ -157,6 +158,8 @@ class LengthToolZoom extends AnnotationTool { isHandleOutsideImage: boolean; private pendingAnnotation: LengthAnnotation | null; private _handleMoveAnimationFrame: number | null; + private currentMousePosition: Types.Point2 | null = null; + private lensOverlay: LensOverlay; constructor( toolProps: PublicToolProps = {}, @@ -166,6 +169,14 @@ class LengthToolZoom extends AnnotationTool { preventHandleOutsideImage: false, getTextLines: defaultGetTextLines, textBoxDetachThreshold: 75, // Canvas pixels distance before label detaches + magnifier: { + enabled: true, + radius: 100, + zoomFactor: 2, + borderWidth: 2, + borderColor: '#FFFFFF', + showCrosshair: true, + }, actions: { // TODO - bind globally - but here is actually pretty good as it // is almost always active. @@ -192,19 +203,40 @@ class LengthToolZoom extends AnnotationTool { this.pendingAnnotation = null; this._handleMoveAnimationFrame = null; + // Initialize lens overlay with configuration + this.lensOverlay = new LensOverlay( + this.configuration.magnifier as LensOverlayConfig + ); + if (!toolProps.configuration?.getTextLines) { this.configuration.getTextLines = this._getTextLinesWithLabel; } } - private _baseMouseMoveCallback = this.mouseMoveCallback; - public mouseMoveCallback = ( evt: EventTypes.MouseMoveEventType, filteredAnnotations?: Annotations ): boolean => { + const eventDetail = evt.detail; + this.currentMousePosition = eventDetail.currentPoints.canvas; + + // Update lens overlay mouse position + this.lensOverlay.updateMousePosition(this.currentMousePosition); + + // Lupe bei aktiver Platzierung anzeigen + if (this._shouldShowMagnifier()) { + this.lensOverlay.show(eventDetail.element); + } else { + this.lensOverlay.hide(); + } + if (this.editData) { - return this._baseMouseMoveCallback(evt, filteredAnnotations); + // Call parent class mouseMoveCallback by calling the parent method directly + return AnnotationTool.prototype.mouseMoveCallback.call( + this, + evt, + filteredAnnotations + ); } return false; }; @@ -323,6 +355,13 @@ class LengthToolZoom extends AnnotationTool { }; this._activateDraw(element); + // Lupe sofort nach dem Start der Zeichnung anzeigen + this.currentMousePosition = eventDetail.currentPoints.canvas; + this.lensOverlay.updateMousePosition(this.currentMousePosition); + if (this._shouldShowMagnifier()) { + this.lensOverlay.show(element); + } + evt.preventDefault(); triggerAnnotationRenderForViewportIds(viewportIdsToRender); @@ -415,6 +454,13 @@ class LengthToolZoom extends AnnotationTool { this._activateDraw(element); + // Lupe sofort nach dem Start der zweiten Punktplatzierung anzeigen + this.currentMousePosition = eventDetail.currentPoints.canvas; + this.lensOverlay.updateMousePosition(this.currentMousePosition); + if (this._shouldShowMagnifier()) { + this.lensOverlay.show(element); + } + evt.preventDefault(); triggerAnnotationRenderForViewportIds(viewportIdsToRender); @@ -602,6 +648,9 @@ class LengthToolZoom extends AnnotationTool { const eventDetail = evt.detail; const { element } = eventDetail; + // Lupe ausblenden bei Ende der Zeichnung + this.lensOverlay.hide(); + if (!this.editData) { return; } @@ -677,7 +726,14 @@ class LengthToolZoom extends AnnotationTool { _dragCallback = (evt: EventTypes.InteractionEventType): void => { this.isDrawing = true; const eventDetail = evt.detail; - const { element } = eventDetail; + const { element, currentPoints } = eventDetail; + + // Mausposition für die Lupe während des Drags aktualisieren + this.currentMousePosition = currentPoints.canvas; + this.lensOverlay.updateMousePosition(this.currentMousePosition); + if (this._shouldShowMagnifier()) { + this.lensOverlay.show(element); + } const { annotation, @@ -1031,6 +1087,7 @@ class LengthToolZoom extends AnnotationTool { ); this._cancelHandleMoveLingerTick(); + this.lensOverlay.hide(); }; /** @@ -1830,6 +1887,18 @@ class LengthToolZoom extends AnnotationTool { csUtils.indexWithinDimensions(index2, dimensions) ); } + + private _shouldShowMagnifier(): boolean { + return ( + this.configuration.magnifier?.enabled && + this.currentMousePosition !== null && + (this.editData?.stage === 'placingFirst' || + this.editData?.stage === 'placingSecond' || + (this.editData && + this.editData.handleIndex !== undefined && + this.isDrawing)) + ); + } } function defaultGetTextLines(data, targetId): string[] { diff --git a/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts b/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts new file mode 100644 index 000000000..c85b55a19 --- /dev/null +++ b/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts @@ -0,0 +1,269 @@ +import { getEnabledElement } from '@cornerstonejs/core'; +import type { Types } from '@cornerstonejs/core'; + +export interface LensOverlayConfig { + enabled: boolean; + radius: number; + zoomFactor: number; + borderWidth: number; + borderColor: string; + showCrosshair: boolean; +} + +export class LensOverlay { + private canvas: HTMLCanvasElement | null = null; + private context: CanvasRenderingContext2D | null = null; + private visible: boolean = false; + private currentMousePosition: Types.Point2 | null = null; + private animationFrame: number | null = null; + private currentElement: HTMLDivElement | null = null; + private config: LensOverlayConfig; + + constructor(config: LensOverlayConfig) { + this.config = config; + } + + public updateMousePosition(position: Types.Point2 | null): void { + this.currentMousePosition = position; + } + + public show(element: HTMLDivElement): void { + if (this.visible) { + return; + } + + this.currentElement = element; + this.initializeCanvas(element); + this.visible = true; + this.scheduleRender(); + } + + public hide(): void { + if (!this.visible) { + return; + } + + this.visible = false; + this.cancelAnimationFrame(); + + if (this.canvas && this.canvas.parentElement) { + this.canvas.parentElement.removeChild(this.canvas); + this.canvas = null; + this.context = null; + } + } + + public isVisible(): boolean { + return this.visible; + } + + public updateConfig(config: Partial): void { + this.config = { ...this.config, ...config }; + } + + private initializeCanvas(element: HTMLDivElement): void { + if (this.canvas) { + return; + } + + const { radius } = this.config; + const canvasSize = radius * 2; + + this.canvas = document.createElement('canvas'); + this.canvas.width = canvasSize; + this.canvas.height = canvasSize; + this.canvas.style.cssText = ` + position: absolute; + width: ${canvasSize}px; + height: ${canvasSize}px; + pointer-events: none; + z-index: 1000; + display: block; + `; + + this.context = this.canvas.getContext('2d'); + + const viewportElement = element.querySelector('.viewport-element'); + if (viewportElement) { + viewportElement.appendChild(this.canvas); + } + } + + private scheduleRender(): void { + if (typeof window === 'undefined' || !this.visible) { + return; + } + + if (this.animationFrame !== null) { + window.cancelAnimationFrame(this.animationFrame); + } + + const render = () => { + this.animationFrame = null; + + if (!this.visible) { + return; + } + + this.render(); + + // Continue animation frame loop + if (this.visible) { + this.animationFrame = window.requestAnimationFrame(render); + } + }; + + this.animationFrame = window.requestAnimationFrame(render); + } + + private cancelAnimationFrame(): void { + if (typeof window !== 'undefined' && this.animationFrame !== null) { + window.cancelAnimationFrame(this.animationFrame); + this.animationFrame = null; + } + } + + private render(): void { + if (!this.canvas || !this.context || !this.currentMousePosition) { + return; + } + + const { radius, zoomFactor, borderWidth, borderColor } = this.config; + const [mouseX, mouseY] = this.currentMousePosition; + + // Canvas leeren + this.context.clearRect(0, 0, radius * 2, radius * 2); + + // Clipping-Pfad für runde Lupe + this.context.save(); + this.context.beginPath(); + this.context.arc(radius, radius, radius, 0, 2 * Math.PI); + this.context.clip(); + + // Bildausschnitt zeichnen + this.drawMagnifiedRegion(mouseX, mouseY, radius, zoomFactor); + + this.context.restore(); + + // Rahmen und Hilfslinien zeichnen + this.drawOverlay(radius, borderWidth, borderColor); + + // Positionierung der Lupe + this.positionLens(mouseX, mouseY, radius); + } + + private drawMagnifiedRegion( + centerX: number, + centerY: number, + radius: number, + zoomFactor: number + ): void { + if (!this.currentElement) return; + + const enabledElement = getEnabledElement(this.currentElement); + if (!enabledElement) return; + + const { viewport } = enabledElement; + const sourceCanvas = viewport.getCanvas(); + + // Berücksichtige devicePixelRatio für korrekte Koordinaten + const devicePixelRatio = window.devicePixelRatio || 1; + + // Canvas-Dimensionen für Grenzprüfung + const canvasWidth = sourceCanvas.width; + const canvasHeight = sourceCanvas.height; + + // Die tatsächliche CSS-Größe des Canvas + const canvasRect = sourceCanvas.getBoundingClientRect(); + const cssToCanvasScaleX = canvasWidth / canvasRect.width; + const cssToCanvasScaleY = canvasHeight / canvasRect.height; + + // Transformiere CSS-Koordinaten in Canvas-Koordinaten + const canvasCenterX = centerX * cssToCanvasScaleX; + const canvasCenterY = centerY * cssToCanvasScaleY; + + const sourceSize = (radius / zoomFactor) * cssToCanvasScaleX; // Verwende X-Skala für beide Dimensionen für Konsistenz + const destSize = radius * 2; + + // Berechne den Quellbereich um die Mausposition zentriert + let srcX = canvasCenterX - sourceSize; + let srcY = canvasCenterY - sourceSize; + let srcWidth = sourceSize * 2; + let srcHeight = sourceSize * 2; + + // Stelle sicher, dass der Quellbereich innerhalb des Canvas bleibt + if (srcX < 0) { + srcWidth += srcX; // Reduziere Breite um den negativen Offset + srcX = 0; + } + if (srcY < 0) { + srcHeight += srcY; // Reduziere Höhe um den negativen Offset + srcY = 0; + } + if (srcX + srcWidth > canvasWidth) { + srcWidth = canvasWidth - srcX; + } + if (srcY + srcHeight > canvasHeight) { + srcHeight = canvasHeight - srcY; + } + + // Nur zeichnen, wenn der Quellbereich gültig ist + if (srcWidth > 0 && srcHeight > 0) { + this.context?.drawImage( + sourceCanvas, + srcX, // Quell-X + srcY, // Quell-Y + srcWidth, // Quell-Breite + srcHeight, // Quell-Höhe + 0, // Ziel-X + 0, // Ziel-Y + destSize, // Ziel-Breite + destSize // Ziel-Höhe + ); + } + } + + private drawOverlay( + radius: number, + borderWidth: number, + borderColor: string + ): void { + if (!this.context) return; + + // Rahmen zeichnen (2px dick) + this.context.strokeStyle = borderColor; + this.context.lineWidth = 2; + this.context.beginPath(); + this.context.arc(radius, radius, radius - 1, 0, 2 * Math.PI); + this.context.stroke(); + + // 4x4 Pixel großen Punkt in der Mitte zeichnen + this.context.fillStyle = '#EC6602'; + this.context.fillRect(radius - 2, radius - 2, 4, 4); + } + + private positionLens(mouseX: number, mouseY: number, radius: number): void { + if (!this.canvas) return; + + // Positionierung oberhalb und rechts der Maus, um nicht die Sicht zu blockieren + const offset = 20; + const viewportRect = this.canvas.parentElement?.getBoundingClientRect(); + + if (viewportRect) { + let posX = mouseX + offset; + let posY = mouseY - radius - offset; + + // Sicherstellen, dass die Lupe innerhalb des Viewports bleibt + if (posX + radius * 2 > viewportRect.width) { + posX = mouseX - radius * 2 - offset; + } + + if (posY < 0) { + posY = mouseY + offset; + } + + this.canvas.style.left = `${posX}px`; + this.canvas.style.top = `${posY}px`; + } + } +} diff --git a/packages/tools/src/tools/annotation/LengthToolZoom/index.ts b/packages/tools/src/tools/annotation/LengthToolZoom/index.ts new file mode 100644 index 000000000..150a7568a --- /dev/null +++ b/packages/tools/src/tools/annotation/LengthToolZoom/index.ts @@ -0,0 +1,2 @@ +export { default } from './LengthToolZoom'; +export { LensOverlay, type LensOverlayConfig } from './LensOverlay'; From 3a9ecd6910d2eb0a2abd530a61e9a8de17bf5965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Tue, 7 Oct 2025 18:35:46 +0200 Subject: [PATCH 106/108] feat: deselect on touch devices We can now also deselect lines on touch devices. Before it was only working for mouse events. --- .../LengthToolZoom/LengthToolZoom.ts | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts index ae95ff2b5..b51b4282c 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts @@ -398,6 +398,8 @@ class LengthToolZoom extends AnnotationTool { return isSelected || annotation.highlighted || hasActiveHandle; }); + // Wenn nichts zum Deselektieren da ist, lassen wir das Tool normal weiterarbeiten + // (kann eine neue Linie beginnen bei Drag) if (!shouldDeselect) { return false; } @@ -414,7 +416,57 @@ class LengthToolZoom extends AnnotationTool { evt.preventDefault(); - return true; + // Nur true zurückgeben, wenn tatsächlich deselektiert wurde + return changed; + }; + + public postTouchStartCallback = ( + evt: EventTypes.TouchStartEventType + ): boolean => { + if ( + this.pendingAnnotation && + (this.pendingAnnotation.metadata as LengthZoomMetadata)?.creationStage === + 'waitingSecond' + ) { + return false; + } + + if (this.editData?.stage === 'placingFirst' || this.isDrawing) { + return false; + } + + const { element } = evt.detail; + const annotations = getAnnotations(this.getToolName(), element) ?? []; + + const shouldDeselect = annotations.some((annotation) => { + const isSelected = isAnnotationSelected(annotation.annotationUID); + const hasActiveHandle = + annotation.data?.handles?.activeHandleIndex !== null && + annotation.data?.handles?.activeHandleIndex !== undefined; + + return isSelected || annotation.highlighted || hasActiveHandle; + }); + + // Wenn nichts zum Deselektieren da ist, lassen wir das Tool normal weiterarbeiten + // (kann eine neue Linie beginnen bei Drag) + if (!shouldDeselect) { + return false; + } + + const changed = this._deselectAllLengthAnnotations(element); + + if (changed) { + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName() + ); + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + } + + evt.preventDefault(); + + // Nur true zurückgeben, wenn tatsächlich deselektiert wurde + return changed; }; private _beginSecondPointPlacement( From 9db20d0cff6d37738e81caea8853f9a76cff9b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Tue, 7 Oct 2025 21:18:20 +0200 Subject: [PATCH 107/108] fix: lines moving when zooming in or out The lines were moving to different places based on the zoom level. This is now fixed. --- .../annotation/LengthToolZoom/LengthToolZoom.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts index b51b4282c..5b048ca51 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom/LengthToolZoom.ts @@ -1208,7 +1208,20 @@ class LengthToolZoom extends AnnotationTool { styleSpecifier, }); - const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)); + // Ensure consistent world-to-canvas transformation + // This fixes the issue where lines shift position when zooming out + const canvasCoordinates = points.map((p) => { + try { + return viewport.worldToCanvas(p); + } catch (error) { + // Fallback to prevent rendering issues + console.warn( + 'Failed to transform world coordinates to canvas:', + error + ); + return [0, 0] as Types.Point2; + } + }); const editDataForAnnotation = this.editData && this.editData.annotation === annotation From 1fa2925cc4a4d5907b23d2ea33430402817c770f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kleino=CC=88der?= Date: Tue, 7 Oct 2025 21:37:54 +0200 Subject: [PATCH 108/108] fix: distortion and wrong centering in magnifier The magnifier clamped to stay inside the canvas which lead to distortion and wrong centering problems. Fix by repeating the border pixel value of the canvas. --- .../annotation/LengthToolZoom/LensOverlay.ts | 94 ++++++++++++------- 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts b/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts index c85b55a19..b925baba2 100644 --- a/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts +++ b/packages/tools/src/tools/annotation/LengthToolZoom/LensOverlay.ts @@ -186,41 +186,69 @@ export class LensOverlay { const destSize = radius * 2; // Berechne den Quellbereich um die Mausposition zentriert - let srcX = canvasCenterX - sourceSize; - let srcY = canvasCenterY - sourceSize; - let srcWidth = sourceSize * 2; - let srcHeight = sourceSize * 2; - - // Stelle sicher, dass der Quellbereich innerhalb des Canvas bleibt - if (srcX < 0) { - srcWidth += srcX; // Reduziere Breite um den negativen Offset - srcX = 0; - } - if (srcY < 0) { - srcHeight += srcY; // Reduziere Höhe um den negativen Offset - srcY = 0; - } - if (srcX + srcWidth > canvasWidth) { - srcWidth = canvasWidth - srcX; - } - if (srcY + srcHeight > canvasHeight) { - srcHeight = canvasHeight - srcY; + const srcX = canvasCenterX - sourceSize; + const srcY = canvasCenterY - sourceSize; + const srcWidth = sourceSize * 2; + const srcHeight = sourceSize * 2; + + // Erstelle temporären Canvas für die Pixelwiederholung + const tempCanvas = document.createElement('canvas'); + tempCanvas.width = srcWidth; + tempCanvas.height = srcHeight; + const tempContext = tempCanvas.getContext('2d'); + + if (!tempContext) return; + + // Hole die ImageData des Quell-Canvas + const sourceImageData = sourceCanvas + .getContext('2d') + ?.getImageData(0, 0, canvasWidth, canvasHeight); + if (!sourceImageData) return; + + // Erstelle ImageData für temporären Canvas + const tempImageData = tempContext.createImageData(srcWidth, srcHeight); + + // Fülle temporäres ImageData mit wiederholten Randpixeln + for (let y = 0; y < srcHeight; y++) { + for (let x = 0; x < srcWidth; x++) { + // Berechne die tatsächliche Position im Quell-Canvas + let sourceX = Math.floor(srcX + x); + let sourceY = Math.floor(srcY + y); + + // Clampe die Koordinaten auf den gültigen Bereich (0 bis canvasWidth/Height - 1) + sourceX = Math.max(0, Math.min(canvasWidth - 1, sourceX)); + sourceY = Math.max(0, Math.min(canvasHeight - 1, sourceY)); + + // Berechne Indizes für Quell- und Ziel-ImageData + const sourceIndex = (sourceY * canvasWidth + sourceX) * 4; + const tempIndex = (y * srcWidth + x) * 4; + + // Kopiere Pixelwerte + tempImageData.data[tempIndex] = sourceImageData.data[sourceIndex]; // R + tempImageData.data[tempIndex + 1] = + sourceImageData.data[sourceIndex + 1]; // G + tempImageData.data[tempIndex + 2] = + sourceImageData.data[sourceIndex + 2]; // B + tempImageData.data[tempIndex + 3] = + sourceImageData.data[sourceIndex + 3]; // A + } } - // Nur zeichnen, wenn der Quellbereich gültig ist - if (srcWidth > 0 && srcHeight > 0) { - this.context?.drawImage( - sourceCanvas, - srcX, // Quell-X - srcY, // Quell-Y - srcWidth, // Quell-Breite - srcHeight, // Quell-Höhe - 0, // Ziel-X - 0, // Ziel-Y - destSize, // Ziel-Breite - destSize // Ziel-Höhe - ); - } + // Setze die ImageData auf temporären Canvas + tempContext.putImageData(tempImageData, 0, 0); + + // Zeichne den temporären Canvas auf den Lens-Canvas + this.context?.drawImage( + tempCanvas, + 0, // Quell-X + 0, // Quell-Y + srcWidth, // Quell-Breite + srcHeight, // Quell-Höhe + 0, // Ziel-X + 0, // Ziel-Y + destSize, // Ziel-Breite + destSize // Ziel-Höhe + ); } private drawOverlay(