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:
parent
a97fb2fc9a
commit
8af0362d12
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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' },
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@ -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 },
|
||||||
|
|||||||
@ -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]);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 });
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
@ -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];
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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 });
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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' },
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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: [],
|
||||||
|
|||||||
@ -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: [],
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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: [],
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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: [],
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
50
yarn.lock
50
yarn.lock
@ -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==
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user