{"version":3,"file":"181.bundle.94f871313841b2f4148e.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/utils.ts","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CornerstoneOverlays.tsx","webpack:///../../../extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx","webpack:///../../../extensions/cornerstone/src/components/CinePlayer/index.ts","webpack:///../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Enums, Types, utilities } from '@cornerstonejs/core';\nimport { utilities as csToolsUtils } from '@cornerstonejs/tools';\nimport { ImageScrollbar } from '@ohif/ui';\nimport { ServicesManger } from '@ohif/core';\n\nfunction CornerstoneImageScrollbar({\n viewportData,\n viewportId,\n element,\n imageSliceData,\n setImageSliceData,\n scrollbarHeight,\n servicesManager,\n}) {\n const { cineService, cornerstoneViewportService } = (servicesManager as ServicesManger).services;\n\n const onImageScrollbarChange = (imageIndex, viewportId) => {\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\n\n const { isCineEnabled } = cineService.getState();\n\n if (isCineEnabled) {\n // on image scrollbar change, stop the CINE if it is playing\n cineService.stopClip(element);\n cineService.setCine({ id: viewportId, isPlaying: false });\n }\n\n csToolsUtils.jumpToSlice(viewport.element, {\n imageIndex,\n debounceLoading: true,\n });\n };\n\n useEffect(() => {\n if (!viewportData) {\n return;\n }\n\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\n\n if (!viewport) {\n return;\n }\n\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\n const imageIndex = viewport.getCurrentImageIdIndex();\n\n setImageSliceData({\n imageIndex: imageIndex,\n numberOfSlices: viewportData.data.imageIds.length,\n });\n\n return;\n }\n\n if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\n const sliceData = utilities.getImageSliceDataForVolumeViewport(\n viewport as Types.IVolumeViewport\n );\n\n if (!sliceData) {\n return;\n }\n\n const { imageIndex, numberOfSlices } = sliceData;\n setImageSliceData({ imageIndex, numberOfSlices });\n }\n }, [viewportId, viewportData]);\n\n useEffect(() => {\n if (viewportData?.viewportType !== Enums.ViewportType.STACK) {\n return;\n }\n\n const updateStackIndex = event => {\n const { newImageIdIndex } = event.detail;\n // find the index of imageId in the imageIds\n setImageSliceData({\n imageIndex: newImageIdIndex,\n numberOfSlices: viewportData.data.imageIds.length,\n });\n };\n\n element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex);\n\n return () => {\n element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex);\n };\n }, [viewportData, element]);\n\n useEffect(() => {\n if (viewportData?.viewportType !== Enums.ViewportType.ORTHOGRAPHIC) {\n return;\n }\n\n const updateVolumeIndex = event => {\n const { imageIndex, numberOfSlices } = event.detail;\n // find the index of imageId in the imageIds\n setImageSliceData({ imageIndex, numberOfSlices });\n };\n\n element.addEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex);\n\n return () => {\n element.removeEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex);\n };\n }, [viewportData, element]);\n\n return (\n onImageScrollbarChange(evt, viewportId)}\n max={imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0}\n height={scrollbarHeight}\n value={imageSliceData.imageIndex}\n />\n );\n}\n\nCornerstoneImageScrollbar.propTypes = {\n viewportData: PropTypes.object,\n viewportId: PropTypes.string.isRequired,\n element: PropTypes.instanceOf(Element),\n scrollbarHeight: PropTypes.string,\n imageSliceData: PropTypes.object.isRequired,\n setImageSliceData: PropTypes.func.isRequired,\n servicesManager: PropTypes.object.isRequired,\n};\n\nexport default CornerstoneImageScrollbar;\n","import moment from 'moment';\nimport { metaData } from '@cornerstonejs/core';\n\n/**\n * Checks if value is valid.\n *\n * @param {number} value\n * @returns {boolean} is valid.\n */\nexport function isValidNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Formats number precision.\n *\n * @param {number} number\n * @param {number} precision\n * @returns {number} formatted number.\n */\nexport function formatNumberPrecision(number, precision = 0) {\n if (number !== null) {\n return parseFloat(number).toFixed(precision);\n }\n}\n\n/**\n * Formats DICOM date.\n *\n * @param {string} date\n * @param {string} strFormat\n * @returns {string} formatted date.\n */\nexport function formatDICOMDate(date, strFormat = 'MMM D, YYYY') {\n return moment(date, 'YYYYMMDD').format(strFormat);\n}\n\n/**\n * DICOM Time is stored as HHmmss.SSS, where:\n * HH 24 hour time:\n * m mm 0..59 Minutes\n * s ss 0..59 Seconds\n * S SS SSS 0..999 Fractional seconds\n *\n * Goal: '24:12:12'\n *\n * @param {*} time\n * @param {string} strFormat\n * @returns {string} formatted name.\n */\nexport function formatDICOMTime(time, strFormat = 'HH:mm:ss') {\n return moment(time, 'HH:mm:ss').format(strFormat);\n}\n\n/**\n * Formats a patient name for display purposes\n *\n * @param {string} name\n * @returns {string} formatted name.\n */\nexport function formatPN(name) {\n if (!name) {\n return '';\n }\n\n const cleaned = name\n .split('^')\n .filter(s => !!s)\n .join(', ')\n .trim();\n return cleaned === ',' || cleaned === '' ? '' : cleaned;\n}\n\n/**\n * Gets compression type\n *\n * @param {number} imageId\n * @returns {string} compression type.\n */\nexport function getCompression(imageId) {\n const generalImageModule = metaData.get('generalImageModule', imageId) || {};\n const { lossyImageCompression, lossyImageCompressionRatio, lossyImageCompressionMethod } =\n generalImageModule;\n\n if (lossyImageCompression === '01' && lossyImageCompressionRatio !== '') {\n const compressionMethod = lossyImageCompressionMethod || 'Lossy: ';\n const compressionRatio = formatNumberPrecision(lossyImageCompressionRatio, 2);\n return compressionMethod + compressionRatio + ' : 1';\n }\n\n return 'Lossless / Uncompressed';\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { vec3 } from 'gl-matrix';\nimport PropTypes from 'prop-types';\nimport { metaData, Enums, utilities } from '@cornerstonejs/core';\nimport { ViewportOverlay } from '@ohif/ui';\nimport { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils';\nimport { InstanceMetadata } from 'platform/core/src/types';\nimport { ServicesManager } from '@ohif/core';\nimport { ImageSliceData } from '@cornerstonejs/core/dist/esm/types';\n\nimport './CustomizableViewportOverlay.css';\n\nconst EPSILON = 1e-4;\n\ninterface OverlayItemProps {\n element: any;\n viewportData: any;\n imageSliceData: ImageSliceData;\n servicesManager: ServicesManager;\n instance: InstanceMetadata;\n customization: any;\n formatters: {\n formatPN: (val) => string;\n formatDate: (val) => string;\n formatTime: (val) => string;\n formatNumberPrecision: (val, number) => string;\n };\n\n // calculated values\n voi: {\n windowWidth: number;\n windowCenter: number;\n };\n instanceNumber?: number;\n scale?: number;\n}\n\n/**\n * Window Level / Center Overlay item\n */\nfunction VOIOverlayItem({ voi, customization }: OverlayItemProps) {\n const { windowWidth, windowCenter } = voi;\n if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {\n return null;\n }\n\n return (\n \n W:\n {windowWidth.toFixed(0)}\n L:\n {windowCenter.toFixed(0)}\n \n );\n}\n\n/**\n * Zoom Level Overlay item\n */\nfunction ZoomOverlayItem({ scale, customization }: OverlayItemProps) {\n return (\n \n Zoom:\n {scale.toFixed(2)}x\n \n );\n}\n\n/**\n * Instance Number Overlay Item\n */\nfunction InstanceNumberOverlayItem({\n instanceNumber,\n imageSliceData,\n customization,\n}: OverlayItemProps) {\n const { imageIndex, numberOfSlices } = imageSliceData;\n\n return (\n \n I:\n \n {instanceNumber !== undefined && instanceNumber !== null\n ? `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})`\n : `${imageIndex + 1}/${numberOfSlices}`}\n \n \n );\n}\n\n/**\n * Customizable Viewport Overlay\n */\nfunction CustomizableViewportOverlay({\n element,\n viewportData,\n imageSliceData,\n viewportId,\n servicesManager,\n}) {\n const { toolbarService, cornerstoneViewportService, customizationService } =\n servicesManager.services;\n const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null });\n const [scale, setScale] = useState(1);\n const [activeTools, setActiveTools] = useState([]);\n const { imageIndex } = imageSliceData;\n\n const topLeftCustomization = customizationService.getModeCustomization(\n 'cornerstoneOverlayTopLeft'\n );\n const topRightCustomization = customizationService.getModeCustomization(\n 'cornerstoneOverlayTopRight'\n );\n const bottomLeftCustomization = customizationService.getModeCustomization(\n 'cornerstoneOverlayBottomLeft'\n );\n const bottomRightCustomization = customizationService.getModeCustomization(\n 'cornerstoneOverlayBottomRight'\n );\n\n const instance = useMemo(() => {\n if (viewportData != null) {\n return _getViewportInstance(viewportData, imageIndex);\n } else {\n return null;\n }\n }, [viewportData, imageIndex]);\n\n const instanceNumber = useMemo(() => {\n if (viewportData != null) {\n return _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService);\n }\n return null;\n }, [viewportData, viewportId, imageIndex, cornerstoneViewportService]);\n\n /**\n * Initial toolbar state\n */\n useEffect(() => {\n setActiveTools(toolbarService.getActiveTools());\n }, []);\n\n /**\n * Updating the VOI when the viewport changes its voi\n */\n useEffect(() => {\n const updateVOI = eventDetail => {\n const { range } = eventDetail.detail;\n\n if (!range) {\n return;\n }\n\n const { lower, upper } = range;\n const { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel(lower, upper);\n\n setVOI({ windowCenter, windowWidth });\n };\n\n element.addEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\n\n return () => {\n element.removeEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\n };\n }, [viewportId, viewportData, voi, element]);\n\n /**\n * Updating the scale when the viewport changes its zoom\n */\n useEffect(() => {\n const updateScale = eventDetail => {\n const { previousCamera, camera } = eventDetail.detail;\n\n if (\n previousCamera.parallelScale !== camera.parallelScale ||\n previousCamera.scale !== camera.scale\n ) {\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\n\n if (!viewport) {\n return;\n }\n\n const imageData = viewport.getImageData();\n\n if (!imageData) {\n return;\n }\n\n if (camera.scale) {\n setScale(camera.scale);\n return;\n }\n\n const { spacing } = imageData;\n // convert parallel scale to scale\n const scale = (element.clientHeight * spacing[0] * 0.5) / camera.parallelScale;\n setScale(scale);\n }\n };\n\n element.addEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\n\n return () => {\n element.removeEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\n };\n }, [viewportId, viewportData, cornerstoneViewportService, element]);\n\n /**\n * Updating the active tools when the toolbar changes\n */\n // Todo: this should act on the toolGroups instead of the toolbar state\n useEffect(() => {\n const { unsubscribe } = toolbarService.subscribe(\n toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\n () => {\n setActiveTools(toolbarService.getActiveTools());\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [toolbarService]);\n\n const _renderOverlayItem = useCallback(\n item => {\n const overlayItemProps: OverlayItemProps = {\n element,\n viewportData,\n imageSliceData,\n viewportId,\n servicesManager,\n customization: item,\n formatters: {\n formatPN: formatPN,\n formatDate: formatDICOMDate,\n formatTime: formatDICOMTime,\n formatNumberPrecision: formatNumberPrecision,\n },\n instance,\n // calculated\n voi,\n scale,\n instanceNumber,\n };\n\n if (item.customizationType === 'ohif.overlayItem.windowLevel') {\n return ;\n } else if (item.customizationType === 'ohif.overlayItem.zoomLevel') {\n return ;\n } else if (item.customizationType === 'ohif.overlayItem.instanceNumber') {\n return ;\n } else {\n const renderItem = customizationService.transform(item);\n\n if (typeof renderItem.content === 'function') {\n return renderItem.content(overlayItemProps);\n }\n }\n },\n [\n element,\n viewportData,\n imageSliceData,\n viewportId,\n servicesManager,\n customizationService,\n instance,\n voi,\n scale,\n instanceNumber,\n ]\n );\n\n const getTopLeftContent = useCallback(() => {\n const items = topLeftCustomization?.items || [\n {\n id: 'WindowLevel',\n customizationType: 'ohif.overlayItem.windowLevel',\n },\n ];\n return (\n <>\n {items.map((item, i) => (\n
{_renderOverlayItem(item)}
\n ))}\n \n );\n }, [topLeftCustomization, _renderOverlayItem]);\n\n const getTopRightContent = useCallback(() => {\n const items = topRightCustomization?.items || [\n {\n id: 'InstanceNmber',\n customizationType: 'ohif.overlayItem.instanceNumber',\n },\n ];\n return (\n <>\n {items.map((item, i) => (\n
{_renderOverlayItem(item)}
\n ))}\n \n );\n }, [topRightCustomization, _renderOverlayItem]);\n\n const getBottomLeftContent = useCallback(() => {\n const items = bottomLeftCustomization?.items || [];\n return (\n <>\n {items.map((item, i) => (\n
{_renderOverlayItem(item)}
\n ))}\n \n );\n }, [bottomLeftCustomization, _renderOverlayItem]);\n\n const getBottomRightContent = useCallback(() => {\n const items = bottomRightCustomization?.items || [];\n return (\n <>\n {items.map((item, i) => (\n
{_renderOverlayItem(item)}
\n ))}\n \n );\n }, [bottomRightCustomization, _renderOverlayItem]);\n\n return (\n \n );\n}\n\nfunction _getViewportInstance(viewportData, imageIndex) {\n let imageId = null;\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\n imageId = viewportData.data.imageIds[imageIndex];\n } else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\n const volumes = viewportData.data;\n if (volumes && volumes.length == 1) {\n const volume = volumes[0];\n imageId = volume.imageIds[imageIndex];\n }\n }\n return imageId ? metaData.get('instance', imageId) || {} : {};\n}\n\nfunction _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) {\n let instanceNumber;\n\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\n instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);\n\n if (!instanceNumber && instanceNumber !== 0) {\n return null;\n }\n } else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\n instanceNumber = _getInstanceNumberFromVolume(\n viewportData,\n imageIndex,\n viewportId,\n cornerstoneViewportService\n );\n }\n return instanceNumber;\n}\n\nfunction _getInstanceNumberFromStack(viewportData, imageIndex) {\n const imageIds = viewportData.data.imageIds;\n const imageId = imageIds[imageIndex];\n\n if (!imageId) {\n return;\n }\n\n const generalImageModule = metaData.get('generalImageModule', imageId) || {};\n const { instanceNumber } = generalImageModule;\n\n const stackSize = imageIds.length;\n\n if (stackSize <= 1) {\n return;\n }\n\n return parseInt(instanceNumber);\n}\n\n// Since volume viewports can be in any view direction, they can render\n// a reconstructed image which don't have imageIds; therefore, no instance and instanceNumber\n// Here we check if viewport is in the acquisition direction and if so, we get the instanceNumber\nfunction _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewportService) {\n const volumes = viewportData.volumes;\n\n // Todo: support fusion of acquisition plane which has instanceNumber\n if (!volumes || volumes.length > 1) {\n return;\n }\n\n const volume = volumes[0];\n const { direction, imageIds } = volume;\n\n const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\n\n if (!cornerstoneViewport) {\n return;\n }\n\n const camera = cornerstoneViewport.getCamera();\n const { viewPlaneNormal } = camera;\n // checking if camera is looking at the acquisition plane (defined by the direction on the volume)\n\n const scanAxisNormal = direction.slice(6, 9);\n\n // check if viewPlaneNormal is parallel to scanAxisNormal\n const cross = vec3.cross(vec3.create(), viewPlaneNormal, scanAxisNormal);\n const isAcquisitionPlane = vec3.length(cross) < EPSILON;\n\n if (isAcquisitionPlane) {\n const imageId = imageIds[imageIndex];\n\n if (!imageId) {\n return {};\n }\n\n const { instanceNumber } = metaData.get('generalImageModule', imageId) || {};\n return parseInt(instanceNumber);\n }\n}\n\nCustomizableViewportOverlay.propTypes = {\n viewportData: PropTypes.object,\n imageIndex: PropTypes.number,\n viewportId: PropTypes.string,\n};\n\nexport default CustomizableViewportOverlay;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport classNames from 'classnames';\nimport {\n metaData,\n Enums,\n Types,\n getEnabledElement,\n utilities as csUtils,\n} from '@cornerstonejs/core';\nimport { utilities } from '@cornerstonejs/tools';\nimport PropTypes from 'prop-types';\nimport { vec3 } from 'gl-matrix';\n\nimport './ViewportOrientationMarkers.css';\n\nconst { getOrientationStringLPS, invertOrientationStringLPS } = utilities.orientation;\n\nfunction ViewportOrientationMarkers({\n element,\n viewportData,\n imageSliceData,\n viewportId,\n servicesManager,\n orientationMarkers = ['top', 'left'],\n}) {\n // Rotation is in degrees\n const [rotation, setRotation] = useState(0);\n const [flipHorizontal, setFlipHorizontal] = useState(false);\n const [flipVertical, setFlipVertical] = useState(false);\n const { cornerstoneViewportService } = servicesManager.services;\n\n useEffect(() => {\n const cameraModifiedListener = (evt: Types.EventTypes.CameraModifiedEvent) => {\n const { rotation, previousCamera, camera } = evt.detail;\n\n if (rotation !== undefined) {\n setRotation(rotation);\n }\n\n if (\n camera.flipHorizontal !== undefined &&\n previousCamera.flipHorizontal !== camera.flipHorizontal\n ) {\n setFlipHorizontal(camera.flipHorizontal);\n }\n\n if (\n camera.flipVertical !== undefined &&\n previousCamera.flipVertical !== camera.flipVertical\n ) {\n setFlipVertical(camera.flipVertical);\n }\n };\n\n element.addEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener);\n\n return () => {\n element.removeEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener);\n };\n }, []);\n\n const markers = useMemo(() => {\n if (!viewportData) {\n return '';\n }\n\n let rowCosines, columnCosines;\n if (viewportData.viewportType === 'stack') {\n const imageIndex = imageSliceData.imageIndex;\n const imageId = viewportData.data.imageIds?.[imageIndex];\n\n // Workaround for below TODO stub\n if (!imageId) {\n return false;\n }\n\n ({ rowCosines, columnCosines } = metaData.get('imagePlaneModule', imageId) || {});\n } else {\n if (!element || !getEnabledElement(element)) {\n return '';\n }\n\n const { viewport } = getEnabledElement(element);\n const { viewUp, viewPlaneNormal } = viewport.getCamera();\n\n const viewRight = vec3.create();\n vec3.cross(viewRight, viewUp, viewPlaneNormal);\n\n columnCosines = [-viewUp[0], -viewUp[1], -viewUp[2]];\n rowCosines = viewRight;\n }\n\n if (!rowCosines || !columnCosines || rotation === undefined) {\n return '';\n }\n\n const markers = _getOrientationMarkers(\n rowCosines,\n columnCosines,\n rotation,\n flipVertical,\n flipHorizontal\n );\n\n const ohifViewport = cornerstoneViewportService.getViewportInfo(viewportId);\n\n if (!ohifViewport) {\n console.log('ViewportOrientationMarkers::No viewport');\n return null;\n }\n const backgroundColor = ohifViewport.getViewportOptions().background;\n\n // Todo: probably this can be done in a better way in which we identify bright\n // background\n const isLight = backgroundColor ? csUtils.isEqual(backgroundColor, [1, 1, 1]) : false;\n\n return orientationMarkers.map((m, index) => (\n \n
{markers[m]}
\n \n ));\n }, [\n viewportData,\n imageSliceData,\n rotation,\n flipVertical,\n flipHorizontal,\n orientationMarkers,\n element,\n ]);\n\n return
{markers}
;\n}\n\nViewportOrientationMarkers.propTypes = {\n percentComplete: PropTypes.number,\n error: PropTypes.object,\n};\n\nViewportOrientationMarkers.defaultProps = {\n percentComplete: 0,\n error: null,\n};\n\n/**\n *\n * Computes the orientation labels on a Cornerstone-enabled Viewport element\n * when the viewport settings change (e.g. when a horizontal flip or a rotation occurs)\n *\n * @param {*} rowCosines\n * @param {*} columnCosines\n * @param {*} rotation in degrees\n * @returns\n */\nfunction _getOrientationMarkers(rowCosines, columnCosines, rotation, flipVertical, flipHorizontal) {\n const rowString = getOrientationStringLPS(rowCosines);\n const columnString = getOrientationStringLPS(columnCosines);\n const oppositeRowString = invertOrientationStringLPS(rowString);\n const oppositeColumnString = invertOrientationStringLPS(columnString);\n\n const markers = {\n top: oppositeColumnString,\n left: oppositeRowString,\n right: rowString,\n bottom: columnString,\n };\n\n // If any vertical or horizontal flips are applied, change the orientation strings ahead of\n // the rotation applications\n if (flipVertical) {\n markers.top = invertOrientationStringLPS(markers.top);\n markers.bottom = invertOrientationStringLPS(markers.bottom);\n }\n\n if (flipHorizontal) {\n markers.left = invertOrientationStringLPS(markers.left);\n markers.right = invertOrientationStringLPS(markers.right);\n }\n\n // Swap the labels accordingly if the viewport has been rotated\n // This could be done in a more complex way for intermediate rotation values (e.g. 45 degrees)\n if (rotation === 90 || rotation === -270) {\n return {\n top: markers.left,\n left: invertOrientationStringLPS(markers.top),\n right: invertOrientationStringLPS(markers.bottom),\n bottom: markers.right, // left\n };\n } else if (rotation === -90 || rotation === 270) {\n return {\n top: invertOrientationStringLPS(markers.left),\n left: markers.top,\n bottom: markers.left,\n right: markers.bottom,\n };\n } else if (rotation === 180 || rotation === -180) {\n return {\n top: invertOrientationStringLPS(markers.top),\n left: invertOrientationStringLPS(markers.left),\n bottom: invertOrientationStringLPS(markers.bottom),\n right: invertOrientationStringLPS(markers.right),\n };\n }\n\n return markers;\n}\n\nexport default ViewportOrientationMarkers;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { Enums } from '@cornerstonejs/core';\n\nfunction ViewportImageSliceLoadingIndicator({ viewportData, element }) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n const loadIndicatorRef = useRef(null);\n const imageIdToBeLoaded = useRef(null);\n\n const setLoadingState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n loadIndicatorRef.current = setTimeout(() => {\n setLoading(true);\n }, 50);\n };\n\n const setFinishLoadingState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n setLoading(false);\n };\n\n const setErrorState = evt => {\n clearTimeout(loadIndicatorRef.current);\n\n if (imageIdToBeLoaded.current === evt.detail.imageId) {\n setError(evt.detail.error);\n imageIdToBeLoaded.current = null;\n }\n };\n\n useEffect(() => {\n element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState);\n element.addEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\n element.addEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState);\n\n return () => {\n element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState);\n\n element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState);\n\n element.removeEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\n };\n }, [element, viewportData]);\n\n if (error) {\n return (\n <>\n
\n
\n

\n

Error Loading Image

\n

An error has occurred.

\n

{error}

\n

\n
\n
\n \n );\n }\n\n if (loading) {\n return (\n // IMPORTANT: we need to use the pointer-events-none class to prevent the loading indicator from\n // interacting with the mouse, since scrolling should propagate to the viewport underneath\n
\n
\n

Loading...

\n
\n
\n );\n }\n\n return null;\n}\n\nViewportImageSliceLoadingIndicator.propTypes = {\n percentComplete: PropTypes.number,\n error: PropTypes.object,\n element: PropTypes.object,\n};\n\nViewportImageSliceLoadingIndicator.defaultProps = {\n percentComplete: 0,\n error: null,\n};\n\nexport default ViewportImageSliceLoadingIndicator;\n","import React, { useEffect, useState } from 'react';\n\nimport ViewportImageScrollbar from './ViewportImageScrollbar';\nimport CustomizableViewportOverlay from './CustomizableViewportOverlay';\nimport ViewportOrientationMarkers from './ViewportOrientationMarkers';\nimport ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';\n\nfunction CornerstoneOverlays(props) {\n const { viewportId, element, scrollbarHeight, servicesManager } = props;\n const { cornerstoneViewportService } = servicesManager.services;\n const [imageSliceData, setImageSliceData] = useState({\n imageIndex: 0,\n numberOfSlices: 0,\n });\n const [viewportData, setViewportData] = useState(null);\n\n useEffect(() => {\n const { unsubscribe } = cornerstoneViewportService.subscribe(\n cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED,\n props => {\n if (props.viewportId !== viewportId) {\n return;\n }\n\n setViewportData(props.viewportData);\n }\n );\n\n return () => {\n unsubscribe();\n };\n }, [viewportId]);\n\n if (!element) {\n return null;\n }\n\n if (viewportData) {\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\n\n if (viewportInfo?.viewportOptions?.customViewportProps?.hideOverlays) {\n return null;\n }\n }\n\n return (\n
\n \n\n \n\n \n\n \n
\n );\n}\n\nexport default CornerstoneOverlays;\n","import React, { useEffect } from 'react';\nimport { CinePlayer, useCine, useViewportGrid } from '@ohif/ui';\nimport { Enums, eventTarget } from '@cornerstonejs/core';\n\nfunction WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) {\n const { toolbarService, customizationService } = servicesManager.services;\n const [{ isCineEnabled, cines }, cineService] = useCine();\n const [{ activeViewportId }] = useViewportGrid();\n\n const { component: CinePlayerComponent = CinePlayer } =\n customizationService.get('cinePlayer') ?? {};\n\n const handleCineClose = () => {\n toolbarService.recordInteraction({\n groupId: 'MoreTools',\n interactionType: 'toggle',\n commands: [\n {\n commandName: 'toggleCine',\n commandOptions: {},\n toolName: 'cine',\n context: 'CORNERSTONE',\n },\n ],\n });\n };\n\n const cineHandler = () => {\n if (!cines || !cines[viewportId] || !enabledVPElement) {\n return;\n }\n\n const cine = cines[viewportId];\n const isPlaying = cine.isPlaying || false;\n const frameRate = cine.frameRate || 24;\n\n const validFrameRate = Math.max(frameRate, 1);\n\n if (isPlaying) {\n cineService.playClip(enabledVPElement, {\n framesPerSecond: validFrameRate,\n });\n } else {\n cineService.stopClip(enabledVPElement);\n }\n };\n\n useEffect(() => {\n eventTarget.addEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);\n\n return () => {\n cineService.setCine({ id: viewportId, isPlaying: false });\n eventTarget.removeEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);\n };\n }, [enabledVPElement]);\n\n useEffect(() => {\n if (!cines || !cines[viewportId] || !enabledVPElement) {\n return;\n }\n\n cineHandler();\n\n return () => {\n if (enabledVPElement && cines?.[viewportId]?.isPlaying) {\n cineService.stopClip(enabledVPElement);\n }\n };\n }, [cines, viewportId, cineService, enabledVPElement, cineHandler]);\n\n const cine = cines[viewportId];\n const isPlaying = (cine && cine.isPlaying) || false;\n\n return (\n isCineEnabled && (\n \n cineService.setCine({\n id: activeViewportId,\n isPlaying,\n })\n }\n onFrameRateChange={frameRate =>\n cineService.setCine({\n id: activeViewportId,\n frameRate,\n })\n }\n />\n )\n );\n}\n\nexport default WrappedCinePlayer;\n","import CinePlayer from './CinePlayer';\n\nexport default CinePlayer;\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport ReactResizeDetector from 'react-resize-detector';\nimport PropTypes from 'prop-types';\nimport * as cs3DTools from '@cornerstonejs/tools';\nimport {\n Enums,\n eventTarget,\n getEnabledElement,\n StackViewport,\n utilities as csUtils,\n} from '@cornerstonejs/core';\nimport { MeasurementService } from '@ohif/core';\nimport { Notification, useViewportDialog } from '@ohif/ui';\nimport { IStackViewport, IVolumeViewport } from '@cornerstonejs/core/dist/esm/types';\n\nimport { setEnabledElement } from '../state';\n\nimport './OHIFCornerstoneViewport.css';\nimport CornerstoneOverlays from './Overlays/CornerstoneOverlays';\nimport getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';\nimport CornerstoneServices from '../types/CornerstoneServices';\nimport CinePlayer from '../components/CinePlayer';\nimport { Types } from '@ohif/core';\n\nconst STACK = 'stack';\n\n/**\n * Caches the jump to measurement operation, so that if display set is shown,\n * it can jump to the measurement.\n */\nlet cacheJumpToMeasurementEvent;\n\nfunction areEqual(prevProps, nextProps) {\n if (nextProps.needsRerendering) {\n return false;\n }\n\n if (prevProps.displaySets.length !== nextProps.displaySets.length) {\n return false;\n }\n\n if (prevProps.viewportOptions.orientation !== nextProps.viewportOptions.orientation) {\n return false;\n }\n\n if (prevProps.viewportOptions.toolGroupId !== nextProps.viewportOptions.toolGroupId) {\n return false;\n }\n\n if (prevProps.viewportOptions.viewportType !== nextProps.viewportOptions.viewportType) {\n return false;\n }\n\n if (nextProps.viewportOptions.needsRerendering) {\n return false;\n }\n\n const prevDisplaySets = prevProps.displaySets;\n const nextDisplaySets = nextProps.displaySets;\n\n if (prevDisplaySets.length !== nextDisplaySets.length) {\n return false;\n }\n\n for (let i = 0; i < prevDisplaySets.length; i++) {\n const prevDisplaySet = prevDisplaySets[i];\n\n const foundDisplaySet = nextDisplaySets.find(\n nextDisplaySet =>\n nextDisplaySet.displaySetInstanceUID === prevDisplaySet.displaySetInstanceUID\n );\n\n if (!foundDisplaySet) {\n return false;\n }\n\n // check they contain the same image\n if (foundDisplaySet.images?.length !== prevDisplaySet.images?.length) {\n return false;\n }\n\n // check if their imageIds are the same\n if (foundDisplaySet.images?.length) {\n for (let j = 0; j < foundDisplaySet.images.length; j++) {\n if (foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\n// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport\n// Then we don't need to worry about the re-renders if the props change.\nconst OHIFCornerstoneViewport = React.memo(props => {\n const {\n displaySets,\n dataSource,\n viewportOptions,\n displaySetOptions,\n servicesManager,\n commandsManager,\n onElementEnabled,\n onElementDisabled,\n isJumpToMeasurementDisabled,\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\n // to set the initial state of the viewport's first image to render\n initialImageIndex,\n } = props;\n\n const viewportId = viewportOptions.viewportId;\n const [scrollbarHeight, setScrollbarHeight] = useState('100px');\n const [enabledVPElement, setEnabledVPElement] = useState(null);\n const elementRef = useRef();\n\n const {\n measurementService,\n displaySetService,\n toolbarService,\n toolGroupService,\n syncGroupService,\n cornerstoneViewportService,\n cornerstoneCacheService,\n viewportGridService,\n stateSyncService,\n } = servicesManager.services as CornerstoneServices;\n\n const [viewportDialogState] = useViewportDialog();\n // useCallback for scroll bar height calculation\n const setImageScrollBarHeight = useCallback(() => {\n const scrollbarHeight = `${elementRef.current.clientHeight - 20}px`;\n setScrollbarHeight(scrollbarHeight);\n }, [elementRef]);\n\n // useCallback for onResize\n const onResize = useCallback(() => {\n if (elementRef.current) {\n cornerstoneViewportService.resize();\n setImageScrollBarHeight();\n }\n }, [elementRef]);\n\n const cleanUpServices = useCallback(\n viewportInfo => {\n const renderingEngineId = viewportInfo.getRenderingEngineId();\n const syncGroups = viewportInfo.getSyncGroups();\n\n toolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId);\n\n syncGroupService.removeViewportFromSyncGroup(viewportId, renderingEngineId, syncGroups);\n },\n [viewportId]\n );\n\n const elementEnabledHandler = useCallback(\n evt => {\n // check this is this element reference and return early if doesn't match\n if (evt.detail.element !== elementRef.current) {\n return;\n }\n\n const { viewportId, element } = evt.detail;\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\n setEnabledElement(viewportId, element);\n setEnabledVPElement(element);\n\n const renderingEngineId = viewportInfo.getRenderingEngineId();\n const toolGroupId = viewportInfo.getToolGroupId();\n const syncGroups = viewportInfo.getSyncGroups();\n\n toolGroupService.addViewportToToolGroup(viewportId, renderingEngineId, toolGroupId);\n\n syncGroupService.addViewportToSyncGroup(viewportId, renderingEngineId, syncGroups);\n\n if (onElementEnabled) {\n onElementEnabled(evt);\n }\n },\n [viewportId, onElementEnabled, toolGroupService]\n );\n\n // disable the element upon unmounting\n useEffect(() => {\n cornerstoneViewportService.enableViewport(viewportId, elementRef.current);\n\n eventTarget.addEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);\n\n setImageScrollBarHeight();\n\n return () => {\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\n\n if (!viewportInfo) {\n return;\n }\n\n cleanUpServices(viewportInfo);\n cornerstoneViewportService.storePresentation({ viewportId });\n\n if (onElementDisabled) {\n onElementDisabled(viewportInfo);\n }\n\n eventTarget.removeEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);\n };\n }, []);\n\n // subscribe to displaySet metadata invalidation (updates)\n // Currently, if the metadata changes we need to re-render the display set\n // for it to take effect in the viewport. As we deal with scaling in the loading,\n // we need to remove the old volume from the cache, and let the\n // viewport to re-add it which will use the new metadata. Otherwise, the\n // viewport will use the cached volume and the new metadata will not be used.\n // Note: this approach does not actually end of sending network requests\n // and it uses the network cache\n useEffect(() => {\n const { unsubscribe } = displaySetService.subscribe(\n displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,\n async ({\n displaySetInstanceUID: invalidatedDisplaySetInstanceUID,\n invalidateData,\n }: Types.DisplaySetSeriesMetadataInvalidatedEvent) => {\n if (!invalidateData) {\n return;\n }\n\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\n\n if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) {\n const viewportData = viewportInfo.getViewportData();\n const newViewportData = await cornerstoneCacheService.invalidateViewportData(\n viewportData,\n invalidatedDisplaySetInstanceUID,\n dataSource,\n displaySetService\n );\n\n const keepCamera = true;\n cornerstoneViewportService.updateViewport(viewportId, newViewportData, keepCamera);\n }\n }\n );\n return () => {\n unsubscribe();\n };\n }, [viewportId]);\n\n useEffect(() => {\n // handle the default viewportType to be stack\n if (!viewportOptions.viewportType) {\n viewportOptions.viewportType = STACK;\n }\n\n const loadViewportData = async () => {\n const viewportData = await cornerstoneCacheService.createViewportData(\n displaySets,\n viewportOptions,\n dataSource,\n initialImageIndex\n );\n\n // The presentation state will have been stored previously by closing\n // a viewport. Otherwise, this viewport will be unchanged and the\n // presentation information will be directly carried over.\n const { lutPresentationStore, positionPresentationStore } = stateSyncService.getState();\n const { presentationIds } = viewportOptions;\n const presentations = {\n positionPresentation: positionPresentationStore[presentationIds?.positionPresentationId],\n lutPresentation: lutPresentationStore[presentationIds?.lutPresentationId],\n };\n let measurement;\n if (cacheJumpToMeasurementEvent?.viewportId === viewportId) {\n measurement = cacheJumpToMeasurementEvent.measurement;\n // Delete the position presentation so that viewport navigates direct\n presentations.positionPresentation = null;\n cacheJumpToMeasurementEvent = null;\n }\n\n // Note: This is a hack to get the grid to re-render the OHIFCornerstoneViewport component\n // Used for segmentation hydration right now, since the logic to decide whether\n // a viewport needs to render a segmentation lives inside the CornerstoneViewportService\n // so we need to re-render (force update via change of the needsRerendering) so that React\n // does the diffing and decides we should render this again (although the id and element has not changed)\n // so that the CornerstoneViewportService can decide whether to render the segmentation or not. Not that we reached here we can turn it off.\n if (viewportOptions.needsRerendering) {\n viewportOptions.needsRerendering = false;\n }\n\n cornerstoneViewportService.setViewportData(\n viewportId,\n viewportData,\n viewportOptions,\n displaySetOptions,\n presentations\n );\n if (measurement) {\n cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);\n }\n };\n\n loadViewportData();\n }, [viewportOptions, displaySets, dataSource]);\n\n /**\n * There are two scenarios for jump to click\n * 1. Current viewports contain the displaySet that the annotation was drawn on\n * 2. Current viewports don't contain the displaySet that the annotation was drawn on\n * and we need to change the viewports displaySet for jumping.\n * Since measurement_jump happens via events and listeners, the former case is handled\n * by the measurement_jump direct callback, but the latter case is handled first by\n * the viewportGrid to set the correct displaySet on the viewport, AND THEN we check\n * the cache for jumping to see if there is any jump queued, then we jump to the correct slice.\n */\n useEffect(() => {\n if (isJumpToMeasurementDisabled) {\n return;\n }\n\n const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(\n measurementService,\n displaySetService,\n elementRef,\n viewportId,\n displaySets,\n viewportGridService,\n cornerstoneViewportService\n );\n\n _checkForCachedJumpToMeasurementEvents(\n measurementService,\n displaySetService,\n elementRef,\n viewportId,\n displaySets,\n viewportGridService,\n cornerstoneViewportService\n );\n\n return () => {\n unsubscribeFromJumpToMeasurementEvents();\n };\n }, [displaySets, elementRef, viewportId]);\n\n return (\n \n
\n \n e.preventDefault()}\n onMouseDown={e => e.preventDefault()}\n ref={elementRef}\n >
\n \n \n \n
\n {viewportDialogState.viewportId === viewportId && (\n \n )}\n
\n
\n );\n}, areEqual);\n\nfunction _subscribeToJumpToMeasurementEvents(\n measurementService,\n displaySetService,\n elementRef,\n viewportId,\n displaySets,\n viewportGridService,\n cornerstoneViewportService\n) {\n const { unsubscribe } = measurementService.subscribe(\n MeasurementService.EVENTS.JUMP_TO_MEASUREMENT_VIEWPORT,\n props => {\n cacheJumpToMeasurementEvent = props;\n const { viewportId: jumpId, measurement, isConsumed } = props;\n if (!measurement || isConsumed) {\n return;\n }\n if (cacheJumpToMeasurementEvent.cornerstoneViewport === undefined) {\n // Decide on which viewport should handle this\n cacheJumpToMeasurementEvent.cornerstoneViewport =\n cornerstoneViewportService.getViewportIdToJump(\n jumpId,\n measurement.displaySetInstanceUID,\n { referencedImageId: measurement.referencedImageId }\n );\n }\n if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportId) {\n return;\n }\n _jumpToMeasurement(\n measurement,\n elementRef,\n viewportId,\n measurementService,\n displaySetService,\n viewportGridService,\n cornerstoneViewportService\n );\n }\n );\n\n return unsubscribe;\n}\n\n// Check if there is a queued jumpToMeasurement event\nfunction _checkForCachedJumpToMeasurementEvents(\n measurementService,\n displaySetService,\n elementRef,\n viewportId,\n displaySets,\n viewportGridService,\n cornerstoneViewportService\n) {\n if (!cacheJumpToMeasurementEvent) {\n return;\n }\n if (cacheJumpToMeasurementEvent.isConsumed) {\n cacheJumpToMeasurementEvent = null;\n return;\n }\n const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID);\n if (!displaysUIDs?.length) {\n return;\n }\n\n // Jump to measurement if the measurement exists\n const { measurement } = cacheJumpToMeasurementEvent;\n if (measurement && elementRef) {\n if (displaysUIDs.includes(measurement?.displaySetInstanceUID)) {\n _jumpToMeasurement(\n measurement,\n elementRef,\n viewportId,\n measurementService,\n displaySetService,\n viewportGridService,\n cornerstoneViewportService\n );\n }\n }\n}\n\nfunction _jumpToMeasurement(\n measurement,\n targetElementRef,\n viewportId,\n measurementService,\n displaySetService,\n viewportGridService,\n cornerstoneViewportService\n) {\n const targetElement = targetElementRef.current;\n const { displaySetInstanceUID, SOPInstanceUID, frameNumber } = measurement;\n\n if (!SOPInstanceUID) {\n console.warn('cannot jump in a non-acquisition plane measurements yet');\n return;\n }\n\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\n\n // Todo: setCornerstoneMeasurementActive should be handled by the toolGroupManager\n // to set it properly\n // setCornerstoneMeasurementActive(measurement);\n\n viewportGridService.setActiveViewportId(viewportId);\n\n const enabledElement = getEnabledElement(targetElement);\n\n if (enabledElement) {\n // See how the jumpToSlice() of Cornerstone3D deals with imageIdx param.\n const viewport = enabledElement.viewport as IStackViewport | IVolumeViewport;\n\n let imageIdIndex = 0;\n let viewportCameraDirectionMatch = true;\n\n if (viewport instanceof StackViewport) {\n const imageIds = viewport.getImageIds();\n imageIdIndex = imageIds.findIndex(imageId => {\n const { SOPInstanceUID: aSOPInstanceUID, frameNumber: aFrameNumber } =\n getSOPInstanceAttributes(imageId);\n return aSOPInstanceUID === SOPInstanceUID && (!frameNumber || frameNumber === aFrameNumber);\n });\n } else {\n // for volume viewport we can't rely on the imageIdIndex since it can be\n // a reconstructed view that doesn't match the original slice numbers etc.\n const { viewPlaneNormal: measurementViewPlane } = measurement.metadata;\n imageIdIndex = referencedDisplaySet.images.findIndex(\n i => i.SOPInstanceUID === SOPInstanceUID\n );\n\n const { viewPlaneNormal: viewportViewPlane } = viewport.getCamera();\n\n // should compare abs for both planes since the direction can be flipped\n if (\n measurementViewPlane &&\n !csUtils.isEqual(measurementViewPlane.map(Math.abs), viewportViewPlane.map(Math.abs))\n ) {\n viewportCameraDirectionMatch = false;\n }\n }\n\n if (!viewportCameraDirectionMatch || imageIdIndex === -1) {\n return;\n }\n\n cs3DTools.utilities.jumpToSlice(targetElement, {\n imageIndex: imageIdIndex,\n });\n\n cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);\n // Jump to measurement consumed, remove.\n cacheJumpToMeasurementEvent?.consume?.();\n cacheJumpToMeasurementEvent = null;\n }\n}\n\n// Component displayName\nOHIFCornerstoneViewport.displayName = 'OHIFCornerstoneViewport';\n\nOHIFCornerstoneViewport.defaultProps = {\n isJumpToMeasurementDisabled: false,\n};\n\nOHIFCornerstoneViewport.propTypes = {\n displaySets: PropTypes.array.isRequired,\n dataSource: PropTypes.object.isRequired,\n viewportOptions: PropTypes.object,\n displaySetOptions: PropTypes.arrayOf(PropTypes.any),\n servicesManager: PropTypes.object.isRequired,\n onElementEnabled: PropTypes.func,\n isJumpToMeasurementDisabled: PropTypes.bool,\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\n // to set the initial state of the viewport's first image to render\n initialImageIdOrIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default OHIFCornerstoneViewport;\n"],"names":["CornerstoneImageScrollbar","_ref","viewportData","viewportId","element","imageSliceData","setImageSliceData","scrollbarHeight","servicesManager","cineService","cornerstoneViewportService","services","useEffect","viewport","getCornerstoneViewport","viewportType","Enums","STACK","ORTHOGRAPHIC","sliceData","utilities","imageIndex","numberOfSlices","getCurrentImageIdIndex","data","imageIds","length","updateStackIndex","event","newImageIdIndex","detail","addEventListener","STACK_VIEWPORT_SCROLL","removeEventListener","updateVolumeIndex","VOLUME_NEW_IMAGE","React","ImageScrollbar","onChange","evt","onImageScrollbarChange","isCineEnabled","getState","stopClip","setCine","id","isPlaying","csToolsUtils","debounceLoading","max","height","value","propTypes","PropTypes","isRequired","Element","formatNumberPrecision","number","precision","arguments","undefined","parseFloat","toFixed","formatDICOMDate","date","strFormat","moment","format","formatDICOMTime","time","formatPN","name","cleaned","split","filter","s","join","trim","EPSILON","VOIOverlayItem","voi","customization","windowWidth","windowCenter","className","style","color","ZoomOverlayItem","_ref2","scale","InstanceNumberOverlayItem","_ref3","instanceNumber","CustomizableViewportOverlay","_ref4","toolbarService","customizationService","setVOI","useState","setScale","activeTools","setActiveTools","topLeftCustomization","getModeCustomization","topRightCustomization","bottomLeftCustomization","bottomRightCustomization","instance","useMemo","imageId","volumes","metaData","_getViewportInstance","generalImageModule","parseInt","_getInstanceNumberFromStack","_getInstanceNumberFromVolume","_getInstanceNumber","getActiveTools","updateVOI","eventDetail","range","lower","upper","VOI_MODIFIED","updateScale","previousCamera","camera","parallelScale","imageData","getImageData","spacing","clientHeight","CAMERA_MODIFIED","unsubscribe","subscribe","EVENTS","TOOL_BAR_STATE_MODIFIED","_renderOverlayItem","useCallback","item","overlayItemProps","formatters","formatDate","formatTime","customizationType","renderItem","transform","content","getTopLeftContent","items","map","i","key","getTopRightContent","getBottomLeftContent","getBottomRightContent","ViewportOverlay","topLeft","topRight","bottomLeft","bottomRight","volume","direction","cornerstoneViewport","getCamera","viewPlaneNormal","scanAxisNormal","slice","cross","vec3","getOrientationStringLPS","invertOrientationStringLPS","ViewportOrientationMarkers","orientationMarkers","rotation","setRotation","flipHorizontal","setFlipHorizontal","flipVertical","setFlipVertical","cameraModifiedListener","markers","rowCosines","columnCosines","getEnabledElement","viewUp","viewRight","rowString","columnString","oppositeRowString","top","left","right","bottom","_getOrientationMarkers","ohifViewport","getViewportInfo","console","log","backgroundColor","getViewportOptions","background","isLight","csUtils","m","index","classNames","percentComplete","error","defaultProps","ViewportImageSliceLoadingIndicator","loading","setLoading","setError","loadIndicatorRef","useRef","imageIdToBeLoaded","setLoadingState","clearTimeout","current","setTimeout","setFinishLoadingState","setErrorState","IMAGE_LOAD_ERROR","STACK_NEW_IMAGE","props","setViewportData","VIEWPORT_DATA_CHANGED","viewportInfo","viewportOptions","customViewportProps","hideOverlays","ViewportImageScrollbar","enabledVPElement","cines","useCine","activeViewportId","useViewportGrid","component","CinePlayerComponent","CinePlayer","get","cineHandler","cine","frameRate","validFrameRate","Math","playClip","framesPerSecond","eventTarget","STACK_VIEWPORT_NEW_STACK","onClose","handleCineClose","recordInteraction","groupId","interactionType","commands","commandName","commandOptions","toolName","context","onPlayPauseChange","onFrameRateChange","cacheJumpToMeasurementEvent","areEqual","prevProps","nextProps","needsRerendering","displaySets","orientation","toolGroupId","prevDisplaySets","nextDisplaySets","prevDisplaySet","foundDisplaySet","find","nextDisplaySet","displaySetInstanceUID","images","j","OHIFCornerstoneViewport","dataSource","displaySetOptions","commandsManager","onElementEnabled","onElementDisabled","isJumpToMeasurementDisabled","initialImageIndex","setScrollbarHeight","setEnabledVPElement","elementRef","measurementService","displaySetService","toolGroupService","syncGroupService","cornerstoneCacheService","viewportGridService","stateSyncService","viewportDialogState","useViewportDialog","setImageScrollBarHeight","onResize","resize","cleanUpServices","renderingEngineId","getRenderingEngineId","syncGroups","getSyncGroups","removeViewportFromToolGroup","removeViewportFromSyncGroup","elementEnabledHandler","setEnabledElement","getToolGroupId","addViewportToToolGroup","addViewportToSyncGroup","enableViewport","ELEMENT_ENABLED","storePresentation","DISPLAY_SET_SERIES_METADATA_INVALIDATED","async","invalidatedDisplaySetInstanceUID","invalidateData","hasDisplaySet","getViewportData","newViewportData","invalidateViewportData","keepCamera","updateViewport","createViewportData","lutPresentationStore","positionPresentationStore","presentationIds","presentations","positionPresentation","positionPresentationId","lutPresentation","lutPresentationId","measurement","cs3DTools","uid","loadViewportData","unsubscribeFromJumpToMeasurementEvents","MeasurementService","JUMP_TO_MEASUREMENT_VIEWPORT","jumpId","isConsumed","getViewportIdToJump","referencedImageId","_jumpToMeasurement","_subscribeToJumpToMeasurementEvents","displaysUIDs","displaySet","includes","_checkForCachedJumpToMeasurementEvents","ReactResizeDetector","refreshMode","refreshRate","targetRef","width","onContextMenu","e","preventDefault","onMouseDown","ref","CornerstoneOverlays","toolBarService","Notification","message","type","actions","onSubmit","onOutsideClick","targetElementRef","targetElement","SOPInstanceUID","frameNumber","warn","referencedDisplaySet","getDisplaySetByUID","setActiveViewportId","enabledElement","imageIdIndex","viewportCameraDirectionMatch","StackViewport","getImageIds","findIndex","aSOPInstanceUID","aFrameNumber","getSOPInstanceAttributes","measurementViewPlane","metadata","viewportViewPlane","abs","consume","displayName","initialImageIdOrIndex"],"sourceRoot":""}