diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 5eec75694..0d3b97d85 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,7 +46,7 @@ "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", "@cornerstonejs/adapters": "^0.6.0", - "@cornerstonejs/core": "^0.47.1", - "@cornerstonejs/tools": "^0.67.4" + "@cornerstonejs/core": "^0.47.3", + "@cornerstonejs/tools": "^0.67.6" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index e4954986e..809bee283 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -34,7 +34,7 @@ "peerDependencies": { "@ohif/core": "^3.0.0", "@ohif/ui": "^2.0.0", - "@cornerstonejs/dicom-image-loader": "^0.6.6", + "@cornerstonejs/dicom-image-loader": "^0.6.8", "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", @@ -53,9 +53,9 @@ "dependencies": { "@babel/runtime": "^7.20.13", "@cornerstonejs/adapters": "^0.6.0", - "@cornerstonejs/core": "^0.47.1", - "@cornerstonejs/streaming-image-volume-loader": "^0.20.4", - "@cornerstonejs/tools": "^0.67.4", + "@cornerstonejs/core": "^0.47.3", + "@cornerstonejs/streaming-image-volume-loader": "^0.20.6", + "@cornerstonejs/tools": "^0.67.6", "@kitware/vtk.js": "27.3.1", "html2canvas": "^1.4.1", "lodash.debounce": "4.0.8", diff --git a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx index 17a4f2a00..a94cc0fc6 100644 --- a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx +++ b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx @@ -335,13 +335,13 @@ const OHIFCornerstoneViewport = React.memo(props => { cleanUpServices(); + const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex( + viewportIndex + ); + cornerstoneViewportService.disableElement(viewportIndex); if (onElementDisabled) { - const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex( - viewportIndex - ); - onElementDisabled(viewportInfo); } diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 8b71f466e..a9d3e504b 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "peerDependencies": { "@ohif/core": "^3.0.0", "classnames": "^2.3.2", - "@cornerstonejs/core": "^0.47.1", - "@cornerstonejs/tools": "^0.67.4", + "@cornerstonejs/core": "^0.47.3", + "@cornerstonejs/tools": "^0.67.6", "@ohif/extension-cornerstone-dicom-sr": "^3.0.0", "dcmjs": "^0.29.5", "lodash.debounce": "^4.17.21", diff --git a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx index 418d4aa97..81e796b87 100644 --- a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx +++ b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import OHIF, { utils } from '@ohif/core'; @@ -8,6 +8,7 @@ import { useTranslation } from 'react-i18next'; import { annotation } from '@cornerstonejs/tools'; import { useTrackedMeasurements } from './../getContextModule'; +import { BaseVolumeViewport, Enums } from '@cornerstonejs/core'; const { formatDate } = utils; @@ -34,6 +35,7 @@ function TrackedCornerstoneViewport(props) { const [trackedMeasurements] = useTrackedMeasurements(); const [isTracked, setIsTracked] = useState(false); const [trackedMeasurementUID, setTrackedMeasurementUID] = useState(null); + const [viewportElem, setViewportElem] = useState(null); const { trackedSeries } = trackedMeasurements.context; const viewportId = viewportOptions.viewportId; @@ -55,6 +57,69 @@ function TrackedCornerstoneViewport(props) { ManufacturerModelName, } = displaySet.images[0]; + const updateIsTracked = useCallback(() => { + const viewport = cornerstoneViewportService.getCornerstoneViewportByIndex( + viewportIndex + ); + + if (viewport instanceof BaseVolumeViewport) { + // A current image id will only exist for volume viewports that can have measurements tracked. + // Typically these are those volume viewports for the series of acquisition. + const currentImageId = viewport?.getCurrentImageId(); + + if (!currentImageId) { + if (isTracked) { + setIsTracked(false); + } + return; + } + } + + if (trackedSeries.includes(SeriesInstanceUID) !== isTracked) { + setIsTracked(!isTracked); + } + }, [isTracked, trackedMeasurements, viewportIndex, SeriesInstanceUID]); + + const onElementEnabled = useCallback( + evt => { + if (evt.detail.element !== viewportElem) { + // The VOLUME_VIEWPORT_NEW_VOLUME event allows updateIsTracked to reliably fetch the image id for a volume viewport. + evt.detail.element?.addEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + updateIsTracked + ); + setViewportElem(evt.detail.element); + } + }, + [updateIsTracked, viewportElem] + ); + + const onElementDisabled = useCallback(() => { + viewportElem?.removeEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + updateIsTracked + ); + }, [updateIsTracked, viewportElem]); + + useEffect(updateIsTracked, [updateIsTracked]); + + useEffect(() => { + const { unsubscribe } = cornerstoneViewportService.subscribe( + cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED, + props => { + if (props.viewportIndex !== viewportIndex) { + return; + } + + updateIsTracked(); + } + ); + + return () => { + unsubscribe(); + }; + }, [updateIsTracked, viewportIndex]); + useEffect(() => { if (isTracked) { annotation.config.style.setViewportToolStyles(viewportId, { @@ -83,19 +148,6 @@ function TrackedCornerstoneViewport(props) { }; }, [isTracked]); - // A current image id will only exist for viewports that can have measurements tracked. - // Typically these are stack viewports and those volume viewports for the series of acquisition. - const currentImageId = cornerstoneViewportService - .getCornerstoneViewport(viewportId) - ?.getCurrentImageId(); - if (currentImageId) { - if (trackedSeries.includes(SeriesInstanceUID) !== isTracked) { - setIsTracked(!isTracked); - } - } else if (isTracked) { - setIsTracked(false); - } - function switchMeasurement(direction) { const newTrackedMeasurementUID = _getNextMeasurementUID( direction, @@ -121,7 +173,13 @@ function TrackedCornerstoneViewport(props) { '@ohif/extension-cornerstone.viewportModule.cornerstone' ); - return ; + return ( + + ); }; return ( diff --git a/package.json b/package.json index 775bea023..98d0018fe 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ ] }, "resolutions": { - "@cornerstonejs/core": "^0.47.1", + "@cornerstonejs/core": "^0.47.3", "**/@babel/runtime": "^7.20.13", "nth-check": "^2.1.1", "trim-newlines": "^5.0.0", diff --git a/platform/core/package.json b/platform/core/package.json index 5b028125f..1737926f7 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -32,7 +32,7 @@ }, "peerDependencies": { "cornerstone-math": "0.1.9", - "@cornerstonejs/dicom-image-loader": "^0.6.6", + "@cornerstonejs/dicom-image-loader": "^0.6.8", "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", diff --git a/platform/viewer/package.json b/platform/viewer/package.json index 6ce2ff1b8..1f5407fa1 100644 --- a/platform/viewer/package.json +++ b/platform/viewer/package.json @@ -68,7 +68,7 @@ "config-point": "^0.4.8", "core-js": "^3.16.1", "cornerstone-math": "^0.1.9", - "@cornerstonejs/dicom-image-loader": "^0.6.6", + "@cornerstonejs/dicom-image-loader": "^0.6.8", "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", diff --git a/yarn.lock b/yarn.lock index 47d527d3c..9a963fc84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1469,43 +1469,43 @@ resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.2.tgz#e96721d56f6ec96f7f95c16321d88cc8467d8d81" integrity sha512-lgdvBvvNezleY+4pIe2ceUsJzlZe/0PipdeubQ3vZZOz3xxtHHMR1XFCl4fgd8gosR8COHuD7h6q+MwgrwBsng== -"@cornerstonejs/core@^0.47.1": - version "0.47.1" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-0.47.1.tgz#8bbb9d5d8a6cd8a4c0fbf0b20bc0f56808d4fa40" - integrity sha512-bA69qo2WkMd5lkFFegYQ1UWHbnOADF0TD6DHiOnabFxHMQYZLB9CkCy4lT/tPAYL2w9WKm6b52ScUPNLTirWeA== +"@cornerstonejs/core@^0.47.3": + version "0.47.3" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-0.47.3.tgz#3ba0157564b23c3f7f961f35ed8cacb4f3b9b581" + integrity sha512-bSJEzrC6xmcwU7zaTl0NqQ9T5n2CYlsDJERKZIn2oTVzwzBMxWEAsFs5v5HuMj4/JrOsE7QkrYSLQpk9c3qX6g== dependencies: "@kitware/vtk.js" "27.3.1" detect-gpu "^5.0.22" gl-matrix "^3.4.3" lodash.clonedeep "4.5.0" -"@cornerstonejs/dicom-image-loader@^0.6.6": - version "0.6.6" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-0.6.6.tgz#086b14e93e67923ea999d7f80c42bf766db3918f" - integrity sha512-pdJ5f7/JEX4BAXR2keAAGf6RUfuyzB3vhEvk0T4yDv960TdpT4RZqRjs5acZMs9bkGqY8zAb+c9+Gdz5vypfvg== +"@cornerstonejs/dicom-image-loader@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-0.6.8.tgz#e9d5c24959d74981b3ccca3641617b2c34106355" + integrity sha512-wYKPXprDYgHrsz2tNf2o0UL0Mr4YcUF4xalQqdLxfrgyUExQKHoDigXmEAwNVokSlS7rNz6NplLXeTbNJ2QSwg== dependencies: "@cornerstonejs/codec-charls" "^1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2" "@cornerstonejs/codec-openjpeg" "^1.2.2" "@cornerstonejs/codec-openjph" "^2.4.2" - "@cornerstonejs/core" "^0.47.1" + "@cornerstonejs/core" "^0.47.3" dicom-parser "^1.8.9" pako "^2.0.4" uuid "^9.0.0" -"@cornerstonejs/streaming-image-volume-loader@^0.20.4": - version "0.20.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.20.4.tgz#f8d727f2ae7dc0ae3c8975bad2a4f5365743127f" - integrity sha512-Zkf/HKatWGf3GPb+0yR7wNPqBHfKXQznpcKsqwFbbMu/SNp7dBcCuvqRVXO5BrJOfnyDeeDpB2+2XRocBnighg== +"@cornerstonejs/streaming-image-volume-loader@^0.20.6": + version "0.20.6" + resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.20.6.tgz#7ab7905ca0ad9501397f553ce80fe0712971bac0" + integrity sha512-lFdCWSVOJR/oU76xOJ7kAfdZzQfSNtCYTcYjuJP1uTBiccwm/MQOdpPgEpgksca1p8qi1PE2zWaQJWtspNtosw== dependencies: - "@cornerstonejs/core" "^0.47.1" + "@cornerstonejs/core" "^0.47.3" -"@cornerstonejs/tools@^0.67.4": - version "0.67.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-0.67.4.tgz#5dfc2d3bacc2be600496cd4e230b1749de59b001" - integrity sha512-qeCCtK/xioEBv7l1zqicWQrHdzkFOX4fGNZ5D/TMkQMa+Ed5Zip8gDAcYTbmUvbYXdvkzhoOZeLcPVhoAkDykw== +"@cornerstonejs/tools@^0.67.6": + version "0.67.6" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-0.67.6.tgz#cb9170d63aa2ea67a452b6184d30333a5024b3c7" + integrity sha512-Kq00AQ1/510miDMdl7cE/2pFasLQaQMZFssrkOMlkeX7VYVOePd6ErTiAz/yfSVxxBeocGyquA1ZwWqBxRK1jA== dependencies: - "@cornerstonejs/core" "^0.47.1" + "@cornerstonejs/core" "^0.47.3" lodash.clonedeep "4.5.0" lodash.get "^4.4.2"