fix(typescript): rename services to fix typescript (#3165)

* fix: Rename services to lower camel case, hp, measure

* fix: Rename DisplaySetService instances to displaySetService

* fix: Rename CornerstoneViewportService to lower camel case

* fix: Added lower case segmentationService rename

* rename other services (#3166)

* rename uiDialogService

* rename toolGroupService

* rename uiNotificationService

* rename viewportGridService

* rename syncGroupService

* rename CornerstoneCacheService

* Fix a syntax error in hotkeys

* Fix a couple of rename issues that were missed

---------

Co-authored-by: Alireza <ar.sedghi@gmail.com>
This commit is contained in:
Bill Wallace 2023-02-10 16:46:09 -05:00 committed by GitHub
parent a97fb2fc9a
commit 8af0362d12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
97 changed files with 934 additions and 908 deletions

View File

@ -71,8 +71,8 @@ function _getDisplaySetsFromSeries(
displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID; displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;
displaySet.getReferenceDisplaySet = () => { displaySet.getReferenceDisplaySet = () => {
const { DisplaySetService } = servicesManager.services; const { displaySetService } = servicesManager.services;
const referencedDisplaySets = DisplaySetService.getDisplaySetsForSeries( const referencedDisplaySets = displaySetService.getDisplaySetsForSeries(
displaySet.referencedSeriesInstanceUID displaySet.referencedSeriesInstanceUID
); );
@ -113,9 +113,9 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) {
// We don't want to fire multiple loads, so we'll wait for the first to finish // We don't want to fire multiple loads, so we'll wait for the first to finish
// and also return the same promise to any other callers. // and also return the same promise to any other callers.
loadPromises[SOPInstanceUID] = new Promise(async (resolve, reject) => { loadPromises[SOPInstanceUID] = new Promise(async (resolve, reject) => {
const { SegmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
if (_segmentationExistsInCache(segDisplaySet, SegmentationService)) { if (_segmentationExistsInCache(segDisplaySet, segmentationService)) {
return; return;
} }
@ -133,7 +133,7 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) {
} }
const suppressEvents = true; const suppressEvents = true;
SegmentationService.createSegmentationForSEGDisplaySet( segmentationService.createSegmentationForSEGDisplaySet(
segDisplaySet, segDisplaySet,
null, null,
suppressEvents suppressEvents
@ -175,10 +175,10 @@ async function _loadSegments(extensionManager, segDisplaySet, headers) {
return segments; return segments;
} }
function _segmentationExistsInCache(segDisplaySet, SegmentationService) { function _segmentationExistsInCache(segDisplaySet, segmentationService) {
// This should be abstracted with the CornerstoneCacheService // This should be abstracted with the CornerstoneCacheService
const labelmapVolumeId = segDisplaySet.displaySetInstanceUID; const labelmapVolumeId = segDisplaySet.displaySetInstanceUID;
const segVolume = SegmentationService.getLabelmapVolume(labelmapVolumeId); const segVolume = segmentationService.getLabelmapVolume(labelmapVolumeId);
return segVolume !== undefined; return segVolume !== undefined;
} }

View File

@ -11,11 +11,11 @@ export default function PanelSegmentation({
commandsManager, commandsManager,
}) { }) {
const { const {
SegmentationService, segmentationService,
UIDialogService, uiDialogService,
ViewportGridService, viewportGridService,
ToolGroupService, toolGroupService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
const { t } = useTranslation('PanelSegmentation'); const { t } = useTranslation('PanelSegmentation');
@ -23,10 +23,10 @@ export default function PanelSegmentation({
const [ const [
initialSegmentationConfigurations, initialSegmentationConfigurations,
setInitialSegmentationConfigurations, setInitialSegmentationConfigurations,
] = useState(SegmentationService.getConfiguration()); ] = useState(segmentationService.getConfiguration());
const [segmentations, setSegmentations] = useState(() => const [segmentations, setSegmentations] = useState(() =>
SegmentationService.getSegmentations() segmentationService.getSegmentations()
); );
const [isMinimized, setIsMinimized] = useState({}); const [isMinimized, setIsMinimized] = useState({});
@ -54,14 +54,14 @@ export default function PanelSegmentation({
useEffect(() => { useEffect(() => {
// ~~ Subscription // ~~ Subscription
const added = SegmentationService.EVENTS.SEGMENTATION_ADDED; const added = segmentationService.EVENTS.SEGMENTATION_ADDED;
const updated = SegmentationService.EVENTS.SEGMENTATION_UPDATED; const updated = segmentationService.EVENTS.SEGMENTATION_UPDATED;
const removed = SegmentationService.EVENTS.SEGMENTATION_REMOVED; const removed = segmentationService.EVENTS.SEGMENTATION_REMOVED;
const subscriptions = []; const subscriptions = [];
[added, updated, removed].forEach(evt => { [added, updated, removed].forEach(evt => {
const { unsubscribe } = SegmentationService.subscribe(evt, () => { const { unsubscribe } = segmentationService.subscribe(evt, () => {
const segmentations = SegmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
setSegmentations(segmentations); setSegmentations(segmentations);
}); });
subscriptions.push(unsubscribe); subscriptions.push(unsubscribe);
@ -75,15 +75,15 @@ export default function PanelSegmentation({
}, []); }, []);
const onSegmentationClick = (segmentationId: string) => { const onSegmentationClick = (segmentationId: string) => {
SegmentationService.setActiveSegmentationForToolGroup(segmentationId); segmentationService.setActiveSegmentationForToolGroup(segmentationId);
}; };
const onSegmentationDelete = (segmentationId: string) => { const onSegmentationDelete = (segmentationId: string) => {
SegmentationService.remove(segmentationId); segmentationService.remove(segmentationId);
}; };
const getToolGroupIds = segmentationId => { const getToolGroupIds = segmentationId => {
const toolGroupIds = SegmentationService.getToolGroupIdsWithSegmentation( const toolGroupIds = segmentationService.getToolGroupIdsWithSegmentation(
segmentationId segmentationId
); );
@ -91,7 +91,7 @@ export default function PanelSegmentation({
}; };
const onSegmentClick = (segmentationId, segmentIndex) => { const onSegmentClick = (segmentationId, segmentIndex) => {
SegmentationService.setActiveSegmentForSegmentation( segmentationService.setActiveSegmentForSegmentation(
segmentationId, segmentationId,
segmentIndex segmentIndex
); );
@ -100,11 +100,11 @@ export default function PanelSegmentation({
toolGroupIds.forEach(toolGroupId => { toolGroupIds.forEach(toolGroupId => {
// const toolGroupId = // const toolGroupId =
SegmentationService.setActiveSegmentationForToolGroup( segmentationService.setActiveSegmentationForToolGroup(
segmentationId, segmentationId,
toolGroupId toolGroupId
); );
SegmentationService.jumpToSegmentCenter( segmentationService.jumpToSegmentCenter(
segmentationId, segmentationId,
segmentIndex, segmentIndex,
toolGroupId toolGroupId
@ -113,17 +113,17 @@ export default function PanelSegmentation({
}; };
const onSegmentEdit = (segmentationId, segmentIndex) => { const onSegmentEdit = (segmentationId, segmentIndex) => {
const segmentation = SegmentationService.getSegmentation(segmentationId); const segmentation = segmentationService.getSegmentation(segmentationId);
const segment = segmentation.segments[segmentIndex]; const segment = segmentation.segments[segmentIndex];
const { label } = segment; const { label } = segment;
callInputDialog(UIDialogService, label, (label, actionId) => { callInputDialog(uiDialogService, label, (label, actionId) => {
if (label === '') { if (label === '') {
return; return;
} }
SegmentationService.setSegmentLabelForSegmentation( segmentationService.setSegmentLabelForSegmentation(
segmentationId, segmentationId,
segmentIndex, segmentIndex,
label label
@ -132,15 +132,15 @@ export default function PanelSegmentation({
}; };
const onSegmentationEdit = segmentationId => { const onSegmentationEdit = segmentationId => {
const segmentation = SegmentationService.getSegmentation(segmentationId); const segmentation = segmentationService.getSegmentation(segmentationId);
const { label } = segmentation; const { label } = segmentation;
callInputDialog(UIDialogService, label, (label, actionId) => { callInputDialog(uiDialogService, label, (label, actionId) => {
if (label === '') { if (label === '') {
return; return;
} }
SegmentationService.addOrUpdateSegmentation( segmentationService.addOrUpdateSegmentation(
{ {
id: segmentationId, id: segmentationId,
label, label,
@ -157,7 +157,7 @@ export default function PanelSegmentation({
}; };
const onSegmentDelete = (segmentationId, segmentIndex) => { const onSegmentDelete = (segmentationId, segmentIndex) => {
// SegmentationService.removeSegmentFromSegmentation( // segmentationService.removeSegmentFromSegmentation(
// segmentationId, // segmentationId,
// segmentIndex // segmentIndex
// ); // );
@ -165,14 +165,14 @@ export default function PanelSegmentation({
}; };
const onToggleSegmentVisibility = (segmentationId, segmentIndex) => { const onToggleSegmentVisibility = (segmentationId, segmentIndex) => {
const segmentation = SegmentationService.getSegmentation(segmentationId); const segmentation = segmentationService.getSegmentation(segmentationId);
const segmentInfo = segmentation.segments[segmentIndex]; const segmentInfo = segmentation.segments[segmentIndex];
const isVisible = !segmentInfo.isVisible; const isVisible = !segmentInfo.isVisible;
const toolGroupIds = getToolGroupIds(segmentationId); const toolGroupIds = getToolGroupIds(segmentationId);
// Todo: right now we apply the visibility to all tool groups // Todo: right now we apply the visibility to all tool groups
toolGroupIds.forEach(toolGroupId => { toolGroupIds.forEach(toolGroupId => {
SegmentationService.setSegmentVisibility( segmentationService.setSegmentVisibility(
segmentationId, segmentationId,
segmentIndex, segmentIndex,
isVisible, isVisible,
@ -182,17 +182,17 @@ export default function PanelSegmentation({
}; };
const onToggleSegmentationVisibility = segmentationId => { const onToggleSegmentationVisibility = segmentationId => {
SegmentationService.toggleSegmentationVisibility(segmentationId); segmentationService.toggleSegmentationVisibility(segmentationId);
}; };
const setSegmentationConfiguration = useCallback( const setSegmentationConfiguration = useCallback(
(segmentationId, key, value) => { (segmentationId, key, value) => {
SegmentationService.setConfiguration({ segmentationService.setConfiguration({
segmentationId, segmentationId,
[key]: value, [key]: value,
}); });
}, },
[SegmentationService] [segmentationService]
); );
return ( return (
@ -280,7 +280,7 @@ PanelSegmentation.propTypes = {
}), }),
servicesManager: PropTypes.shape({ servicesManager: PropTypes.shape({
services: PropTypes.shape({ services: PropTypes.shape({
SegmentationService: PropTypes.shape({ segmentationService: PropTypes.shape({
getSegmentation: PropTypes.func.isRequired, getSegmentation: PropTypes.func.isRequired,
getSegmentations: PropTypes.func.isRequired, getSegmentations: PropTypes.func.isRequired,
toggleSegmentationVisibility: PropTypes.func.isRequired, toggleSegmentationVisibility: PropTypes.func.isRequired,

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { Input, Dialog } from '@ohif/ui'; import { Input, Dialog } from '@ohif/ui';
function callInputDialog(UIDialogService, label, callback) { function callInputDialog(uiDialogService, label, callback) {
const dialogId = 'enter-segment-label'; const dialogId = 'enter-segment-label';
const onSubmitHandler = ({ action, value }) => { const onSubmitHandler = ({ action, value }) => {
@ -13,11 +13,11 @@ function callInputDialog(UIDialogService, label, callback) {
callback('', action.id); callback('', action.id);
break; break;
} }
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
}; };
if (UIDialogService) { if (uiDialogService) {
UIDialogService.create({ uiDialogService.create({
id: dialogId, id: dialogId,
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
@ -27,7 +27,7 @@ function callInputDialog(UIDialogService, label, callback) {
title: 'Enter Segment Label', title: 'Enter Segment Label',
value: { label }, value: { label },
noCloseButton: true, noCloseButton: true,
onClose: () => UIDialogService.dismiss({ id: dialogId }), onClose: () => uiDialogService.dismiss({ id: dialogId }),
actions: [ actions: [
{ id: 'cancel', text: 'Cancel', type: 'primary' }, { id: 'cancel', text: 'Cancel', type: 'primary' },
{ id: 'save', text: 'Confirm', type: 'secondary' }, { id: 'save', text: 'Confirm', type: 'secondary' },

View File

@ -5,9 +5,9 @@ async function _hydrateSEGDisplaySet({
servicesManager, servicesManager,
}) { }) {
const { const {
SegmentationService, segmentationService,
HangingProtocolService, hangingProtocolService,
ViewportGridService, viewportGridService,
} = servicesManager.services; } = servicesManager.services;
const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID; const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;
@ -17,22 +17,22 @@ async function _hydrateSEGDisplaySet({
// We need the hydration to notify panels about the new segmentation added // We need the hydration to notify panels about the new segmentation added
const suppressEvents = false; const suppressEvents = false;
segmentationId = await SegmentationService.createSegmentationForSEGDisplaySet( segmentationId = await segmentationService.createSegmentationForSEGDisplaySet(
segDisplaySet, segDisplaySet,
segmentationId, segmentationId,
suppressEvents suppressEvents
); );
SegmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID); segmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);
const { viewports } = ViewportGridService.getState(); const { viewports } = viewportGridService.getState();
const updatedViewports = HangingProtocolService.getViewportsRequireUpdate( const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex, viewportIndex,
displaySetInstanceUID displaySetInstanceUID
); );
ViewportGridService.setDisplaySetsForViewports(updatedViewports); viewportGridService.setDisplaySetsForViewports(updatedViewports);
// Todo: fix this after we have a better way for stack viewport segmentations // Todo: fix this after we have a better way for stack viewport segmentations
@ -45,13 +45,13 @@ async function _hydrateSEGDisplaySet({
return; return;
} }
const shouldDisplaySeg = SegmentationService.shouldRenderSegmentation( const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(
viewport.displaySetInstanceUIDs, viewport.displaySetInstanceUIDs,
segDisplaySet.displaySetInstanceUID segDisplaySet.displaySetInstanceUID
); );
if (shouldDisplaySeg) { if (shouldDisplaySeg) {
ViewportGridService.setDisplaySetsForViewport({ viewportGridService.setDisplaySetsForViewport({
viewportIndex: index, viewportIndex: index,
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs, displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
viewportOptions: { viewportOptions: {

View File

@ -1,5 +1,5 @@
function createSEGToolGroupAndAddTools( function createSEGToolGroupAndAddTools(
ToolGroupService, toolGroupService,
toolGroupId, toolGroupId,
extensionManager extensionManager
) { ) {
@ -28,7 +28,7 @@ function createSEGToolGroupAndAddTools(
enabled: [{ toolName: toolNames.SegmentationDisplay }], enabled: [{ toolName: toolNames.SegmentationDisplay }],
}; };
return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {}); return toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
} }
export default createSEGToolGroupAndAddTools; export default createSEGToolGroupAndAddTools;

View File

@ -33,10 +33,10 @@ function OHIFCornerstoneSEGViewport(props) {
const { t } = useTranslation('SEGViewport'); const { t } = useTranslation('SEGViewport');
const { const {
DisplaySetService, displaySetService,
ToolGroupService, toolGroupService,
SegmentationService, segmentationService,
UINotificationService, uiNotificationService,
} = servicesManager.services; } = servicesManager.services;
const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportIndex}`; const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportIndex}`;
@ -127,7 +127,7 @@ function OHIFCornerstoneSEGViewport(props) {
direction => { direction => {
direction = direction === 'left' ? -1 : 1; direction = direction === 'left' ? -1 : 1;
const segmentationId = segDisplaySet.displaySetInstanceUID; const segmentationId = segDisplaySet.displaySetInstanceUID;
const segmentation = SegmentationService.getSegmentation(segmentationId); const segmentation = segmentationService.getSegmentation(segmentationId);
const { segments } = segmentation; const { segments } = segmentation;
@ -141,7 +141,7 @@ function OHIFCornerstoneSEGViewport(props) {
newSelectedSegmentIndex = numberOfSegments - 1; newSelectedSegmentIndex = numberOfSegments - 1;
} }
SegmentationService.jumpToSegmentCenter( segmentationService.jumpToSegmentCenter(
segmentationId, segmentationId,
newSelectedSegmentIndex, newSelectedSegmentIndex,
toolGroupId toolGroupId
@ -168,8 +168,8 @@ function OHIFCornerstoneSEGViewport(props) {
}, [servicesManager, viewportIndex, segDisplaySet, segIsLoading]); }, [servicesManager, viewportIndex, segDisplaySet, segIsLoading]);
useEffect(() => { useEffect(() => {
const { unsubscribe } = SegmentationService.subscribe( const { unsubscribe } = segmentationService.subscribe(
SegmentationService.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED, segmentationService.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED,
evt => { evt => {
if ( if (
evt.segDisplaySet.displaySetInstanceUID === evt.segDisplaySet.displaySetInstanceUID ===
@ -179,7 +179,7 @@ function OHIFCornerstoneSEGViewport(props) {
} }
if (evt.overlappingSegments) { if (evt.overlappingSegments) {
UINotificationService.show({ uiNotificationService.show({
title: 'Overlapping Segments', title: 'Overlapping Segments',
message: message:
'Overlapping segments detected which is not currently supported', 'Overlapping segments detected which is not currently supported',
@ -195,8 +195,8 @@ function OHIFCornerstoneSEGViewport(props) {
}, [segDisplaySet]); }, [segDisplaySet]);
useEffect(() => { useEffect(() => {
const { unsubscribe } = SegmentationService.subscribe( const { unsubscribe } = segmentationService.subscribe(
SegmentationService.EVENTS.SEGMENT_PIXEL_DATA_CREATED, segmentationService.EVENTS.SEGMENT_PIXEL_DATA_CREATED,
({ segmentIndex, numSegments }) => { ({ segmentIndex, numSegments }) => {
setProcessingProgress({ setProcessingProgress({
segmentIndex, segmentIndex,
@ -214,8 +214,8 @@ function OHIFCornerstoneSEGViewport(props) {
Cleanup the SEG viewport when the viewport is destroyed Cleanup the SEG viewport when the viewport is destroyed
*/ */
useEffect(() => { useEffect(() => {
const onDisplaySetsRemovedSubscription = DisplaySetService.subscribe( const onDisplaySetsRemovedSubscription = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_REMOVED, displaySetService.EVENTS.DISPLAY_SETS_REMOVED,
({ displaySetInstanceUIDs }) => { ({ displaySetInstanceUIDs }) => {
const activeViewport = viewports[activeViewportIndex]; const activeViewport = viewports[activeViewportIndex];
if ( if (
@ -235,14 +235,14 @@ function OHIFCornerstoneSEGViewport(props) {
}, []); }, []);
useEffect(() => { useEffect(() => {
let toolGroup = ToolGroupService.getToolGroup(toolGroupId); let toolGroup = toolGroupService.getToolGroup(toolGroupId);
if (toolGroup) { if (toolGroup) {
return; return;
} }
toolGroup = createSEGToolGroupAndAddTools( toolGroup = createSEGToolGroupAndAddTools(
ToolGroupService, toolGroupService,
toolGroupId, toolGroupId,
extensionManager extensionManager
); );
@ -251,11 +251,11 @@ function OHIFCornerstoneSEGViewport(props) {
return () => { return () => {
// remove the segmentation representations if seg displayset changed // remove the segmentation representations if seg displayset changed
SegmentationService.removeSegmentationRepresentationFromToolGroup( segmentationService.removeSegmentationRepresentationFromToolGroup(
toolGroupId toolGroupId
); );
ToolGroupService.destroyToolGroup(toolGroupId); toolGroupService.destroyToolGroup(toolGroupId);
}; };
}, []); }, []);
@ -264,7 +264,7 @@ function OHIFCornerstoneSEGViewport(props) {
return () => { return () => {
// remove the segmentation representations if seg displayset changed // remove the segmentation representations if seg displayset changed
SegmentationService.removeSegmentationRepresentationFromToolGroup( segmentationService.removeSegmentationRepresentationFromToolGroup(
toolGroupId toolGroupId
); );
referencedDisplaySetRef.current = null; referencedDisplaySetRef.current = null;

View File

@ -36,7 +36,7 @@
"@ohif/extension-cornerstone": "^3.0.0", "@ohif/extension-cornerstone": "^3.0.0",
"@ohif/extension-measurement-tracking": "^3.0.0", "@ohif/extension-measurement-tracking": "^3.0.0",
"@ohif/ui": "^2.0.0", "@ohif/ui": "^2.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
@ -45,7 +45,7 @@
"dependencies": { "dependencies": {
"@babel/runtime": "7.16.3", "@babel/runtime": "7.16.3",
"classnames": "^2.3.2", "classnames": "^2.3.2",
"@cornerstonejs/core": "^0.27.1", "@cornerstonejs/core": "0.30.1",
"@cornerstonejs/tools": "^0.36.3" "@cornerstonejs/tools": "0.39.0"
} }
} }

View File

@ -119,7 +119,7 @@ function _getDisplaySetsFromSeries(
} }
function _load(displaySet, servicesManager, extensionManager) { function _load(displaySet, servicesManager, extensionManager) {
const { DisplaySetService, MeasurementService } = servicesManager.services; const { displaySetService, measurementService } = servicesManager.services;
const dataSources = extensionManager.getDataSources(); const dataSources = extensionManager.getDataSources();
const dataSource = dataSources[0]; const dataSource = dataSources[0];
@ -128,7 +128,7 @@ function _load(displaySet, servicesManager, extensionManager) {
displaySet.referencedImages = _getReferencedImagesList(ContentSequence); displaySet.referencedImages = _getReferencedImagesList(ContentSequence);
displaySet.measurements = _getMeasurements(ContentSequence); displaySet.measurements = _getMeasurements(ContentSequence);
const mappings = MeasurementService.getSourceMappings( const mappings = measurementService.getSourceMappings(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
@ -138,7 +138,7 @@ function _load(displaySet, servicesManager, extensionManager) {
displaySet.isLoaded = true; displaySet.isLoaded = true;
// Check currently added displaySets and add measurements if the sources exist. // Check currently added displaySets and add measurements if the sources exist.
DisplaySetService.activeDisplaySets.forEach(activeDisplaySet => { displaySetService.activeDisplaySets.forEach(activeDisplaySet => {
_checkIfCanAddMeasurementsToDisplaySet( _checkIfCanAddMeasurementsToDisplaySet(
displaySet, displaySet,
activeDisplaySet, activeDisplaySet,
@ -147,8 +147,8 @@ function _load(displaySet, servicesManager, extensionManager) {
}); });
// Subscribe to new displaySets as the source may come in after. // Subscribe to new displaySets as the source may come in after.
DisplaySetService.subscribe( displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_ADDED, displaySetService.EVENTS.DISPLAY_SETS_ADDED,
data => { data => {
const { displaySetsAdded } = data; const { displaySetsAdded } = data;
// If there are still some measurements that have not yet been loaded into cornerstone, // If there are still some measurements that have not yet been loaded into cornerstone,

View File

@ -1,8 +1,8 @@
import { SOPClassHandlerId } from './id'; import { SOPClassHandlerId } from './id';
export default function onModeEnter({ servicesManager }) { export default function onModeEnter({ servicesManager }) {
const { DisplaySetService } = servicesManager.services; const { displaySetService } = servicesManager.services;
const displaySetCache = DisplaySetService.getDisplaySetCache(); const displaySetCache = displaySetService.getDisplaySetCache();
const srDisplaySets = displaySetCache.filter( const srDisplaySets = displaySetCache.filter(
ds => ds.SOPClassHandlerId === SOPClassHandlerId ds => ds.SOPClassHandlerId === SOPClassHandlerId

View File

@ -4,8 +4,8 @@ import { ArrowAnnotateTool } from '@cornerstonejs/tools';
* The reason we are extending ArrowAnnotateTool is to create a new tool for SR * The reason we are extending ArrowAnnotateTool is to create a new tool for SR
* viewport which basically has a different name. This is done since Cornerstone * viewport which basically has a different name. This is done since Cornerstone
* has shifted from creating tool instances for each annotation, and we have ArrowAnnotate * has shifted from creating tool instances for each annotation, and we have ArrowAnnotate
* mappers at the MeasurementService, so if we didn't do this, we would be mapping * mappers at the measurementService, so if we didn't do this, we would be mapping
* the SR annotation to the MeasurementService (since there is a ArrowAnnotateTool mapper), * the SR annotation to the measurementService (since there is a ArrowAnnotateTool mapper),
* but with extending and renaming it, there is not mapper for SRArrowAnnotateTool; hence * but with extending and renaming it, there is not mapper for SRArrowAnnotateTool; hence
* no mapping; hence no new measurement, just temporary ones for the SR viewport. * no mapping; hence no new measurement, just temporary ones for the SR viewport.
*/ */

View File

@ -4,8 +4,8 @@ import { BidirectionalTool } from '@cornerstonejs/tools';
* The reason we are extending BidirectionalTool is to create a new tool for SR * The reason we are extending BidirectionalTool is to create a new tool for SR
* viewport which basically has a different name. This is done since Cornerstone * viewport which basically has a different name. This is done since Cornerstone
* has shifted from creating tool instances for each annotation, and we have Bidirectional * has shifted from creating tool instances for each annotation, and we have Bidirectional
* mappers at the MeasurementService, so if we didn't do this, we would be mapping * mappers at the measurementService, so if we didn't do this, we would be mapping
* the SR annotation to the MeasurementService (since there is a BidirectionalTool mapper), * the SR annotation to the measurementService (since there is a BidirectionalTool mapper),
* but with extending and renaming it, there is not mapper for SRBidirectionalTool; hence * but with extending and renaming it, there is not mapper for SRBidirectionalTool; hence
* no mapping; hence no new measurement, just temporary ones for the SR viewport. * no mapping; hence no new measurement, just temporary ones for the SR viewport.
*/ */

View File

@ -4,8 +4,8 @@ import { EllipticalROITool } from '@cornerstonejs/tools';
* The reason we are extending EllipticalROITool is to create a new tool for SR * The reason we are extending EllipticalROITool is to create a new tool for SR
* viewport which basically has a different name. This is done since Cornerstone * viewport which basically has a different name. This is done since Cornerstone
* has shifted from creating tool instances for each annotation, and we have EllipticalROI * has shifted from creating tool instances for each annotation, and we have EllipticalROI
* mappers at the MeasurementService, so if we didn't do this, we would be mapping * mappers at the measurementService, so if we didn't do this, we would be mapping
* the SR annotation to the MeasurementService (since there is a EllipticalROITool mapper), * the SR annotation to the measurementService (since there is a EllipticalROITool mapper),
* but with extending and renaming it, there is not mapper for SREllipticalROITool; hence * but with extending and renaming it, there is not mapper for SREllipticalROITool; hence
* no mapping; hence no new measurement, just temporary ones for the SR viewport. * no mapping; hence no new measurement, just temporary ones for the SR viewport.
*/ */

View File

@ -4,8 +4,8 @@ import { LengthTool } from '@cornerstonejs/tools';
* The reason we are extending LengthTool is to create a new tool for SR * The reason we are extending LengthTool is to create a new tool for SR
* viewport which basically has a different name. This is done since Cornerstone * viewport which basically has a different name. This is done since Cornerstone
* has shifted from creating tool instances for each annotation, and we have Length * has shifted from creating tool instances for each annotation, and we have Length
* mappers at the MeasurementService, so if we didn't do this, we would be mapping * mappers at the measurementService, so if we didn't do this, we would be mapping
* the SR annotation to the MeasurementService (since there is a LengthTool mapper), * the SR annotation to the measurementService (since there is a LengthTool mapper),
* but with extending and renaming it, there is not mapper for SRLengthTool; hence * but with extending and renaming it, there is not mapper for SRLengthTool; hence
* no mapping; hence no new measurement, just temporary ones for the SR viewport. * no mapping; hence no new measurement, just temporary ones for the SR viewport.
*/ */

View File

@ -1,6 +1,6 @@
/** /**
* Extracts the label from the toolData imported from dcmjs. We need to do this * Extracts the label from the toolData imported from dcmjs. We need to do this
* as dcmjs does not depeend on OHIF/the MeasurementService, it just produces data for cornestoneTools. * as dcmjs does not depeend on OHIF/the measurementService, it just produces data for cornestoneTools.
* This optional data is available for the consumer to process if they wish to. * This optional data is available for the consumer to process if they wish to.
* @param {object} toolData The tooldata relating to the * @param {object} toolData The tooldata relating to the
* *

View File

@ -20,14 +20,14 @@ export default function hydrateStructuredReport(
displaySetInstanceUID displaySetInstanceUID
) { ) {
const dataSource = extensionManager.getActiveDataSource()[0]; const dataSource = extensionManager.getActiveDataSource()[0];
const { MeasurementService, DisplaySetService } = servicesManager.services; const { measurementService, displaySetService } = servicesManager.services;
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
// TODO -> We should define a strict versioning somewhere. // TODO -> We should define a strict versioning somewhere.
const mappings = MeasurementService.getSourceMappings( const mappings = measurementService.getSourceMappings(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
@ -166,7 +166,7 @@ export default function hydrateStructuredReport(
}, },
}; };
const source = MeasurementService.getSource( const source = measurementService.getSource(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
@ -176,7 +176,7 @@ export default function hydrateStructuredReport(
m => m.annotationType === annotationType m => m.annotationType === annotationType
); );
MeasurementService.addRawMeasurement( measurementService.addRawMeasurement(
source, source,
annotationType, annotationType,
{ annotation }, { annotation },

View File

@ -6,11 +6,11 @@ const supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];
const CORNERSTONE_3D_TAG = cornerstoneAdapters.CORNERSTONE_3D_TAG; const CORNERSTONE_3D_TAG = cornerstoneAdapters.CORNERSTONE_3D_TAG;
/** /**
* Checks if the given `displaySet`can be rehydrated into the `MeasurementService`. * Checks if the given `displaySet`can be rehydrated into the `measurementService`.
* *
* @param {object} displaySet The SR `displaySet` to check. * @param {object} displaySet The SR `displaySet` to check.
* @param {object[]} mappings The CornerstoneTools 4 mappings to the `MeasurementService`. * @param {object[]} mappings The CornerstoneTools 4 mappings to the `measurementService`.
* @returns {boolean} True if the SR can be rehydrated into the `MeasurementService`. * @returns {boolean} True if the SR can be rehydrated into the `measurementService`.
*/ */
export default function isRehydratable(displaySet, mappings) { export default function isRehydratable(displaySet, mappings) {
if (!mappings || !mappings.length) { if (!mappings || !mappings.length) {
@ -30,7 +30,7 @@ export default function isRehydratable(displaySet, mappings) {
adapterKeys.forEach(key => { adapterKeys.forEach(key => {
if (mappingDefinitions.includes(key)) { if (mappingDefinitions.includes(key)) {
// Must have both a dcmjs adapter and a MeasurementService // Must have both a dcmjs adapter and a measurementService
// Definition in order to be a candidate for import. // Definition in order to be a candidate for import.
adapters.push(cornerstoneAdapters[key]); adapters.push(cornerstoneAdapters[key]);
} }

View File

@ -36,9 +36,9 @@ function OHIFCornerstoneSRViewport(props) {
const { t } = useTranslation('SRViewport'); const { t } = useTranslation('SRViewport');
const { const {
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
MeasurementService, measurementService,
} = servicesManager.services; } = servicesManager.services;
// SR viewport will always have a single display set // SR viewport will always have a single display set
@ -84,12 +84,12 @@ function OHIFCornerstoneSRViewport(props) {
// if no panels from measurement-tracking extension is used, this code will run // if no panels from measurement-tracking extension is used, this code will run
trackedMeasurements = null; trackedMeasurements = null;
sendTrackedMeasurementsEvent = (eventName, { displaySetInstanceUID }) => { sendTrackedMeasurementsEvent = (eventName, { displaySetInstanceUID }) => {
MeasurementService.clearMeasurements(); measurementService.clearMeasurements();
const { SeriesInstanceUIDs } = hydrateStructuredReport( const { SeriesInstanceUIDs } = hydrateStructuredReport(
{ servicesManager, extensionManager }, { servicesManager, extensionManager },
displaySetInstanceUID displaySetInstanceUID
); );
const displaySets = DisplaySetService.getDisplaySetsForSeries( const displaySets = displaySetService.getDisplaySetsForSeries(
SeriesInstanceUIDs[0] SeriesInstanceUIDs[0]
); );
if (displaySets.length) { if (displaySets.length) {
@ -152,7 +152,7 @@ function OHIFCornerstoneSRViewport(props) {
_getViewportReferencedDisplaySetData( _getViewportReferencedDisplaySetData(
srDisplaySet, srDisplaySet,
newMeasurementSelected, newMeasurementSelected,
DisplaySetService displaySetService
).then(({ referencedDisplaySet, referencedDisplaySetMetadata }) => { ).then(({ referencedDisplaySet, referencedDisplaySetMetadata }) => {
setMeasurementSelected(newMeasurementSelected); setMeasurementSelected(newMeasurementSelected);
setActiveImageDisplaySetData(referencedDisplaySet); setActiveImageDisplaySetData(referencedDisplaySet);
@ -166,13 +166,13 @@ function OHIFCornerstoneSRViewport(props) {
// it means that we have a new referenced display set, and the // it means that we have a new referenced display set, and the
// imageIdIndex will handle it by updating the viewport, but if they // imageIdIndex will handle it by updating the viewport, but if they
// are the same we just need to use MeasurementService to jump to the // are the same we just need to use measurementService to jump to the
// new measurement // new measurement
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
const csViewport = CornerstoneViewportService.getCornerstoneViewport( const csViewport = cornerstoneViewportService.getCornerstoneViewport(
viewportInfo.getViewportId() viewportInfo.getViewportId()
); );
@ -259,8 +259,8 @@ function OHIFCornerstoneSRViewport(props) {
Cleanup the SR viewport when the viewport is destroyed Cleanup the SR viewport when the viewport is destroyed
*/ */
useEffect(() => { useEffect(() => {
const onDisplaySetsRemovedSubscription = DisplaySetService.subscribe( const onDisplaySetsRemovedSubscription = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_REMOVED, displaySetService.EVENTS.DISPLAY_SETS_REMOVED,
({ displaySetInstanceUIDs }) => { ({ displaySetInstanceUIDs }) => {
const activeViewport = viewports[activeViewportIndex]; const activeViewport = viewports[activeViewportIndex];
if ( if (
@ -432,14 +432,14 @@ OHIFCornerstoneSRViewport.defaultProps = {
async function _getViewportReferencedDisplaySetData( async function _getViewportReferencedDisplaySetData(
displaySet, displaySet,
measurementSelected, measurementSelected,
DisplaySetService displaySetService
) { ) {
const { measurements } = displaySet; const { measurements } = displaySet;
const measurement = measurements[measurementSelected]; const measurement = measurements[measurementSelected];
const { displaySetInstanceUID } = measurement; const { displaySetInstanceUID } = measurement;
const referencedDisplaySet = DisplaySetService.getDisplaySetByUID( const referencedDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );

View File

@ -30,7 +30,7 @@
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"@ohif/ui": "^2.0.0", "@ohif/ui": "^2.0.0",
"cornerstone-wado-image-loader": "^4.2.1", "cornerstone-wado-image-loader": "^4.2.1",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
@ -43,10 +43,10 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "7.17.9", "@babel/runtime": "7.17.9",
"@cornerstonejs/adapters": "^0.2.1", "@cornerstonejs/adapters": "0.3.0",
"@cornerstonejs/core": "^0.27.1", "@cornerstonejs/core": "0.30.1",
"@cornerstonejs/streaming-image-volume-loader": "^0.11.2", "@cornerstonejs/streaming-image-volume-loader": "^0.11.2",
"@cornerstonejs/tools": "^0.36.3", "@cornerstonejs/tools": "0.39.0",
"@kitware/vtk.js": "25.9.0", "@kitware/vtk.js": "25.9.0",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"lodash.debounce": "4.0.8", "lodash.debounce": "4.0.8",

View File

@ -116,14 +116,14 @@ const OHIFCornerstoneViewport = React.memo(props => {
const elementRef = useRef(); const elementRef = useRef();
const { const {
MeasurementService, measurementService,
DisplaySetService, displaySetService,
toolbarService, toolbarService,
ToolGroupService, toolGroupService,
SyncGroupService, syncGroupService,
CornerstoneViewportService, cornerstoneViewportService,
CornerstoneCacheService, cornerstoneCacheService,
ViewportGridService, viewportGridService,
} = servicesManager.services; } = servicesManager.services;
// useCallback for scroll bar height calculation // useCallback for scroll bar height calculation
@ -135,13 +135,13 @@ const OHIFCornerstoneViewport = React.memo(props => {
// useCallback for onResize // useCallback for onResize
const onResize = useCallback(() => { const onResize = useCallback(() => {
if (elementRef.current) { if (elementRef.current) {
CornerstoneViewportService.resize(); cornerstoneViewportService.resize();
setImageScrollBarHeight(); setImageScrollBarHeight();
} }
}, [elementRef]); }, [elementRef]);
const cleanUpServices = useCallback(() => { const cleanUpServices = useCallback(() => {
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
@ -153,9 +153,9 @@ const OHIFCornerstoneViewport = React.memo(props => {
const renderingEngineId = viewportInfo.getRenderingEngineId(); const renderingEngineId = viewportInfo.getRenderingEngineId();
const syncGroups = viewportInfo.getSyncGroups(); const syncGroups = viewportInfo.getSyncGroups();
ToolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId); toolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId);
SyncGroupService.removeViewportFromSyncGroup( syncGroupService.removeViewportFromSyncGroup(
viewportId, viewportId,
renderingEngineId, renderingEngineId,
syncGroups syncGroups
@ -170,7 +170,7 @@ const OHIFCornerstoneViewport = React.memo(props => {
} }
const { viewportId, element } = evt.detail; const { viewportId, element } = evt.detail;
const viewportInfo = CornerstoneViewportService.getViewportInfo( const viewportInfo = cornerstoneViewportService.getViewportInfo(
viewportId viewportId
); );
const viewportIndex = viewportInfo.getViewportIndex(); const viewportIndex = viewportInfo.getViewportIndex();
@ -181,13 +181,13 @@ const OHIFCornerstoneViewport = React.memo(props => {
const toolGroupId = viewportInfo.getToolGroupId(); const toolGroupId = viewportInfo.getToolGroupId();
const syncGroups = viewportInfo.getSyncGroups(); const syncGroups = viewportInfo.getSyncGroups();
ToolGroupService.addViewportToToolGroup( toolGroupService.addViewportToToolGroup(
viewportId, viewportId,
renderingEngineId, renderingEngineId,
toolGroupId toolGroupId
); );
SyncGroupService.addViewportToSyncGroup( syncGroupService.addViewportToSyncGroup(
viewportId, viewportId,
renderingEngineId, renderingEngineId,
syncGroups syncGroups
@ -197,12 +197,12 @@ const OHIFCornerstoneViewport = React.memo(props => {
onElementEnabled(evt); onElementEnabled(evt);
} }
}, },
[viewportIndex, onElementEnabled, ToolGroupService] [viewportIndex, onElementEnabled, toolGroupService]
); );
// disable the element upon unmounting // disable the element upon unmounting
useEffect(() => { useEffect(() => {
CornerstoneViewportService.enableViewport( cornerstoneViewportService.enableViewport(
viewportIndex, viewportIndex,
viewportOptions, viewportOptions,
elementRef.current elementRef.current
@ -218,10 +218,10 @@ const OHIFCornerstoneViewport = React.memo(props => {
return () => { return () => {
cleanUpServices(); cleanUpServices();
CornerstoneViewportService.disableElement(viewportIndex); cornerstoneViewportService.disableElement(viewportIndex);
if (onElementDisabled) { if (onElementDisabled) {
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
@ -244,24 +244,24 @@ const OHIFCornerstoneViewport = React.memo(props => {
// Note: this approach does not actually end of sending network requests // Note: this approach does not actually end of sending network requests
// and it uses the network cache // and it uses the network cache
useEffect(() => { useEffect(() => {
const { unsubscribe } = DisplaySetService.subscribe( const { unsubscribe } = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED, displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,
async invalidatedDisplaySetInstanceUID => { async invalidatedDisplaySetInstanceUID => {
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) { if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) {
const viewportData = viewportInfo.getViewportData(); const viewportData = viewportInfo.getViewportData();
const newViewportData = await CornerstoneCacheService.invalidateViewportData( const newViewportData = await cornerstoneCacheService.invalidateViewportData(
viewportData, viewportData,
invalidatedDisplaySetInstanceUID, invalidatedDisplaySetInstanceUID,
dataSource, dataSource,
DisplaySetService displaySetService
); );
const keepCamera = true; const keepCamera = true;
CornerstoneViewportService.updateViewport( cornerstoneViewportService.updateViewport(
viewportIndex, viewportIndex,
newViewportData, newViewportData,
keepCamera keepCamera
@ -281,14 +281,14 @@ const OHIFCornerstoneViewport = React.memo(props => {
} }
const loadViewportData = async () => { const loadViewportData = async () => {
const viewportData = await CornerstoneCacheService.createViewportData( const viewportData = await cornerstoneCacheService.createViewportData(
displaySets, displaySets,
viewportOptions, viewportOptions,
dataSource, dataSource,
initialImageIndex initialImageIndex
); );
CornerstoneViewportService.setViewportData( cornerstoneViewportService.setViewportData(
viewportIndex, viewportIndex,
viewportData, viewportData,
viewportOptions, viewportOptions,
@ -311,23 +311,23 @@ const OHIFCornerstoneViewport = React.memo(props => {
*/ */
useEffect(() => { useEffect(() => {
const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents( const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
elementRef, elementRef,
viewportIndex, viewportIndex,
displaySets, displaySets,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
); );
_checkForCachedJumpToMeasurementEvents( _checkForCachedJumpToMeasurementEvents(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
elementRef, elementRef,
viewportIndex, viewportIndex,
displaySets, displaySets,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
); );
return () => { return () => {
@ -365,19 +365,19 @@ const OHIFCornerstoneViewport = React.memo(props => {
}, areEqual); }, areEqual);
function _subscribeToJumpToMeasurementEvents( function _subscribeToJumpToMeasurementEvents(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
elementRef, elementRef,
viewportIndex, viewportIndex,
displaySets, displaySets,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
) { ) {
const displaysUIDs = displaySets.map( const displaysUIDs = displaySets.map(
displaySet => displaySet.displaySetInstanceUID displaySet => displaySet.displaySetInstanceUID
); );
const { unsubscribe } = MeasurementService.subscribe( const { unsubscribe } = measurementService.subscribe(
MeasurementService.EVENTS.JUMP_TO_MEASUREMENT, measurementService.EVENTS.JUMP_TO_MEASUREMENT,
({ measurement }) => { ({ measurement }) => {
if (!measurement) return; if (!measurement) return;
@ -387,10 +387,10 @@ function _subscribeToJumpToMeasurementEvents(
measurement, measurement,
elementRef, elementRef,
viewportIndex, viewportIndex,
MeasurementService, measurementService,
DisplaySetService, displaySetService,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
); );
} }
} }
@ -401,25 +401,25 @@ function _subscribeToJumpToMeasurementEvents(
// Check if there is a queued jumpToMeasurement event // Check if there is a queued jumpToMeasurement event
function _checkForCachedJumpToMeasurementEvents( function _checkForCachedJumpToMeasurementEvents(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
elementRef, elementRef,
viewportIndex, viewportIndex,
displaySets, displaySets,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
) { ) {
const displaysUIDs = displaySets.map( const displaysUIDs = displaySets.map(
displaySet => displaySet.displaySetInstanceUID displaySet => displaySet.displaySetInstanceUID
); );
const measurementIdToJumpTo = MeasurementService.getJumpToMeasurement( const measurementIdToJumpTo = measurementService.getJumpToMeasurement(
viewportIndex viewportIndex
); );
if (measurementIdToJumpTo && elementRef) { if (measurementIdToJumpTo && elementRef) {
// Jump to measurement if the measurement exists // Jump to measurement if the measurement exists
const measurement = MeasurementService.getMeasurement( const measurement = measurementService.getMeasurement(
measurementIdToJumpTo measurementIdToJumpTo
); );
@ -428,10 +428,10 @@ function _checkForCachedJumpToMeasurementEvents(
measurement, measurement,
elementRef, elementRef,
viewportIndex, viewportIndex,
MeasurementService, measurementService,
DisplaySetService, displaySetService,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
); );
} }
} }
@ -441,10 +441,10 @@ function _jumpToMeasurement(
measurement, measurement,
targetElementRef, targetElementRef,
viewportIndex, viewportIndex,
MeasurementService, measurementService,
DisplaySetService, displaySetService,
ViewportGridService, viewportGridService,
CornerstoneViewportService cornerstoneViewportService
) { ) {
const targetElement = targetElementRef.current; const targetElement = targetElementRef.current;
const { displaySetInstanceUID, SOPInstanceUID, frameNumber } = measurement; const { displaySetInstanceUID, SOPInstanceUID, frameNumber } = measurement;
@ -453,7 +453,7 @@ function _jumpToMeasurement(
console.warn('cannot jump in a non-acquisition plane measurements yet'); console.warn('cannot jump in a non-acquisition plane measurements yet');
} }
const referencedDisplaySet = DisplaySetService.getDisplaySetByUID( const referencedDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -461,11 +461,11 @@ function _jumpToMeasurement(
// to set it properly // to set it properly
// setCornerstoneMeasurementActive(measurement); // setCornerstoneMeasurementActive(measurement);
ViewportGridService.setActiveViewportIndex(viewportIndex); viewportGridService.setActiveViewportIndex(viewportIndex);
const enableElement = getEnabledElement(targetElement); const enableElement = getEnabledElement(targetElement);
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
@ -520,7 +520,7 @@ function _jumpToMeasurement(
cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid); cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);
// Jump to measurement consumed, remove. // Jump to measurement consumed, remove.
MeasurementService.removeJumpToMeasurement(viewportIndex); measurementService.removeJumpToMeasurement(viewportIndex);
} }
} }

View File

@ -7,7 +7,7 @@ import ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndic
function CornerstoneOverlays(props) { function CornerstoneOverlays(props) {
const { viewportIndex, element, scrollbarHeight, servicesManager } = props; const { viewportIndex, element, scrollbarHeight, servicesManager } = props;
const { CornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [imageSliceData, setImageSliceData] = useState({ const [imageSliceData, setImageSliceData] = useState({
imageIndex: 0, imageIndex: 0,
numberOfSlices: 0, numberOfSlices: 0,
@ -15,8 +15,8 @@ function CornerstoneOverlays(props) {
const [viewportData, setViewportData] = useState(null); const [viewportData, setViewportData] = useState(null);
useEffect(() => { useEffect(() => {
const { unsubscribe } = CornerstoneViewportService.subscribe( const { unsubscribe } = cornerstoneViewportService.subscribe(
CornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED, cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED,
props => { props => {
if (props.viewportIndex !== viewportIndex) { if (props.viewportIndex !== viewportIndex) {
return; return;
@ -36,7 +36,7 @@ function CornerstoneOverlays(props) {
} }
if (viewportData) { if (viewportData) {
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );

View File

@ -16,16 +16,16 @@ function CornerstoneImageScrollbar({
}) { }) {
const { const {
cineService, cineService,
CornerstoneViewportService, cornerstoneViewportService,
} = (servicesManager as ServicesManger).services; } = (servicesManager as ServicesManger).services;
const onImageScrollbarChange = (imageIndex, viewportIndex) => { const onImageScrollbarChange = (imageIndex, viewportIndex) => {
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
const viewportId = viewportInfo.getViewportId(); const viewportId = viewportInfo.getViewportId();
const viewport = CornerstoneViewportService.getCornerstoneViewport( const viewport = cornerstoneViewportService.getCornerstoneViewport(
viewportId viewportId
); );
@ -48,7 +48,7 @@ function CornerstoneImageScrollbar({
return; return;
} }
const viewport = CornerstoneViewportService.getCornerstoneViewportByIndex( const viewport = cornerstoneViewportService.getCornerstoneViewportByIndex(
viewportIndex viewportIndex
); );

View File

@ -30,7 +30,7 @@ function ViewportOrientationMarkers({
const [rotation, setRotation] = useState(0); const [rotation, setRotation] = useState(0);
const [flipHorizontal, setFlipHorizontal] = useState(false); const [flipHorizontal, setFlipHorizontal] = useState(false);
const [flipVertical, setFlipVertical] = useState(false); const [flipVertical, setFlipVertical] = useState(false);
const { CornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
useEffect(() => { useEffect(() => {
const cameraModifiedListener = ( const cameraModifiedListener = (
@ -114,7 +114,7 @@ function ViewportOrientationMarkers({
flipHorizontal flipHorizontal
); );
const ohifViewport = CornerstoneViewportService.getViewportInfoByIndex( const ohifViewport = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );

View File

@ -15,7 +15,7 @@ function CornerstoneViewportOverlay({
servicesManager, servicesManager,
}) { }) {
const { const {
CornerstoneViewportService, cornerstoneViewportService,
toolbarService, toolbarService,
} = servicesManager.services; } = servicesManager.services;
const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null }); const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null });
@ -86,7 +86,7 @@ function CornerstoneViewportOverlay({
previousCamera.parallelScale !== camera.parallelScale || previousCamera.parallelScale !== camera.parallelScale ||
previousCamera.scale !== camera.scale previousCamera.scale !== camera.scale
) { ) {
const viewport = CornerstoneViewportService.getCornerstoneViewportByIndex( const viewport = cornerstoneViewportService.getCornerstoneViewportByIndex(
viewportIndex viewportIndex
); );
@ -169,7 +169,7 @@ function CornerstoneViewportOverlay({
viewportData, viewportData,
imageIndex, imageIndex,
viewportIndex, viewportIndex,
CornerstoneViewportService cornerstoneViewportService
); );
} }
@ -189,7 +189,7 @@ function CornerstoneViewportOverlay({
return null; return null;
} }
const ohifViewport = CornerstoneViewportService.getViewportInfoByIndex( const ohifViewport = cornerstoneViewportService.getViewportInfoByIndex(
viewportIndex viewportIndex
); );
@ -241,7 +241,7 @@ function _getInstanceNumberFromVolume(
viewportData, viewportData,
imageIndex, imageIndex,
viewportIndex, viewportIndex,
CornerstoneViewportService cornerstoneViewportService
) { ) {
const volumes = viewportData.volumes; const volumes = viewportData.volumes;
@ -253,7 +253,7 @@ function _getInstanceNumberFromVolume(
const volume = volumes[0]; const volume = volumes[0];
const { direction, imageIds } = volume; const { direction, imageIds } = volume;
const cornerstoneViewport = CornerstoneViewportService.getCornerstoneViewportByIndex( const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewportByIndex(
viewportIndex viewportIndex
); );
@ -288,7 +288,7 @@ CornerstoneViewportOverlay.propTypes = {
viewportData: PropTypes.object, viewportData: PropTypes.object,
imageIndex: PropTypes.number, imageIndex: PropTypes.number,
viewportIndex: PropTypes.number, viewportIndex: PropTypes.number,
servicesManager: ServicesManager, servicesManager: PropTypes.instanceOf(ServicesManager),
}; };
export default CornerstoneViewportOverlay; export default CornerstoneViewportOverlay;

View File

@ -21,18 +21,18 @@ import toggleStackImageSync from './utils/stackSync/toggleStackImageSync';
const commandsModule = ({ servicesManager }) => { const commandsModule = ({ servicesManager }) => {
const { const {
ViewportGridService, viewportGridService,
ToolGroupService, toolGroupService,
cineService, cineService,
toolbarService, toolbarService,
UIDialogService, uiDialogService,
CornerstoneViewportService, cornerstoneViewportService,
HangingProtocolService, hangingProtocolService,
UINotificationService, uiNotificationService,
} = (servicesManager as ServicesManager).services; } = (servicesManager as ServicesManager).services;
function _getActiveViewportEnabledElement() { function _getActiveViewportEnabledElement() {
const { activeViewportIndex } = ViewportGridService.getState(); const { activeViewportIndex } = viewportGridService.getState();
const { element } = OHIFgetEnabledElement(activeViewportIndex) || {}; const { element } = OHIFgetEnabledElement(activeViewportIndex) || {};
const enabledElement = getEnabledElement(element); const enabledElement = getEnabledElement(element);
return enabledElement; return enabledElement;
@ -68,7 +68,7 @@ const commandsModule = ({ servicesManager }) => {
toolGroupIdToUse = toolGroup.id; toolGroupIdToUse = toolGroup.id;
} }
const toolGroup = ToolGroupService.getToolGroup(toolGroupIdToUse); const toolGroup = toolGroupService.getToolGroup(toolGroupIdToUse);
return toolGroup; return toolGroup;
} }
@ -77,7 +77,7 @@ const commandsModule = ({ servicesManager }) => {
return _getActiveViewportEnabledElement(); return _getActiveViewportEnabledElement();
}, },
setViewportActive: ({ viewportId }) => { setViewportActive: ({ viewportId }) => {
const viewportInfo = CornerstoneViewportService.getViewportInfo( const viewportInfo = cornerstoneViewportService.getViewportInfo(
viewportId viewportId
); );
if (!viewportInfo) { if (!viewportInfo) {
@ -86,13 +86,13 @@ const commandsModule = ({ servicesManager }) => {
} }
const viewportIndex = viewportInfo.getViewportIndex(); const viewportIndex = viewportInfo.getViewportIndex();
ViewportGridService.setActiveViewportIndex(viewportIndex); viewportGridService.setActiveViewportIndex(viewportIndex);
}, },
arrowTextCallback: ({ callback, data }) => { arrowTextCallback: ({ callback, data }) => {
callInputDialog(UIDialogService, data, callback); callInputDialog(uiDialogService, data, callback);
}, },
toggleCine: () => { toggleCine: () => {
const { viewports } = ViewportGridService.getState(); const { viewports } = viewportGridService.getState();
const { isCineEnabled } = cineService.getState(); const { isCineEnabled } = cineService.getState();
cineService.setIsCineEnabled(!isCineEnabled); cineService.setIsCineEnabled(!isCineEnabled);
toolbarService.setButton('Cine', { props: { isActive: !isCineEnabled } }); toolbarService.setButton('Cine', { props: { isActive: !isCineEnabled } });
@ -106,7 +106,7 @@ const commandsModule = ({ servicesManager }) => {
const windowCenterNum = Number(level); const windowCenterNum = Number(level);
const { viewportId } = _getActiveViewportEnabledElement(); const { viewportId } = _getActiveViewportEnabledElement();
const viewportToolGroupId = ToolGroupService.getToolGroupForViewport( const viewportToolGroupId = toolGroupService.getToolGroupForViewport(
viewportId viewportId
); );
@ -115,7 +115,7 @@ const commandsModule = ({ servicesManager }) => {
} }
// get actor from the viewport // get actor from the viewport
const renderingEngine = CornerstoneViewportService.getRenderingEngine(); const renderingEngine = cornerstoneViewportService.getRenderingEngine();
const viewport = renderingEngine.getViewport(viewportId); const viewport = renderingEngine.getViewport(viewportId);
const { lower, upper } = csUtils.windowLevel.toLowHighRange( const { lower, upper } = csUtils.windowLevel.toLowHighRange(
@ -136,7 +136,7 @@ const commandsModule = ({ servicesManager }) => {
const activeViewportToolGroup = _getToolGroup(null); const activeViewportToolGroup = _getToolGroup(null);
if (!activeViewportToolGroup._toolInstances.Crosshairs) { if (!activeViewportToolGroup._toolInstances.Crosshairs) {
UINotificationService.show({ uiNotificationService.show({
title: 'Crosshairs', title: 'Crosshairs',
message: message:
'You need to be in a MPR view to use Crosshairs. Click on MPR button in the toolbar to activate it.', 'You need to be in a MPR view to use Crosshairs. Click on MPR button in the toolbar to activate it.',
@ -148,7 +148,7 @@ const commandsModule = ({ servicesManager }) => {
} }
} }
const { viewports } = ViewportGridService.getState() || { const { viewports } = viewportGridService.getState() || {
viewports: [], viewports: [],
}; };
@ -195,7 +195,7 @@ const commandsModule = ({ servicesManager }) => {
}); });
}, },
showDownloadViewportModal: () => { showDownloadViewportModal: () => {
const { activeViewportIndex } = ViewportGridService.getState(); const { activeViewportIndex } = viewportGridService.getState();
const { UIModalService } = servicesManager.services; const { UIModalService } = servicesManager.services;
if (UIModalService) { if (UIModalService) {
@ -205,7 +205,7 @@ const commandsModule = ({ servicesManager }) => {
contentProps: { contentProps: {
activeViewportIndex, activeViewportIndex,
onClose: UIModalService.hide, onClose: UIModalService.hide,
CornerstoneViewportService, cornerstoneViewportService,
}, },
}); });
} }
@ -378,7 +378,7 @@ const commandsModule = ({ servicesManager }) => {
colormap, colormap,
immediate = false, immediate = false,
}) => { }) => {
const viewport = CornerstoneViewportService.getCornerstoneViewportByIndex( const viewport = cornerstoneViewportService.getCornerstoneViewportByIndex(
viewportIndex viewportIndex
); );
@ -397,18 +397,18 @@ const commandsModule = ({ servicesManager }) => {
} }
}, },
incrementActiveViewport: () => { incrementActiveViewport: () => {
const { activeViewportIndex, viewports } = ViewportGridService.getState(); const { activeViewportIndex, viewports } = viewportGridService.getState();
const nextViewportIndex = (activeViewportIndex + 1) % viewports.length; const nextViewportIndex = (activeViewportIndex + 1) % viewports.length;
ViewportGridService.setActiveViewportIndex(nextViewportIndex); viewportGridService.setActiveViewportIndex(nextViewportIndex);
}, },
decrementActiveViewport: () => { decrementActiveViewport: () => {
const { activeViewportIndex, viewports } = ViewportGridService.getState(); const { activeViewportIndex, viewports } = viewportGridService.getState();
const nextViewportIndex = const nextViewportIndex =
(activeViewportIndex - 1 + viewports.length) % viewports.length; (activeViewportIndex - 1 + viewports.length) % viewports.length;
ViewportGridService.setActiveViewportIndex(nextViewportIndex); viewportGridService.setActiveViewportIndex(nextViewportIndex);
}, },
setHangingProtocol: ({ protocolId }) => { setHangingProtocol: ({ protocolId }) => {
HangingProtocolService.setProtocol(protocolId); hangingProtocolService.setProtocol(protocolId);
}, },
toggleMPR: ({ toggledState }) => { toggleMPR: ({ toggledState }) => {
toggleMPRHangingProtocol({ toggleMPRHangingProtocol({
@ -425,13 +425,13 @@ const commandsModule = ({ servicesManager }) => {
}); });
}, },
toggleReferenceLines: ({ toggledState }) => { toggleReferenceLines: ({ toggledState }) => {
const { activeViewportIndex } = ViewportGridService.getState(); const { activeViewportIndex } = viewportGridService.getState();
const viewportInfo = CornerstoneViewportService.getViewportInfoByIndex( const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(
activeViewportIndex activeViewportIndex
); );
const viewportId = viewportInfo.getViewportId(); const viewportId = viewportInfo.getViewportId();
const toolGroup = ToolGroupService.getToolGroupForViewport(viewportId); const toolGroup = toolGroupService.getToolGroupForViewport(viewportId);
if (!toggledState) { if (!toggledState) {
toolGroup.setToolDisabled(ReferenceLinesTool.toolName); toolGroup.setToolDisabled(ReferenceLinesTool.toolName);

View File

@ -7,6 +7,8 @@ import {
imageRetrievalPoolManager, imageRetrievalPoolManager,
} from '@cornerstonejs/core'; } from '@cornerstonejs/core';
import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools'; import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools';
import { Types } from '@ohif/core';
import init from './init'; import init from './init';
import commandsModule from './commandsModule'; import commandsModule from './commandsModule';
import getHangingProtocolModule from './getHangingProtocolModule'; import getHangingProtocolModule from './getHangingProtocolModule';
@ -41,7 +43,7 @@ const OHIFCornerstoneViewport = props => {
/** /**
* *
*/ */
const cornerstoneExtension = { const cornerstoneExtension: Types.Extensions.Extension = {
/** /**
* Only required property. Should be a unique value across all extensions. * Only required property. Should be a unique value across all extensions.
*/ */
@ -71,13 +73,18 @@ const cornerstoneExtension = {
configuration = {}, configuration = {},
appConfig, appConfig,
}) { }) {
// Todo: we should be consistent with how services get registered. Use REGISTRATION static method for all
servicesManager.registerService( servicesManager.registerService(
CornerstoneViewportService(servicesManager) CornerstoneViewportService(servicesManager)
); );
servicesManager.registerService(ToolGroupService(servicesManager)); servicesManager.registerService(
ToolGroupService.REGISTRATION(servicesManager)
);
servicesManager.registerService(SyncGroupService(servicesManager)); servicesManager.registerService(SyncGroupService(servicesManager));
servicesManager.registerService(SegmentationService(servicesManager)); servicesManager.registerService(SegmentationService(servicesManager));
servicesManager.registerService(CornerstoneCacheService(servicesManager)); servicesManager.registerService(
CornerstoneCacheService.REGISTRATION(servicesManager)
);
await init({ servicesManager, commandsManager, configuration, appConfig }); await init({ servicesManager, commandsManager, configuration, appConfig });
}, },

View File

@ -63,22 +63,22 @@ export default async function init({
const { const {
UserAuthenticationService, UserAuthenticationService,
MeasurementService, measurementService,
DisplaySetService, displaySetService,
UIDialogService, uiDialogService,
UIModalService, UIModalService,
UINotificationService, uiNotificationService,
cineService, cineService,
CornerstoneViewportService, cornerstoneViewportService,
HangingProtocolService, hangingProtocolService,
ToolGroupService, toolGroupService,
ViewportGridService, viewportGridService,
} = servicesManager.services; } = servicesManager.services;
window.services = servicesManager.services; window.services = servicesManager.services;
if (!window.crossOriginIsolated) { if (!window.crossOriginIsolated) {
UINotificationService.show({ uiNotificationService.show({
title: 'Cross Origin Isolation', title: 'Cross Origin Isolation',
message: message:
'Cross Origin Isolation is not enabled, volume rendering will not work (e.g., MPR)', 'Cross Origin Isolation is not enabled, volume rendering will not work (e.g., MPR)',
@ -87,7 +87,7 @@ export default async function init({
} }
if (cornerstone.getShouldUseCPURendering()) { if (cornerstone.getShouldUseCPURendering()) {
_showCPURenderingModal(UIModalService, HangingProtocolService); _showCPURenderingModal(UIModalService, hangingProtocolService);
} }
const labelmapRepresentation = const labelmapRepresentation =
@ -110,15 +110,15 @@ export default async function init({
cornerstoneStreamingImageVolumeLoader cornerstoneStreamingImageVolumeLoader
); );
HangingProtocolService.registerImageLoadStrategy( hangingProtocolService.registerImageLoadStrategy(
'interleaveCenter', 'interleaveCenter',
interleaveCenterLoader interleaveCenterLoader
); );
HangingProtocolService.registerImageLoadStrategy( hangingProtocolService.registerImageLoadStrategy(
'interleaveTopToBottom', 'interleaveTopToBottom',
interleaveTopToBottom interleaveTopToBottom
); );
HangingProtocolService.registerImageLoadStrategy('nth', nthLoader); hangingProtocolService.registerImageLoadStrategy('nth', nthLoader);
metaData.addProvider(metadataProvider.get.bind(metadataProvider), 9999); metaData.addProvider(metadataProvider.get.bind(metadataProvider), 9999);
@ -132,9 +132,9 @@ export default async function init({
/* Measurement Service */ /* Measurement Service */
const measurementServiceSource = connectToolsToMeasurementService( const measurementServiceSource = connectToolsToMeasurementService(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
); );
initCineService(cineService); initCineService(cineService);
@ -145,7 +145,7 @@ export default async function init({
}); });
const onRightClick = event => { const onRightClick = event => {
if (!UIDialogService) { if (!uiDialogService) {
console.warn('Unable to show dialog; no UI Dialog Service available.'); console.warn('Unable to show dialog; no UI Dialog Service available.');
return; return;
} }
@ -172,15 +172,15 @@ export default async function init({
CONTEXT_MENU_OPEN = true; CONTEXT_MENU_OPEN = true;
UIDialogService.dismiss({ id: 'context-menu' }); uiDialogService.dismiss({ id: 'context-menu' });
UIDialogService.create({ uiDialogService.create({
id: 'context-menu', id: 'context-menu',
isDraggable: false, isDraggable: false,
preservePosition: false, preservePosition: false,
defaultPosition: _getDefaultPosition(event.detail), defaultPosition: _getDefaultPosition(event.detail),
content: ContextMenuMeasurements, content: ContextMenuMeasurements,
onClickOutside: () => { onClickOutside: () => {
UIDialogService.dismiss({ id: 'context-menu' }); uiDialogService.dismiss({ id: 'context-menu' });
CONTEXT_MENU_OPEN = false; CONTEXT_MENU_OPEN = false;
}, },
contentProps: { contentProps: {
@ -200,15 +200,15 @@ export default async function init({
}, },
onClose: () => { onClose: () => {
CONTEXT_MENU_OPEN = false; CONTEXT_MENU_OPEN = false;
UIDialogService.dismiss({ id: 'context-menu' }); uiDialogService.dismiss({ id: 'context-menu' });
}, },
onSetLabel: item => { onSetLabel: item => {
const { annotationUID } = item.value; const { annotationUID } = item.value;
const measurement = MeasurementService.getMeasurement(annotationUID); const measurement = measurementService.getMeasurement(annotationUID);
callInputDialog( callInputDialog(
UIDialogService, uiDialogService,
measurement, measurement,
(label, actionId) => { (label, actionId) => {
if (actionId === 'cancel') { if (actionId === 'cancel') {
@ -219,7 +219,7 @@ export default async function init({
label, label,
}); });
MeasurementService.update( measurementService.update(
updatedMeasurement.uid, updatedMeasurement.uid,
updatedMeasurement, updatedMeasurement,
true true
@ -235,27 +235,27 @@ export default async function init({
}; };
const resetContextMenu = () => { const resetContextMenu = () => {
if (!UIDialogService) { if (!uiDialogService) {
console.warn('Unable to show dialog; no UI Dialog Service available.'); console.warn('Unable to show dialog; no UI Dialog Service available.');
return; return;
} }
CONTEXT_MENU_OPEN = false; CONTEXT_MENU_OPEN = false;
UIDialogService.dismiss({ id: 'context-menu' }); uiDialogService.dismiss({ id: 'context-menu' });
}; };
// When a custom image load is performed, update the relevant viewports // When a custom image load is performed, update the relevant viewports
HangingProtocolService.subscribe( hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.CUSTOM_IMAGE_LOAD_PERFORMED, hangingProtocolService.EVENTS.CUSTOM_IMAGE_LOAD_PERFORMED,
volumeInputArrayMap => { volumeInputArrayMap => {
for (const entry of volumeInputArrayMap.entries()) { for (const entry of volumeInputArrayMap.entries()) {
const [viewportId, volumeInputArray] = entry; const [viewportId, volumeInputArray] = entry;
const viewport = CornerstoneViewportService.getCornerstoneViewport( const viewport = cornerstoneViewportService.getCornerstoneViewport(
viewportId viewportId
); );
CornerstoneViewportService.setVolumesForViewport( cornerstoneViewportService.setVolumesForViewport(
viewport, viewport,
volumeInputArray volumeInputArray
); );
@ -356,11 +356,11 @@ export default async function init({
elementDisabledHandler.bind(null) elementDisabledHandler.bind(null)
); );
ViewportGridService.subscribe( viewportGridService.subscribe(
ViewportGridService.EVENTS.ACTIVE_VIEWPORT_INDEX_CHANGED, viewportGridService.EVENTS.ACTIVE_VIEWPORT_INDEX_CHANGED,
({ viewportIndex }) => { ({ viewportIndex }) => {
const viewportId = `viewport-${viewportIndex}`; const viewportId = `viewport-${viewportIndex}`;
const toolGroup = ToolGroupService.getToolGroupForViewport(viewportId); const toolGroup = toolGroupService.getToolGroupForViewport(viewportId);
if (!toolGroup || !toolGroup._toolInstances?.['ReferenceLines']) { if (!toolGroup || !toolGroup._toolInstances?.['ReferenceLines']) {
return; return;
@ -403,7 +403,7 @@ function CPUModal() {
); );
} }
function _showCPURenderingModal(UIModalService, HangingProtocolService) { function _showCPURenderingModal(UIModalService, hangingProtocolService) {
const callback = progress => { const callback = progress => {
if (progress === 100) { if (progress === 100) {
UIModalService.show({ UIModalService.show({
@ -415,8 +415,8 @@ function _showCPURenderingModal(UIModalService, HangingProtocolService) {
} }
}; };
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.HANGING_PROTOCOL_APPLIED_FOR_VIEWPORT, hangingProtocolService.EVENTS.HANGING_PROTOCOL_APPLIED_FOR_VIEWPORT,
({ progress }) => { ({ progress }) => {
const done = callback(progress); const done = callback(progress);

View File

@ -13,9 +13,9 @@ const CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';
const CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1'; const CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';
const initMeasurementService = ( const initMeasurementService = (
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
) => { ) => {
/* Initialization */ /* Initialization */
const { const {
@ -24,17 +24,17 @@ const initMeasurementService = (
EllipticalROI, EllipticalROI,
ArrowAnnotate, ArrowAnnotate,
} = measurementServiceMappingsFactory( } = measurementServiceMappingsFactory(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
); );
const csTools3DVer1MeasurementSource = MeasurementService.createSource( const csTools3DVer1MeasurementSource = measurementService.createSource(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
/* Mappings */ /* Mappings */
MeasurementService.addMapping( measurementService.addMapping(
csTools3DVer1MeasurementSource, csTools3DVer1MeasurementSource,
'Length', 'Length',
Length.matchingCriteria, Length.matchingCriteria,
@ -42,7 +42,7 @@ const initMeasurementService = (
Length.toMeasurement Length.toMeasurement
); );
MeasurementService.addMapping( measurementService.addMapping(
csTools3DVer1MeasurementSource, csTools3DVer1MeasurementSource,
'Bidirectional', 'Bidirectional',
Bidirectional.matchingCriteria, Bidirectional.matchingCriteria,
@ -50,7 +50,7 @@ const initMeasurementService = (
Bidirectional.toMeasurement Bidirectional.toMeasurement
); );
MeasurementService.addMapping( measurementService.addMapping(
csTools3DVer1MeasurementSource, csTools3DVer1MeasurementSource,
'EllipticalROI', 'EllipticalROI',
EllipticalROI.matchingCriteria, EllipticalROI.matchingCriteria,
@ -58,7 +58,7 @@ const initMeasurementService = (
EllipticalROI.toMeasurement EllipticalROI.toMeasurement
); );
MeasurementService.addMapping( measurementService.addMapping(
csTools3DVer1MeasurementSource, csTools3DVer1MeasurementSource,
'ArrowAnnotate', 'ArrowAnnotate',
ArrowAnnotate.matchingCriteria, ArrowAnnotate.matchingCriteria,
@ -70,18 +70,18 @@ const initMeasurementService = (
}; };
const connectToolsToMeasurementService = ( const connectToolsToMeasurementService = (
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
) => { ) => {
const csTools3DVer1MeasurementSource = initMeasurementService( const csTools3DVer1MeasurementSource = initMeasurementService(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
); );
connectMeasurementServiceToTools( connectMeasurementServiceToTools(
MeasurementService, measurementService,
CornerstoneViewportService, cornerstoneViewportService,
csTools3DVer1MeasurementSource csTools3DVer1MeasurementSource
); );
const { annotationToMeasurement, remove } = csTools3DVer1MeasurementSource; const { annotationToMeasurement, remove } = csTools3DVer1MeasurementSource;
@ -113,7 +113,7 @@ const connectToolsToMeasurementService = (
} = annotationModifiedEventDetail; } = annotationModifiedEventDetail;
// If the measurement hasn't been added, don't modify it // If the measurement hasn't been added, don't modify it
const measurement = MeasurementService.getMeasurement(annotationUID); const measurement = measurementService.getMeasurement(annotationUID);
if (!measurement) { if (!measurement) {
return; return;
@ -138,13 +138,13 @@ const connectToolsToMeasurementService = (
if (removedSelectedAnnotationUIDs) { if (removedSelectedAnnotationUIDs) {
removedSelectedAnnotationUIDs.forEach(annotationUID => removedSelectedAnnotationUIDs.forEach(annotationUID =>
MeasurementService.setMeasurementSelected(annotationUID, false) measurementService.setMeasurementSelected(annotationUID, false)
); );
} }
if (addedSelectedAnnotationUIDs) { if (addedSelectedAnnotationUIDs) {
addedSelectedAnnotationUIDs.forEach(annotationUID => addedSelectedAnnotationUIDs.forEach(annotationUID =>
MeasurementService.setMeasurementSelected(annotationUID, true) measurementService.setMeasurementSelected(annotationUID, true)
); );
} }
} catch (error) { } catch (error) {
@ -166,7 +166,7 @@ const connectToolsToMeasurementService = (
annotation: { annotationUID }, annotation: { annotationUID },
} = annotationRemovedEventDetail; } = annotationRemovedEventDetail;
const measurement = MeasurementService.getMeasurement(annotationUID); const measurement = measurementService.getMeasurement(annotationUID);
if (measurement) { if (measurement) {
console.log('~~ removeEvt', csToolsEvent); console.log('~~ removeEvt', csToolsEvent);
@ -198,8 +198,8 @@ const connectToolsToMeasurementService = (
}; };
const connectMeasurementServiceToTools = ( const connectMeasurementServiceToTools = (
MeasurementService, measurementService,
CornerstoneViewportService, cornerstoneViewportService,
measurementSource measurementSource
) => { ) => {
const { const {
@ -207,14 +207,14 @@ const connectMeasurementServiceToTools = (
MEASUREMENTS_CLEARED, MEASUREMENTS_CLEARED,
MEASUREMENT_UPDATED, MEASUREMENT_UPDATED,
RAW_MEASUREMENT_ADDED, RAW_MEASUREMENT_ADDED,
} = MeasurementService.EVENTS; } = measurementService.EVENTS;
const csTools3DVer1MeasurementSource = MeasurementService.getSource( const csTools3DVer1MeasurementSource = measurementService.getSource(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
MeasurementService.subscribe(MEASUREMENTS_CLEARED, ({ measurements }) => { measurementService.subscribe(MEASUREMENTS_CLEARED, ({ measurements }) => {
if (!Object.keys(measurements).length) { if (!Object.keys(measurements).length) {
return; return;
} }
@ -229,7 +229,7 @@ const connectMeasurementServiceToTools = (
} }
}); });
MeasurementService.subscribe( measurementService.subscribe(
MEASUREMENT_UPDATED, MEASUREMENT_UPDATED,
({ source, measurement, notYetUpdatedAtSource }) => { ({ source, measurement, notYetUpdatedAtSource }) => {
if (source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) { if (source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) {
@ -263,7 +263,7 @@ const connectMeasurementServiceToTools = (
} }
); );
MeasurementService.subscribe( measurementService.subscribe(
RAW_MEASUREMENT_ADDED, RAW_MEASUREMENT_ADDED,
({ source, measurement, data, dataSource }) => { ({ source, measurement, data, dataSource }) => {
if (source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) { if (source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) {
@ -316,14 +316,14 @@ const connectMeasurementServiceToTools = (
} }
); );
MeasurementService.subscribe( measurementService.subscribe(
MEASUREMENT_REMOVED, MEASUREMENT_REMOVED,
({ source, measurement: removedMeasurementId }) => { ({ source, measurement: removedMeasurementId }) => {
if (source?.name && source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) { if (source?.name && source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) {
return; return;
} }
removeAnnotation(removedMeasurementId); removeAnnotation(removedMeasurementId);
const renderingEngine = CornerstoneViewportService.getRenderingEngine(); const renderingEngine = cornerstoneViewportService.getRenderingEngine();
// Note: We could do a better job by triggering the render on the // Note: We could do a better job by triggering the render on the
// viewport itself, but the removeAnnotation does not include that info... // viewport itself, but the removeAnnotation does not include that info...
renderingEngine.render(); renderingEngine.render();

View File

@ -1,5 +1,5 @@
import { ServicesManager } from '@ohif/core';
import { cache as cs3DCache, Enums, volumeLoader } from '@cornerstonejs/core'; import { cache as cs3DCache, Enums, volumeLoader } from '@cornerstonejs/core';
import { utils } from '@ohif/core';
import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType'; import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType';
import { import {
@ -10,6 +10,16 @@ import {
const VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume'; const VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume';
class CornerstoneCacheService { class CornerstoneCacheService {
static REGISTRATION = (serviceManager: ServicesManager) => {
return {
name: 'cornerstoneCacheService',
altName: 'CornerstoneCacheService',
create: ({ configuration = {} }) => {
return new CornerstoneCacheService(serviceManager);
},
};
};
stackImageIds: Map<string, string[]> = new Map(); stackImageIds: Map<string, string[]> = new Map();
volumeImageIds: Map<string, string[]> = new Map(); volumeImageIds: Map<string, string[]> = new Map();
@ -69,7 +79,7 @@ class CornerstoneCacheService {
viewportData: VolumeViewportData, viewportData: VolumeViewportData,
invalidatedDisplaySetInstanceUID: string, invalidatedDisplaySetInstanceUID: string,
dataSource, dataSource,
DisplaySetService displaySetService
) { ) {
if (viewportData.viewportType === Enums.ViewportType.STACK) { if (viewportData.viewportType === Enums.ViewportType.STACK) {
throw new Error('Invalidation of StackViewport is not supported yet'); throw new Error('Invalidation of StackViewport is not supported yet');
@ -85,7 +95,7 @@ class CornerstoneCacheService {
} }
const displaySets = viewportData.data.map(({ displaySetInstanceUID }) => const displaySets = viewportData.data.map(({ displaySetInstanceUID }) =>
DisplaySetService.getDisplaySetByUID(displaySetInstanceUID) displaySetService.getDisplaySetByUID(displaySetInstanceUID)
); );
const newViewportData = await this._getVolumeViewportData( const newViewportData = await this._getVolumeViewportData(
@ -203,7 +213,7 @@ class CornerstoneCacheService {
} }
private _shouldRenderSegmentation(displaySets) { private _shouldRenderSegmentation(displaySets) {
const { SegmentationService } = this.servicesManager.services; const { segmentationService } = this.servicesManager.services;
const viewportDisplaySetInstanceUIDs = displaySets.map( const viewportDisplaySetInstanceUIDs = displaySets.map(
({ displaySetInstanceUID }) => displaySetInstanceUID ({ displaySetInstanceUID }) => displaySetInstanceUID
@ -211,12 +221,12 @@ class CornerstoneCacheService {
// check inside segmentations if any of them are referencing the displaySets // check inside segmentations if any of them are referencing the displaySets
// that are about to be displayed // that are about to be displayed
const segmentations = SegmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
for (const segmentation of segmentations) { for (const segmentation of segmentations) {
const segDisplaySetInstanceUID = segmentation.displaySetInstanceUID; const segDisplaySetInstanceUID = segmentation.displaySetInstanceUID;
const shouldDisplaySeg = SegmentationService.shouldRenderSegmentation( const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(
viewportDisplaySetInstanceUIDs, viewportDisplaySetInstanceUIDs,
segDisplaySetInstanceUID segDisplaySetInstanceUID
); );

View File

@ -1,10 +1,3 @@
import CornerstoneCacheService from './CornerstoneCacheService'; import CornerstoneCacheService from './CornerstoneCacheService';
export default function ExtendedCornerstoneCacheService(serviceManager) { export default CornerstoneCacheService;
return {
name: 'CornerstoneCacheService',
create: ({ configuration = {} }) => {
return new CornerstoneCacheService(serviceManager);
},
};
}

View File

@ -738,7 +738,7 @@ class SegmentationService {
highlightHideOthers = false, highlightHideOthers = false,
highlightFunctionType: 'ease-in-out' // todo: make animation functions configurable from outside highlightFunctionType: 'ease-in-out' // todo: make animation functions configurable from outside
): void { ): void {
const { ToolGroupService } = this.servicesManager.services; const { toolGroupService } = this.servicesManager.services;
const center = this._getSegmentCenter(segmentationId, segmentIndex); const center = this._getSegmentCenter(segmentationId, segmentIndex);
const { world } = center; const { world } = center;
@ -751,10 +751,10 @@ class SegmentationService {
if (Array.isArray(toolGroupId)) { if (Array.isArray(toolGroupId)) {
toolGroupId.forEach(toolGroup => { toolGroupId.forEach(toolGroup => {
toolGroups.push(ToolGroupService.getToolGroup(toolGroup)); toolGroups.push(toolGroupService.getToolGroup(toolGroup));
}); });
} else { } else {
toolGroups.push(ToolGroupService.getToolGroup(toolGroupId)); toolGroups.push(toolGroupService.getToolGroup(toolGroupId));
} }
toolGroups.forEach(toolGroup => { toolGroups.forEach(toolGroup => {
@ -1240,9 +1240,9 @@ class SegmentationService {
} }
// if (brushSize !== undefined) { // if (brushSize !== undefined) {
// const { ToolGroupService } = this.servicesManager.services; // const { toolGroupService } = this.servicesManager.services;
// const toolGroupIds = ToolGroupService.getToolGroupIds(); // const toolGroupIds = toolGroupService.getToolGroupIds();
// toolGroupIds.forEach(toolGroupId => { // toolGroupIds.forEach(toolGroupId => {
// cstUtils.segmentation.setBrushSizeForToolGroup(toolGroupId, brushSize); // cstUtils.segmentation.setBrushSizeForToolGroup(toolGroupId, brushSize);
@ -1250,9 +1250,9 @@ class SegmentationService {
// } // }
// if (brushThresholdGate !== undefined) { // if (brushThresholdGate !== undefined) {
// const { ToolGroupService } = this.servicesManager.services; // const { toolGroupService } = this.servicesManager.services;
// const toolGroupIds = ToolGroupService.getFirstToolGroupIds(); // const toolGroupIds = toolGroupService.getFirstToolGroupIds();
// toolGroupIds.forEach(toolGroupId => { // toolGroupIds.forEach(toolGroupId => {
// cstUtils.segmentation.setBrushThresholdForToolGroup( // cstUtils.segmentation.setBrushThresholdForToolGroup(
@ -1324,11 +1324,11 @@ class SegmentationService {
return false; return false;
} }
const { DisplaySetService } = this.servicesManager.services; const { displaySetService } = this.servicesManager.services;
let shouldDisplaySeg = false; let shouldDisplaySeg = false;
const segDisplaySet = DisplaySetService.getDisplaySetByUID( const segDisplaySet = displaySetService.getDisplaySetByUID(
segDisplaySetInstanceUID segDisplaySetInstanceUID
); );
@ -1337,7 +1337,7 @@ class SegmentationService {
viewportDisplaySetInstanceUIDs.forEach(displaySetInstanceUID => { viewportDisplaySetInstanceUIDs.forEach(displaySetInstanceUID => {
// check if the displaySet is sharing the same frameOfReferenceUID // check if the displaySet is sharing the same frameOfReferenceUID
// with the new segmentation // with the new segmentation
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -1710,7 +1710,7 @@ class SegmentationService {
} }
private _setLabelmapConfigValue = (property, value) => { private _setLabelmapConfigValue = (property, value) => {
const { CornerstoneViewportService } = this.servicesManager.services; const { cornerstoneViewportService } = this.servicesManager.services;
const config = cstSegmentation.config.getGlobalConfig(); const config = cstSegmentation.config.getGlobalConfig();
@ -1719,8 +1719,8 @@ class SegmentationService {
// Todo: add non global (representation specific config as well) // Todo: add non global (representation specific config as well)
cstSegmentation.config.setGlobalConfig(config); cstSegmentation.config.setGlobalConfig(config);
const renderingEngine = CornerstoneViewportService.getRenderingEngine(); const renderingEngine = cornerstoneViewportService.getRenderingEngine();
const viewportIds = CornerstoneViewportService.getViewportIds(); const viewportIds = cornerstoneViewportService.getViewportIds();
renderingEngine.renderViewports(viewportIds); renderingEngine.renderViewports(viewportIds);
}; };
@ -1953,8 +1953,8 @@ class SegmentationService {
} }
private _getFirstToolGroupId = () => { private _getFirstToolGroupId = () => {
const { ToolGroupService } = this.servicesManager.services; const { toolGroupService } = this.servicesManager.services;
const toolGroupIds = ToolGroupService.getToolGroupIds(); const toolGroupIds = toolGroupService.getToolGroupIds();
return toolGroupIds[0]; return toolGroupIds[0];
}; };

View File

@ -2,7 +2,8 @@ import SegmentationService from './SegmentationService';
export default function ExtendedSegmentationService(servicesManager) { export default function ExtendedSegmentationService(servicesManager) {
return { return {
name: 'SegmentationService', name: 'segmentationService',
altName: 'SegmentationService',
create: ({ configuration = {} }) => { create: ({ configuration = {} }) => {
return new SegmentationService({ servicesManager }); return new SegmentationService({ servicesManager });
}, },

View File

@ -2,7 +2,8 @@ import SyncGroupService from './SyncGroupService';
export default function ExtendedSyncGroupService(serviceManager) { export default function ExtendedSyncGroupService(serviceManager) {
return { return {
name: 'SyncGroupService', altName: 'SyncGroupService',
name: 'syncGroupService',
create: ({ configuration = {} }) => { create: ({ configuration = {} }) => {
return new SyncGroupService(serviceManager); return new SyncGroupService(serviceManager);
}, },

View File

@ -20,6 +20,16 @@ type Tools = {
}; };
export default class ToolGroupService { export default class ToolGroupService {
public static REGISTRATION = serviceManager => {
return {
name: 'toolGroupService',
altName: 'ToolGroupService',
create: ({ configuration = {} }) => {
return new ToolGroupService(serviceManager);
},
};
};
serviceManager: any; serviceManager: any;
private toolGroupIds: Set<string> = new Set(); private toolGroupIds: Set<string> = new Set();
/** /**
@ -29,8 +39,8 @@ export default class ToolGroupService {
EVENTS: { [key: string]: string }; EVENTS: { [key: string]: string };
constructor(serviceManager) { constructor(serviceManager) {
const { CornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = serviceManager.services;
this.CornerstoneViewportService = CornerstoneViewportService; this.cornerstoneViewportService = cornerstoneViewportService;
this.listeners = {}; this.listeners = {};
this.EVENTS = EVENTS; this.EVENTS = EVENTS;
Object.assign(this, pubSubServiceInterface); Object.assign(this, pubSubServiceInterface);
@ -51,7 +61,7 @@ export default class ToolGroupService {
} }
public getToolGroupForViewport(viewportId: string): Types.IToolGroup | void { public getToolGroupForViewport(viewportId: string): Types.IToolGroup | void {
const renderingEngine = this.CornerstoneViewportService.getRenderingEngine(); const renderingEngine = this.cornerstoneViewportService.getRenderingEngine();
return ToolGroupManager.getToolGroupForViewport( return ToolGroupManager.getToolGroupForViewport(
viewportId, viewportId,
renderingEngine.id renderingEngine.id

View File

@ -1,10 +1,3 @@
import ToolGroupService from './ToolGroupService'; import ToolGroupService from './ToolGroupService';
export default function ExtendedToolGroupService(serviceManager) { export default ToolGroupService;
return {
name: 'ToolGroupService',
create: ({ configuration = {} }) => {
return new ToolGroupService(serviceManager);
},
};
}

View File

@ -412,7 +412,7 @@ class CornerstoneViewportService implements IViewportService {
// (This call may or may not create sub-requests for series metadata) // (This call may or may not create sub-requests for series metadata)
const volumeInputArray = []; const volumeInputArray = [];
const displaySetOptionsArray = viewportInfo.getDisplaySetOptions(); const displaySetOptionsArray = viewportInfo.getDisplaySetOptions();
const { HangingProtocolService } = this.servicesManager.services; const { hangingProtocolService } = this.servicesManager.services;
const volumeToLoad = []; const volumeToLoad = [];
const displaySetInstanceUIDs = []; const displaySetInstanceUIDs = [];
@ -449,11 +449,11 @@ class CornerstoneViewportService implements IViewportService {
this.viewportsDisplaySets.set(viewport.id, displaySetInstanceUIDs); this.viewportsDisplaySets.set(viewport.id, displaySetInstanceUIDs);
if ( if (
HangingProtocolService.hasCustomImageLoadStrategy() && hangingProtocolService.hasCustomImageLoadStrategy() &&
!HangingProtocolService.customImageLoadPerformed !hangingProtocolService.customImageLoadPerformed
) { ) {
// delegate the volume loading to the hanging protocol service if it has a custom image load strategy // delegate the volume loading to the hanging protocol service if it has a custom image load strategy
return HangingProtocolService.runImageLoadStrategy({ return hangingProtocolService.runImageLoadStrategy({
viewportId: viewport.id, viewportId: viewport.id,
volumeInputArray, volumeInputArray,
}); });
@ -469,9 +469,9 @@ class CornerstoneViewportService implements IViewportService {
public async setVolumesForViewport(viewport, volumeInputArray) { public async setVolumesForViewport(viewport, volumeInputArray) {
const { const {
DisplaySetService, displaySetService,
SegmentationService, segmentationService,
ToolGroupService, toolGroupService,
} = this.servicesManager.services; } = this.servicesManager.services;
await viewport.setVolumes(volumeInputArray); await viewport.setVolumes(volumeInputArray);
@ -480,7 +480,7 @@ class CornerstoneViewportService implements IViewportService {
const displaySetInstanceUIDs = this.viewportsDisplaySets.get(viewport.id); const displaySetInstanceUIDs = this.viewportsDisplaySets.get(viewport.id);
const segDisplaySet = displaySetInstanceUIDs const segDisplaySet = displaySetInstanceUIDs
.map(DisplaySetService.getDisplaySetByUID) .map(displaySetService.getDisplaySetByUID)
.find(displaySet => displaySet && displaySet.Modality === 'SEG'); .find(displaySet => displaySet && displaySet.Modality === 'SEG');
if (segDisplaySet) { if (segDisplaySet) {
@ -488,18 +488,18 @@ class CornerstoneViewportService implements IViewportService {
const referencedVolume = cache.getVolume(referencedVolumeId); const referencedVolume = cache.getVolume(referencedVolumeId);
const segmentationId = segDisplaySet.displaySetInstanceUID; const segmentationId = segDisplaySet.displaySetInstanceUID;
const toolGroup = ToolGroupService.getToolGroupForViewport(viewport.id); const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
if (referencedVolume) { if (referencedVolume) {
SegmentationService.addSegmentationRepresentationToToolGroup( segmentationService.addSegmentationRepresentationToToolGroup(
toolGroup.id, toolGroup.id,
segmentationId segmentationId
); );
} }
} else { } else {
const toolGroup = ToolGroupService.getToolGroupForViewport(viewport.id); const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
const toolGroupSegmentationRepresentations = const toolGroupSegmentationRepresentations =
SegmentationService.getSegmentationRepresentationsForToolGroup( segmentationService.getSegmentationRepresentationsForToolGroup(
toolGroup.id toolGroup.id
) || []; ) || [];
@ -508,7 +508,7 @@ class CornerstoneViewportService implements IViewportService {
// and we can look into hydrated segmentations to check if any of them are // and we can look into hydrated segmentations to check if any of them are
// associated with the primary displaySet // associated with the primary displaySet
// get segmentations only returns the hydrated segmentations // get segmentations only returns the hydrated segmentations
const segmentations = SegmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
for (const segmentation of segmentations) { for (const segmentation of segmentations) {
// if there is already a segmentation representation for this segmentation // if there is already a segmentation representation for this segmentation
@ -543,11 +543,11 @@ class CornerstoneViewportService implements IViewportService {
} }
if (shouldDisplaySeg) { if (shouldDisplaySeg) {
const toolGroup = ToolGroupService.getToolGroupForViewport( const toolGroup = toolGroupService.getToolGroupForViewport(
viewport.id viewport.id
); );
SegmentationService.addSegmentationRepresentationToToolGroup( segmentationService.addSegmentationRepresentationToToolGroup(
toolGroup.id, toolGroup.id,
segmentation.id segmentation.id
); );
@ -557,7 +557,7 @@ class CornerstoneViewportService implements IViewportService {
const viewportInfo = this.getViewportInfo(viewport.id); const viewportInfo = this.getViewportInfo(viewport.id);
const toolGroup = ToolGroupService.getToolGroupForViewport(viewport.id); const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
csToolsUtils.segmentation.triggerSegmentationRender(toolGroup.id); csToolsUtils.segmentation.triggerSegmentationRender(toolGroup.id);
const initialImageOptions = viewportInfo.getInitialImageOptions(); const initialImageOptions = viewportInfo.getInitialImageOptions();
@ -733,8 +733,8 @@ class CornerstoneViewportService implements IViewportService {
} }
_getFrameOfReferenceUID(displaySetInstanceUID) { _getFrameOfReferenceUID(displaySetInstanceUID) {
const { DisplaySetService } = this.servicesManager.services; const { displaySetService } = this.servicesManager.services;
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );

View File

@ -12,7 +12,7 @@ import {
*/ */
export interface IViewportService { export interface IViewportService {
servicesManager: unknown; servicesManager: unknown;
HangingProtocolService: unknown; hangingProtocolService: unknown;
renderingEngine: unknown; renderingEngine: unknown;
viewportGridResizeObserver: unknown; viewportGridResizeObserver: unknown;
viewportsInfo: unknown; viewportsInfo: unknown;

View File

@ -7,7 +7,7 @@ import { SyncGroup } from '../SyncGroupService/SyncGroupService';
import { import {
StackViewportData, StackViewportData,
VolumeViewportData, VolumeViewportData,
} from './CornerstoneCacheService'; } from '../../types/CornerstoneCacheService';
export type InitialImageOptions = { export type InitialImageOptions = {
index?: number; index?: number;

View File

@ -21,7 +21,7 @@ const VIEWPORT_ID = 'cornerstone-viewport-download-form';
const CornerstoneViewportDownloadForm = ({ const CornerstoneViewportDownloadForm = ({
onClose, onClose,
activeViewportIndex, activeViewportIndex,
CornerstoneViewportService, cornerstoneViewportService,
}) => { }) => {
const enabledElement = OHIFgetEnabledElement(activeViewportIndex); const enabledElement = OHIFgetEnabledElement(activeViewportIndex);
const activeViewportElement = enabledElement?.element; const activeViewportElement = enabledElement?.element;
@ -154,7 +154,7 @@ const CornerstoneViewportDownloadForm = ({
const { viewport } = activeViewportEnabledElement; const { viewport } = activeViewportEnabledElement;
const renderingEngine = CornerstoneViewportService.getRenderingEngine(); const renderingEngine = cornerstoneViewportService.getRenderingEngine();
const downloadViewport = renderingEngine.getViewport(VIEWPORT_ID); const downloadViewport = renderingEngine.getViewport(VIEWPORT_ID);
if (downloadViewport instanceof StackViewport) { if (downloadViewport instanceof StackViewport) {

View File

@ -11,7 +11,7 @@ import { Input, Dialog } from '@ohif/ui';
* @param {*} isArrowAnnotateInputDialog * @param {*} isArrowAnnotateInputDialog
*/ */
function callInputDialog( function callInputDialog(
UIDialogService, uiDialogService,
data, data,
callback, callback,
isArrowAnnotateInputDialog = true isArrowAnnotateInputDialog = true
@ -32,11 +32,11 @@ function callInputDialog(
callback('', action.id); callback('', action.id);
break; break;
} }
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
}; };
if (UIDialogService) { if (uiDialogService) {
UIDialogService.create({ uiDialogService.create({
id: dialogId, id: dialogId,
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
@ -46,7 +46,7 @@ function callInputDialog(
title: 'Enter your annotation', title: 'Enter your annotation',
value: { label }, value: { label },
noCloseButton: true, noCloseButton: true,
onClose: () => UIDialogService.dismiss({ id: dialogId }), onClose: () => uiDialogService.dismiss({ id: dialogId }),
actions: [ actions: [
{ id: 'cancel', text: 'Cancel', type: 'primary' }, { id: 'cancel', text: 'Cancel', type: 'primary' },
{ id: 'save', text: 'Save', type: 'secondary' }, { id: 'save', text: 'Save', type: 'secondary' },

View File

@ -12,8 +12,8 @@ const Length = {
*/ */
toMeasurement: ( toMeasurement: (
csToolsEventDetail, csToolsEventDetail,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
getValueTypeFromToolType getValueTypeFromToolType
) => { ) => {
const { annotation, viewportId } = csToolsEventDetail; const { annotation, viewportId } = csToolsEventDetail;
@ -37,26 +37,26 @@ const Length = {
StudyInstanceUID, StudyInstanceUID,
} = getSOPInstanceAttributes( } = getSOPInstanceAttributes(
referencedImageId, referencedImageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
); );
let displaySet; let displaySet;
if (SOPInstanceUID) { if (SOPInstanceUID) {
displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID SeriesInstanceUID
); );
} else { } else {
displaySet = DisplaySetService.getDisplaySetsForSeries(SeriesInstanceUID); displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
} }
const { points } = data.handles; const { points } = data.handles;
const mappedAnnotations = getMappedAnnotations( const mappedAnnotations = getMappedAnnotations(
annotation, annotation,
DisplaySetService displaySetService
); );
const displayText = getDisplayText(mappedAnnotations, displaySet); const displayText = getDisplayText(mappedAnnotations, displaySet);
@ -84,7 +84,7 @@ const Length = {
}, },
}; };
function getMappedAnnotations(annotation, DisplaySetService) { function getMappedAnnotations(annotation, displaySetService) {
const { metadata, data } = annotation; const { metadata, data } = annotation;
const { text } = data; const { text } = data;
const { referencedImageId } = metadata; const { referencedImageId } = metadata;
@ -97,7 +97,7 @@ function getMappedAnnotations(annotation, DisplaySetService) {
frameNumber, frameNumber,
} = getSOPInstanceAttributes(referencedImageId); } = getSOPInstanceAttributes(referencedImageId);
const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID, SeriesInstanceUID,
frameNumber frameNumber

View File

@ -8,8 +8,8 @@ const Bidirectional = {
toAnnotation: measurement => {}, toAnnotation: measurement => {},
toMeasurement: ( toMeasurement: (
csToolsEventDetail, csToolsEventDetail,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
getValueTypeFromToolType getValueTypeFromToolType
) => { ) => {
const { annotation, viewportId } = csToolsEventDetail; const { annotation, viewportId } = csToolsEventDetail;
@ -33,26 +33,26 @@ const Bidirectional = {
StudyInstanceUID, StudyInstanceUID,
} = getSOPInstanceAttributes( } = getSOPInstanceAttributes(
referencedImageId, referencedImageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
); );
let displaySet; let displaySet;
if (SOPInstanceUID) { if (SOPInstanceUID) {
displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID SeriesInstanceUID
); );
} else { } else {
displaySet = DisplaySetService.getDisplaySetsForSeries(SeriesInstanceUID); displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
} }
const { points } = data.handles; const { points } = data.handles;
const mappedAnnotations = getMappedAnnotations( const mappedAnnotations = getMappedAnnotations(
annotation, annotation,
DisplaySetService displaySetService
); );
const displayText = getDisplayText(mappedAnnotations, displaySet); const displayText = getDisplayText(mappedAnnotations, displaySet);
@ -79,7 +79,7 @@ const Bidirectional = {
}, },
}; };
function getMappedAnnotations(annotation, DisplaySetService) { function getMappedAnnotations(annotation, displaySetService) {
const { metadata, data } = annotation; const { metadata, data } = annotation;
const { cachedStats } = data; const { cachedStats } = data;
const { referencedImageId, referencedSeriesInstanceUID } = metadata; const { referencedImageId, referencedSeriesInstanceUID } = metadata;
@ -105,7 +105,7 @@ function getMappedAnnotations(annotation, DisplaySetService) {
frameNumber, frameNumber,
} = getSOPInstanceAttributes(referencedImageId); } = getSOPInstanceAttributes(referencedImageId);
const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID, SeriesInstanceUID,
frameNumber frameNumber

View File

@ -7,8 +7,8 @@ const EllipticalROI = {
toAnnotation: measurement => {}, toAnnotation: measurement => {},
toMeasurement: ( toMeasurement: (
csToolsEventDetail, csToolsEventDetail,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
getValueTypeFromToolType getValueTypeFromToolType
) => { ) => {
const { annotation, viewportId } = csToolsEventDetail; const { annotation, viewportId } = csToolsEventDetail;
@ -32,26 +32,26 @@ const EllipticalROI = {
StudyInstanceUID, StudyInstanceUID,
} = getSOPInstanceAttributes( } = getSOPInstanceAttributes(
referencedImageId, referencedImageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
); );
let displaySet; let displaySet;
if (SOPInstanceUID) { if (SOPInstanceUID) {
displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID SeriesInstanceUID
); );
} else { } else {
displaySet = DisplaySetService.getDisplaySetsForSeries(SeriesInstanceUID); displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
} }
const { points } = data.handles; const { points } = data.handles;
const mappedAnnotations = getMappedAnnotations( const mappedAnnotations = getMappedAnnotations(
annotation, annotation,
DisplaySetService displaySetService
); );
const displayText = getDisplayText(mappedAnnotations, displaySet); const displayText = getDisplayText(mappedAnnotations, displaySet);
@ -78,7 +78,7 @@ const EllipticalROI = {
}, },
}; };
function getMappedAnnotations(annotation, DisplaySetService) { function getMappedAnnotations(annotation, displaySetService) {
const { metadata, data } = annotation; const { metadata, data } = annotation;
const { cachedStats } = data; const { cachedStats } = data;
const { referencedImageId } = metadata; const { referencedImageId } = metadata;
@ -105,7 +105,7 @@ function getMappedAnnotations(annotation, DisplaySetService) {
frameNumber, frameNumber,
} = getSOPInstanceAttributes(referencedImageId); } = getSOPInstanceAttributes(referencedImageId);
const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID, SeriesInstanceUID,
frameNumber frameNumber

View File

@ -1,6 +1,6 @@
import SUPPORTED_TOOLS from './constants/supportedTools'; import SUPPORTED_TOOLS from './constants/supportedTools';
import getSOPInstanceAttributes from './utils/getSOPInstanceAttributes'; import getSOPInstanceAttributes from './utils/getSOPInstanceAttributes';
import { DisplaySetService, utils } from '@ohif/core'; import { displaySetService, utils } from '@ohif/core';
const Length = { const Length = {
toAnnotation: measurement => {}, toAnnotation: measurement => {},
@ -13,8 +13,8 @@ const Length = {
*/ */
toMeasurement: ( toMeasurement: (
csToolsEventDetail, csToolsEventDetail,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
getValueTypeFromToolType getValueTypeFromToolType
) => { ) => {
const { annotation, viewportId } = csToolsEventDetail; const { annotation, viewportId } = csToolsEventDetail;
@ -38,26 +38,26 @@ const Length = {
StudyInstanceUID, StudyInstanceUID,
} = getSOPInstanceAttributes( } = getSOPInstanceAttributes(
referencedImageId, referencedImageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
); );
let displaySet; let displaySet;
if (SOPInstanceUID) { if (SOPInstanceUID) {
displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID SeriesInstanceUID
); );
} else { } else {
displaySet = DisplaySetService.getDisplaySetsForSeries(SeriesInstanceUID); displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
} }
const { points } = data.handles; const { points } = data.handles;
const mappedAnnotations = getMappedAnnotations( const mappedAnnotations = getMappedAnnotations(
annotation, annotation,
DisplaySetService displaySetService
); );
const displayText = getDisplayText(mappedAnnotations, displaySet); const displayText = getDisplayText(mappedAnnotations, displaySet);
@ -84,7 +84,7 @@ const Length = {
}, },
}; };
function getMappedAnnotations(annotation, DisplaySetService) { function getMappedAnnotations(annotation, displaySetService) {
const { metadata, data } = annotation; const { metadata, data } = annotation;
const { cachedStats } = data; const { cachedStats } = data;
const { referencedImageId } = metadata; const { referencedImageId } = metadata;
@ -110,7 +110,7 @@ function getMappedAnnotations(annotation, DisplaySetService) {
frameNumber, frameNumber,
} = getSOPInstanceAttributes(referencedImageId); } = getSOPInstanceAttributes(referencedImageId);
const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID, SeriesInstanceUID,
frameNumber frameNumber

View File

@ -4,9 +4,9 @@ import EllipticalROI from './EllipticalROI';
import ArrowAnnotate from './ArrowAnnotate'; import ArrowAnnotate from './ArrowAnnotate';
const measurementServiceMappingsFactory = ( const measurementServiceMappingsFactory = (
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
) => { ) => {
/** /**
* Maps measurement service format object to cornerstone annotation object. * Maps measurement service format object to cornerstone annotation object.
@ -23,7 +23,7 @@ const measurementServiceMappingsFactory = (
RECTANGLE, RECTANGLE,
BIDIRECTIONAL, BIDIRECTIONAL,
POINT, POINT,
} = MeasurementService.VALUE_TYPES; } = measurementService.VALUE_TYPES;
// TODO -> I get why this was attempted, but its not nearly flexible enough. // TODO -> I get why this was attempted, but its not nearly flexible enough.
// A single measurement may have an ellipse + a bidirectional measurement, for instances. // A single measurement may have an ellipse + a bidirectional measurement, for instances.
@ -45,13 +45,13 @@ const measurementServiceMappingsFactory = (
toMeasurement: csToolsAnnotation => toMeasurement: csToolsAnnotation =>
Length.toMeasurement( Length.toMeasurement(
csToolsAnnotation, csToolsAnnotation,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
_getValueTypeFromToolType _getValueTypeFromToolType
), ),
matchingCriteria: [ matchingCriteria: [
{ {
valueType: MeasurementService.VALUE_TYPES.POLYLINE, valueType: measurementService.VALUE_TYPES.POLYLINE,
points: 2, points: 2,
}, },
], ],
@ -61,19 +61,19 @@ const measurementServiceMappingsFactory = (
toMeasurement: csToolsAnnotation => toMeasurement: csToolsAnnotation =>
Bidirectional.toMeasurement( Bidirectional.toMeasurement(
csToolsAnnotation, csToolsAnnotation,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
_getValueTypeFromToolType _getValueTypeFromToolType
), ),
matchingCriteria: [ matchingCriteria: [
// TODO -> We should eventually do something like shortAxis + longAxis, // TODO -> We should eventually do something like shortAxis + longAxis,
// But its still a little unclear how these automatic interpretations will work. // But its still a little unclear how these automatic interpretations will work.
{ {
valueType: MeasurementService.VALUE_TYPES.POLYLINE, valueType: measurementService.VALUE_TYPES.POLYLINE,
points: 2, points: 2,
}, },
{ {
valueType: MeasurementService.VALUE_TYPES.POLYLINE, valueType: measurementService.VALUE_TYPES.POLYLINE,
points: 2, points: 2,
}, },
], ],
@ -83,13 +83,13 @@ const measurementServiceMappingsFactory = (
toMeasurement: csToolsAnnotation => toMeasurement: csToolsAnnotation =>
EllipticalROI.toMeasurement( EllipticalROI.toMeasurement(
csToolsAnnotation, csToolsAnnotation,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
_getValueTypeFromToolType _getValueTypeFromToolType
), ),
matchingCriteria: [ matchingCriteria: [
{ {
valueType: MeasurementService.VALUE_TYPES.ELLIPSE, valueType: measurementService.VALUE_TYPES.ELLIPSE,
}, },
], ],
}, },
@ -98,13 +98,13 @@ const measurementServiceMappingsFactory = (
toMeasurement: csToolsAnnotation => toMeasurement: csToolsAnnotation =>
ArrowAnnotate.toMeasurement( ArrowAnnotate.toMeasurement(
csToolsAnnotation, csToolsAnnotation,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
_getValueTypeFromToolType _getValueTypeFromToolType
), ),
matchingCriteria: [ matchingCriteria: [
{ {
valueType: MeasurementService.VALUE_TYPES.POINT, valueType: measurementService.VALUE_TYPES.POINT,
points: 1, points: 1,
}, },
], ],

View File

@ -13,7 +13,7 @@ import * as cornerstone from '@cornerstonejs/core';
*/ */
export default function getSOPInstanceAttributes( export default function getSOPInstanceAttributes(
imageId, imageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
) { ) {
if (imageId) { if (imageId) {
@ -23,7 +23,7 @@ export default function getSOPInstanceAttributes(
// Todo: implement for volume viewports and use the referencedSeriesInstanceUID // Todo: implement for volume viewports and use the referencedSeriesInstanceUID
// if no imageId => measurement is not in the acquisition plane // if no imageId => measurement is not in the acquisition plane
// const metadata = getUIDFromScene(CornerstoneViewportService, viewportId); // const metadata = getUIDFromScene(cornerstoneViewportService, viewportId);
// if (!metadata) { // if (!metadata) {
// throw new Error('Not viewport with imageId found'); // throw new Error('Not viewport with imageId found');
@ -49,8 +49,8 @@ function _getUIDFromImageID(imageId) {
}; };
} }
// function getUIDFromScene(CornerstoneViewportService) { // function getUIDFromScene(cornerstoneViewportService) {
// const renderingEngine = CornerstoneViewportService.getRenderingEngine(); // const renderingEngine = cornerstoneViewportService.getRenderingEngine();
// const scene = renderingEngine.getScene(sceneUID); // const scene = renderingEngine.getScene(sceneUID);
// const viewportUIDs = scene.getViewportIds(); // const viewportUIDs = scene.getViewportIds();

View File

@ -39,9 +39,9 @@ export default function toggleMPRHangingProtocol({
getToolGroup, getToolGroup,
}) { }) {
const { const {
UINotificationService, uiNotificationService,
HangingProtocolService, hangingProtocolService,
ViewportGridService, viewportGridService,
toolbarService, toolbarService,
} = servicesManager.services; } = servicesManager.services;
@ -54,12 +54,12 @@ export default function toggleMPRHangingProtocol({
viewports, viewports,
numRows, numRows,
numCols, numCols,
} = ViewportGridService.getState(); } = viewportGridService.getState();
const viewportDisplaySetInstanceUIDs = const viewportDisplaySetInstanceUIDs =
viewports[activeViewportIndex].displaySetInstanceUIDs; viewports[activeViewportIndex].displaySetInstanceUIDs;
const errorCallback = error => { const errorCallback = error => {
UINotificationService.show({ uiNotificationService.show({
title: 'Multiplanar reconstruction (MPR) ', title: 'Multiplanar reconstruction (MPR) ',
message: message:
'Cannot create MPR for this DisplaySet since it is not reconstructable.', 'Cannot create MPR for this DisplaySet since it is not reconstructable.',
@ -69,7 +69,7 @@ export default function toggleMPRHangingProtocol({
}; };
// What is the current active protocol and stage number to restore later // What is the current active protocol and stage number to restore later
const { protocol, stage } = HangingProtocolService.getActiveProtocol(); const { protocol, stage } = hangingProtocolService.getActiveProtocol();
if (toggledState) { if (toggledState) {
resetCachedState(); resetCachedState();
@ -102,7 +102,7 @@ export default function toggleMPRHangingProtocol({
getToolGroup getToolGroup
); );
HangingProtocolService.setProtocol( hangingProtocolService.setProtocol(
MPR_TOOLGROUP_ID, MPR_TOOLGROUP_ID,
matchDetails, matchDetails,
errorCallback errorCallback
@ -111,7 +111,7 @@ export default function toggleMPRHangingProtocol({
} }
const restoreErrorCallback = error => { const restoreErrorCallback = error => {
UINotificationService.show({ uiNotificationService.show({
title: 'Multiplanar reconstruction (MPR) ', title: 'Multiplanar reconstruction (MPR) ',
message: message:
'Something went wrong while trying to restore the previous layout.', 'Something went wrong while trying to restore the previous layout.',
@ -130,7 +130,7 @@ export default function toggleMPRHangingProtocol({
// cached protocol and stage. However, for the default protocol, we need // cached protocol and stage. However, for the default protocol, we need
// to also apply the layout type and properties. // to also apply the layout type and properties.
if (cachedState.protocol.id !== 'default') { if (cachedState.protocol.id !== 'default') {
HangingProtocolService.setProtocol( hangingProtocolService.setProtocol(
cachedState.protocol.id, cachedState.protocol.id,
viewportMatchDetails, viewportMatchDetails,
restoreErrorCallback restoreErrorCallback
@ -139,14 +139,14 @@ export default function toggleMPRHangingProtocol({
return; return;
} }
HangingProtocolService.setProtocol( hangingProtocolService.setProtocol(
'default', 'default',
viewportMatchDetails, viewportMatchDetails,
restoreErrorCallback restoreErrorCallback
); );
if (numRows !== properties.rows || numCols !== properties.columns) { if (numRows !== properties.rows || numCols !== properties.columns) {
ViewportGridService.setLayout({ viewportGridService.setLayout({
numRows: properties.rows, numRows: properties.rows,
numCols: properties.columns, numCols: properties.columns,
layoutType, layoutType,
@ -169,7 +169,7 @@ export default function toggleMPRHangingProtocol({
viewportOptions, viewportOptions,
displaySetsInfo, displaySetsInfo,
} = viewportMatchDetailsForViewport; } = viewportMatchDetailsForViewport;
ViewportGridService.setDisplaySetsForViewport({ viewportGridService.setDisplaySetsForViewport({
viewportIndex, viewportIndex,
displaySetInstanceUIDs: displaySetsInfo.map( displaySetInstanceUIDs: displaySetsInfo.map(
displaySetInfo => displaySetInfo.displaySetInstanceUID displaySetInfo => displaySetInfo.displaySetInstanceUID
@ -177,7 +177,7 @@ export default function toggleMPRHangingProtocol({
viewportOptions, viewportOptions,
}); });
} else { } else {
ViewportGridService.setDisplaySetsForViewport({ viewportGridService.setDisplaySetsForViewport({
viewportIndex, viewportIndex,
displaySetInstanceUIDs: [], displaySetInstanceUIDs: [],
viewportOptions: {}, viewportOptions: {},
@ -217,15 +217,15 @@ function _disableCrosshairs(toolGroupIds, getToolGroup) {
function _getViewportsInfo({ protocol, stage, viewports, servicesManager }) { function _getViewportsInfo({ protocol, stage, viewports, servicesManager }) {
// here we need to use the viewports and try to map it into the // here we need to use the viewports and try to map it into the
// viewportMatchDetails and displaySetMatch that HangingProtocolService // viewportMatchDetails and displaySetMatch that hangingProtocolService
// expects // expects
const { const {
ViewportGridService, viewportGridService,
HangingProtocolService, hangingProtocolService,
ToolGroupService, toolGroupService,
} = servicesManager.services; } = servicesManager.services;
const { numRows, numCols } = ViewportGridService.getState(); const { numRows, numCols } = viewportGridService.getState();
let viewportMatchDetails = new Map(); let viewportMatchDetails = new Map();
@ -261,7 +261,7 @@ function _getViewportsInfo({ protocol, stage, viewports, servicesManager }) {
} }
}); });
} else { } else {
({ viewportMatchDetails } = HangingProtocolService.getMatchDetails()); ({ viewportMatchDetails } = hangingProtocolService.getMatchDetails());
} }
// get the toolGroup state for viewports // get the toolGroup state for viewports
@ -277,7 +277,7 @@ function _getViewportsInfo({ protocol, stage, viewports, servicesManager }) {
if (viewportIds.length) { if (viewportIds.length) {
toolOptions = viewportIds.map(viewportId => { toolOptions = viewportIds.map(viewportId => {
const toolGroup = ToolGroupService.getToolGroupForViewport(viewportId); const toolGroup = toolGroupService.getToolGroupForViewport(viewportId);
return { return {
toolGroupId: toolGroup.id, toolGroupId: toolGroup.id,
toolOptions: toolGroup.toolOptions, toolOptions: toolGroup.toolOptions,

View File

@ -12,10 +12,10 @@ export default function toggleStackImageSync({
getEnabledElement, getEnabledElement,
}) { }) {
const { const {
SyncGroupService, syncGroupService,
ViewportGridService, viewportGridService,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
if (!toggledState) { if (!toggledState) {
@ -23,7 +23,7 @@ export default function toggleStackImageSync({
const { viewports, synchronizerId } = syncGroupInfo; const { viewports, synchronizerId } = syncGroupInfo;
viewports.forEach(({ viewportId, renderingEngineId }) => { viewports.forEach(({ viewportId, renderingEngineId }) => {
SyncGroupService.removeViewportFromSyncGroup( syncGroupService.removeViewportFromSyncGroup(
viewportId, viewportId,
renderingEngineId, renderingEngineId,
synchronizerId synchronizerId
@ -37,7 +37,7 @@ export default function toggleStackImageSync({
STACK_IMAGE_SYNC_GROUPS_INFO = []; STACK_IMAGE_SYNC_GROUPS_INFO = [];
// create synchronization groups and add viewports // create synchronization groups and add viewports
let { viewports } = ViewportGridService.getState(); let { viewports } = viewportGridService.getState();
// filter empty viewports // filter empty viewports
viewports = viewports.filter( viewports = viewports.filter(
@ -50,7 +50,7 @@ export default function toggleStackImageSync({
const { displaySetInstanceUIDs } = viewport; const { displaySetInstanceUIDs } = viewport;
for (const displaySetInstanceUID of displaySetInstanceUIDs) { for (const displaySetInstanceUID of displaySetInstanceUIDs) {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -70,7 +70,7 @@ export default function toggleStackImageSync({
return acc; return acc;
} }
const { element } = CornerstoneViewportService.getViewportInfo(viewportId); const { element } = cornerstoneViewportService.getViewportInfo(viewportId);
const { viewport: csViewport, renderingEngineId } = getEnabledElement( const { viewport: csViewport, renderingEngineId } = getEnabledElement(
element element
); );
@ -99,7 +99,7 @@ export default function toggleStackImageSync({
calculateViewportRegistrations(viewports); calculateViewportRegistrations(viewports);
viewports.forEach(({ viewportId, renderingEngineId }) => { viewports.forEach(({ viewportId, renderingEngineId }) => {
SyncGroupService.addViewportToSyncGroup(viewportId, renderingEngineId, { syncGroupService.addViewportToSyncGroup(viewportId, renderingEngineId, {
type: 'stackimage', type: 'stackimage',
id: synchronizerId, id: synchronizerId,
source: true, source: true,

View File

@ -32,7 +32,7 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"@ohif/i18n": "^1.0.0", "@ohif/i18n": "^1.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicomweb-client": "^0.6.0", "dicomweb-client": "^0.6.0",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^17.0.2", "react": "^17.0.2",

View File

@ -17,11 +17,11 @@ async function createReportAsync(
options options
) { ) {
const { const {
DisplaySetService, displaySetService,
UINotificationService, uiNotificationService,
UIDialogService, uiDialogService,
} = servicesManager.services; } = servicesManager.services;
const loadingDialogId = UIDialogService.create({ const loadingDialogId = uiDialogService.create({
showOverlay: true, showOverlay: true,
isDraggable: false, isDraggable: false,
centralize: true, centralize: true,
@ -46,9 +46,9 @@ async function createReportAsync(
// automatically calls makeDisplaySets // automatically calls makeDisplaySets
DicomMetadataStore.addInstances([naturalizedReport], true); DicomMetadataStore.addInstances([naturalizedReport], true);
const displaySetInstanceUID = DisplaySetService.getMostRecentDisplaySet(); const displaySetInstanceUID = displaySetService.getMostRecentDisplaySet();
UINotificationService.show({ uiNotificationService.show({
title: 'Create Report', title: 'Create Report',
message: 'Measurements saved successfully', message: 'Measurements saved successfully',
type: 'success', type: 'success',
@ -56,13 +56,13 @@ async function createReportAsync(
return [displaySetInstanceUID]; return [displaySetInstanceUID];
} catch (error) { } catch (error) {
UINotificationService.show({ uiNotificationService.show({
title: 'Create Report', title: 'Create Report',
message: error.message || 'Failed to store measurements', message: error.message || 'Failed to store measurements',
type: 'error', type: 'error',
}); });
} finally { } finally {
UIDialogService.dismiss({ id: loadingDialogId }); uiDialogService.dismiss({ id: loadingDialogId });
} }
} }

View File

@ -21,10 +21,10 @@ export default function PanelMeasurementTable({
const [viewportGrid, viewportGridService] = useViewportGrid(); const [viewportGrid, viewportGridService] = useViewportGrid();
const { activeViewportIndex, viewports } = viewportGrid; const { activeViewportIndex, viewports } = viewportGrid;
const { const {
MeasurementService, measurementService,
UIDialogService, uiDialogService,
UINotificationService, uiNotificationService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const [displayMeasurements, setDisplayMeasurements] = useState([]); const [displayMeasurements, setDisplayMeasurements] = useState([]);
@ -34,21 +34,21 @@ export default function PanelMeasurementTable({
100 100
); );
// ~~ Initial // ~~ Initial
setDisplayMeasurements(_getMappedMeasurements(MeasurementService)); setDisplayMeasurements(_getMappedMeasurements(measurementService));
// ~~ Subscription // ~~ Subscription
const added = MeasurementService.EVENTS.MEASUREMENT_ADDED; const added = measurementService.EVENTS.MEASUREMENT_ADDED;
const addedRaw = MeasurementService.EVENTS.RAW_MEASUREMENT_ADDED; const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;
const updated = MeasurementService.EVENTS.MEASUREMENT_UPDATED; const updated = measurementService.EVENTS.MEASUREMENT_UPDATED;
const removed = MeasurementService.EVENTS.MEASUREMENT_REMOVED; const removed = measurementService.EVENTS.MEASUREMENT_REMOVED;
const cleared = MeasurementService.EVENTS.MEASUREMENTS_CLEARED; const cleared = measurementService.EVENTS.MEASUREMENTS_CLEARED;
const subscriptions = []; const subscriptions = [];
[added, addedRaw, updated, removed, cleared].forEach(evt => { [added, addedRaw, updated, removed, cleared].forEach(evt => {
subscriptions.push( subscriptions.push(
MeasurementService.subscribe(evt, () => { measurementService.subscribe(evt, () => {
debouncedSetDisplayMeasurements( debouncedSetDisplayMeasurements(
_getMappedMeasurements(MeasurementService) _getMappedMeasurements(measurementService)
); );
}).unsubscribe }).unsubscribe
); );
@ -63,20 +63,20 @@ export default function PanelMeasurementTable({
}, []); }, []);
async function exportReport() { async function exportReport() {
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
downloadCSVReport(measurements, MeasurementService); downloadCSVReport(measurements, measurementService);
} }
async function clearMeasurements() { async function clearMeasurements() {
MeasurementService.clearMeasurements(); measurementService.clearMeasurements();
} }
async function createReport() { async function createReport() {
// filter measurements that are added to the active study // filter measurements that are added to the active study
const activeViewport = viewports[activeViewportIndex]; const activeViewport = viewports[activeViewportIndex];
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
activeViewport.displaySetInstanceUIDs[0] activeViewport.displaySetInstanceUIDs[0]
); );
const trackedMeasurements = measurements.filter( const trackedMeasurements = measurements.filter(
@ -84,7 +84,7 @@ export default function PanelMeasurementTable({
); );
if (trackedMeasurements.length <= 0) { if (trackedMeasurements.length <= 0) {
UINotificationService.show({ uiNotificationService.show({
title: 'No Measurements', title: 'No Measurements',
message: 'No Measurements are added to the current Study.', message: 'No Measurements are added to the current Study.',
type: 'info', type: 'info',
@ -93,7 +93,7 @@ export default function PanelMeasurementTable({
return; return;
} }
const promptResult = await createReportDialogPrompt(UIDialogService, { const promptResult = await createReportDialogPrompt(uiDialogService, {
extensionManager, extensionManager,
}); });
@ -109,7 +109,7 @@ export default function PanelMeasurementTable({
? 'Research Derived Series' // default ? 'Research Derived Series' // default
: promptResult.value; // provided value : promptResult.value; // provided value
const SeriesNumber = getNextSRSeriesNumber(DisplaySetService); const SeriesNumber = getNextSRSeriesNumber(displaySetService);
const displaySetInstanceUIDs = await createReportAsync( const displaySetInstanceUIDs = await createReportAsync(
servicesManager, servicesManager,
@ -125,20 +125,20 @@ export default function PanelMeasurementTable({
} }
const jumpToImage = ({ uid, isActive }) => { const jumpToImage = ({ uid, isActive }) => {
MeasurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, uid); measurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, uid);
onMeasurementItemClickHandler({ uid, isActive }); onMeasurementItemClickHandler({ uid, isActive });
}; };
const onMeasurementItemEditHandler = ({ uid, isActive }) => { const onMeasurementItemEditHandler = ({ uid, isActive }) => {
const measurement = MeasurementService.getMeasurement(uid); const measurement = measurementService.getMeasurement(uid);
//Todo: why we are jumping to image? //Todo: why we are jumping to image?
// jumpToImage({ id, isActive }); // jumpToImage({ id, isActive });
const onSubmitHandler = ({ action, value }) => { const onSubmitHandler = ({ action, value }) => {
switch (action.id) { switch (action.id) {
case 'save': { case 'save': {
MeasurementService.update( measurementService.update(
uid, uid,
{ {
...measurement, ...measurement,
@ -148,10 +148,10 @@ export default function PanelMeasurementTable({
); );
} }
} }
UIDialogService.dismiss({ id: 'enter-annotation' }); uiDialogService.dismiss({ id: 'enter-annotation' });
}; };
UIDialogService.create({ uiDialogService.create({
id: 'enter-annotation', id: 'enter-annotation',
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
@ -234,7 +234,7 @@ export default function PanelMeasurementTable({
PanelMeasurementTable.propTypes = { PanelMeasurementTable.propTypes = {
servicesManager: PropTypes.shape({ servicesManager: PropTypes.shape({
services: PropTypes.shape({ services: PropTypes.shape({
MeasurementService: PropTypes.shape({ measurementService: PropTypes.shape({
getMeasurements: PropTypes.func.isRequired, getMeasurements: PropTypes.func.isRequired,
subscribe: PropTypes.func.isRequired, subscribe: PropTypes.func.isRequired,
EVENTS: PropTypes.object.isRequired, EVENTS: PropTypes.object.isRequired,
@ -244,11 +244,11 @@ PanelMeasurementTable.propTypes = {
}).isRequired, }).isRequired,
}; };
function _getMappedMeasurements(MeasurementService) { function _getMappedMeasurements(measurementService) {
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const mappedMeasurements = measurements.map((m, index) => const mappedMeasurements = measurements.map((m, index) =>
_mapMeasurementToDisplay(m, index, MeasurementService.VALUE_TYPES) _mapMeasurementToDisplay(m, index, measurementService.VALUE_TYPES)
); );
return mappedMeasurements; return mappedMeasurements;

View File

@ -17,9 +17,9 @@ function PanelStudyBrowser({
dataSource, dataSource,
}) { }) {
const { const {
HangingProtocolService, hangingProtocolService,
DisplaySetService, displaySetService,
UINotificationService, uiNotificationService,
} = servicesManager.services; } = servicesManager.services;
// Normally you nest the components so the tree isn't so deep, and the data // Normally you nest the components so the tree isn't so deep, and the data
// doesn't have to have such an intense shape. This works well enough for now. // doesn't have to have such an intense shape. This works well enough for now.
@ -42,13 +42,13 @@ function PanelStudyBrowser({
let updatedViewports = []; let updatedViewports = [];
const viewportIndex = activeViewportIndex; const viewportIndex = activeViewportIndex;
try { try {
updatedViewports = HangingProtocolService.getViewportsRequireUpdate( updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex, viewportIndex,
displaySetInstanceUID displaySetInstanceUID
); );
} catch (error) { } catch (error) {
console.warn(error); console.warn(error);
UINotificationService.show({ uiNotificationService.show({
title: 'Thumbnail Double Click', title: 'Thumbnail Double Click',
message: message:
'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.', 'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.',
@ -103,10 +103,10 @@ function PanelStudyBrowser({
// // ~~ Initial Thumbnails // // ~~ Initial Thumbnails
useEffect(() => { useEffect(() => {
const currentDisplaySets = DisplaySetService.activeDisplaySets; const currentDisplaySets = displaySetService.activeDisplaySets;
currentDisplaySets.forEach(async dSet => { currentDisplaySets.forEach(async dSet => {
const newImageSrcEntry = {}; const newImageSrcEntry = {};
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
dSet.displaySetInstanceUID dSet.displaySetInstanceUID
); );
const imageIds = dataSource.getImageIdsForDisplaySet(displaySet); const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
@ -134,7 +134,7 @@ function PanelStudyBrowser({
// ~~ displaySets // ~~ displaySets
useEffect(() => { useEffect(() => {
// TODO: Are we sure `activeDisplaySets` will always be accurate? // TODO: Are we sure `activeDisplaySets` will always be accurate?
const currentDisplaySets = DisplaySetService.activeDisplaySets; const currentDisplaySets = displaySetService.activeDisplaySets;
const mappedDisplaySets = _mapDisplaySets( const mappedDisplaySets = _mapDisplaySets(
currentDisplaySets, currentDisplaySets,
thumbnailImageSrcMap thumbnailImageSrcMap
@ -148,13 +148,13 @@ function PanelStudyBrowser({
// ~~ subscriptions --> displaySets // ~~ subscriptions --> displaySets
useEffect(() => { useEffect(() => {
// DISPLAY_SETS_ADDED returns an array of DisplaySets that were added // DISPLAY_SETS_ADDED returns an array of DisplaySets that were added
const SubscriptionDisplaySetsAdded = DisplaySetService.subscribe( const SubscriptionDisplaySetsAdded = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_ADDED, displaySetService.EVENTS.DISPLAY_SETS_ADDED,
data => { data => {
const { displaySetsAdded } = data; const { displaySetsAdded } = data;
displaySetsAdded.forEach(async dSet => { displaySetsAdded.forEach(async dSet => {
const newImageSrcEntry = {}; const newImageSrcEntry = {};
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
dSet.displaySetInstanceUID dSet.displaySetInstanceUID
); );
const imageIds = dataSource.getImageIdsForDisplaySet(displaySet); const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
@ -179,8 +179,8 @@ function PanelStudyBrowser({
// TODO: Will this always hold _all_ the displaySets we care about? // TODO: Will this always hold _all_ the displaySets we care about?
// DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets` // DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets`
const SubscriptionDisplaySetsChanged = DisplaySetService.subscribe( const SubscriptionDisplaySetsChanged = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_CHANGED, displaySetService.EVENTS.DISPLAY_SETS_CHANGED,
changedDisplaySets => { changedDisplaySets => {
const mappedDisplaySets = _mapDisplaySets( const mappedDisplaySets = _mapDisplaySets(
changedDisplaySets, changedDisplaySets,
@ -222,7 +222,7 @@ function PanelStudyBrowser({
if (!shouldCollapseStudy) { if (!shouldCollapseStudy) {
const madeInClient = true; const madeInClient = true;
requestDisplaySetCreationForStudy( requestDisplaySetCreationForStudy(
DisplaySetService, displaySetService,
StudyInstanceUID, StudyInstanceUID,
madeInClient madeInClient
); );

View File

@ -8,7 +8,7 @@ export const CREATE_REPORT_DIALOG_RESPONSE = {
}; };
export default function createReportDialogPrompt( export default function createReportDialogPrompt(
UIDialogService, uiDialogService,
{ extensionManager } { extensionManager }
) { ) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
@ -16,7 +16,7 @@ export default function createReportDialogPrompt(
const _handleClose = () => { const _handleClose = () => {
// Dismiss dialog // Dismiss dialog
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
// Notify of cancel action // Notify of cancel action
resolve({ resolve({
action: CREATE_REPORT_DIALOG_RESPONSE.CANCEL, action: CREATE_REPORT_DIALOG_RESPONSE.CANCEL,
@ -31,7 +31,7 @@ export default function createReportDialogPrompt(
* @param {string} param0.value - value from input field * @param {string} param0.value - value from input field
*/ */
const _handleFormSubmit = ({ action, value }) => { const _handleFormSubmit = ({ action, value }) => {
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
switch (action.id) { switch (action.id) {
case 'save': case 'save':
resolve({ resolve({
@ -66,7 +66,7 @@ export default function createReportDialogPrompt(
}; };
}); });
dialogId = UIDialogService.create({ dialogId = uiDialogService.create({
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
content: Dialog, content: Dialog,
@ -93,7 +93,7 @@ export default function createReportDialogPrompt(
}; };
const onKeyPressHandler = event => { const onKeyPressHandler = event => {
if (event.key === 'Enter') { if (event.key === 'Enter') {
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
resolve({ resolve({
action: CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT, action: CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT,
value: value.label, value: value.label,

View File

@ -1,12 +1,12 @@
function requestDisplaySetCreationForStudy( function requestDisplaySetCreationForStudy(
dataSource, dataSource,
DisplaySetService, displaySetService,
StudyInstanceUID, StudyInstanceUID,
madeInClient madeInClient
) { ) {
// TODO: is this already short-circuited by the map of Retrieve promises? // TODO: is this already short-circuited by the map of Retrieve promises?
if ( if (
DisplaySetService.activeDisplaySets.some( displaySetService.activeDisplaySets.some(
displaySet => displaySet.StudyInstanceUID === StudyInstanceUID displaySet => displaySet.StudyInstanceUID === StudyInstanceUID
) )
) { ) {

View File

@ -20,7 +20,7 @@ function LayoutSelector({
const [viewportGridState, viewportGridService] = useViewportGrid(); const [viewportGridState, viewportGridService] = useViewportGrid();
const { const {
HangingProtocolService, hangingProtocolService,
toolbarService, toolbarService,
} = (servicesManager as ServicesManager).services; } = (servicesManager as ServicesManager).services;
@ -31,8 +31,8 @@ function LayoutSelector({
}; };
useEffect(() => { useEffect(() => {
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.PROTOCOL_CHANGED, hangingProtocolService.EVENTS.PROTOCOL_CHANGED,
evt => { evt => {
const { protocol } = evt; const { protocol } = evt;
} }
@ -41,7 +41,7 @@ function LayoutSelector({
return () => { return () => {
unsubscribe(); unsubscribe();
}; };
}, [HangingProtocolService]); }, [hangingProtocolService]);
useEffect(() => { useEffect(() => {
window.addEventListener('click', closeOnOutsideClick); window.addEventListener('click', closeOnOutsideClick);
@ -65,7 +65,7 @@ function LayoutSelector({
// TODO Here the layout change will amount to a change of hanging protocol as specified by the extension for this layout selector tool // TODO Here the layout change will amount to a change of hanging protocol as specified by the extension for this layout selector tool
// followed by the change of the grid itself. // followed by the change of the grid itself.
if (HangingProtocolService.getActiveProtocol().protocol.id === 'mpr') { if (hangingProtocolService.getActiveProtocol().protocol.id === 'mpr') {
toolbarService.recordInteraction({ toolbarService.recordInteraction({
groupId: 'MPR', groupId: 'MPR',
itemId: 'MPR', itemId: 'MPR',

View File

@ -58,7 +58,7 @@ function ViewerLayout({
appConfig.showLoadingIndicator appConfig.showLoadingIndicator
); );
const { HangingProtocolService } = servicesManager.services; const { hangingProtocolService } = servicesManager.services;
const { hotkeyDefinitions, hotkeyDefaults } = hotkeysManager; const { hotkeyDefinitions, hotkeyDefaults } = hotkeysManager;
const versionNumber = process.env.VERSION_NUMBER; const versionNumber = process.env.VERSION_NUMBER;
@ -167,11 +167,11 @@ function ViewerLayout({
}; };
useEffect(() => { useEffect(() => {
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.HANGING_PROTOCOL_APPLIED_FOR_VIEWPORT, hangingProtocolService.EVENTS.HANGING_PROTOCOL_APPLIED_FOR_VIEWPORT,
// Todo: right now to set the loading indicator to false, we need to wait for the // Todo: right now to set the loading indicator to false, we need to wait for the
// HangingProtocolService to finish applying the viewport matching to each viewport, // hangingProtocolService to finish applying the viewport matching to each viewport,
// however, this might not be the only approach to set the loading indicator to false. we need to explore this further. // however, this might not be the only approach to set the loading indicator to false. we need to explore this further.
({ progress }) => { ({ progress }) => {
if (progress === 100) { if (progress === 100) {
@ -183,7 +183,7 @@ function ViewerLayout({
return () => { return () => {
unsubscribe(); unsubscribe();
}; };
}, [HangingProtocolService]); }, [hangingProtocolService]);
const getViewportComponentData = viewportComponent => { const getViewportComponentData = viewportComponent => {
const { entry } = getComponent(viewportComponent.namespace); const { entry } = getComponent(viewportComponent.namespace);

View File

@ -3,37 +3,37 @@ import React from 'react';
const commandsModule = ({ servicesManager, commandsManager }) => { const commandsModule = ({ servicesManager, commandsManager }) => {
const { const {
MeasurementService, measurementService,
HangingProtocolService, hangingProtocolService,
UINotificationService, uiNotificationService,
ViewportGridService, viewportGridService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const actions = { const actions = {
displayNotification: ({ text, title, type }) => { displayNotification: ({ text, title, type }) => {
UINotificationService.show({ uiNotificationService.show({
title: title, title: title,
message: text, message: text,
type: type, type: type,
}); });
}, },
clearMeasurements: () => { clearMeasurements: () => {
MeasurementService.clear(); measurementService.clear();
}, },
nextStage: () => { nextStage: () => {
// next stage in hanging protocols // next stage in hanging protocols
HangingProtocolService.nextProtocolStage(); hangingProtocolService.nextProtocolStage();
}, },
previousStage: () => { previousStage: () => {
HangingProtocolService.previousProtocolStage(); hangingProtocolService.previousProtocolStage();
}, },
openDICOMTagViewer() { openDICOMTagViewer() {
const { activeViewportIndex, viewports } = ViewportGridService.getState(); const { activeViewportIndex, viewports } = viewportGridService.getState();
const activeViewportSpecificData = viewports[activeViewportIndex]; const activeViewportSpecificData = viewports[activeViewportIndex];
const { displaySetInstanceUIDs } = activeViewportSpecificData; const { displaySetInstanceUIDs } = activeViewportSpecificData;
const displaySets = DisplaySetService.activeDisplaySets; const displaySets = displaySetService.activeDisplaySets;
const { UIModalService } = servicesManager.services; const { UIModalService } = servicesManager.services;
const displaySetInstanceUID = displaySetInstanceUIDs[0]; const displaySetInstanceUID = displaySetInstanceUIDs[0];

View File

@ -1,7 +1,7 @@
const MIN_SR_SERIES_NUMBER = 4700; const MIN_SR_SERIES_NUMBER = 4700;
export default function getNextSRSeriesNumber(DisplaySetService) { export default function getNextSRSeriesNumber(displaySetService) {
const activeDisplaySets = DisplaySetService.getActiveDisplaySets(); const activeDisplaySets = displaySetService.getActiveDisplaySets();
const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR'); const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR');
const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber); const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber);
const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER); const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER);

View File

@ -30,7 +30,7 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"@ohif/ui": "^2.0.0", "@ohif/ui": "^2.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",

View File

@ -30,7 +30,7 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"@ohif/ui": "^2.0.0", "@ohif/ui": "^2.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",

View File

@ -32,10 +32,10 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"classnames": "^2.3.2", "classnames": "^2.3.2",
"@cornerstonejs/core": "^0.27.1", "@cornerstonejs/core": "0.30.1",
"@cornerstonejs/tools": "^0.36.3", "@cornerstonejs/tools": "0.39.0",
"@ohif/extension-cornerstone-dicom-sr": "^3.0.0", "@ohif/extension-cornerstone-dicom-sr": "^3.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",

View File

@ -17,11 +17,11 @@ async function createReportAsync(
options options
) { ) {
const { const {
DisplaySetService, displaySetService,
UINotificationService, uiNotificationService,
UIDialogService, uiDialogService,
} = servicesManager.services; } = servicesManager.services;
const loadingDialogId = UIDialogService.create({ const loadingDialogId = uiDialogService.create({
showOverlay: true, showOverlay: true,
isDraggable: false, isDraggable: false,
centralize: true, centralize: true,
@ -46,9 +46,9 @@ async function createReportAsync(
// automatically calls makeDisplaySets // automatically calls makeDisplaySets
DicomMetadataStore.addInstances([naturalizedReport], true); DicomMetadataStore.addInstances([naturalizedReport], true);
const displaySetInstanceUID = DisplaySetService.getMostRecentDisplaySet(); const displaySetInstanceUID = displaySetService.getMostRecentDisplaySet();
UINotificationService.show({ uiNotificationService.show({
title: 'Create Report', title: 'Create Report',
message: 'Measurements saved successfully', message: 'Measurements saved successfully',
type: 'success', type: 'success',
@ -56,13 +56,13 @@ async function createReportAsync(
return [displaySetInstanceUID]; return [displaySetInstanceUID];
} catch (error) { } catch (error) {
UINotificationService.show({ uiNotificationService.show({
title: 'Create Report', title: 'Create Report',
message: error.message || 'Failed to store measurements', message: error.message || 'Failed to store measurements',
type: 'error', type: 'error',
}); });
} finally { } finally {
UIDialogService.dismiss({ id: loadingDialogId }); uiDialogService.dismiss({ id: loadingDialogId });
} }
} }

View File

@ -3,13 +3,13 @@ import React from 'react';
import { Dialog, Input } from '@ohif/ui'; import { Dialog, Input } from '@ohif/ui';
import RESPONSE from './PROMPT_RESPONSES'; import RESPONSE from './PROMPT_RESPONSES';
export default function createReportDialogPrompt(UIDialogService) { export default function createReportDialogPrompt(uiDialogService) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
let dialogId = undefined; let dialogId = undefined;
const _handleClose = () => { const _handleClose = () => {
// Dismiss dialog // Dismiss dialog
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
// Notify of cancel action // Notify of cancel action
resolve({ action: RESPONSE.CANCEL, value: undefined }); resolve({ action: RESPONSE.CANCEL, value: undefined });
}; };
@ -20,7 +20,7 @@ export default function createReportDialogPrompt(UIDialogService) {
* @param {string} param0.value - value from input field * @param {string} param0.value - value from input field
*/ */
const _handleFormSubmit = ({ action, value }) => { const _handleFormSubmit = ({ action, value }) => {
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
switch (action.id) { switch (action.id) {
case 'save': case 'save':
resolve({ action: RESPONSE.CREATE_REPORT, value: value.label }); resolve({ action: RESPONSE.CREATE_REPORT, value: value.label });
@ -31,7 +31,7 @@ export default function createReportDialogPrompt(UIDialogService) {
} }
}; };
dialogId = UIDialogService.create({ dialogId = uiDialogService.create({
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
content: Dialog, content: Dialog,
@ -55,7 +55,7 @@ export default function createReportDialogPrompt(UIDialogService) {
}; };
const onKeyPressHandler = event => { const onKeyPressHandler = event => {
if (event.key === 'Enter') { if (event.key === 'Enter') {
UIDialogService.dismiss({ id: dialogId }); uiDialogService.dismiss({ id: dialogId });
resolve({ action: RESPONSE.CREATE_REPORT, value: value.label }); resolve({ action: RESPONSE.CREATE_REPORT, value: value.label });
} }
}; };

View File

@ -1,7 +1,7 @@
const MIN_SR_SERIES_NUMBER = 4700; const MIN_SR_SERIES_NUMBER = 4700;
export default function getNextSRSeriesNumber(DisplaySetService) { export default function getNextSRSeriesNumber(displaySetService) {
const activeDisplaySets = DisplaySetService.getActiveDisplaySets(); const activeDisplaySets = displaySetService.getActiveDisplaySets();
const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR'); const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR');
const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber); const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber);
const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER); const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER);

View File

@ -34,10 +34,10 @@ function TrackedMeasurementsContextProvider(
const machineOptions = Object.assign({}, defaultOptions); const machineOptions = Object.assign({}, defaultOptions);
machineOptions.actions = Object.assign({}, machineOptions.actions, { machineOptions.actions = Object.assign({}, machineOptions.actions, {
jumpToFirstMeasurementInActiveViewport: (ctx, evt) => { jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {
const { MeasurementService } = servicesManager.services; const { measurementService } = servicesManager.services;
const { trackedStudy, trackedSeries } = ctx; const { trackedStudy, trackedSeries } = ctx;
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter( const trackedMeasurements = measurements.filter(
m => m =>
trackedStudy === m.referenceStudyUID && trackedStudy === m.referenceStudyUID &&
@ -46,7 +46,7 @@ function TrackedMeasurementsContextProvider(
const uid = trackedMeasurements[0].uid; const uid = trackedMeasurements[0].uid;
MeasurementService.jumpToMeasurement( measurementService.jumpToMeasurement(
viewportGrid.activeViewportIndex, viewportGrid.activeViewportIndex,
uid uid
); );
@ -63,24 +63,24 @@ function TrackedMeasurementsContextProvider(
} }
}, },
discardPreviouslyTrackedMeasurements: (ctx, evt) => { discardPreviouslyTrackedMeasurements: (ctx, evt) => {
const { MeasurementService } = servicesManager.services; const { measurementService } = servicesManager.services;
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const filteredMeasurements = measurements.filter(ms => const filteredMeasurements = measurements.filter(ms =>
ctx.prevTrackedSeries.includes(ms.referenceSeriesUID) ctx.prevTrackedSeries.includes(ms.referenceSeriesUID)
); );
const measurementIds = filteredMeasurements.map(fm => fm.id); const measurementIds = filteredMeasurements.map(fm => fm.id);
for (let i = 0; i < measurementIds.length; i++) { for (let i = 0; i < measurementIds.length; i++) {
MeasurementService.remove(measurementIds[i]); measurementService.remove(measurementIds[i]);
} }
}, },
clearAllMeasurements: (ctx, evt) => { clearAllMeasurements: (ctx, evt) => {
const { MeasurementService } = servicesManager.services; const { measurementService } = servicesManager.services;
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const measurementIds = measurements.map(fm => fm.uid); const measurementIds = measurements.map(fm => fm.uid);
for (let i = 0; i < measurementIds.length; i++) { for (let i = 0; i < measurementIds.length; i++) {
MeasurementService.remove(measurementIds[i]); measurementService.remove(measurementIds[i]);
} }
}, },
}); });
@ -139,8 +139,8 @@ function TrackedMeasurementsContextProvider(
// Todo: Getting the first displaySetInstanceUID is wrong, but we don't have // Todo: Getting the first displaySetInstanceUID is wrong, but we don't have
// tracking fusion viewports yet. This should change when we do. // tracking fusion viewports yet. This should change when we do.
const { DisplaySetService } = servicesManager.services; const { displaySetService } = servicesManager.services;
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
activeViewport.displaySetInstanceUIDs[0] activeViewport.displaySetInstanceUIDs[0]
); );

View File

@ -17,10 +17,10 @@ function promptHydrateStructuredReport(
) { ) {
const { const {
UIViewportDialogService, UIViewportDialogService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const { viewportIndex, displaySetInstanceUID } = evt; const { viewportIndex, displaySetInstanceUID } = evt;
const srDisplaySet = DisplaySetService.getDisplaySetByUID( const srDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );

View File

@ -9,9 +9,9 @@ function promptSaveReport(
evt evt
) { ) {
const { const {
UIDialogService, uiDialogService,
MeasurementService, measurementService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const viewportIndex = const viewportIndex =
evt.viewportIndex === undefined evt.viewportIndex === undefined
@ -26,13 +26,13 @@ function promptSaveReport(
let displaySetInstanceUIDs; let displaySetInstanceUIDs;
return new Promise(async function(resolve, reject) { return new Promise(async function(resolve, reject) {
// TODO: Fallback if (UIDialogService) { // TODO: Fallback if (uiDialogService) {
const promptResult = await createReportDialogPrompt(UIDialogService); const promptResult = await createReportDialogPrompt(uiDialogService);
if (promptResult.action === RESPONSE.CREATE_REPORT) { if (promptResult.action === RESPONSE.CREATE_REPORT) {
const dataSources = extensionManager.getDataSources(); const dataSources = extensionManager.getDataSources();
const dataSource = dataSources[0]; const dataSource = dataSources[0];
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter( const trackedMeasurements = measurements.filter(
m => m =>
trackedStudy === m.referenceStudyUID && trackedStudy === m.referenceStudyUID &&
@ -45,7 +45,7 @@ function promptSaveReport(
? 'Research Derived Series' // default ? 'Research Derived Series' // default
: promptResult.value; // provided value : promptResult.value; // provided value
const SeriesNumber = getNextSRSeriesNumber(DisplaySetService); const SeriesNumber = getNextSRSeriesNumber(displaySetService);
displaySetInstanceUIDs = await createReportAsync( displaySetInstanceUIDs = await createReportAsync(
servicesManager, servicesManager,

View File

@ -32,9 +32,9 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
200 200
); );
const { const {
MeasurementService, measurementService,
UIDialogService, uiDialogService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const [ const [
trackedMeasurements, trackedMeasurements,
@ -47,7 +47,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
const [displayMeasurements, setDisplayMeasurements] = useState([]); const [displayMeasurements, setDisplayMeasurements] = useState([]);
useEffect(() => { useEffect(() => {
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const filteredMeasurements = measurements.filter( const filteredMeasurements = measurements.filter(
m => m =>
trackedStudy === m.referenceStudyUID && trackedStudy === m.referenceStudyUID &&
@ -57,14 +57,14 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
const mappedMeasurements = filteredMeasurements.map(m => const mappedMeasurements = filteredMeasurements.map(m =>
_mapMeasurementToDisplay( _mapMeasurementToDisplay(
m, m,
MeasurementService.VALUE_TYPES, measurementService.VALUE_TYPES,
DisplaySetService displaySetService
) )
); );
setDisplayMeasurements(mappedMeasurements); setDisplayMeasurements(mappedMeasurements);
// eslint-ignore-next-line // eslint-ignore-next-line
}, [ }, [
MeasurementService, measurementService,
trackedStudy, trackedStudy,
trackedSeries, trackedSeries,
debouncedMeasurementChangeTimestamp, debouncedMeasurementChangeTimestamp,
@ -110,20 +110,20 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
// TODO: Better way to consolidated, debounce, check on change? // TODO: Better way to consolidated, debounce, check on change?
// Are we exposing the right API for measurementService? // Are we exposing the right API for measurementService?
// This watches for ALL MeasurementService changes. It updates a timestamp, // This watches for ALL measurementService changes. It updates a timestamp,
// which is debounced. After a brief period of inactivity, this triggers // which is debounced. After a brief period of inactivity, this triggers
// a re-render where we grab up-to-date measurements // a re-render where we grab up-to-date measurements
useEffect(() => { useEffect(() => {
const added = MeasurementService.EVENTS.MEASUREMENT_ADDED; const added = measurementService.EVENTS.MEASUREMENT_ADDED;
const addedRaw = MeasurementService.EVENTS.RAW_MEASUREMENT_ADDED; const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;
const updated = MeasurementService.EVENTS.MEASUREMENT_UPDATED; const updated = measurementService.EVENTS.MEASUREMENT_UPDATED;
const removed = MeasurementService.EVENTS.MEASUREMENT_REMOVED; const removed = measurementService.EVENTS.MEASUREMENT_REMOVED;
const cleared = MeasurementService.EVENTS.MEASUREMENTS_CLEARED; const cleared = measurementService.EVENTS.MEASUREMENTS_CLEARED;
const subscriptions = []; const subscriptions = [];
[added, addedRaw, updated, removed, cleared].forEach(evt => { [added, addedRaw, updated, removed, cleared].forEach(evt => {
subscriptions.push( subscriptions.push(
MeasurementService.subscribe(evt, () => { measurementService.subscribe(evt, () => {
setMeasurementsUpdated(Date.now().toString()); setMeasurementsUpdated(Date.now().toString());
}).unsubscribe }).unsubscribe
); );
@ -134,33 +134,33 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
unsub(); unsub();
}); });
}; };
}, [MeasurementService, sendTrackedMeasurementsEvent]); }, [measurementService, sendTrackedMeasurementsEvent]);
async function exportReport() { async function exportReport() {
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter( const trackedMeasurements = measurements.filter(
m => m =>
trackedStudy === m.referenceStudyUID && trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID) trackedSeries.includes(m.referenceSeriesUID)
); );
downloadCSVReport(trackedMeasurements, MeasurementService); downloadCSVReport(trackedMeasurements, measurementService);
} }
const jumpToImage = ({ uid, isActive }) => { const jumpToImage = ({ uid, isActive }) => {
MeasurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, uid); measurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, uid);
onMeasurementItemClickHandler({ uid, isActive }); onMeasurementItemClickHandler({ uid, isActive });
}; };
const onMeasurementItemEditHandler = ({ uid, isActive }) => { const onMeasurementItemEditHandler = ({ uid, isActive }) => {
const measurement = MeasurementService.getMeasurement(uid); const measurement = measurementService.getMeasurement(uid);
jumpToImage({ uid, isActive }); jumpToImage({ uid, isActive });
const onSubmitHandler = ({ action, value }) => { const onSubmitHandler = ({ action, value }) => {
switch (action.id) { switch (action.id) {
case 'save': { case 'save': {
MeasurementService.update( measurementService.update(
uid, uid,
{ {
...measurement, ...measurement,
@ -170,10 +170,10 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
); );
} }
} }
UIDialogService.dismiss({ id: 'enter-annotation' }); uiDialogService.dismiss({ id: 'enter-annotation' });
}; };
UIDialogService.create({ uiDialogService.create({
id: 'enter-annotation', id: 'enter-annotation',
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
@ -230,10 +230,10 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
}; };
const displayMeasurementsWithoutFindings = displayMeasurements.filter( const displayMeasurementsWithoutFindings = displayMeasurements.filter(
dm => dm.measurementType !== MeasurementService.VALUE_TYPES.POINT dm => dm.measurementType !== measurementService.VALUE_TYPES.POINT
); );
const additionalFindings = displayMeasurements.filter( const additionalFindings = displayMeasurements.filter(
dm => dm.measurementType === MeasurementService.VALUE_TYPES.POINT dm => dm.measurementType === measurementService.VALUE_TYPES.POINT
); );
return ( return (
@ -286,7 +286,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
PanelMeasurementTableTracking.propTypes = { PanelMeasurementTableTracking.propTypes = {
servicesManager: PropTypes.shape({ servicesManager: PropTypes.shape({
services: PropTypes.shape({ services: PropTypes.shape({
MeasurementService: PropTypes.shape({ measurementService: PropTypes.shape({
getMeasurements: PropTypes.func.isRequired, getMeasurements: PropTypes.func.isRequired,
VALUE_TYPES: PropTypes.object.isRequired, VALUE_TYPES: PropTypes.object.isRequired,
}).isRequired, }).isRequired,
@ -294,8 +294,8 @@ PanelMeasurementTableTracking.propTypes = {
}).isRequired, }).isRequired,
}; };
// TODO: This could be a MeasurementService mapper // TODO: This could be a measurementService mapper
function _mapMeasurementToDisplay(measurement, types, DisplaySetService) { function _mapMeasurementToDisplay(measurement, types, displaySetService) {
const { referenceStudyUID, referenceSeriesUID, SOPInstanceUID } = measurement; const { referenceStudyUID, referenceSeriesUID, SOPInstanceUID } = measurement;
// TODO: We don't deal with multiframe well yet, would need to update // TODO: We don't deal with multiframe well yet, would need to update
@ -307,7 +307,7 @@ function _mapMeasurementToDisplay(measurement, types, DisplaySetService) {
SOPInstanceUID SOPInstanceUID
); );
const displaySets = DisplaySetService.getDisplaySetsForSeries( const displaySets = displaySetService.getDisplaySetsForSeries(
referenceSeriesUID referenceSeriesUID
); );

View File

@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { HangingProtocolService, utils } from '@ohif/core'; import { utils } from '@ohif/core';
import { import {
StudyBrowser, StudyBrowser,
useImageViewer, useImageViewer,
@ -23,11 +23,11 @@ function PanelStudyBrowserTracking({
dataSource, dataSource,
}) { }) {
const { const {
MeasurementService, measurementService,
DisplaySetService, displaySetService,
UIDialogService, uiDialogService,
HangingProtocolService, hangingProtocolService,
UINotificationService, uiNotificationService,
} = servicesManager.services; } = servicesManager.services;
// Normally you nest the components so the tree isn't so deep, and the data // Normally you nest the components so the tree isn't so deep, and the data
@ -55,13 +55,13 @@ function PanelStudyBrowserTracking({
let updatedViewports = []; let updatedViewports = [];
const viewportIndex = activeViewportIndex; const viewportIndex = activeViewportIndex;
try { try {
updatedViewports = HangingProtocolService.getViewportsRequireUpdate( updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex, viewportIndex,
displaySetInstanceUID displaySetInstanceUID
); );
} catch (error) { } catch (error) {
console.warn(error); console.warn(error);
UINotificationService.show({ uiNotificationService.show({
title: 'Thumbnail Double Click', title: 'Thumbnail Double Click',
message: message:
'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.', 'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.',
@ -79,13 +79,13 @@ function PanelStudyBrowserTracking({
const isSingleViewport = numCols === 1 && numRows === 1; const isSingleViewport = numCols === 1 && numRows === 1;
useEffect(() => { useEffect(() => {
const added = MeasurementService.EVENTS.MEASUREMENT_ADDED; const added = measurementService.EVENTS.MEASUREMENT_ADDED;
const addedRaw = MeasurementService.EVENTS.RAW_MEASUREMENT_ADDED; const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;
const subscriptions = []; const subscriptions = [];
[added, addedRaw].forEach(evt => { [added, addedRaw].forEach(evt => {
subscriptions.push( subscriptions.push(
MeasurementService.subscribe(evt, ({ source, measurement }) => { measurementService.subscribe(evt, ({ source, measurement }) => {
const { const {
referenceSeriesUID: SeriesInstanceUID, referenceSeriesUID: SeriesInstanceUID,
referenceStudyUID: StudyInstanceUID, referenceStudyUID: StudyInstanceUID,
@ -106,7 +106,7 @@ function PanelStudyBrowserTracking({
unsub(); unsub();
}); });
}; };
}, [MeasurementService, activeViewportIndex, sendTrackedMeasurementsEvent]); }, [measurementService, activeViewportIndex, sendTrackedMeasurementsEvent]);
const { trackedStudy, trackedSeries } = trackedMeasurements.context; const { trackedStudy, trackedSeries } = trackedMeasurements.context;
@ -150,10 +150,10 @@ function PanelStudyBrowserTracking({
// ~~ Initial Thumbnails // ~~ Initial Thumbnails
useEffect(() => { useEffect(() => {
const currentDisplaySets = DisplaySetService.activeDisplaySets; const currentDisplaySets = displaySetService.activeDisplaySets;
currentDisplaySets.forEach(async dSet => { currentDisplaySets.forEach(async dSet => {
const newImageSrcEntry = {}; const newImageSrcEntry = {};
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
dSet.displaySetInstanceUID dSet.displaySetInstanceUID
); );
const imageIds = dataSource.getImageIdsForDisplaySet(displaySet); const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
@ -171,12 +171,12 @@ function PanelStudyBrowserTracking({
} }
}); });
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [DisplaySetService, dataSource, getImageSrc]); }, [displaySetService, dataSource, getImageSrc]);
// ~~ displaySets // ~~ displaySets
useEffect(() => { useEffect(() => {
// TODO: Are we sure `activeDisplaySets` will always be accurate? // TODO: Are we sure `activeDisplaySets` will always be accurate?
const currentDisplaySets = DisplaySetService.activeDisplaySets; const currentDisplaySets = displaySetService.activeDisplaySets;
const mappedDisplaySets = _mapDisplaySets( const mappedDisplaySets = _mapDisplaySets(
currentDisplaySets, currentDisplaySets,
thumbnailImageSrcMap, thumbnailImageSrcMap,
@ -184,15 +184,15 @@ function PanelStudyBrowserTracking({
viewports, viewports,
isSingleViewport, isSingleViewport,
dataSource, dataSource,
DisplaySetService, displaySetService,
UIDialogService, uiDialogService,
UINotificationService uiNotificationService
); );
setDisplaySets(mappedDisplaySets); setDisplaySets(mappedDisplaySets);
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [ }, [
DisplaySetService.activeDisplaySets, displaySetService.activeDisplaySets,
trackedSeries, trackedSeries,
thumbnailImageSrcMap, thumbnailImageSrcMap,
viewports, viewports,
@ -202,15 +202,15 @@ function PanelStudyBrowserTracking({
// ~~ subscriptions --> displaySets // ~~ subscriptions --> displaySets
useEffect(() => { useEffect(() => {
// DISPLAY_SETS_ADDED returns an array of DisplaySets that were added // DISPLAY_SETS_ADDED returns an array of DisplaySets that were added
const SubscriptionDisplaySetsAdded = DisplaySetService.subscribe( const SubscriptionDisplaySetsAdded = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_ADDED, displaySetService.EVENTS.DISPLAY_SETS_ADDED,
data => { data => {
const { displaySetsAdded, options } = data; const { displaySetsAdded, options } = data;
displaySetsAdded.forEach(async dSet => { displaySetsAdded.forEach(async dSet => {
const displaySetInstanceUID = dSet.displaySetInstanceUID; const displaySetInstanceUID = dSet.displaySetInstanceUID;
const newImageSrcEntry = {}; const newImageSrcEntry = {};
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -237,8 +237,8 @@ function PanelStudyBrowserTracking({
// TODO: Will this always hold _all_ the displaySets we care about? // TODO: Will this always hold _all_ the displaySets we care about?
// DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets` // DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets`
const SubscriptionDisplaySetsChanged = DisplaySetService.subscribe( const SubscriptionDisplaySetsChanged = displaySetService.subscribe(
DisplaySetService.EVENTS.DISPLAY_SETS_CHANGED, displaySetService.EVENTS.DISPLAY_SETS_CHANGED,
changedDisplaySets => { changedDisplaySets => {
const mappedDisplaySets = _mapDisplaySets( const mappedDisplaySets = _mapDisplaySets(
changedDisplaySets, changedDisplaySets,
@ -247,9 +247,9 @@ function PanelStudyBrowserTracking({
viewports, viewports,
isSingleViewport, isSingleViewport,
dataSource, dataSource,
DisplaySetService, displaySetService,
UIDialogService, uiDialogService,
UINotificationService uiNotificationService
); );
setDisplaySets(mappedDisplaySets); setDisplaySets(mappedDisplaySets);
@ -262,7 +262,7 @@ function PanelStudyBrowserTracking({
}; };
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [ }, [
DisplaySetService, displaySetService,
dataSource, dataSource,
getImageSrc, getImageSrc,
thumbnailImageSrcMap, thumbnailImageSrcMap,
@ -294,7 +294,7 @@ function PanelStudyBrowserTracking({
if (!shouldCollapseStudy) { if (!shouldCollapseStudy) {
const madeInClient = true; const madeInClient = true;
requestDisplaySetCreationForStudy( requestDisplaySetCreationForStudy(
DisplaySetService, displaySetService,
StudyInstanceUID, StudyInstanceUID,
madeInClient madeInClient
); );
@ -357,7 +357,7 @@ function PanelStudyBrowserTracking({
setActiveTabName(clickedTabName); setActiveTabName(clickedTabName);
}} }}
onClickUntrack={displaySetInstanceUID => { onClickUntrack={displaySetInstanceUID => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
// TODO: shift this somewhere else where we're centralizing this logic? // TODO: shift this somewhere else where we're centralizing this logic?
@ -414,9 +414,9 @@ function _mapDisplaySets(
viewports, // TODO: make array of `displaySetInstanceUIDs`? viewports, // TODO: make array of `displaySetInstanceUIDs`?
isSingleViewport, isSingleViewport,
dataSource, dataSource,
DisplaySetService, displaySetService,
UIDialogService, uiDialogService,
UINotificationService uiNotificationService
) { ) {
const thumbnailDisplaySets = []; const thumbnailDisplaySets = [];
const thumbnailNoImageDisplaySets = []; const thumbnailNoImageDisplaySets = [];
@ -466,7 +466,7 @@ function _mapDisplaySets(
if (dataSource.reject && dataSource.reject.series) { if (dataSource.reject && dataSource.reject.series) {
thumbnailProps.canReject = true; thumbnailProps.canReject = true;
thumbnailProps.onReject = () => { thumbnailProps.onReject = () => {
UIDialogService.create({ uiDialogService.create({
id: 'ds-reject-sr', id: 'ds-reject-sr',
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
@ -489,7 +489,7 @@ function _mapDisplaySets(
classes: ['reject-yes-button'], classes: ['reject-yes-button'],
}, },
], ],
onClose: () => UIDialogService.dismiss({ id: 'ds-reject-sr' }), onClose: () => uiDialogService.dismiss({ id: 'ds-reject-sr' }),
onShow: () => { onShow: () => {
const yesButton = document.querySelector('.reject-yes-button'); const yesButton = document.querySelector('.reject-yes-button');
@ -503,16 +503,16 @@ function _mapDisplaySets(
ds.StudyInstanceUID, ds.StudyInstanceUID,
ds.SeriesInstanceUID ds.SeriesInstanceUID
); );
DisplaySetService.deleteDisplaySet(displaySetInstanceUID); displaySetService.deleteDisplaySet(displaySetInstanceUID);
UIDialogService.dismiss({ id: 'ds-reject-sr' }); uiDialogService.dismiss({ id: 'ds-reject-sr' });
UINotificationService.show({ uiNotificationService.show({
title: 'Delete Report', title: 'Delete Report',
message: 'Report deleted successfully', message: 'Report deleted successfully',
type: 'success', type: 'success',
}); });
} catch (error) { } catch (error) {
UIDialogService.dismiss({ id: 'ds-reject-sr' }); uiDialogService.dismiss({ id: 'ds-reject-sr' });
UINotificationService.show({ uiNotificationService.show({
title: 'Delete Report', title: 'Delete Report',
message: 'Failed to delete report', message: 'Failed to delete report',
type: 'error', type: 'error',
@ -520,7 +520,7 @@ function _mapDisplaySets(
} }
break; break;
case 'cancel': case 'cancel':
UIDialogService.dismiss({ id: 'ds-reject-sr' }); uiDialogService.dismiss({ id: 'ds-reject-sr' });
break; break;
} }
}, },

View File

@ -1,11 +1,11 @@
function requestDisplaySetCreationForStudy( function requestDisplaySetCreationForStudy(
dataSource, dataSource,
DisplaySetService, displaySetService,
StudyInstanceUID, StudyInstanceUID,
madeInClient madeInClient
) { ) {
if ( if (
DisplaySetService.activeDisplaySets.some( displaySetService.activeDisplaySets.some(
displaySet => displaySet.StudyInstanceUID === StudyInstanceUID displaySet => displaySet.StudyInstanceUID === StudyInstanceUID
) )
) { ) {

View File

@ -35,8 +35,8 @@ function TrackedCornerstoneViewport(props) {
const { t } = useTranslation('TrackedViewport'); const { t } = useTranslation('TrackedViewport');
const { const {
MeasurementService, measurementService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
// Todo: handling more than one displaySet on the same viewport // Todo: handling more than one displaySet on the same viewport
@ -99,9 +99,9 @@ function TrackedCornerstoneViewport(props) {
}, },
}); });
CornerstoneViewportService.getRenderingEngine().renderViewport( cornerstoneViewportService
viewportId .getRenderingEngine()
); .renderViewport(viewportId);
return; return;
} }
@ -112,7 +112,7 @@ function TrackedCornerstoneViewport(props) {
}, },
}); });
CornerstoneViewportService.getRenderingEngine().renderViewport(viewportId); cornerstoneViewportService.getRenderingEngine().renderViewport(viewportId);
return () => { return () => {
annotation.config.style.setViewportToolStyles(viewportId, {}); annotation.config.style.setViewportToolStyles(viewportId, {});
@ -177,7 +177,7 @@ function TrackedCornerstoneViewport(props) {
setTrackedMeasurementUID(newTrackedMeasurementUID); setTrackedMeasurementUID(newTrackedMeasurementUID);
MeasurementService.jumpToMeasurement( measurementService.jumpToMeasurement(
viewportIndex, viewportIndex,
newTrackedMeasurementUID newTrackedMeasurementUID
); );
@ -281,8 +281,8 @@ function _getNextMeasurementUID(
trackedMeasurementId, trackedMeasurementId,
trackedMeasurements trackedMeasurements
) { ) {
const { MeasurementService } = servicesManager.services; const { measurementService } = servicesManager.services;
const measurements = MeasurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const { trackedSeries } = trackedMeasurements.context; const { trackedSeries } = trackedMeasurements.context;

View File

@ -30,7 +30,7 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^3.0.0", "@ohif/core": "^3.0.0",
"@ohif/ui": "^2.0.0", "@ohif/ui": "^2.0.0",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",

View File

@ -25,10 +25,10 @@ const DEFAULT_MEATADATA = {
export default function PanelPetSUV({ servicesManager, commandsManager }) { export default function PanelPetSUV({ servicesManager, commandsManager }) {
const { t } = useTranslation('PanelSUV'); const { t } = useTranslation('PanelSUV');
const { const {
DisplaySetService, displaySetService,
ToolGroupService, toolGroupService,
toolbarService, toolbarService,
HangingProtocolService, hangingProtocolService,
} = (servicesManager as ServicesManager).services; } = (servicesManager as ServicesManager).services;
const [metadata, setMetadata] = useState(DEFAULT_MEATADATA); const [metadata, setMetadata] = useState(DEFAULT_MEATADATA);
const [ptDisplaySet, setPtDisplaySet] = useState(null); const [ptDisplaySet, setPtDisplaySet] = useState(null);
@ -70,8 +70,8 @@ export default function PanelPetSUV({ servicesManager, commandsManager }) {
}; };
useEffect(() => { useEffect(() => {
const displaySets = DisplaySetService.getActiveDisplaySets(); const displaySets = displaySetService.getActiveDisplaySets();
const { viewportMatchDetails } = HangingProtocolService.getMatchDetails(); const { viewportMatchDetails } = hangingProtocolService.getMatchDetails();
if (!displaySets.length) { if (!displaySets.length) {
return; return;
} }
@ -89,8 +89,8 @@ export default function PanelPetSUV({ servicesManager, commandsManager }) {
// get the patientMetadata from the StudyInstanceUIDs and update the state // get the patientMetadata from the StudyInstanceUIDs and update the state
useEffect(() => { useEffect(() => {
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.PROTOCOL_CHANGED, hangingProtocolService.EVENTS.PROTOCOL_CHANGED,
({ viewportMatchDetails }) => { ({ viewportMatchDetails }) => {
const displaySetInfo = getMatchingPTDisplaySet(viewportMatchDetails); const displaySetInfo = getMatchingPTDisplaySet(viewportMatchDetails);
@ -112,7 +112,7 @@ export default function PanelPetSUV({ servicesManager, commandsManager }) {
throw new Error('No ptDisplaySet found'); throw new Error('No ptDisplaySet found');
} }
const toolGroupIds = ToolGroupService.getToolGroupIds(); const toolGroupIds = toolGroupService.getToolGroupIds();
// Todo: we don't have a proper way to perform a toggle command and update the // Todo: we don't have a proper way to perform a toggle command and update the
// state for the toolbar, so here, we manually toggle the toolbar // state for the toolbar, so here, we manually toggle the toolbar
@ -139,7 +139,7 @@ export default function PanelPetSUV({ servicesManager, commandsManager }) {
); );
// update the displaySets // update the displaySets
DisplaySetService.setDisplaySetMetadataInvalidated( displaySetService.setDisplaySetMetadataInvalidated(
ptDisplaySet.displaySetInstanceUID ptDisplaySet.displaySetInstanceUID
); );
} }
@ -238,7 +238,7 @@ export default function PanelPetSUV({ servicesManager, commandsManager }) {
PanelPetSUV.propTypes = { PanelPetSUV.propTypes = {
servicesManager: PropTypes.shape({ servicesManager: PropTypes.shape({
services: PropTypes.shape({ services: PropTypes.shape({
MeasurementService: PropTypes.shape({ measurementService: PropTypes.shape({
getMeasurements: PropTypes.func.isRequired, getMeasurements: PropTypes.func.isRequired,
subscribe: PropTypes.func.isRequired, subscribe: PropTypes.func.isRequired,
EVENTS: PropTypes.object.isRequired, EVENTS: PropTypes.object.isRequired,

View File

@ -45,14 +45,14 @@ export default function PanelRoiThresholdSegmentation({
servicesManager, servicesManager,
commandsManager, commandsManager,
}) { }) {
const { SegmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
const { t } = useTranslation('PanelSUV'); const { t } = useTranslation('PanelSUV');
const [showConfig, setShowConfig] = useState(false); const [showConfig, setShowConfig] = useState(false);
const [labelmapLoading, setLabelmapLoading] = useState(false); const [labelmapLoading, setLabelmapLoading] = useState(false);
const [selectedSegmentationId, setSelectedSegmentationId] = useState(null); const [selectedSegmentationId, setSelectedSegmentationId] = useState(null);
const [segmentations, setSegmentations] = useState(() => const [segmentations, setSegmentations] = useState(() =>
SegmentationService.getSegmentations() segmentationService.getSegmentations()
); );
const [config, dispatch] = useReducer(reducer, { const [config, dispatch] = useReducer(reducer, {
@ -90,7 +90,7 @@ export default function PanelRoiThresholdSegmentation({
const lesionGlyoclysisStats = lesionStats.volume * lesionStats.meanValue; const lesionGlyoclysisStats = lesionStats.volume * lesionStats.meanValue;
// update segDetails with the suv peak for the active segmentation // update segDetails with the suv peak for the active segmentation
const segmentation = SegmentationService.getSegmentation( const segmentation = segmentationService.getSegmentation(
selectedSegmentationId selectedSegmentationId
); );
@ -101,7 +101,7 @@ export default function PanelRoiThresholdSegmentation({
}; };
const notYetUpdatedAtSource = true; const notYetUpdatedAtSource = true;
SegmentationService.addOrUpdateSegmentation( segmentationService.addOrUpdateSegmentation(
{ {
...segmentation, ...segmentation,
...Object.assign(segmentation.cachedStats, cachedStats), ...Object.assign(segmentation.cachedStats, cachedStats),
@ -118,13 +118,13 @@ export default function PanelRoiThresholdSegmentation({
*/ */
useEffect(() => { useEffect(() => {
// ~~ Subscription // ~~ Subscription
const added = SegmentationService.EVENTS.SEGMENTATION_ADDED; const added = segmentationService.EVENTS.SEGMENTATION_ADDED;
const updated = SegmentationService.EVENTS.SEGMENTATION_UPDATED; const updated = segmentationService.EVENTS.SEGMENTATION_UPDATED;
const subscriptions = []; const subscriptions = [];
[added, updated].forEach(evt => { [added, updated].forEach(evt => {
const { unsubscribe } = SegmentationService.subscribe(evt, () => { const { unsubscribe } = segmentationService.subscribe(evt, () => {
const segmentations = SegmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
setSegmentations(segmentations); setSegmentations(segmentations);
}); });
subscriptions.push(unsubscribe); subscriptions.push(unsubscribe);
@ -138,10 +138,10 @@ export default function PanelRoiThresholdSegmentation({
}, []); }, []);
useEffect(() => { useEffect(() => {
const { unsubscribe } = SegmentationService.subscribe( const { unsubscribe } = segmentationService.subscribe(
SegmentationService.EVENTS.SEGMENTATION_REMOVED, segmentationService.EVENTS.SEGMENTATION_REMOVED,
() => { () => {
const segmentations = SegmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
setSegmentations(segmentations); setSegmentations(segmentations);
if (segmentations.length > 0) { if (segmentations.length > 0) {
@ -223,15 +223,15 @@ export default function PanelRoiThresholdSegmentation({
setSelectedSegmentationId(id); setSelectedSegmentationId(id);
}} }}
onToggleVisibility={id => { onToggleVisibility={id => {
SegmentationService.toggleSegmentationVisibility(id); segmentationService.toggleSegmentationVisibility(id);
}} }}
onToggleVisibilityAll={ids => { onToggleVisibilityAll={ids => {
ids.map(id => { ids.map(id => {
SegmentationService.toggleSegmentationVisibility(id); segmentationService.toggleSegmentationVisibility(id);
}); });
}} }}
onDelete={id => { onDelete={id => {
SegmentationService.remove(id); segmentationService.remove(id);
}} }}
onEdit={id => { onEdit={id => {
segmentationEditHandler({ segmentationEditHandler({
@ -285,7 +285,7 @@ PanelRoiThresholdSegmentation.propTypes = {
}), }),
servicesManager: PropTypes.shape({ servicesManager: PropTypes.shape({
services: PropTypes.shape({ services: PropTypes.shape({
SegmentationService: PropTypes.shape({ segmentationService: PropTypes.shape({
getSegmentation: PropTypes.func.isRequired, getSegmentation: PropTypes.func.isRequired,
getSegmentations: PropTypes.func.isRequired, getSegmentations: PropTypes.func.isRequired,
toggleSegmentationVisibility: PropTypes.func.isRequired, toggleSegmentationVisibility: PropTypes.func.isRequired,

View File

@ -2,14 +2,14 @@ import React from 'react';
import { Input, Dialog } from '@ohif/ui'; import { Input, Dialog } from '@ohif/ui';
function segmentationItemEditHandler({ id, servicesManager }) { function segmentationItemEditHandler({ id, servicesManager }) {
const { SegmentationService, UIDialogService } = servicesManager.services; const { segmentationService, uiDialogService } = servicesManager.services;
const segmentation = SegmentationService.getSegmentation(id); const segmentation = segmentationService.getSegmentation(id);
const onSubmitHandler = ({ action, value }) => { const onSubmitHandler = ({ action, value }) => {
switch (action.id) { switch (action.id) {
case 'save': { case 'save': {
SegmentationService.addOrUpdateSegmentation( segmentationService.addOrUpdateSegmentation(
{ {
...segmentation, ...segmentation,
...value, ...value,
@ -18,10 +18,10 @@ function segmentationItemEditHandler({ id, servicesManager }) {
); );
} }
} }
UIDialogService.dismiss({ id: 'enter-annotation' }); uiDialogService.dismiss({ id: 'enter-annotation' });
}; };
UIDialogService.create({ uiDialogService.create({
id: 'enter-annotation', id: 'enter-annotation',
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,

View File

@ -20,13 +20,13 @@ const commandsModule = ({
extensionManager, extensionManager,
}) => { }) => {
const { const {
ViewportGridService, viewportGridService,
UINotificationService, uiNotificationService,
DisplaySetService, displaySetService,
HangingProtocolService, hangingProtocolService,
ToolGroupService, toolGroupService,
CornerstoneViewportService, cornerstoneViewportService,
SegmentationService, segmentationService,
} = servicesManager.services; } = servicesManager.services;
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
@ -36,14 +36,14 @@ const commandsModule = ({
const { getEnabledElement } = utilityModule.exports; const { getEnabledElement } = utilityModule.exports;
function _getActiveViewportsEnabledElement() { function _getActiveViewportsEnabledElement() {
const { activeViewportIndex } = ViewportGridService.getState(); const { activeViewportIndex } = viewportGridService.getState();
const { element } = getEnabledElement(activeViewportIndex) || {}; const { element } = getEnabledElement(activeViewportIndex) || {};
const enabledElement = cs.getEnabledElement(element); const enabledElement = cs.getEnabledElement(element);
return enabledElement; return enabledElement;
} }
function _getMatchedViewportsToolGroupIds() { function _getMatchedViewportsToolGroupIds() {
const { viewportMatchDetails } = HangingProtocolService.getMatchDetails(); const { viewportMatchDetails } = hangingProtocolService.getMatchDetails();
const toolGroupIds = []; const toolGroupIds = [];
viewportMatchDetails.forEach((value, key) => { viewportMatchDetails.forEach((value, key) => {
const { viewportOptions } = value; const { viewportOptions } = value;
@ -67,7 +67,7 @@ const commandsModule = ({
for (const [viewportIndex, viewportDetails] of viewportMatchDetails) { for (const [viewportIndex, viewportDetails] of viewportMatchDetails) {
const { displaySetsInfo } = viewportDetails; const { displaySetsInfo } = viewportDetails;
const displaySets = displaySetsInfo.map(({ displaySetInstanceUID }) => const displaySets = displaySetsInfo.map(({ displaySetInstanceUID }) =>
DisplaySetService.getDisplaySetByUID(displaySetInstanceUID) displaySetService.getDisplaySetByUID(displaySetInstanceUID)
); );
if (!displaySets || displaySets.length === 0) { if (!displaySets || displaySets.length === 0) {
@ -121,17 +121,17 @@ const commandsModule = ({
createNewLabelmapFromPT: async () => { createNewLabelmapFromPT: async () => {
// Create a segmentation of the same resolution as the source data // Create a segmentation of the same resolution as the source data
// using volumeLoader.createAndCacheDerivedVolume. // using volumeLoader.createAndCacheDerivedVolume.
const { viewportMatchDetails } = HangingProtocolService.getMatchDetails(); const { viewportMatchDetails } = hangingProtocolService.getMatchDetails();
const ptDisplaySet = actions.getMatchingPTDisplaySet({ const ptDisplaySet = actions.getMatchingPTDisplaySet({
viewportMatchDetails, viewportMatchDetails,
}); });
if (!ptDisplaySet) { if (!ptDisplaySet) {
UINotificationService.error('No matching PT display set found'); uiNotificationService.error('No matching PT display set found');
return; return;
} }
const segmentationId = await SegmentationService.createSegmentationForDisplaySet( const segmentationId = await segmentationService.createSegmentationForDisplaySet(
ptDisplaySet.displaySetInstanceUID ptDisplaySet.displaySetInstanceUID
); );
@ -142,14 +142,14 @@ const commandsModule = ({
for (const toolGroupId of toolGroupIds) { for (const toolGroupId of toolGroupIds) {
const hydrateSegmentation = true; const hydrateSegmentation = true;
await SegmentationService.addSegmentationRepresentationToToolGroup( await segmentationService.addSegmentationRepresentationToToolGroup(
toolGroupId, toolGroupId,
segmentationId, segmentationId,
hydrateSegmentation, hydrateSegmentation,
representationType representationType
); );
SegmentationService.setActiveSegmentationForToolGroup( segmentationService.setActiveSegmentationForToolGroup(
segmentationId, segmentationId,
toolGroupId toolGroupId
); );
@ -161,7 +161,7 @@ const commandsModule = ({
const toolGroupIds = _getMatchedViewportsToolGroupIds(); const toolGroupIds = _getMatchedViewportsToolGroupIds();
toolGroupIds.forEach(toolGroupId => { toolGroupIds.forEach(toolGroupId => {
SegmentationService.setActiveSegmentationForToolGroup( segmentationService.setActiveSegmentationForToolGroup(
segmentationId, segmentationId,
toolGroupId toolGroupId
); );
@ -193,7 +193,7 @@ const commandsModule = ({
); );
if (annotationUIDs.length === 0) { if (annotationUIDs.length === 0) {
UINotificationService.show({ uiNotificationService.show({
title: 'Commands Module', title: 'Commands Module',
message: 'No ROIThreshold Tool is Selected', message: 'No ROIThreshold Tool is Selected',
type: 'error', type: 'error',
@ -289,7 +289,7 @@ const commandsModule = ({
}, },
calculateTMTV: ({ segmentations }) => { calculateTMTV: ({ segmentations }) => {
const labelmaps = segmentations.map(s => const labelmaps = segmentations.map(s =>
SegmentationService.getLabelmapVolume(s.id) segmentationService.getLabelmapVolume(s.id)
); );
if (!labelmaps.length) { if (!labelmaps.length) {
@ -314,7 +314,7 @@ const commandsModule = ({
}, },
getTotalLesionGlycolysis: ({ segmentations }) => { getTotalLesionGlycolysis: ({ segmentations }) => {
const labelmapVolumes = segmentations.map(s => const labelmapVolumes = segmentations.map(s =>
SegmentationService.getLabelmapVolume(s.id) segmentationService.getLabelmapVolume(s.id)
); );
let mergedLabelmap; let mergedLabelmap;
@ -448,7 +448,7 @@ const commandsModule = ({
}, },
getSegmentationCSVReport: ({ segmentations }) => { getSegmentationCSVReport: ({ segmentations }) => {
if (!segmentations || !segmentations.length) { if (!segmentations || !segmentations.length) {
segmentations = SegmentationService.getSegmentations(); segmentations = segmentationService.getSegmentations();
} }
let report = {}; let report = {};
@ -474,7 +474,7 @@ const commandsModule = ({
} }
}); });
const labelmapVolume = SegmentationService.getLabelmapVolume(id); const labelmapVolume = segmentationService.getLabelmapVolume(id);
if (!labelmapVolume) { if (!labelmapVolume) {
report[id] = segReport; report[id] = segReport;
@ -484,7 +484,7 @@ const commandsModule = ({
const referencedVolumeId = labelmapVolume.referencedVolumeId; const referencedVolumeId = labelmapVolume.referencedVolumeId;
segReport.referencedVolumeId = referencedVolumeId; segReport.referencedVolumeId = referencedVolumeId;
const referencedVolume = SegmentationService.getLabelmapVolume( const referencedVolume = segmentationService.getLabelmapVolume(
referencedVolumeId referencedVolumeId
); );
@ -525,8 +525,8 @@ const commandsModule = ({
dicomRTAnnotationExport(annotations); dicomRTAnnotationExport(annotations);
}, },
setFusionPTColormap: ({ toolGroupId, colormap }) => { setFusionPTColormap: ({ toolGroupId, colormap }) => {
const toolGroup = ToolGroupService.getToolGroup(toolGroupId); const toolGroup = toolGroupService.getToolGroup(toolGroupId);
const { viewportMatchDetails } = HangingProtocolService.getMatchDetails(); const { viewportMatchDetails } = hangingProtocolService.getMatchDetails();
const ptDisplaySet = actions.getMatchingPTDisplaySet({ const ptDisplaySet = actions.getMatchingPTDisplaySet({
viewportMatchDetails, viewportMatchDetails,
@ -540,7 +540,7 @@ const commandsModule = ({
let viewports = []; let viewports = [];
fusionViewportIds.forEach(viewportId => { fusionViewportIds.forEach(viewportId => {
const viewportInfo = CornerstoneViewportService.getViewportInfo( const viewportInfo = cornerstoneViewportService.getViewportInfo(
viewportId viewportId
); );
@ -552,7 +552,7 @@ const commandsModule = ({
}); });
viewports.push( viewports.push(
CornerstoneViewportService.getCornerstoneViewport(viewportId) cornerstoneViewportService.getCornerstoneViewport(viewportId)
); );
}); });

View File

@ -16,25 +16,25 @@ const CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';
*/ */
export default function init({ servicesManager, extensionManager }) { export default function init({ servicesManager, extensionManager }) {
const { const {
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
addTool(RectangleROIStartEndThresholdTool); addTool(RectangleROIStartEndThresholdTool);
const { RectangleROIStartEndThreshold } = measurementServiceMappingsFactory( const { RectangleROIStartEndThreshold } = measurementServiceMappingsFactory(
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
); );
const csTools3DVer1MeasurementSource = MeasurementService.getSource( const csTools3DVer1MeasurementSource = measurementService.getSource(
CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_NAME,
CORNERSTONE_3D_TOOLS_SOURCE_VERSION CORNERSTONE_3D_TOOLS_SOURCE_VERSION
); );
MeasurementService.addMapping( measurementService.addMapping(
csTools3DVer1MeasurementSource, csTools3DVer1MeasurementSource,
'RectangleROIStartEndThreshold', 'RectangleROIStartEndThreshold',
RectangleROIStartEndThreshold.matchingCriteria, RectangleROIStartEndThreshold.matchingCriteria,

View File

@ -12,8 +12,8 @@ const RectangleROIStartEndThreshold = {
*/ */
toMeasurement: ( toMeasurement: (
csToolsEventDetail, csToolsEventDetail,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
) => { ) => {
const { annotation, viewportId } = csToolsEventDetail; const { annotation, viewportId } = csToolsEventDetail;
const { metadata, data, annotationUID } = annotation; const { metadata, data, annotationUID } = annotation;
@ -36,19 +36,19 @@ const RectangleROIStartEndThreshold = {
StudyInstanceUID, StudyInstanceUID,
} = getSOPInstanceAttributes( } = getSOPInstanceAttributes(
referencedImageId, referencedImageId,
CornerstoneViewportService, cornerstoneViewportService,
viewportId viewportId
); );
let displaySet; let displaySet;
if (SOPInstanceUID) { if (SOPInstanceUID) {
displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID( displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID, SOPInstanceUID,
SeriesInstanceUID SeriesInstanceUID
); );
} else { } else {
displaySet = DisplaySetService.getDisplaySetsForSeries(SeriesInstanceUID); displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
} }
const { cachedStats } = data; const { cachedStats } = data;

View File

@ -1,9 +1,9 @@
import RectangleROIStartEndThreshold from './RectangleROIStartEndThreshold'; import RectangleROIStartEndThreshold from './RectangleROIStartEndThreshold';
const measurementServiceMappingsFactory = ( const measurementServiceMappingsFactory = (
MeasurementService, measurementService,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
) => { ) => {
return { return {
RectangleROIStartEndThreshold: { RectangleROIStartEndThreshold: {
@ -11,12 +11,12 @@ const measurementServiceMappingsFactory = (
toMeasurement: csToolsAnnotation => toMeasurement: csToolsAnnotation =>
RectangleROIStartEndThreshold.toMeasurement( RectangleROIStartEndThreshold.toMeasurement(
csToolsAnnotation, csToolsAnnotation,
DisplaySetService, displaySetService,
CornerstoneViewportService cornerstoneViewportService
), ),
matchingCriteria: [ matchingCriteria: [
{ {
valueType: MeasurementService.VALUE_TYPES.ROI_THRESHOLD_MANUAL, valueType: measurementService.VALUE_TYPES.ROI_THRESHOLD_MANUAL,
}, },
], ],
}, },

View File

@ -53,7 +53,7 @@ function modeFactory({ modeConfiguration }) {
* Lifecycle hooks * Lifecycle hooks
*/ */
onModeEnter: ({ servicesManager, extensionManager }) => { onModeEnter: ({ servicesManager, extensionManager }) => {
const { toolbarService, ToolGroupService } = servicesManager.services; const { toolbarService, toolGroupService } = servicesManager.services;
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone.utilityModule.tools' '@ohif/extension-cornerstone.utilityModule.tools'
); );
@ -89,7 +89,7 @@ function modeFactory({ modeConfiguration }) {
}; };
const toolGroupId = 'default'; const toolGroupId = 'default';
ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, configs); toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, configs);
let unsubscribe; let unsubscribe;
@ -116,8 +116,8 @@ function modeFactory({ modeConfiguration }) {
// Since we only have one viewport for the basic cs3d mode and it has // Since we only have one viewport for the basic cs3d mode and it has
// only one hanging protocol, we can just use the first viewport // only one hanging protocol, we can just use the first viewport
({ unsubscribe } = ToolGroupService.subscribe( ({ unsubscribe } = toolGroupService.subscribe(
ToolGroupService.EVENTS.VIEWPORT_ADDED, toolGroupService.EVENTS.VIEWPORT_ADDED,
activateTool activateTool
)); ));
@ -134,13 +134,13 @@ function modeFactory({ modeConfiguration }) {
}, },
onModeExit: ({ servicesManager }) => { onModeExit: ({ servicesManager }) => {
const { const {
ToolGroupService, toolGroupService,
MeasurementService, measurementService,
toolbarService, toolbarService,
} = servicesManager.services; } = servicesManager.services;
toolbarService.reset(); toolbarService.reset();
ToolGroupService.destroy(); toolGroupService.destroy();
}, },
validationTags: { validationTags: {
study: [], study: [],

View File

@ -68,15 +68,15 @@ function modeFactory() {
*/ */
onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => { onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {
const { const {
MeasurementService, measurementService,
toolbarService, toolbarService,
ToolGroupService, toolGroupService,
} = servicesManager.services; } = servicesManager.services;
MeasurementService.clearMeasurements(); measurementService.clearMeasurements();
// Init Default and SR ToolGroups // Init Default and SR ToolGroups
initToolGroups(extensionManager, ToolGroupService, commandsManager); initToolGroups(extensionManager, toolGroupService, commandsManager);
let unsubscribe; let unsubscribe;
@ -103,8 +103,8 @@ function modeFactory() {
// Since we only have one viewport for the basic cs3d mode and it has // Since we only have one viewport for the basic cs3d mode and it has
// only one hanging protocol, we can just use the first viewport // only one hanging protocol, we can just use the first viewport
({ unsubscribe } = ToolGroupService.subscribe( ({ unsubscribe } = toolGroupService.subscribe(
ToolGroupService.EVENTS.VIEWPORT_ADDED, toolGroupService.EVENTS.VIEWPORT_ADDED,
activateTool activateTool
)); ));
@ -124,18 +124,18 @@ function modeFactory() {
}, },
onModeExit: ({ servicesManager }) => { onModeExit: ({ servicesManager }) => {
const { const {
ToolGroupService, toolGroupService,
SyncGroupService, syncGroupService,
toolbarService, toolbarService,
SegmentationService, segmentationService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
toolbarService.reset(); toolbarService.reset();
ToolGroupService.destroy(); toolGroupService.destroy();
SyncGroupService.destroy(); syncGroupService.destroy();
SegmentationService.destroy(); segmentationService.destroy();
CornerstoneViewportService.destroy(); cornerstoneViewportService.destroy();
}, },
validationTags: { validationTags: {
study: [], study: [],

View File

@ -1,6 +1,6 @@
function initDefaultToolGroup( function initDefaultToolGroup(
extensionManager, extensionManager,
ToolGroupService, toolGroupService,
commandsManager, commandsManager,
toolGroupId toolGroupId
) { ) {
@ -60,10 +60,10 @@ function initDefaultToolGroup(
}, },
}; };
ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig); toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig);
} }
function initSRToolGroup(extensionManager, ToolGroupService, commandsManager) { function initSRToolGroup(extensionManager, toolGroupService, commandsManager) {
const SRUtilityModule = extensionManager.getModuleEntry( const SRUtilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone-dicom-sr.utilityModule.tools' '@ohif/extension-cornerstone-dicom-sr.utilityModule.tools'
); );
@ -138,10 +138,10 @@ function initSRToolGroup(extensionManager, ToolGroupService, commandsManager) {
}; };
const toolGroupId = 'SRToolGroup'; const toolGroupId = 'SRToolGroup';
ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig); toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig);
} }
function initMPRToolGroup(extensionManager, ToolGroupService, commandsManager) { function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) {
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone.utilityModule.tools' '@ohif/extension-cornerstone.utilityModule.tools'
); );
@ -208,18 +208,18 @@ function initMPRToolGroup(extensionManager, ToolGroupService, commandsManager) {
}, },
}; };
ToolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig); toolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig);
} }
function initToolGroups(extensionManager, ToolGroupService, commandsManager) { function initToolGroups(extensionManager, toolGroupService, commandsManager) {
initDefaultToolGroup( initDefaultToolGroup(
extensionManager, extensionManager,
ToolGroupService, toolGroupService,
commandsManager, commandsManager,
'default' 'default'
); );
initSRToolGroup(extensionManager, ToolGroupService, commandsManager); initSRToolGroup(extensionManager, toolGroupService, commandsManager);
initMPRToolGroup(extensionManager, ToolGroupService, commandsManager); initMPRToolGroup(extensionManager, toolGroupService, commandsManager);
} }
export default initToolGroups; export default initToolGroups;

View File

@ -68,15 +68,15 @@ function modeFactory() {
*/ */
onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => { onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {
const { const {
MeasurementService, measurementService,
toolbarService, toolbarService,
ToolGroupService, toolGroupService,
} = servicesManager.services; } = servicesManager.services;
MeasurementService.clearMeasurements(); measurementService.clearMeasurements();
// Init Default and SR ToolGroups // Init Default and SR ToolGroups
initToolGroups(extensionManager, ToolGroupService, commandsManager); initToolGroups(extensionManager, toolGroupService, commandsManager);
let unsubscribe; let unsubscribe;
@ -103,8 +103,8 @@ function modeFactory() {
// Since we only have one viewport for the basic cs3d mode and it has // Since we only have one viewport for the basic cs3d mode and it has
// only one hanging protocol, we can just use the first viewport // only one hanging protocol, we can just use the first viewport
({ unsubscribe } = ToolGroupService.subscribe( ({ unsubscribe } = toolGroupService.subscribe(
ToolGroupService.EVENTS.VIEWPORT_ADDED, toolGroupService.EVENTS.VIEWPORT_ADDED,
activateTool activateTool
)); ));
@ -124,18 +124,18 @@ function modeFactory() {
}, },
onModeExit: ({ servicesManager }) => { onModeExit: ({ servicesManager }) => {
const { const {
ToolGroupService, toolGroupService,
SyncGroupService, syncGroupService,
toolbarService, toolbarService,
SegmentationService, segmentationService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
toolbarService.reset(); toolbarService.reset();
ToolGroupService.destroy(); toolGroupService.destroy();
SyncGroupService.destroy(); syncGroupService.destroy();
SegmentationService.destroy(); segmentationService.destroy();
CornerstoneViewportService.destroy(); cornerstoneViewportService.destroy();
}, },
validationTags: { validationTags: {
study: [], study: [],

View File

@ -1,6 +1,6 @@
function initDefaultToolGroup( function initDefaultToolGroup(
extensionManager, extensionManager,
ToolGroupService, toolGroupService,
commandsManager, commandsManager,
toolGroupId toolGroupId
) { ) {
@ -60,10 +60,10 @@ function initDefaultToolGroup(
}, },
}; };
ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig); toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig);
} }
function initSRToolGroup(extensionManager, ToolGroupService, commandsManager) { function initSRToolGroup(extensionManager, toolGroupService, commandsManager) {
const SRUtilityModule = extensionManager.getModuleEntry( const SRUtilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone-dicom-sr.utilityModule.tools' '@ohif/extension-cornerstone-dicom-sr.utilityModule.tools'
); );
@ -138,10 +138,10 @@ function initSRToolGroup(extensionManager, ToolGroupService, commandsManager) {
}; };
const toolGroupId = 'SRToolGroup'; const toolGroupId = 'SRToolGroup';
ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig); toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, toolsConfig);
} }
function initMPRToolGroup(extensionManager, ToolGroupService, commandsManager) { function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) {
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone.utilityModule.tools' '@ohif/extension-cornerstone.utilityModule.tools'
); );
@ -208,18 +208,18 @@ function initMPRToolGroup(extensionManager, ToolGroupService, commandsManager) {
}, },
}; };
ToolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig); toolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig);
} }
function initToolGroups(extensionManager, ToolGroupService, commandsManager) { function initToolGroups(extensionManager, toolGroupService, commandsManager) {
initDefaultToolGroup( initDefaultToolGroup(
extensionManager, extensionManager,
ToolGroupService, toolGroupService,
commandsManager, commandsManager,
'default' 'default'
); );
initSRToolGroup(extensionManager, ToolGroupService, commandsManager); initSRToolGroup(extensionManager, toolGroupService, commandsManager);
initMPRToolGroup(extensionManager, ToolGroupService, commandsManager); initMPRToolGroup(extensionManager, toolGroupService, commandsManager);
} }
export default initToolGroups; export default initToolGroups;

View File

@ -43,9 +43,9 @@ function modeFactory({ modeConfiguration }) {
onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => { onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {
const { const {
toolbarService, toolbarService,
ToolGroupService, toolGroupService,
HangingProtocolService, hangingProtocolService,
DisplaySetService, displaySetService,
} = servicesManager.services; } = servicesManager.services;
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
@ -55,7 +55,7 @@ function modeFactory({ modeConfiguration }) {
const { toolNames, Enums } = utilityModule.exports; const { toolNames, Enums } = utilityModule.exports;
// Init Default and SR ToolGroups // Init Default and SR ToolGroups
initToolGroups(toolNames, Enums, ToolGroupService, commandsManager); initToolGroups(toolNames, Enums, toolGroupService, commandsManager);
const setWindowLevelActive = () => { const setWindowLevelActive = () => {
toolbarService.recordInteraction({ toolbarService.recordInteraction({
@ -91,28 +91,28 @@ function modeFactory({ modeConfiguration }) {
}); });
}; };
const { unsubscribe } = ToolGroupService.subscribe( const { unsubscribe } = toolGroupService.subscribe(
ToolGroupService.EVENTS.VIEWPORT_ADDED, toolGroupService.EVENTS.VIEWPORT_ADDED,
() => { () => {
// For fusion toolGroup we need to add the volumeIds for the crosshairs // For fusion toolGroup we need to add the volumeIds for the crosshairs
// since in the fusion viewport we don't want both PT and CT to render MIP // since in the fusion viewport we don't want both PT and CT to render MIP
// when slabThickness is modified // when slabThickness is modified
const { const {
displaySetMatchDetails, displaySetMatchDetails,
} = HangingProtocolService.getMatchDetails(); } = hangingProtocolService.getMatchDetails();
setCrosshairsConfiguration( setCrosshairsConfiguration(
displaySetMatchDetails, displaySetMatchDetails,
toolNames, toolNames,
ToolGroupService, toolGroupService,
DisplaySetService displaySetService
); );
setFusionActiveVolume( setFusionActiveVolume(
displaySetMatchDetails, displaySetMatchDetails,
toolNames, toolNames,
ToolGroupService, toolGroupService,
DisplaySetService displaySetService
); );
setWindowLevelActive(); setWindowLevelActive();
@ -134,19 +134,19 @@ function modeFactory({ modeConfiguration }) {
}, },
onModeExit: ({ servicesManager }) => { onModeExit: ({ servicesManager }) => {
const { const {
ToolGroupService, toolGroupService,
SyncGroupService, syncGroupService,
toolbarService, toolbarService,
SegmentationService, segmentationService,
CornerstoneViewportService, cornerstoneViewportService,
} = servicesManager.services; } = servicesManager.services;
unsubscriptions.forEach(unsubscribe => unsubscribe()); unsubscriptions.forEach(unsubscribe => unsubscribe());
toolbarService.reset(); toolbarService.reset();
ToolGroupService.destroy(); toolGroupService.destroy();
SyncGroupService.destroy(); syncGroupService.destroy();
SegmentationService.destroy(); segmentationService.destroy();
CornerstoneViewportService.destroy(); cornerstoneViewportService.destroy();
}, },
validationTags: { validationTags: {
study: [], study: [],

View File

@ -7,7 +7,7 @@ export const toolGroupIds = {
// MPR: 'mpr', // MPR: 'mpr',
}; };
function _initToolGroups(toolNames, Enums, ToolGroupService, commandsManager) { function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) {
const tools = { const tools = {
active: [ active: [
{ {
@ -65,12 +65,12 @@ function _initToolGroups(toolNames, Enums, ToolGroupService, commandsManager) {
}, },
}; };
ToolGroupService.createToolGroupAndAddTools( toolGroupService.createToolGroupAndAddTools(
toolGroupIds.CT, toolGroupIds.CT,
tools, tools,
toolsConfig toolsConfig
); );
ToolGroupService.createToolGroupAndAddTools( toolGroupService.createToolGroupAndAddTools(
toolGroupIds.PT, toolGroupIds.PT,
{ {
active: tools.active, active: tools.active,
@ -83,12 +83,12 @@ function _initToolGroups(toolNames, Enums, ToolGroupService, commandsManager) {
}, },
toolsConfig toolsConfig
); );
ToolGroupService.createToolGroupAndAddTools( toolGroupService.createToolGroupAndAddTools(
toolGroupIds.Fusion, toolGroupIds.Fusion,
tools, tools,
toolsConfig toolsConfig
); );
ToolGroupService.createToolGroupAndAddTools( toolGroupService.createToolGroupAndAddTools(
toolGroupIds.default, toolGroupIds.default,
tools, tools,
toolsConfig toolsConfig
@ -116,14 +116,14 @@ function _initToolGroups(toolNames, Enums, ToolGroupService, commandsManager) {
}, },
}; };
ToolGroupService.createToolGroupAndAddTools( toolGroupService.createToolGroupAndAddTools(
toolGroupIds.MIP, toolGroupIds.MIP,
mipTools, mipTools,
mipToolsConfig mipToolsConfig
); );
} }
function initMPRToolGroup(toolNames, Enums, ToolGroupService, commandsManager) { function initMPRToolGroup(toolNames, Enums, toolGroupService, commandsManager) {
const tools = { const tools = {
active: [ active: [
{ {
@ -181,12 +181,12 @@ function initMPRToolGroup(toolNames, Enums, ToolGroupService, commandsManager) {
}, },
}; };
ToolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig); toolGroupService.createToolGroupAndAddTools('mpr', tools, toolsConfig);
} }
function initToolGroups(toolNames, Enums, ToolGroupService, commandsManager) { function initToolGroups(toolNames, Enums, toolGroupService, commandsManager) {
_initToolGroups(toolNames, Enums, ToolGroupService, commandsManager); _initToolGroups(toolNames, Enums, toolGroupService, commandsManager);
// initMPRToolGroup(toolNames, Enums, ToolGroupService, commandsManager); // initMPRToolGroup(toolNames, Enums, toolGroupService, commandsManager);
} }
export default initToolGroups; export default initToolGroups;

View File

@ -3,8 +3,8 @@ import { toolGroupIds } from '../initToolGroups';
export default function setCrosshairsConfiguration( export default function setCrosshairsConfiguration(
matches, matches,
toolNames, toolNames,
ToolGroupService, toolGroupService,
DisplaySetService displaySetService
) { ) {
const matchDetails = matches.get('ctDisplaySet'); const matchDetails = matches.get('ctDisplaySet');
@ -13,11 +13,11 @@ export default function setCrosshairsConfiguration(
} }
const { SeriesInstanceUID } = matchDetails; const { SeriesInstanceUID } = matchDetails;
const displaySets = DisplaySetService.getDisplaySetsForSeries( const displaySets = displaySetService.getDisplaySetsForSeries(
SeriesInstanceUID SeriesInstanceUID
); );
const toolConfig = ToolGroupService.getToolConfiguration( const toolConfig = toolGroupService.getToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.Crosshairs toolNames.Crosshairs
); );
@ -27,7 +27,7 @@ export default function setCrosshairsConfiguration(
filterActorUIDsToSetSlabThickness: [displaySets[0].displaySetInstanceUID], filterActorUIDsToSetSlabThickness: [displaySets[0].displaySetInstanceUID],
}; };
ToolGroupService.setToolConfiguration( toolGroupService.setToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.Crosshairs, toolNames.Crosshairs,
crosshairsConfig crosshairsConfig

View File

@ -3,8 +3,8 @@ import { toolGroupIds } from '../initToolGroups';
export default function setFusionActiveVolume( export default function setFusionActiveVolume(
matches, matches,
toolNames, toolNames,
ToolGroupService, toolGroupService,
DisplaySetService displaySetService
) { ) {
const matchDetails = matches.get('ptDisplaySet'); const matchDetails = matches.get('ptDisplaySet');
@ -14,7 +14,7 @@ export default function setFusionActiveVolume(
const { SeriesInstanceUID } = matchDetails; const { SeriesInstanceUID } = matchDetails;
const displaySets = DisplaySetService.getDisplaySetsForSeries( const displaySets = displaySetService.getDisplaySetsForSeries(
SeriesInstanceUID SeriesInstanceUID
); );
@ -22,12 +22,12 @@ export default function setFusionActiveVolume(
return; return;
} }
const wlToolConfig = ToolGroupService.getToolConfiguration( const wlToolConfig = toolGroupService.getToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.WindowLevel toolNames.WindowLevel
); );
const ellipticalToolConfig = ToolGroupService.getToolConfiguration( const ellipticalToolConfig = toolGroupService.getToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.EllipticalROI toolNames.EllipticalROI
); );
@ -45,13 +45,13 @@ export default function setFusionActiveVolume(
volumeId, volumeId,
}; };
ToolGroupService.setToolConfiguration( toolGroupService.setToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.WindowLevel, toolNames.WindowLevel,
windowLevelConfig windowLevelConfig
); );
ToolGroupService.setToolConfiguration( toolGroupService.setToolConfiguration(
toolGroupIds.Fusion, toolGroupIds.Fusion,
toolNames.EllipticalROI, toolNames.EllipticalROI,
ellipticalROIConfig ellipticalROIConfig

View File

@ -37,7 +37,7 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "7.16.3", "@babel/runtime": "7.16.3",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"dicomweb-client": "^0.6.0", "dicomweb-client": "^0.6.0",
"isomorphic-base64": "^1.0.2", "isomorphic-base64": "^1.0.2",
"lodash.merge": "^4.6.1", "lodash.merge": "^4.6.1",

View File

@ -76,8 +76,8 @@ export class HotkeysManager {
} }
definitions.forEach(definition => this.registerHotkeys(definition)); definitions.forEach(definition => this.registerHotkeys(definition));
} catch (error) { } catch (error) {
const { UINotificationService } = this._servicesManager.services; const { uiNotificationService, } = this._servicesManager.services;
UINotificationService.show({ uiNotificationService.show({
title: 'Hotkeys Manager', title: 'Hotkeys Manager',
message: 'Error while setting hotkeys', message: 'Error while setting hotkeys',
type: 'error', type: 'error',

View File

@ -347,11 +347,11 @@ export default class ExtensionManager {
}; };
_initHangingProtocolsModule = (extensionModule, extensionId) => { _initHangingProtocolsModule = (extensionModule, extensionId) => {
const { HangingProtocolService } = this._servicesManager.services; const { hangingProtocolService } = this._servicesManager.services;
extensionModule.forEach(({ id, protocol }) => { extensionModule.forEach(({ id, protocol }) => {
if (protocol) { if (protocol) {
// Only auto-register if protocol specified, otherwise let mode register // Only auto-register if protocol specified, otherwise let mode register
HangingProtocolService.addProtocol(id, protocol); hangingProtocolService.addProtocol(id, protocol);
} }
}); });
}; };

View File

@ -1,4 +1,4 @@
import HangingProtocolServiceClass from './HangingProtocolService'; import HangingProtocolService from './HangingProtocolService';
const testProtocol = { const testProtocol = {
id: 'test', id: 'test',
@ -149,7 +149,10 @@ describe('HangingProtocolService', () => {
}, },
}, },
}; };
const hps = new HangingProtocolServiceClass(commandsManager, servicesManager); const hangingProtocolService = new HangingProtocolService(
commandsManager,
servicesManager
);
let initialScaling; let initialScaling;
afterEach(() => { afterEach(() => {
@ -158,36 +161,42 @@ describe('HangingProtocolService', () => {
describe('with a static protocol', () => { describe('with a static protocol', () => {
beforeAll(() => { beforeAll(() => {
hps.addProtocol(testProtocol.id, testProtocol); hangingProtocolService.addProtocol(testProtocol.id, testProtocol);
}); });
it('has one protocol', () => { it('has one protocol', () => {
expect(hps.getProtocols().length).toBe(1); expect(hangingProtocolService.getProtocols().length).toBe(1);
}); });
describe('run', () => { describe('run', () => {
it('matches best image match', () => { it('matches best image match', () => {
checkHpsBestMatch(hps); checkHpsBestMatch(hangingProtocolService);
}); });
}); });
}); });
describe('with protocol generator', () => { describe('with protocol generator', () => {
beforeAll(() => { beforeAll(() => {
hps.addProtocol(testProtocol.id, testProtocolGenerator); hangingProtocolService.addProtocol(
testProtocol.id,
testProtocolGenerator
);
}); });
it('has one protocol', () => { it('has one protocol', () => {
expect(hps.getProtocols().length).toBe(1); expect(hangingProtocolService.getProtocols().length).toBe(1);
}); });
describe('run', () => { describe('run', () => {
it('matches best image match', () => { it('matches best image match', () => {
checkHpsBestMatch(hps); checkHpsBestMatch(hangingProtocolService);
}); });
it('uses services manager', () => { it('uses services manager', () => {
hps.run({ studies: [studyMatch], displaySets: studyMatchDisplaySets }); hangingProtocolService.run({
studies: [studyMatch],
displaySets: studyMatchDisplaySets,
});
expect(mockedFunction).toHaveBeenCalledTimes(1); expect(mockedFunction).toHaveBeenCalledTimes(1);
}); });
}); });

View File

@ -866,13 +866,13 @@ class HangingProtocolService {
protocol: Protocol, protocol: Protocol,
options: HangingProtocol.SetProtocolOptions options: HangingProtocol.SetProtocolOptions
) { ) {
const { DisplaySetService } = this._servicesManager.services; const { displaySetService } = this._servicesManager.services;
if (options.displaySetInstanceUIDs) { if (options.displaySetInstanceUIDs) {
this._updateGlobalMatchByOptions( this._updateGlobalMatchByOptions(
options as HangingProtocol.GlobalProtocolOptions, options as HangingProtocol.GlobalProtocolOptions,
protocol, protocol,
DisplaySetService displaySetService
); );
return; return;
} }
@ -893,7 +893,7 @@ class HangingProtocolService {
options: HangingProtocol.ViewportSpecificProtocolOptions, options: HangingProtocol.ViewportSpecificProtocolOptions,
protocol: HangingProtocol.Protocol protocol: HangingProtocol.Protocol
) { ) {
const { DisplaySetService } = this._servicesManager.services; const { displaySetService } = this._servicesManager.services;
const { displaySetSelectors = {} } = protocol; const { displaySetSelectors = {} } = protocol;
const protocolViewports = protocol.stages[this.stage].viewports; const protocolViewports = protocol.stages[this.stage].viewports;
@ -914,7 +914,7 @@ class HangingProtocolService {
displaySetAndViewportOptions.displaySetInstanceUIDs.forEach( displaySetAndViewportOptions.displaySetInstanceUIDs.forEach(
(displaySetInstanceUID, index) => { (displaySetInstanceUID, index) => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -968,7 +968,7 @@ class HangingProtocolService {
displaySetAndViewportOptions?.displaySetInstanceUIDs?.forEach( displaySetAndViewportOptions?.displaySetInstanceUIDs?.forEach(
(displaySetInstanceUID, index) => { (displaySetInstanceUID, index) => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -999,7 +999,7 @@ class HangingProtocolService {
protocolViewport: HangingProtocol.Viewport, protocolViewport: HangingProtocol.Viewport,
displaySetSelectors: Record<string, HangingProtocol.DisplaySetSelector> displaySetSelectors: Record<string, HangingProtocol.DisplaySetSelector>
) { ) {
const { DisplaySetService } = this._servicesManager.services; const { displaySetService } = this._servicesManager.services;
const protocolViewportDisplaySets = protocolViewport.displaySets; const protocolViewportDisplaySets = protocolViewport.displaySets;
const numDisplaySetsToSet = const numDisplaySetsToSet =
displaySetAndViewportOptions.displaySetInstanceUIDs.length; displaySetAndViewportOptions.displaySetInstanceUIDs.length;
@ -1015,7 +1015,7 @@ class HangingProtocolService {
displaySetAndViewportOptions.displaySetInstanceUIDs.forEach( displaySetAndViewportOptions.displaySetInstanceUIDs.forEach(
displaySetInstanceUID => { displaySetInstanceUID => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -1036,7 +1036,7 @@ class HangingProtocolService {
private _updateGlobalMatchByOptions( private _updateGlobalMatchByOptions(
options: HangingProtocol.GlobalProtocolOptions, options: HangingProtocol.GlobalProtocolOptions,
protocol: Protocol, protocol: Protocol,
DisplaySetService: any displaySetService: any
) { ) {
const { displaySetSelectors = {} } = protocol; const { displaySetSelectors = {} } = protocol;
const protocolViewports = protocol.stages[this.stage].viewports; const protocolViewports = protocol.stages[this.stage].viewports;
@ -1045,7 +1045,7 @@ class HangingProtocolService {
// we need to check each displaySetInstanceUIDs to see if it satisfies the // we need to check each displaySetInstanceUIDs to see if it satisfies the
// seriesMatching criteria // seriesMatching criteria
options.displaySetInstanceUIDs.forEach(displaySetInstanceUID => { options.displaySetInstanceUIDs.forEach(displaySetInstanceUID => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -1076,7 +1076,7 @@ class HangingProtocolService {
Array.from(newDisplaySetIds).forEach((displaySetId, index) => { Array.from(newDisplaySetIds).forEach((displaySetId, index) => {
const displaySetInstanceUID = options.displaySetInstanceUIDs[index]; const displaySetInstanceUID = options.displaySetInstanceUIDs[index];
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -1115,7 +1115,7 @@ class HangingProtocolService {
}); });
remainingDisplaySetMatches.forEach(({ displaySetInstanceUID }) => { remainingDisplaySetMatches.forEach(({ displaySetInstanceUID }) => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );
@ -1157,13 +1157,13 @@ class HangingProtocolService {
} }
_validateOptions(options: HangingProtocol.SetProtocolOptions) { _validateOptions(options: HangingProtocol.SetProtocolOptions) {
const { DisplaySetService } = this._servicesManager.services; const { displaySetService } = this._servicesManager.services;
if (options.displaySetInstanceUIDs) { if (options.displaySetInstanceUIDs) {
options = options as HangingProtocol.GlobalProtocolOptions; options = options as HangingProtocol.GlobalProtocolOptions;
options.displaySetInstanceUIDs.forEach(displaySetInstanceUID => { options.displaySetInstanceUIDs.forEach(displaySetInstanceUID => {
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID displaySetInstanceUID
); );

View File

@ -62,12 +62,12 @@ The following services is available in the `OHIF-v3`.
<tr> <tr>
<td> <td>
<a href="./data/SegmentationService"> <a href="./data/SegmentationService">
SegmentationService (NEW) segmentationService (NEW)
</a> </a>
</td> </td>
<td>Segmentation Service</td> <td>Segmentation Service</td>
<td> <td>
SegmentationService segmentationService
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@ -65,7 +65,7 @@
"cornerstone-math": "^0.1.9", "cornerstone-math": "^0.1.9",
"cornerstone-wado-image-loader": "^4.2.1", "cornerstone-wado-image-loader": "^4.2.1",
"dayjs": "^1.11.6", "dayjs": "^1.11.6",
"dcmjs": "^0.28.3", "dcmjs": "0.29.4",
"detect-gpu": "^4.0.16", "detect-gpu": "^4.0.16",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"dotenv-webpack": "^1.7.0", "dotenv-webpack": "^1.7.0",

View File

@ -30,10 +30,10 @@ function ViewerViewportGrid(props) {
// TODO -> Need some way of selecting which displaySets hit the viewports. // TODO -> Need some way of selecting which displaySets hit the viewports.
const { const {
DisplaySetService, displaySetService,
MeasurementService, measurementService,
HangingProtocolService, hangingProtocolService,
UINotificationService, uiNotificationService,
} = servicesManager.services; } = servicesManager.services;
/** /**
@ -48,7 +48,7 @@ function ViewerViewportGrid(props) {
const { const {
viewportMatchDetails, viewportMatchDetails,
hpAlreadyApplied, hpAlreadyApplied,
} = HangingProtocolService.getMatchDetails(); } = hangingProtocolService.getMatchDetails();
if (!viewportMatchDetails.size) { if (!viewportMatchDetails.size) {
return; return;
@ -104,7 +104,7 @@ function ViewerViewportGrid(props) {
const suppressEvent = true; const suppressEvent = true;
const applied = true; const applied = true;
HangingProtocolService.setHangingProtocolAppliedForViewport( hangingProtocolService.setHangingProtocolAppliedForViewport(
viewportIndex, viewportIndex,
applied, applied,
suppressEvent suppressEvent
@ -119,13 +119,13 @@ function ViewerViewportGrid(props) {
(viewportIndex, displaySetInstanceUID) => { (viewportIndex, displaySetInstanceUID) => {
let updatedViewports = []; let updatedViewports = [];
try { try {
updatedViewports = HangingProtocolService.getViewportsRequireUpdate( updatedViewports = hangingProtocolService.getViewportsRequireUpdate(
viewportIndex, viewportIndex,
displaySetInstanceUID displaySetInstanceUID
); );
} catch (error) { } catch (error) {
console.warn(error); console.warn(error);
UINotificationService.show({ uiNotificationService.show({
title: 'Drag and Drop', title: 'Drag and Drop',
message: message:
'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.', 'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.',
@ -136,18 +136,18 @@ function ViewerViewportGrid(props) {
return updatedViewports; return updatedViewports;
}, },
[HangingProtocolService, UINotificationService] [hangingProtocolService, uiNotificationService]
); );
useEffect(() => { useEffect(() => {
const displaySets = DisplaySetService.getActiveDisplaySets(); const displaySets = displaySetService.getActiveDisplaySets();
updateDisplaySetsForViewports(displaySets); updateDisplaySetsForViewports(displaySets);
}, [numRows, numCols]); }, [numRows, numCols]);
// Layout change based on hanging protocols // Layout change based on hanging protocols
useEffect(() => { useEffect(() => {
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.NEW_LAYOUT, hangingProtocolService.EVENTS.NEW_LAYOUT,
({ layoutType, numRows, numCols, layoutOptions }) => { ({ layoutType, numRows, numCols, layoutOptions }) => {
viewportGridService.setLayout({ viewportGridService.setLayout({
numRows, numRows,
@ -165,10 +165,10 @@ function ViewerViewportGrid(props) {
// Using Hanging protocol engine to match the displaySets // Using Hanging protocol engine to match the displaySets
useEffect(() => { useEffect(() => {
const { unsubscribe } = HangingProtocolService.subscribe( const { unsubscribe } = hangingProtocolService.subscribe(
HangingProtocolService.EVENTS.PROTOCOL_CHANGED, hangingProtocolService.EVENTS.PROTOCOL_CHANGED,
() => { () => {
const displaySets = DisplaySetService.getActiveDisplaySets(); const displaySets = displaySetService.getActiveDisplaySets();
updateDisplaySetsForViewports(displaySets); updateDisplaySetsForViewports(displaySets);
} }
); );
@ -179,8 +179,8 @@ function ViewerViewportGrid(props) {
}, [viewports]); }, [viewports]);
useEffect(() => { useEffect(() => {
const { unsubscribe } = MeasurementService.subscribe( const { unsubscribe } = measurementService.subscribe(
MeasurementService.EVENTS.JUMP_TO_MEASUREMENT, measurementService.EVENTS.JUMP_TO_MEASUREMENT,
({ viewportIndex, measurement }) => { ({ viewportIndex, measurement }) => {
const { const {
displaySetInstanceUID: referencedDisplaySetInstanceUID, displaySetInstanceUID: referencedDisplaySetInstanceUID,
@ -198,7 +198,7 @@ function ViewerViewportGrid(props) {
} }
} }
const displaySet = DisplaySetService.getDisplaySetByUID( const displaySet = displaySetService.getDisplaySetByUID(
referencedDisplaySetInstanceUID referencedDisplaySetInstanceUID
); );
@ -335,7 +335,7 @@ function ViewerViewportGrid(props) {
const displaySets = displaySetInstanceUIDsToUse.map( const displaySets = displaySetInstanceUIDsToUse.map(
displaySetInstanceUID => { displaySetInstanceUID => {
return ( return (
DisplaySetService.getDisplaySetByUID(displaySetInstanceUID) || {} displaySetService.getDisplaySetByUID(displaySetInstanceUID) || {}
); );
} }
); );
@ -343,7 +343,7 @@ function ViewerViewportGrid(props) {
const ViewportComponent = _getViewportComponent( const ViewportComponent = _getViewportComponent(
displaySets, displaySets,
viewportComponents, viewportComponents,
UINotificationService uiNotificationService
); );
// look inside displaySets to see if they need reRendering // look inside displaySets to see if they need reRendering
@ -403,7 +403,7 @@ function ViewerViewportGrid(props) {
}, [viewports, activeViewportIndex, viewportComponents, dataSource]); }, [viewports, activeViewportIndex, viewportComponents, dataSource]);
/** /**
* Loading indicator until numCols and numRows are gotten from the HangingProtocolService * Loading indicator until numCols and numRows are gotten from the hangingProtocolService
*/ */
if (!numRows || !numCols) { if (!numRows || !numCols) {
return null; return null;
@ -428,7 +428,7 @@ ViewerViewportGrid.defaultProps = {
function _getViewportComponent( function _getViewportComponent(
displaySets, displaySets,
viewportComponents, viewportComponents,
UINotificationService uiNotificationService
) { ) {
if (!displaySets || !displaySets.length) { if (!displaySets || !displaySets.length) {
return EmptyViewport; return EmptyViewport;
@ -453,7 +453,7 @@ function _getViewportComponent(
} }
console.log("Can't show displaySet", SOPClassHandlerId, displaySets[0]); console.log("Can't show displaySet", SOPClassHandlerId, displaySets[0]);
UINotificationService.show({ uiNotificationService.show({
title: 'Viewport Not Supported Yet', title: 'Viewport Not Supported Yet',
message: `Cannot display SOPClassId of ${displaySets[0].SOPClassUID} yet`, message: `Cannot display SOPClassId of ${displaySets[0].SOPClassUID} yet`,
type: 'error', type: 'error',

View File

@ -23,8 +23,8 @@ function defaultRouteInit(
hangingProtocol hangingProtocol
) { ) {
const { const {
DisplaySetService, displaySetService,
HangingProtocolService, hangingProtocolService,
} = servicesManager.services; } = servicesManager.services;
const unsubscriptions = []; const unsubscriptions = [];
@ -38,7 +38,7 @@ function defaultRouteInit(
SeriesInstanceUID SeriesInstanceUID
); );
DisplaySetService.makeDisplaySets(seriesMetadata.instances, madeInClient); displaySetService.makeDisplaySets(seriesMetadata.instances, madeInClient);
} }
); );
@ -58,7 +58,7 @@ function defaultRouteInit(
// until we run the hanging protocol matching service. // until we run the hanging protocol matching service.
Promise.allSettled(allRetrieves).then(() => { Promise.allSettled(allRetrieves).then(() => {
const displaySets = DisplaySetService.getActiveDisplaySets(); const displaySets = displaySetService.getActiveDisplaySets();
if (!displaySets || !displaySets.length) { if (!displaySets || !displaySets.length) {
return; return;
@ -84,7 +84,7 @@ function defaultRouteInit(
// run the hanging protocol matching on the displaySets with the predefined // run the hanging protocol matching on the displaySets with the predefined
// hanging protocol in the mode configuration // hanging protocol in the mode configuration
HangingProtocolService.run( hangingProtocolService.run(
{ studies, activeStudy, displaySets }, { studies, activeStudy, displaySets },
hangingProtocol hangingProtocol
); );
@ -119,8 +119,8 @@ export default function ModeRoute({
} }
const { const {
DisplaySetService, displaySetService,
HangingProtocolService: hangingProtocolService, hangingProtocolService,
} = servicesManager.services; } = servicesManager.services;
const { extensions, sopClassHandlers, hotkeys, hangingProtocol } = mode; const { extensions, sopClassHandlers, hotkeys, hangingProtocol } = mode;
@ -242,7 +242,7 @@ export default function ModeRoute({
// Extension // Extension
// Add SOPClassHandlers to a new SOPClassManager. // Add SOPClassHandlers to a new SOPClassManager.
DisplaySetService.init(extensionManager, sopClassHandlers); displaySetService.init(extensionManager, sopClassHandlers);
extensionManager.onModeEnter({ extensionManager.onModeEnter({
servicesManager, servicesManager,

View File

@ -2372,18 +2372,16 @@
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
"@cornerstonejs/adapters@^0.2.1": "@cornerstonejs/adapters@0.3.0":
version "0.2.1" version "0.3.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-0.2.1.tgz#c1de369d82e05a4ff58dce25dc441e870b0ef991" resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-0.3.0.tgz#c0a2a904c92ebfae77520eba4fc64c07ebd06db4"
integrity sha512-5oHHwpSR9sjRh3GBsHh3sBF8kiWbgAdNiVf1nWc7dc3PtemWl+BiPr7xLE0/9aRe0BCRkgyU/u/Yqgk7I/pZLg== integrity sha512-o3GIrccNM0q/QF0//ueVIXeRltUmtTBkTR47qPgIY9gdi+3sYEFHEW6RTXe3OOtDDXOWgM88Jp3mWWUK4ZeXxg==
dependencies: dependencies:
"@babel/runtime-corejs2" "^7.17.8" "@babel/runtime-corejs2" "^7.17.8"
dcmjs "^0.29.4" dcmjs "^0.29.4"
gl-matrix "^3.4.3" gl-matrix "^3.4.3"
lodash.clonedeep "^4.5.0" lodash.clonedeep "^4.5.0"
loglevelnext "^3.0.1"
ndarray "^1.0.19" ndarray "^1.0.19"
pako "^2.0.4"
"@cornerstonejs/calculate-suv@^1.0.3": "@cornerstonejs/calculate-suv@^1.0.3":
version "1.0.3" version "1.0.3"
@ -2410,6 +2408,14 @@
resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-1.0.3.tgz#4c82642e8a6beb0d263f5a263723aec4225e5300" resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-1.0.3.tgz#4c82642e8a6beb0d263f5a263723aec4225e5300"
integrity sha512-PK+9N/JL7ZMGum6OKuReRGGhWXpWjRC9WnltQ6aEzRKEQPMg+3WFiQPZowKCCG1I4whv35DYFRi6wu7RyRaEMQ== integrity sha512-PK+9N/JL7ZMGum6OKuReRGGhWXpWjRC9WnltQ6aEzRKEQPMg+3WFiQPZowKCCG1I4whv35DYFRi6wu7RyRaEMQ==
"@cornerstonejs/core@0.30.1":
version "0.30.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-0.30.1.tgz#6cb7088260641e7e55de2edb11979b1a0c00c794"
integrity sha512-A7t6WtPut17uLGpv3cUfk1gSzEvWiFcCg1K3H0WGySdZsf4tIinb5xA+9oD2eaBPbvTXmIef4HWFIAsN3kAEgg==
dependencies:
detect-gpu "^4.0.45"
lodash.clonedeep "4.5.0"
"@cornerstonejs/core@^0.27.1": "@cornerstonejs/core@^0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.27.1.tgz#1c56697cee8071eacfd9b1ee6f59c0fa6071accc" resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.27.1.tgz#1c56697cee8071eacfd9b1ee6f59c0fa6071accc"
@ -2418,6 +2424,14 @@
detect-gpu "^4.0.45" detect-gpu "^4.0.45"
lodash.clonedeep "4.5.0" lodash.clonedeep "4.5.0"
"@cornerstonejs/core@^0.28.0":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-0.28.0.tgz#bc5114dfd332fcc5caf4ab049bcb08f6457e5f97"
integrity sha512-DSAdH2+8h/rRCTR6WbbGkY+vqnAVVZH47+GgGQQHscEwDD/K3ZO62JMl4LgcgkDzI0LIIZAk6CgAtok31yG/3Q==
dependencies:
detect-gpu "^4.0.45"
lodash.clonedeep "4.5.0"
"@cornerstonejs/streaming-image-volume-loader@^0.11.2": "@cornerstonejs/streaming-image-volume-loader@^0.11.2":
version "0.11.2" version "0.11.2"
resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.11.2.tgz#75a8502a381a402a28ca2022f4bd2733eb90427f" resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.11.2.tgz#75a8502a381a402a28ca2022f4bd2733eb90427f"
@ -2426,12 +2440,12 @@
"@cornerstonejs/core" "^0.27.1" "@cornerstonejs/core" "^0.27.1"
cornerstone-wado-image-loader "^4.8.0" cornerstone-wado-image-loader "^4.8.0"
"@cornerstonejs/tools@^0.36.3": "@cornerstonejs/tools@0.39.0":
version "0.36.3" version "0.39.0"
resolved "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-0.36.3.tgz#22769dbcac57f6811f37376ac45ea1041286d4a0" resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-0.39.0.tgz#7d9bac4c55bc19145c2051f7c7150b34570849e4"
integrity sha512-popsYtA5Tvr9u7AoRFASwAr9vdxT3S697sb14clydczbbURAk/vHJw1K70P55BJ38jVx/yaGqfZWObFMWbqPLg== integrity sha512-xDR51lOEuNIDaTJltZvxDK+BIdIbznXUsWt+OpYiiygCQYt1Lt2eHufO2wVFVPrMgvm0dryF+WQbRVwtWvx4yA==
dependencies: dependencies:
"@cornerstonejs/core" "^0.27.1" "@cornerstonejs/core" "^0.28.0"
lodash.clonedeep "4.5.0" lodash.clonedeep "4.5.0"
lodash.get "^4.4.2" lodash.get "^4.4.2"
@ -10263,19 +10277,7 @@ dayjs@^1.11.6:
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2"
integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
dcmjs@^0.28.3: dcmjs@0.29.4, dcmjs@^0.29.4:
version "0.28.3"
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.28.3.tgz#a756ab4b02363d12545c9830b8f97b5141723727"
integrity sha512-GZOu+CtNvdWsPv8ga9Ywm/1YadEqT/+FhwcpgsbDAmKDUKe+6uNH+8KbEsRcaN1V5WFQEMwRbF9IRTl2qOoZvA==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
gl-matrix "^3.1.0"
lodash.clonedeep "^4.5.0"
loglevelnext "^3.0.1"
ndarray "^1.0.19"
pako "^2.0.4"
dcmjs@^0.29.4:
version "0.29.4" version "0.29.4"
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.29.4.tgz#3fb13945611979f756bc91b3f199fd87b4eabdb4" resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.29.4.tgz#3fb13945611979f756bc91b3f199fd87b4eabdb4"
integrity sha512-PzD6C4oB7v/AVTIPbkS6D6hjgVcSW7+T+DsxFpkD1xcEgU4qjGM16WGEHH3ZAPDBF0Xgm2d9FXUu/lXZIyfmow== integrity sha512-PzD6C4oB7v/AVTIPbkS6D6hjgVcSW7+T+DsxFpkD1xcEgU4qjGM16WGEHH3ZAPDBF0Xgm2d9FXUu/lXZIyfmow==