From c0fd4416edb90fbe1b0e76e41613c62691e1f476 Mon Sep 17 00:00:00 2001
From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com>
Date: Thu, 18 May 2023 20:59:33 -0400
Subject: [PATCH] fix(Measurement): fixed line dashing of measurements in
various scenarios (#3407)
* fix(Measurement): fixed line dashing of measurements in various scenarios
For a StackViewport simply rely on the SeriesInstanceUID being part of the
tracked measurements or not.
For a VolumeViewport first check the image id of the current image in the viewport
and then check the SeriesInstanceUID (like for a StackViewport) if an id is returned.
To reliably get the id of the current image, listen for the VOLUME_VIEWPORT_NEW_VOLUME event.
* Changes for PR comments.
---
extensions/cornerstone-dicom-sr/package.json | 4 +-
extensions/cornerstone/package.json | 8 +-
.../src/Viewport/OHIFCornerstoneViewport.tsx | 8 +-
extensions/measurement-tracking/package.json | 4 +-
.../viewports/TrackedCornerstoneViewport.tsx | 88 +++++++++++++++----
package.json | 2 +-
platform/core/package.json | 2 +-
platform/viewer/package.json | 2 +-
yarn.lock | 38 ++++----
9 files changed, 107 insertions(+), 49 deletions(-)
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"