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.
This commit is contained in:
Joe Boccanfuso 2023-05-18 20:59:33 -04:00 committed by GitHub
parent f2004aee9e
commit c0fd4416ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 107 additions and 49 deletions

View File

@ -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"
}
}

View File

@ -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",

View File

@ -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);
}

View File

@ -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",

View File

@ -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 <Component {...props} />;
return (
<Component
{...props}
onElementEnabled={onElementEnabled}
onElementDisabled={onElementDisabled}
/>
);
};
return (

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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"