{"version":3,"file":"569.bundle.75dc0e8e9472e97b21eb.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx"],"sourcesContent":["function createSEGToolGroupAndAddTools(\n toolGroupService,\n toolGroupId,\n extensionManager\n) {\n const utilityModule = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.utilityModule.tools'\n );\n\n const { toolNames, Enums } = utilityModule.exports;\n\n const tools = {\n active: [\n {\n toolName: toolNames.WindowLevel,\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\n },\n {\n toolName: toolNames.Pan,\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\n },\n {\n toolName: toolNames.Zoom,\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\n },\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\n ],\n enabled: [{ toolName: toolNames.SegmentationDisplay }],\n };\n\n return toolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});\n}\n\nexport default createSEGToolGroupAndAddTools;\n","async function _hydrateSEGDisplaySet({\n segDisplaySet,\n viewportIndex,\n servicesManager,\n}) {\n const {\n segmentationService,\n hangingProtocolService,\n viewportGridService,\n } = servicesManager.services;\n\n const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;\n\n let segmentationId = null;\n\n // We need the hydration to notify panels about the new segmentation added\n const suppressEvents = false;\n\n segmentationId = await segmentationService.createSegmentationForSEGDisplaySet(\n segDisplaySet,\n segmentationId,\n suppressEvents\n );\n\n segmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);\n\n const { viewports } = viewportGridService.getState();\n\n const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(\n viewportIndex,\n displaySetInstanceUID\n );\n\n viewportGridService.setDisplaySetsForViewports(updatedViewports);\n\n // Todo: fix this after we have a better way for stack viewport segmentations\n\n // check every viewport in the viewports to see if the displaySetInstanceUID\n // is being displayed, if so we need to update the viewport to use volume viewport\n // (if already is not using it) since Cornerstone3D currently only supports\n // volume viewport for segmentation\n viewports.forEach((viewport, index) => {\n if (index === viewportIndex) {\n return;\n }\n\n const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(\n viewport.displaySetInstanceUIDs,\n segDisplaySet.displaySetInstanceUID\n );\n\n if (shouldDisplaySeg) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: index,\n displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,\n viewportOptions: {\n initialImageOptions: {\n preset: 'middle',\n },\n },\n });\n }\n });\n\n return true;\n}\n\nexport default _hydrateSEGDisplaySet;\n","import hydrateSEGDisplaySet from './_hydrateSEG';\n\nconst RESPONSE = {\n NO_NEVER: -1,\n CANCEL: 0,\n HYDRATE_SEG: 5,\n};\n\nfunction promptHydrateSEG({\n servicesManager,\n segDisplaySet,\n viewportIndex,\n}) {\n const { uiViewportDialogService } = servicesManager.services;\n\n return new Promise(async function(resolve, reject) {\n const promptResult = await _askHydrate(\n uiViewportDialogService,\n viewportIndex\n );\n\n if (promptResult === RESPONSE.HYDRATE_SEG) {\n const isHydrated = await hydrateSEGDisplaySet({\n segDisplaySet,\n viewportIndex,\n servicesManager,\n });\n\n resolve(isHydrated);\n }\n });\n}\n\nfunction _askHydrate(uiViewportDialogService, viewportIndex) {\n return new Promise(function(resolve, reject) {\n const message = 'Do you want to open this Segmentation?';\n const actions = [\n {\n type: 'secondary',\n text: 'No',\n value: RESPONSE.CANCEL,\n },\n {\n type: 'primary',\n text: 'Yes',\n value: RESPONSE.HYDRATE_SEG,\n },\n ];\n const onSubmit = result => {\n uiViewportDialogService.hide();\n resolve(result);\n };\n\n uiViewportDialogService.show({\n viewportIndex,\n type: 'info',\n message,\n actions,\n onSubmit,\n onOutsideClick: () => {\n uiViewportDialogService.hide();\n resolve(RESPONSE.CANCEL);\n },\n });\n });\n}\n\nexport default promptHydrateSEG;\n","import PropTypes from 'prop-types';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport OHIF, { utils } from '@ohif/core';\nimport {\n LoadingIndicatorProgress, Notification, useViewportDialog, useViewportGrid, ViewportActionBar\n} from '@ohif/ui';\nimport createSEGToolGroupAndAddTools from '../utils/initSEGToolGroup';\nimport promptHydrateSEG from '../utils/promptHydrateSEG';\nimport hydrateSEGDisplaySet from '../utils/_hydrateSEG';\nimport _getStatusComponent from './_getStatusComponent';\n\nconst { formatDate } = utils;\nconst SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';\n\nfunction OHIFCornerstoneSEGViewport(props) {\n const {\n children,\n displaySets,\n viewportOptions,\n viewportIndex,\n viewportLabel,\n servicesManager,\n extensionManager,\n } = props;\n\n const { t } = useTranslation('SEGViewport');\n\n const {\n displaySetService,\n toolGroupService,\n segmentationService,\n uiNotificationService,\n } = servicesManager.services;\n\n const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportIndex}`;\n\n // SEG viewport will always have a single display set\n if (displaySets.length > 1) {\n throw new Error('SEG viewport should only have a single display set');\n }\n\n const segDisplaySet = displaySets[0];\n\n const [viewportGrid, viewportGridService] = useViewportGrid();\n const [viewportDialogState, viewportDialogApi] = useViewportDialog();\n\n // States\n const [isToolGroupCreated, setToolGroupCreated] = useState(false);\n const [selectedSegment, setSelectedSegment] = useState(1);\n\n // Hydration means that the SEG is opened and segments are loaded into the\n // segmentation panel, and SEG is also rendered on any viewport that is in the\n // same frameOfReferenceUID as the referencedSeriesUID of the SEG. However,\n // loading basically means SEG loading over network and bit unpacking of the\n // SEG data.\n const [isHydrated, setIsHydrated] = useState(segDisplaySet.isHydrated);\n const [segIsLoading, setSegIsLoading] = useState(!segDisplaySet.isLoaded);\n const [element, setElement] = useState(null);\n const [processingProgress, setProcessingProgress] = useState({\n segmentIndex: 1,\n totalSegments: null,\n });\n\n // refs\n const referencedDisplaySetRef = useRef(null);\n\n const { viewports, activeViewportIndex } = viewportGrid;\n\n const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();\n const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(\n referencedDisplaySet\n );\n\n referencedDisplaySetRef.current = {\n displaySet: referencedDisplaySet,\n metadata: referencedDisplaySetMetadata,\n };\n /**\n * OnElementEnabled callback which is called after the cornerstoneExtension\n * has enabled the element. Note: we delegate all the image rendering to\n * cornerstoneExtension, so we don't need to do anything here regarding\n * the image rendering, element enabling etc.\n */\n const onElementEnabled = evt => {\n setElement(evt.detail.element);\n };\n\n const onElementDisabled = () => {\n setElement(null);\n };\n\n const getCornerstoneViewport = useCallback(() => {\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n const {\n displaySet: referencedDisplaySet,\n } = referencedDisplaySetRef.current;\n\n // Todo: jump to the center of the first segment\n return (\n \n );\n }, [viewportIndex, segDisplaySet, toolGroupId]);\n\n const onSegmentChange = useCallback(\n direction => {\n direction = direction === 'left' ? -1 : 1;\n const segmentationId = segDisplaySet.displaySetInstanceUID;\n const segmentation = segmentationService.getSegmentation(segmentationId);\n\n const { segments } = segmentation;\n\n const numberOfSegments = Object.keys(segments).length;\n\n let newSelectedSegmentIndex = selectedSegment + direction;\n\n if (newSelectedSegmentIndex > numberOfSegments - 1) {\n newSelectedSegmentIndex = 1;\n } else if (newSelectedSegmentIndex === 0) {\n newSelectedSegmentIndex = numberOfSegments - 1;\n }\n\n segmentationService.jumpToSegmentCenter(\n segmentationId,\n newSelectedSegmentIndex,\n toolGroupId\n );\n setSelectedSegment(newSelectedSegmentIndex);\n },\n [selectedSegment]\n );\n\n useEffect(() => {\n if (segIsLoading) {\n return;\n }\n\n promptHydrateSEG({\n servicesManager,\n viewportIndex,\n segDisplaySet,\n }).then(isHydrated => {\n if (isHydrated) {\n setIsHydrated(true);\n }\n });\n }, [servicesManager, viewportIndex, segDisplaySet, segIsLoading]);\n\n useEffect(() => {\n const { unsubscribe } = segmentationService.subscribe(\n segmentationService.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED,\n evt => {\n if (\n evt.segDisplaySet.displaySetInstanceUID ===\n segDisplaySet.displaySetInstanceUID\n ) {\n setSegIsLoading(false);\n }\n\n if (evt.overlappingSegments) {\n uiNotificationService.show({\n title: 'Overlapping Segments',\n message:\n 'Overlapping segments detected which is not currently supported',\n type: 'warning',\n });\n }\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [segDisplaySet]);\n\n useEffect(() => {\n const { unsubscribe } = segmentationService.subscribe(\n segmentationService.EVENTS.SEGMENT_PIXEL_DATA_CREATED,\n ({ segmentIndex, numSegments }) => {\n setProcessingProgress({\n segmentIndex,\n totalSegments: numSegments,\n });\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [segDisplaySet]);\n\n /**\n Cleanup the SEG viewport when the viewport is destroyed\n */\n useEffect(() => {\n const onDisplaySetsRemovedSubscription = displaySetService.subscribe(\n displaySetService.EVENTS.DISPLAY_SETS_REMOVED,\n ({ displaySetInstanceUIDs }) => {\n const activeViewport = viewports[activeViewportIndex];\n if (\n displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)\n ) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [],\n });\n }\n }\n );\n\n return () => {\n onDisplaySetsRemovedSubscription.unsubscribe();\n };\n }, []);\n\n useEffect(() => {\n let toolGroup = toolGroupService.getToolGroup(toolGroupId);\n\n if (toolGroup) {\n return;\n }\n\n // This creates a custom tool group which has the lifetime of this view\n // only, and does NOT interfere with currently displayed segmentations.\n toolGroup = createSEGToolGroupAndAddTools(\n toolGroupService,\n toolGroupId,\n extensionManager\n );\n\n setToolGroupCreated(true);\n\n return () => {\n // remove the segmentation representations if seg displayset changed\n segmentationService.removeSegmentationRepresentationFromToolGroup(\n toolGroupId\n );\n\n // Only destroy the viewport specific implementation\n toolGroupService.destroyToolGroup(toolGroupId);\n };\n }, []);\n\n useEffect(() => {\n setIsHydrated(segDisplaySet.isHydrated);\n\n return () => {\n // remove the segmentation representations if seg displayset changed\n segmentationService.removeSegmentationRepresentationFromToolGroup(\n toolGroupId\n );\n referencedDisplaySetRef.current = null;\n };\n }, [segDisplaySet]);\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n let childrenWithProps = null;\n\n if (\n !referencedDisplaySetRef.current ||\n referencedDisplaySet.displaySetInstanceUID !==\n referencedDisplaySetRef.current.displaySet.displaySetInstanceUID\n ) {\n return null;\n }\n\n if (children && children.length) {\n childrenWithProps = children.map((child, index) => {\n return (\n child &&\n React.cloneElement(child, {\n viewportIndex,\n key: index,\n })\n );\n });\n }\n\n const {\n PatientID,\n PatientName,\n PatientSex,\n PatientAge,\n SliceThickness,\n ManufacturerModelName,\n StudyDate,\n SeriesDescription,\n SpacingBetweenSlices,\n } = referencedDisplaySetRef.current.metadata;\n\n const onStatusClick = async () => {\n const isHydrated = await hydrateSEGDisplaySet({\n segDisplaySet,\n viewportIndex,\n servicesManager,\n });\n\n setIsHydrated(isHydrated);\n };\n\n return (\n <>\n {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n onArrowsClick={onSegmentChange}\n getStatusComponent={() => {\n return _getStatusComponent({\n isHydrated,\n onStatusClick,\n });\n }}\n studyData={{\n label: viewportLabel,\n useAltStyling: true,\n studyDate: formatDate(StudyDate),\n seriesDescription: `SEG Viewport ${SeriesDescription}`,\n patientInformation: {\n patientName: PatientName\n ? OHIF.utils.formatPN(PatientName.Alphabetic)\n : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${SpacingBetweenSlices.toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n />\n\n
\n {segIsLoading && (\n Loading SEG ...\n ) : (\n \n
Loading Segment
\n
{`${processingProgress.segmentIndex}`}
\n
/
\n
{`${processingProgress.totalSegments}`}
\n
\n )\n }\n studyInstanceUid={referencedDisplaySet.images[0].StudyInstanceUid}\n />\n )}\n {getCornerstoneViewport()}\n
\n {viewportDialogState.viewportIndex === viewportIndex && (\n \n )}\n
\n {childrenWithProps}\n
\n \n );\n}\n\nOHIFCornerstoneSEGViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object),\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n customProps: PropTypes.object,\n};\n\nOHIFCornerstoneSEGViewport.defaultProps = {\n customProps: {},\n};\n\nfunction _getReferencedDisplaySetMetadata(referencedDisplaySet) {\n const image0 = referencedDisplaySet.images[0];\n const referencedDisplaySetMetadata = {\n PatientID: image0.PatientID,\n PatientName: image0.PatientName,\n PatientSex: image0.PatientSex,\n PatientAge: image0.PatientAge,\n SliceThickness: image0.SliceThickness,\n StudyDate: image0.StudyDate,\n SeriesDescription: image0.SeriesDescription,\n SeriesInstanceUID: image0.SeriesInstanceUID,\n SeriesNumber: image0.SeriesNumber,\n ManufacturerModelName: image0.ManufacturerModelName,\n SpacingBetweenSlices: image0.SpacingBetweenSlices,\n StudyInstanceUID: image0.StudyInstanceUID,\n };\n\n return referencedDisplaySetMetadata;\n}\n\nexport default OHIFCornerstoneSEGViewport;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Icon, Tooltip } from '@ohif/ui';\n\n\nexport default function _getStatusComponent({ isHydrated, onStatusClick }) {\n let ToolTipMessage = null;\n let StatusIcon = null;\n\n const {t} = useTranslation(\"Common\");\n const loadStr = t(\"LOAD\");\n\n switch (isHydrated) {\n case true:\n StatusIcon = () => ;\n\n ToolTipMessage = () => (\n
This Segmentation is loaded in the segmentation panel
\n );\n break;\n case false:\n StatusIcon = () => ;\n\n ToolTipMessage = () =>
Click LOAD to load segmentation.
;\n }\n\n const StatusArea = () => (\n
\n
\n \n SEG\n
\n {!isHydrated && (\n \n {loadStr}\n
\n )}\n \n );\n\n\n return (\n <>\n {ToolTipMessage && (\n } position=\"bottom-left\">\n \n \n )}\n {!ToolTipMessage && }\n \n );\n}\n"],"names":["toolGroupService","toolGroupId","extensionManager","utilityModule","getModuleEntry","toolNames","Enums","exports","tools","active","toolName","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","enabled","SegmentationDisplay","createToolGroupAndAddTools","async","segDisplaySet","viewportIndex","servicesManager","segmentationService","hangingProtocolService","viewportGridService","services","displaySetInstanceUID","referencedDisplaySetInstanceUID","segmentationId","createSegmentationForSEGDisplaySet","hydrateSegmentation","viewports","getState","updatedViewports","getViewportsRequireUpdate","setDisplaySetsForViewports","forEach","viewport","index","shouldRenderSegmentation","displaySetInstanceUIDs","setDisplaySetsForViewport","viewportOptions","initialImageOptions","preset","RESPONSE","NO_NEVER","CANCEL","HYDRATE_SEG","uiViewportDialogService","Promise","resolve","reject","promptResult","message","actions","type","text","value","onSubmit","result","hide","show","onOutsideClick","_askHydrate","hydrateSEGDisplaySet","formatDate","utils","OHIFCornerstoneSEGViewport","props","children","displaySets","viewportLabel","t","useTranslation","displaySetService","uiNotificationService","length","Error","viewportGrid","useViewportGrid","viewportDialogState","viewportDialogApi","useViewportDialog","isToolGroupCreated","setToolGroupCreated","useState","selectedSegment","setSelectedSegment","isHydrated","setIsHydrated","segIsLoading","setSegIsLoading","isLoaded","element","setElement","processingProgress","setProcessingProgress","segmentIndex","totalSegments","referencedDisplaySetRef","useRef","activeViewportIndex","referencedDisplaySet","getReferenceDisplaySet","referencedDisplaySetMetadata","image0","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","StudyDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","ManufacturerModelName","SpacingBetweenSlices","StudyInstanceUID","_getReferencedDisplaySetMetadata","current","displaySet","metadata","onElementEnabled","evt","detail","onElementDisabled","getCornerstoneViewport","useCallback","component","Component","React","_extends","viewportType","orientation","viewportId","onSegmentChange","direction","segmentation","getSegmentation","segments","numberOfSegments","Object","keys","newSelectedSegmentIndex","jumpToSegmentCenter","useEffect","promptHydrateSEG","then","unsubscribe","subscribe","EVENTS","SEGMENTATION_PIXEL_DATA_CREATED","overlappingSegments","title","SEGMENT_PIXEL_DATA_CREATED","numSegments","onDisplaySetsRemovedSubscription","DISPLAY_SETS_REMOVED","activeViewport","includes","toolGroup","getToolGroup","createSEGToolGroupAndAddTools","removeSegmentationRepresentationFromToolGroup","destroyToolGroup","childrenWithProps","map","child","key","onStatusClick","ViewportActionBar","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","ToolTipMessage","StatusIcon","loadStr","Icon","name","StatusArea","className","onMouseUp","Tooltip","content","position","_getStatusComponent","studyData","label","useAltStyling","studyDate","seriesDescription","patientInformation","patientName","OHIF","formatPN","Alphabetic","patientSex","patientAge","MRN","thickness","toFixed","spacing","undefined","scanner","LoadingIndicatorProgress","progress","textBlock","studyInstanceUid","StudyInstanceUid","Notification","id","propTypes","PropTypes","isRequired","dataSource","customProps","defaultProps"],"sourceRoot":""}