diff --git a/extensions/autometrics/README.md b/extensions/autometrics/README.md new file mode 100644 index 00000000000..bf1acb1474e --- /dev/null +++ b/extensions/autometrics/README.md @@ -0,0 +1,66 @@ +# Autometrics Extension + +This extension adds an "Autometrics" panel to the OHIF viewer with a group of buttons for automated measurement tools. + +## Features + +The Autometrics panel includes the following button groups: + +### Angular Measurements +- **M1M2** - Automated M1M2 measurements +- **TMT-DOR** - Automated TMT-DOR measurements +- **TMT-LAT** - Automated TMT-LAT measurements +- **CP** - Automated CP measurements +- **HA** - Automated HA measurements + +### Foot Ankle Offset +- **TALAS** - Automated TALAS measurements + +## Installation + +The extension is automatically included in the OHIF viewer configuration and will appear in the right panel of the Basic Viewer mode. + +## Usage + +1. Open the Basic Viewer mode +2. The Autometrics panel will appear in the right sidebar +3. Click on any of the measurement buttons to trigger automated measurements +4. Currently, the buttons log to the console - you can extend the functionality by modifying the `handleButtonClick` function in `AutometricsPanel.tsx` + +## Customization + +To add custom functionality to the buttons, modify the `handleButtonClick` function in `src/Panels/AutometricsPanel.tsx`: + +```typescript +const handleButtonClick = (buttonName) => { + switch (buttonName) { + case 'M1M2': + // Add M1M2 measurement logic + break; + case 'TMT-DOR': + // Add TMT-DOR measurement logic + break; + case 'TMT-LAT': + // Add TMT-LAT measurement logic + break; + case 'CP': + // Add CP measurement logic + break; + case 'HA': + // Add HA measurement logic + break; + case 'TALAS': + // Add TALAS measurement logic + break; + } +}; +``` + +## Development + +The extension is built using React and follows the OHIF extension pattern. The main components are: + +- `AutometricsPanel.tsx` - The main panel component +- `getPanelModule.tsx` - Panel module registration +- `index.ts` - Extension entry point +- `Icons/FootIcon.tsx` - Custom foot skeleton icon for the panel diff --git a/extensions/autometrics/package.json b/extensions/autometrics/package.json new file mode 100644 index 00000000000..7afde8d3a1a --- /dev/null +++ b/extensions/autometrics/package.json @@ -0,0 +1,16 @@ +{ + "name": "@ohif/extension-autometrics", + "version": "3.0.0", + "description": "Autometrics panel extension for OHIF", + "main": "src/index.ts", + "scripts": { + "build": "echo 'No build step required'", + "test": "echo 'No tests specified'" + }, + "dependencies": { + "@ohif/ui-next": "^3.0.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } +} diff --git a/extensions/autometrics/src/Components/CoordinateGroup.tsx b/extensions/autometrics/src/Components/CoordinateGroup.tsx new file mode 100644 index 00000000000..1a6bede306b --- /dev/null +++ b/extensions/autometrics/src/Components/CoordinateGroup.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { Button } from '@ohif/ui-next'; + +interface CoordinateGroupProps { + title: string; + groupKey: string; + coordinates: { x: string; y: string; z: string }; + isSelected: boolean; + onSelect: (groupKey: string) => void; +} + +const CoordinateGroup: React.FC = ({ + title, + groupKey, + coordinates, + isSelected, + onSelect, +}) => { + return ( +
+
{title}
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ ); +}; + +export default CoordinateGroup; + diff --git a/extensions/autometrics/src/Components/LogoSection.tsx b/extensions/autometrics/src/Components/LogoSection.tsx new file mode 100644 index 00000000000..d6a8f46296e --- /dev/null +++ b/extensions/autometrics/src/Components/LogoSection.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +const LogoSection: React.FC = () => { + return ( +
+
+ {/* CurveBeam Logo */} +
+ CurveBeam Logo +
+ + {/* Autometrics Logo */} +
+ Autometrics +
+
+
+ ); +}; + +export default LogoSection; diff --git a/extensions/autometrics/src/Components/PopupModal.tsx b/extensions/autometrics/src/Components/PopupModal.tsx new file mode 100644 index 00000000000..ae7a910c26b --- /dev/null +++ b/extensions/autometrics/src/Components/PopupModal.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +interface PopupModalProps { + isVisible: boolean; + onClose: () => void; + imageSrc: string; + imageAlt: string; +} + +const PopupModal: React.FC = ({ isVisible, onClose, imageSrc, imageAlt }) => { + if (!isVisible) return null; + + return ( +
+
+ {/* Close Button */} + + + {/* Image */} + {imageAlt} console.log('Image loaded successfully')} + onError={e => console.error('Image failed to load:', e)} + /> +
+
+ ); +}; + +export default PopupModal; + diff --git a/extensions/autometrics/src/Components/SidePanelWithServices.tsx b/extensions/autometrics/src/Components/SidePanelWithServices.tsx new file mode 100644 index 00000000000..298f5ae03b9 --- /dev/null +++ b/extensions/autometrics/src/Components/SidePanelWithServices.tsx @@ -0,0 +1,116 @@ +import React, { useEffect, useState, useCallback } from 'react'; +import { SidePanel } from '@ohif/ui-next'; +import { Types } from '@ohif/core'; + +export type SidePanelWithServicesProps = { + servicesManager: AppTypes.ServicesManager; + side: 'left' | 'right'; + className?: string; + activeTabIndex: number; + tabs?: any; + expandedWidth?: number; + onClose: () => void; + onOpen: () => void; + isExpanded: boolean; + collapsedWidth?: number; + expandedInsideBorderSize?: number; + collapsedInsideBorderSize?: number; + collapsedOutsideBorderSize?: number; +}; + +const SidePanelWithServices = ({ + servicesManager, + side, + activeTabIndex: activeTabIndexProp, + isExpanded, + tabs: tabsProp, + onOpen, + onClose, + ...props +}: SidePanelWithServicesProps) => { + const panelService = servicesManager?.services?.panelService; + + // Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM. + // Thus going to the Study List page and back to the viewer resets this flag for a SidePanel. + const [sidePanelExpanded, setSidePanelExpanded] = useState(isExpanded); + const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp ?? 0); + const [closedManually, setClosedManually] = useState(false); + const [tabs, setTabs] = useState(tabsProp ?? panelService.getPanels(side)); + + const handleActiveTabIndexChange = useCallback(({ activeTabIndex }) => { + setActiveTabIndex(activeTabIndex); + }, []); + + const handleOpen = useCallback(() => { + setSidePanelExpanded(true); + onOpen?.(); + }, [onOpen]); + + const handleClose = useCallback(() => { + setSidePanelExpanded(false); + setClosedManually(true); + onClose?.(); + }, [onClose]); + + useEffect(() => { + setSidePanelExpanded(isExpanded); + }, [isExpanded]); + + /** update the active tab index from outside */ + useEffect(() => { + setActiveTabIndex(activeTabIndexProp ?? 0); + }, [activeTabIndexProp]); + + useEffect(() => { + const { unsubscribe } = panelService.subscribe( + panelService.EVENTS.PANELS_CHANGED, + panelChangedEvent => { + if (panelChangedEvent.position !== side) { + return; + } + + setTabs(panelService.getPanels(side)); + } + ); + + return () => { + unsubscribe(); + }; + }, [panelService, side]); + + useEffect(() => { + const activatePanelSubscription = panelService.subscribe( + panelService.EVENTS.ACTIVATE_PANEL, + (activatePanelEvent: Types.ActivatePanelEvent) => { + if (sidePanelExpanded || activatePanelEvent.forceActive) { + const tabIndex = tabs.findIndex(tab => tab.id === activatePanelEvent.panelId); + if (tabIndex !== -1) { + if (!closedManually) { + setSidePanelExpanded(true); + } + setActiveTabIndex(tabIndex); + } + } + } + ); + + return () => { + activatePanelSubscription.unsubscribe(); + }; + }, [tabs, sidePanelExpanded, panelService, closedManually]); + + return ( + + ); +}; + +export default SidePanelWithServices; diff --git a/extensions/autometrics/src/Components/TalasHeader.tsx b/extensions/autometrics/src/Components/TalasHeader.tsx new file mode 100644 index 00000000000..bc79a923642 --- /dev/null +++ b/extensions/autometrics/src/Components/TalasHeader.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Button } from '@ohif/ui-next'; + +interface TalasHeaderProps { + onBack: () => void; +} + +const TalasHeader: React.FC = ({ onBack }) => { + return ( +
+ +
TALAS
+
+ ); +}; + +export default TalasHeader; + diff --git a/extensions/autometrics/src/Icons/FootIcon.tsx b/extensions/autometrics/src/Icons/FootIcon.tsx new file mode 100644 index 00000000000..3033292cf3f --- /dev/null +++ b/extensions/autometrics/src/Icons/FootIcon.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +interface IconProps { + className?: string; + width?: number; + height?: number; + color?: string; +} + +const FootIcon: React.FC = ({ + className = '', + width = 24, + height = 24, + color = 'currentColor', +}) => { + return ( + + {/* Solid black rectangle */} + + + ); +}; + +export default FootIcon; diff --git a/extensions/autometrics/src/Icons/index.ts b/extensions/autometrics/src/Icons/index.ts new file mode 100644 index 00000000000..2329da058c6 --- /dev/null +++ b/extensions/autometrics/src/Icons/index.ts @@ -0,0 +1,7 @@ +import FootIcon from './FootIcon'; +import { Icons } from '@ohif/ui-next'; + +// Register the custom foot icon +Icons.addIcon('tab-autometrics', FootIcon); + +export { FootIcon }; diff --git a/extensions/autometrics/src/Panels/AutometricsPanel.tsx b/extensions/autometrics/src/Panels/AutometricsPanel.tsx new file mode 100644 index 00000000000..1a780c07c98 --- /dev/null +++ b/extensions/autometrics/src/Panels/AutometricsPanel.tsx @@ -0,0 +1,56 @@ +import React, { useState, useEffect } from 'react'; +import { Button } from '@ohif/ui-next'; +import Talas from './Talas'; +import Main from './Main'; + +const AutometricsPanel = ({ commandsManager, servicesManager }) => { + const [currentView, setCurrentView] = useState('autometrics'); // 'autometrics' or 'talas' + + // Handle ESC key to exit select mode + const handleButtonClick = buttonName => { + console.log(`${buttonName} button clicked`); + + if (buttonName === 'TALAS') { + setCurrentView('talas'); + commandsManager.run({ + commandName: 'setHangingProtocol', + commandOptions: { + protocolId: 'mpr', + }, + }); + + // Enable crosshairs + commandsManager.run({ + commandName: 'setToolActive', + commandOptions: { + toolName: 'Crosshairs', + toolGroupId: 'mpr', + }, + }); + } else { + commandsManager.run({ + commandName: 'setToolActive', + commandOptions: { + toolName: 'Pan', + toolGroupId: 'default', + }, + }); + document.body.style.cursor = 'default'; + } + }; + + // TALAS view + if (currentView && currentView === 'talas') { + return ( + + ); + } + + // Default Autometrics view + return
; +}; + +export default AutometricsPanel; diff --git a/extensions/autometrics/src/Panels/Main.tsx b/extensions/autometrics/src/Panels/Main.tsx new file mode 100644 index 00000000000..ba03303c53e --- /dev/null +++ b/extensions/autometrics/src/Panels/Main.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { Button } from '@ohif/ui-next'; +import LogoSection from '../Components/LogoSection'; + +const Main = ({ handleButtonClick }) => { + return ( +
+

Autometrics Panel

+

+ Select the measurement you would like to modify: +

+

Welcome to the Autometrics extension. Select a measurement group below:

+ + {/* Angular Measurements Group */} +
+

+ Angular Measurements +

+
+ + + + + + + +
+
+ + {/* Foot Ankle OffSet Group */} +
+

+ Foot Ankle OffSet +

+
+ +
+
+ + +
+ ); +}; + +export default Main; diff --git a/extensions/autometrics/src/Panels/Talas.tsx b/extensions/autometrics/src/Panels/Talas.tsx new file mode 100644 index 00000000000..43ab3ed763b --- /dev/null +++ b/extensions/autometrics/src/Panels/Talas.tsx @@ -0,0 +1,898 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { Button } from '@ohif/ui-next'; +import { getEnabledElement, getEnabledElements } from '@cornerstonejs/core'; +import { annotation } from '@cornerstonejs/tools'; +import LogoSection from '../Components/LogoSection'; + +function Talas({ setCurrentView, commandsManager }) { + const [selectedGroup, setSelectedGroup] = useState(''); + const [showPopup, setShowPopup] = useState(false); + const [coordinates, setCoordinates] = useState({ + M1: { x: '', y: '', z: '' }, + M5: { x: '', y: '', z: '' }, + C: { x: '', y: '', z: '' }, + T: { x: '', y: '', z: '' }, + }); + const selectedGroupRef = useRef(''); + const eventListenerRef = useRef<{ + handleRightClick: (event: MouseEvent) => void; + handleMouseDown: (event: MouseEvent) => void; + isProcessing: boolean; + } | null>(null); + const annotationsRef = useRef< + Map< + string, + { element: HTMLElement; worldCoords: number[]; sliceIndex: number; viewportId: string } + > + >(new Map()); + const viewportAnnotationsRef = useRef< + Map> + >(new Map()); + + const handleBack = () => { + setCurrentView('autometrics'); + setSelectedGroup(''); // Reset selected group + selectedGroupRef.current = ''; + + // Return to original viewport layout + commandsManager.run({ + commandName: 'setHangingProtocol', + commandOptions: { + protocolId: 'default', + }, + }); + + // Remove event listeners + removeClickListener(); + }; + + const handleSubmit = () => { + // Handle form submission + console.log('Coordinates submitted:', coordinates); + console.log('Setting showPopup to true'); + setShowPopup(true); + }; + + const handleSelect = groupName => { + console.log(`Select button clicked for ${groupName}`); + setSelectedGroup(groupName); + selectedGroupRef.current = groupName; + + // Change cursor to crosshair + document.body.style.cursor = 'crosshair'; + + // Add click listener for coordinate capture + addClickListener(); + }; + + // Function to remove click listeners + const removeClickListener = () => { + if (eventListenerRef.current) { + const viewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + viewportElements.forEach(element => { + element.removeEventListener('contextmenu', eventListenerRef.current.handleRightClick, true); + element.removeEventListener('mousedown', eventListenerRef.current.handleMouseDown, true); + }); + eventListenerRef.current = null; + } + document.body.style.cursor = 'default'; + }; + + // Function to add click listener for coordinate capture + const addClickListener = () => { + // Always clear any previous listeners before adding + removeClickListener(); + + const viewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + if (!viewportElements || viewportElements.length === 0) { + console.warn('No cornerstone viewport elements found'); + return; + } + + console.log(`Found ${viewportElements.length} viewport elements`); + + const handleRightClick = (event: MouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + + // Capture the ref at the beginning to avoid null access issues + const listenerRef = eventListenerRef.current; + if (!listenerRef || listenerRef.isProcessing) return; + + // Set processing flag + listenerRef.isProcessing = true; + + console.log('Right click detected'); + + const viewportElement = event.currentTarget as HTMLDivElement; + const rect = viewportElement.getBoundingClientRect(); + + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) { + listenerRef.isProcessing = false; + return; + } + + const viewport = enabledElement.viewport; + const pixelX = event.clientX - rect.left; + const pixelY = event.clientY - rect.top; + const normalizedX = pixelX / rect.width; + const normalizedY = pixelY / rect.height; + + const worldCoords = viewport.canvasToWorld([pixelX, pixelY]); + if (!worldCoords || worldCoords.length < 2) { + listenerRef.isProcessing = false; + return; + } + + const validWorldCoords = [ + Number(worldCoords[0]) || 0, + Number(worldCoords[1]) || 0, + Number(worldCoords[2]) || 0, + ]; + + const currentGroup = selectedGroupRef.current; + if (!currentGroup) { + // nothing selected → ignore + listenerRef.isProcessing = false; + return; + } + + setCoordinates(prev => ({ + ...prev, + [currentGroup]: { + x: validWorldCoords[0].toFixed(2), + y: validWorldCoords[1].toFixed(2), + z: validWorldCoords[2].toFixed(2), + }, + })); + + console.log(`Coordinates captured for ${currentGroup}:`, { + normalized: [normalizedX, normalizedY, viewport.getSliceIndex()], + pixel: [pixelX, pixelY], + world: validWorldCoords, + }); + + const anatomicalNames = { + M1: '1st Metatarsal', + M5: '5th Metatarsal', + C: 'Calcaneous', + T: 'Talus', + }; + const anatomicalName = anatomicalNames[currentGroup] || currentGroup; + + // Single call; no more timeouts or duplicate paths + createAnnotationsForAllViewports(currentGroup, validWorldCoords, anatomicalName); + + // Update crosshair position across all viewports + try { + const { toolGroupService } = commandsManager.services; + const toolGroupIds = toolGroupService.getToolGroupIds(); + + toolGroupIds.forEach(toolGroupId => { + const toolGroup = toolGroupService.getToolGroup(toolGroupId); + const crosshairTool = toolGroup.getToolInstance('Crosshairs'); + + if (crosshairTool) { + // Try to set the crosshair position using the tool's method + if (crosshairTool.setCrosshairPosition) { + crosshairTool.setCrosshairPosition(validWorldCoords); + } else if (crosshairTool.setPosition) { + crosshairTool.setPosition(validWorldCoords); + } else { + // Fallback: try to update the tool's center + crosshairTool.computeToolCenter(); + } + } + }); + } catch (error) { + console.warn('Could not update crosshair position:', error); + } + + // Reset state and listeners + setSelectedGroup(''); + selectedGroupRef.current = ''; + document.body.style.cursor = 'default'; + + // Clear processing flag BEFORE removing listeners + listenerRef.isProcessing = false; + + // Remove the click listener (this will null the ref) + removeClickListener(); + }; + + const handleMouseDown = (event: MouseEvent) => { + if (event.button === 2) { + event.preventDefault(); + event.stopPropagation(); + } + }; + + // Store single instances to remove later + eventListenerRef.current = { handleRightClick, handleMouseDown, isProcessing: false }; + + // Attach the SAME handler instances to all viewports + viewportElements.forEach((element, index) => { + console.log(`Adding event listeners to viewport ${index}:`, element); + element.addEventListener('contextmenu', handleRightClick, true); + element.addEventListener('mousedown', handleMouseDown, true); + }); + }; + + // Function to draw a circle annotation using CircleROI tool with anatomical name as label + const drawCircleAnnotation = (element, worldCoords, groupName) => { + try { + const enabledElement = getEnabledElement(element); + if (!enabledElement) { + console.warn('No enabled element found for circle annotation'); + return; + } + + // Additional validation for world coordinates + if (!worldCoords || !Array.isArray(worldCoords) || worldCoords.length < 2) { + console.error('Invalid world coordinates in drawCircleAnnotation:', worldCoords); + return; + } + + // Get the anatomical name based on the group + const anatomicalNames = { + M1: '1st Metatarsal', + M5: '5th Metatarsal', + C: 'Calcaneous', + T: 'Talus', + }; + + const anatomicalName = anatomicalNames[groupName] || groupName; + + console.log('Creating annotation for:', anatomicalName); + console.log('World coordinates:', worldCoords); + console.log('Element:', element); + + // Ensure worldCoords is properly formatted with valid numbers + const centerPoint = [ + Number(worldCoords[0]) || 0, + Number(worldCoords[1]) || 0, + Number(worldCoords[2]) || 0, + ]; + + console.log('Center point:', centerPoint); + + // Create a simple div element to show the annotation + const annotationDiv = document.createElement('div'); + annotationDiv.className = 'custom-annotation'; + annotationDiv.style.cssText = ` + position: absolute; + color: #ff0000; + font-size: 14px; + font-weight: bold; + pointer-events: none; + z-index: 1000; + transform: translate(-4px, -4px); + display: flex; + align-items: center; + gap: 4px; + `; + + // Create the red circle element + const circleDiv = document.createElement('div'); + circleDiv.style.cssText = ` + width: 8px; + height: 8px; + border: 2px solid #ff0000; + border-radius: 50%; + background: transparent; + flex-shrink: 0; + `; + + // Create the text element + const textDiv = document.createElement('span'); + textDiv.textContent = groupName; // Use short label (M1, M5, C, T) + textDiv.style.cssText = ` + color: #ff0000; + font-size: 14px; + font-weight: bold; + `; + + // Assemble the annotation + annotationDiv.appendChild(circleDiv); + annotationDiv.appendChild(textDiv); + + // Get the viewport element and calculate position + const viewportElement = element; + const rect = viewportElement.getBoundingClientRect(); + + // Convert world coordinates back to screen coordinates + const screenCoords = enabledElement.viewport.worldToCanvas([ + centerPoint[0], + centerPoint[1], + centerPoint[2] || 0, + ]); + + if (screenCoords && screenCoords.length >= 2) { + // Remove existing annotation for this group if it exists + const existingAnnotation = annotationsRef.current.get(groupName); + if (existingAnnotation) { + existingAnnotation.element.remove(); + annotationsRef.current.delete(groupName); + console.log(`Removed existing annotation for ${groupName}`); + } + + annotationDiv.style.left = `${screenCoords[0]}px`; + annotationDiv.style.top = `${screenCoords[1]}px`; + + // Add the annotation to the viewport + viewportElement.appendChild(annotationDiv); + + // Store the annotation reference and world coordinates for position updates + annotationsRef.current.set(groupName, { + element: annotationDiv, + worldCoords: centerPoint, + sliceIndex: enabledElement.viewport.getSliceIndex(), + viewportId: 'mpr-axial', // Axial viewport ID + }); + + // Create annotations for all viewports (including the clicked one) + createAnnotationsForAllViewports(groupName, centerPoint, anatomicalName); + + console.log( + `Custom annotation created for ${groupName} at screen coordinates:`, + screenCoords + ); + } else { + console.warn('Could not convert world coordinates to screen coordinates'); + } + } catch (annotationError) { + console.error('Error creating custom annotation:', annotationError); + console.log('Falling back to coordinate-only capture'); + + // If all annotation methods fail, just log the coordinates + console.log( + `Coordinate captured for ${groupName} at:`, + worldCoords, + 'with label:', + groupName + ); + } + }; + + // Function to create annotations for all viewports using Cornerstone's annotation system + const createAnnotationsForAllViewports = ( + groupName: string, + worldCoords: number[], + anatomicalName: string + ) => { + try { + // Remove all group annotations globally first + const allViewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + allViewportElements.forEach(viewportElement => { + viewportElement + .querySelectorAll(`[data-annotation-group="${groupName}"]`) + .forEach(el => el.remove()); + }); + + let viewportIds: string[] = []; + if (commandsManager?.services?.viewportGridService) { + viewportIds = commandsManager.services.viewportGridService.getViewportIds(); + } + + if (viewportIds.length > 0) { + viewportIds.forEach(viewportId => { + const viewportElement = document.querySelector( + `[data-viewport-id="${viewportId}"]` + ) as HTMLDivElement; + if (viewportElement) { + createAnnotationInViewportDirect(viewportElement, groupName, worldCoords); + } + }); + return; // prevent fall-through + } + + // Fallback: DOM + const viewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + viewports.forEach(vp => createAnnotationInViewportDirect(vp, groupName, worldCoords)); + } catch (error) { + console.error('Error creating annotations for all viewports:', error); + } + }; + + // Direct method to create annotation in a specific viewport + const createAnnotationInViewportDirect = ( + viewportElement: HTMLDivElement, + groupName: string, + worldCoords: number[] + ) => { + // Remove existing annotation for this group in this viewport if it exists + const existingAnnotation = viewportElement.querySelector( + `[data-annotation-group="${groupName}"]` + ); + if (existingAnnotation) { + existingAnnotation.remove(); + console.log(`Removed existing annotation for ${groupName} in this viewport`); + } + try { + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) { + console.warn('No enabled element found for viewport'); + return; + } + + // Log viewport information for debugging + const viewportId = + viewportElement.getAttribute('data-viewport-id') || + viewportElement.getAttribute('data-viewport-uid') || + viewportElement.getAttribute('data-viewportid') || + viewportElement.id || + 'viewport'; + console.log(`Processing viewport: ${viewportId}`); + console.log(`Viewport element:`, viewportElement); + console.log(`Enabled element:`, enabledElement); + + // Navigate ALL views (axial, sagittal, coronal) to the clicked position + try { + const viewport = enabledElement.viewport; + const point3: [number, number, number] = [ + worldCoords[0], + worldCoords[1], + worldCoords[2] || 0, + ]; + viewport.jumpToWorld(point3); + console.log(`Navigated ${viewportId} to world coordinates:`, point3); + } catch (navError) { + console.warn(`Could not navigate ${viewportId}:`, navError); + } + + // Create a simple div element to show the annotation + const annotationDiv = document.createElement('div'); + annotationDiv.className = 'custom-annotation'; + annotationDiv.setAttribute('data-annotation-group', groupName); + annotationDiv.style.cssText = ` + position: absolute; + color: #ff0000; + font-size: 14px; + font-weight: bold; + pointer-events: none; + z-index: 1000; + transform: translate(-4px, -4px); + display: flex; + align-items: center; + gap: 4px; + `; + + // Create the red circle element + const circleDiv = document.createElement('div'); + circleDiv.style.cssText = ` + width: 8px; + height: 8px; + border: 2px solid #ff0000; + border-radius: 50%; + background: transparent; + flex-shrink: 0; + `; + + // Create the text element + const textDiv = document.createElement('span'); + textDiv.textContent = groupName; + textDiv.style.cssText = ` + color: #ff0000; + font-size: 14px; + font-weight: bold; + `; + + // Assemble the annotation + annotationDiv.appendChild(circleDiv); + annotationDiv.appendChild(textDiv); + + // Convert world coordinates to screen coordinates for this viewport + const screenCoords = enabledElement.viewport.worldToCanvas([ + worldCoords[0], + worldCoords[1], + worldCoords[2] || 0, + ]); + + console.log(`World coords for ${viewportId}:`, worldCoords); + console.log(`Screen coords for ${viewportId}:`, screenCoords); + + if (screenCoords && screenCoords.length >= 2) { + // Remove existing annotation for this group if it exists + const annotationKey = `${groupName}-${viewportId}`; + const existingAnnotation = annotationsRef.current.get(annotationKey); + if (existingAnnotation) { + existingAnnotation.element.remove(); + annotationsRef.current.delete(annotationKey); + console.log(`Removed existing annotation for ${groupName} in viewport ${viewportId}`); + } + + annotationDiv.style.left = `${screenCoords[0]}px`; + annotationDiv.style.top = `${screenCoords[1]}px`; + + // Add the annotation to the viewport + viewportElement.appendChild(annotationDiv); + + // Store the annotation reference and world coordinates for position updates + annotationsRef.current.set(annotationKey, { + element: annotationDiv, + worldCoords: worldCoords, + sliceIndex: enabledElement.viewport.getSliceIndex(), + viewportId: viewportId, // Store viewport ID for slice checking + }); + + console.log( + `Custom annotation created for ${groupName} in viewport ${viewportId} at screen coordinates:`, + screenCoords + ); + console.log(`Annotation element added to viewport ${viewportId}:`, annotationDiv); + } else { + console.warn( + 'Could not convert world coordinates to screen coordinates for viewport:', + viewportId + ); + } + } catch (error) { + console.error('Error creating annotation in viewport:', error); + } + }; + + // Cleanup event listeners on unmount + useEffect(() => { + return () => { + removeClickListener(); + }; + }, []); + + useEffect(() => { + console.log('showPopup changed to:', showPopup); + }, [showPopup]); + + // Add viewport change listener to update annotation positions + useEffect(() => { + let animationFrameId: number; + + const updateAnnotationPositions = () => { + // Get all viewport elements + const allViewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + + allViewports.forEach(viewportElement => { + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) return; + + const viewportId = + viewportElement.getAttribute('data-viewport-id') || + viewportElement.getAttribute('data-viewport-uid') || + viewportElement.getAttribute('data-viewportid') || + viewportElement.id || + 'viewport'; + + // Update annotations for this specific viewport + annotationsRef.current.forEach((annotation, annotationKey) => { + try { + // Check if this annotation belongs to this viewport + if (annotation.viewportId === viewportId) { + // Check if we're on the correct slice for this annotation + const currentSliceIndex = enabledElement.viewport.getSliceIndex(); + + if (currentSliceIndex === annotation.sliceIndex) { + // Show annotation and update position + const screenCoords = enabledElement.viewport.worldToCanvas([ + annotation.worldCoords[0], + annotation.worldCoords[1], + annotation.worldCoords[2] || 0, + ]); + + if (screenCoords && screenCoords.length >= 2) { + annotation.element.style.left = `${screenCoords[0]}px`; + annotation.element.style.top = `${screenCoords[1]}px`; + annotation.element.style.display = 'flex'; // Show the annotation + } + } else { + // Hide annotation if we're on a different slice + annotation.element.style.display = 'none'; + } + } + } catch (error) { + console.error(`Error updating annotation position for ${annotationKey}:`, error); + } + }); + }); + }; + + const handleViewportChange = () => { + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + } + animationFrameId = requestAnimationFrame(updateAnnotationPositions); + }; + + // Listen for various viewport change events on all viewports + const allViewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + + allViewports.forEach(element => { + element.addEventListener('wheel', handleViewportChange, { passive: true }); + element.addEventListener( + 'mousemove', + e => { + if (e.buttons > 0) { + // Only update during panning + handleViewportChange(); + } + }, + { passive: true } + ); + }); + + // Use a more frequent update for smooth positioning + const intervalId = setInterval(updateAnnotationPositions, 100); + + return () => { + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + } + clearInterval(intervalId); + + // Remove event listeners from all viewports + allViewports.forEach(element => { + element.removeEventListener('wheel', handleViewportChange); + element.removeEventListener('mousemove', handleViewportChange); + }); + }; + }, []); + + return ( +
+ {/* Header with Back button and TALAS title */} +
+ +
TALAS
+
+ + {/* TALAS content */} +
+ {/* 1st Metatarsal (M1) Group */} +
+
+ 1st Metatarsal (M1) +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + {/* 5th Metatarsal (M5) Group */} +
+
+ 5th Metatarsal (M5) +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + {/* Calcaneous (C) Group */} +
+
+ Calcaneous (C) +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + {/* Talus (T) Group */} +
+
+ Talus (T) +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + {/* Submit button at the bottom */} +
+ + +
+ + + + {/* Popup Modal */} + {showPopup && ( +
+
+ {/* Close Button */} + + + {/* Image */} + Talas Visualization console.log('Image loaded successfully')} + onError={e => console.error('Image failed to load:', e)} + /> +
+
+ )} +
+ ); +} + +export default Talas; diff --git a/extensions/autometrics/src/Panels/TalasRefactored.tsx b/extensions/autometrics/src/Panels/TalasRefactored.tsx new file mode 100644 index 00000000000..deb0e4c5888 --- /dev/null +++ b/extensions/autometrics/src/Panels/TalasRefactored.tsx @@ -0,0 +1,133 @@ +import React, { useState } from 'react'; +import { Button } from '@ohif/ui-next'; +import LogoSection from '../Components/LogoSection'; +import TalasHeader from '../Components/TalasHeader'; +import CoordinateGroup from '../Components/CoordinateGroup'; +import PopupModal from '../Components/PopupModal'; +import { useCoordinates } from '../hooks/useCoordinates'; +import { useEventHandlers } from '../hooks/useEventHandlers'; +import { useAnnotations } from '../hooks/useAnnotations'; + +interface TalasProps { + setCurrentView: (view: string) => void; + commandsManager: any; +} + +const coordinateGroups = [ + { key: 'M1', title: '1st Metatarsal (M1)' }, + { key: 'M5', title: '5th Metatarsal (M5)' }, + { key: 'C', title: 'Calcaneous (C)' }, + { key: 'T', title: 'Talus (T)' }, +]; + +function TalasRefactored({ setCurrentView, commandsManager }: TalasProps) { + const [showPopup, setShowPopup] = useState(false); + + const { + selectedGroup, + coordinates, + selectedGroupRef, + updateCoordinates, + selectGroup, + clearSelection, + } = useCoordinates(); + + const { createAnnotationsForAllViewports, updateCrosshairPosition } = + useAnnotations(commandsManager); + + const handleCoordinateCapture = ( + groupName: string, + worldCoords: number[], + anatomicalName: string + ) => { + // Create annotations for all viewports + createAnnotationsForAllViewports(groupName, worldCoords, anatomicalName); + + // Update crosshair position across all viewports + updateCrosshairPosition(worldCoords); + }; + + const { addClickListener, removeClickListener } = useEventHandlers( + selectedGroupRef, + updateCoordinates, + clearSelection, + handleCoordinateCapture + ); + + const handleBack = () => { + setCurrentView('autometrics'); + clearSelection(); + + // Return to original viewport layout + commandsManager.run({ + commandName: 'setHangingProtocol', + commandOptions: { + protocolId: 'default', + }, + }); + + // Remove event listeners + removeClickListener(); + }; + + const handleSubmit = () => { + console.log('Coordinates submitted:', coordinates); + setShowPopup(true); + }; + + const handleSelect = (groupName: string) => { + console.log(`Select button clicked for ${groupName}`); + selectGroup(groupName); + addClickListener(); + }; + + return ( +
+ + + {/* TALAS content */} +
+ {coordinateGroups.map(group => ( + + ))} +
+ + {/* Submit buttons */} +
+ + +
+ + + + setShowPopup(false)} + imageSrc="/talas_visualization.png" + imageAlt="Talas Visualization" + /> +
+ ); +} + +export default TalasRefactored; + diff --git a/extensions/autometrics/src/Panels/index.ts b/extensions/autometrics/src/Panels/index.ts new file mode 100644 index 00000000000..3ae053bdd45 --- /dev/null +++ b/extensions/autometrics/src/Panels/index.ts @@ -0,0 +1 @@ +export { default as AutometricsPanel } from './AutometricsPanel'; diff --git a/extensions/autometrics/src/REFACTORING.md b/extensions/autometrics/src/REFACTORING.md new file mode 100644 index 00000000000..4a20e992487 --- /dev/null +++ b/extensions/autometrics/src/REFACTORING.md @@ -0,0 +1,112 @@ +# Talas Component Refactoring + +## Overview +The original `Talas.tsx` component was a monolithic 898-line file that mixed multiple responsibilities. This refactoring breaks it down into smaller, more manageable and testable pieces. + +## Refactoring Benefits + +### 1. Size Reduction +- **Original**: 898 lines (Talas.tsx) +- **Refactored**: 108 lines (TalasRefactored.tsx) +- **Reduction**: ~88% smaller main component + +### 2. Separation of Concerns + +#### Custom Hooks +- `useCoordinates.ts` - Manages coordinate state and selection logic +- `useEventHandlers.ts` - Handles mouse events and click listeners +- `useAnnotations.ts` - Manages annotation system and viewport updates + +#### Utility Classes +- `AnnotationManager` - Centralized annotation creation and management +- Annotation positioning and viewport navigation logic + +#### UI Components +- `CoordinateGroup.tsx` - Reusable coordinate input group +- `PopupModal.tsx` - Modal dialog component +- `TalasHeader.tsx` - Header with back button and title + +## File Structure + +``` +src/ +├── hooks/ +│ ├── useCoordinates.ts (42 lines) +│ ├── useEventHandlers.ts (112 lines) +│ └── useAnnotations.ts (85 lines) +├── utils/ +│ └── annotationUtils.ts (234 lines) +├── Components/ +│ ├── CoordinateGroup.tsx (52 lines) +│ ├── PopupModal.tsx (35 lines) +│ └── TalasHeader.tsx (20 lines) +└── Panels/ + └── TalasRefactored.tsx (108 lines) +``` + +## Key Improvements + +### 1. Testability +Each hook and component can now be tested in isolation: +- Mock coordinate state management +- Test event handling logic separately +- Unit test annotation creation +- Test UI components independently + +### 2. Reusability +Components can be reused across the application: +- `CoordinateGroup` can be used in other measurement tools +- `PopupModal` is a generic modal component +- Hooks can be reused in similar coordinate-capture workflows + +### 3. Maintainability +- **Single Responsibility**: Each file has one clear purpose +- **Smaller Files**: Easier to understand and modify +- **Clear Interfaces**: TypeScript interfaces define clear contracts +- **Logical Grouping**: Related functionality is grouped together + +### 4. Readability +- **Reduced Cognitive Load**: Main component focuses on orchestration +- **Clear Flow**: Data flow is easier to follow +- **Better Naming**: Functions and variables have more descriptive names +- **Less Nesting**: Reduced complexity in the main component + +## Migration Path + +To use the refactored version: + +1. Replace imports in the parent component: +```tsx +// Old +import Talas from './Panels/Talas'; + +// New +import TalasRefactored from './Panels/TalasRefactored'; +``` + +2. The component interface remains the same: +```tsx + +``` + +## Performance Benefits + +- **Faster Development**: Smaller files load faster in IDEs +- **Better Tree Shaking**: Unused utilities won't be bundled +- **Easier Debugging**: Stack traces point to specific, smaller files +- **Memory Efficiency**: Hooks can be optimized individually + +## Future Improvements + +With this structure, you can easily: +- Add new coordinate groups by updating the `coordinateGroups` array +- Extend annotation types in `AnnotationManager` +- Add new event handlers without touching existing code +- Create additional coordinate management workflows +- Add automated tests for each module + +The refactored code maintains all original functionality while providing a much cleaner, more maintainable codebase. + diff --git a/extensions/autometrics/src/Toolbar/Toolbar.tsx b/extensions/autometrics/src/Toolbar/Toolbar.tsx new file mode 100644 index 00000000000..3cf27b8402a --- /dev/null +++ b/extensions/autometrics/src/Toolbar/Toolbar.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { useToolbar } from '@ohif/core'; + +interface ToolbarProps { + buttonSection?: string; + viewportId?: string; + location?: number; +} + +export function Toolbar({ buttonSection = 'primary', viewportId, location }: ToolbarProps) { + const { + toolbarButtons, + onInteraction, + isItemOpen, + isItemLocked, + openItem, + closeItem, + toggleLock, + } = useToolbar({ + buttonSection, + }); + + if (!toolbarButtons.length) { + return null; + } + + return ( + <> + {toolbarButtons?.map(toolDef => { + if (!toolDef) { + return null; + } + + const { id, Component, componentProps } = toolDef; + + // Enhanced props with state and actions - respecting viewport specificity + const enhancedProps = { + ...componentProps, + isOpen: isItemOpen(id, viewportId), + isLocked: isItemLocked(id, viewportId), + onOpen: () => openItem(id, viewportId), + onClose: () => closeItem(id, viewportId), + onToggleLock: () => toggleLock(id, viewportId), + viewportId, + }; + + const tool = ( + { + onInteraction({ + ...args, + itemId: id, + viewportId, + }); + }} + {...enhancedProps} + /> + ); + + return
{tool}
; + })} + + ); +} diff --git a/extensions/autometrics/src/Toolbar/index.ts b/extensions/autometrics/src/Toolbar/index.ts new file mode 100644 index 00000000000..7c6430332bc --- /dev/null +++ b/extensions/autometrics/src/Toolbar/index.ts @@ -0,0 +1 @@ +export * from './Toolbar'; diff --git a/extensions/autometrics/src/ViewerLayout/CustomViewerHeader.tsx b/extensions/autometrics/src/ViewerLayout/CustomViewerHeader.tsx new file mode 100644 index 00000000000..b5c4c3da37f --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/CustomViewerHeader.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; + +import { Button, Header, Icons, useModal } from '@ohif/ui-next'; +import { useSystem } from '@ohif/core'; +import { Toolbar } from '../Toolbar/Toolbar'; +import HeaderPatientInfo from './HeaderPatientInfo'; +import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo'; +import { Types } from '@ohif/core'; + +function CustomViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config }>) { + const { servicesManager, extensionManager, commandsManager } = useSystem(); + const { customizationService } = servicesManager.services; + + const { t } = useTranslation(); + const { show } = useModal(); + + const AboutModal = customizationService.getCustomization( + 'ohif.aboutModal' + ) as Types.MenuComponentCustomization; + + const UserPreferencesModal = customizationService.getCustomization( + 'ohif.userPreferencesModal' + ) as Types.MenuComponentCustomization; + + const menuOptions = [ + { + title: AboutModal?.menuTitle ?? t('Header:About'), + icon: 'info', + onClick: () => + show({ + content: AboutModal, + title: AboutModal?.title ?? t('AboutModal:About OHIF Viewer'), + containerClassName: AboutModal?.containerClassName ?? 'max-w-md', + }), + }, + { + title: UserPreferencesModal.menuTitle ?? t('Header:Preferences'), + icon: 'settings', + onClick: () => + show({ + content: UserPreferencesModal, + title: UserPreferencesModal.title ?? t('UserPreferencesModal:User preferences'), + containerClassName: + UserPreferencesModal?.containerClassName ?? 'flex max-w-4xl p-6 flex-col', + }), + }, + ]; + + if (appConfig.oidc) { + menuOptions.push({ + title: t('Header:Logout'), + icon: 'power-off', + onClick: async () => { + // Handle logout if needed + }, + }); + } + + return ( +
}} + Secondary={} + PatientInfo={ + appConfig.showPatientInfo !== PatientInfoVisibility.DISABLED && ( + + ) + } + UndoRedo={null} + > +
+ +
+
+ ); +} + +export default CustomViewerHeader; diff --git a/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/HeaderPatientInfo.tsx b/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/HeaderPatientInfo.tsx new file mode 100644 index 00000000000..f6d858512b5 --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/HeaderPatientInfo.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import usePatientInfo from '../../hooks/usePatientInfo'; +import { Icons } from '@ohif/ui-next'; + +export enum PatientInfoVisibility { + VISIBLE = 'visible', + VISIBLE_COLLAPSED = 'visibleCollapsed', + DISABLED = 'disabled', + VISIBLE_READONLY = 'visibleReadOnly', +} + +const formatWithEllipsis = (str, maxLength) => { + if (str?.length > maxLength) { + return str.substring(0, maxLength) + '...'; + } + return str; +}; + +function HeaderPatientInfo({ servicesManager, appConfig }: withAppTypes) { + const initialExpandedState = + appConfig.showPatientInfo === PatientInfoVisibility.VISIBLE || + appConfig.showPatientInfo === PatientInfoVisibility.VISIBLE_READONLY; + const [expanded, setExpanded] = useState(initialExpandedState); + const { patientInfo, isMixedPatients } = usePatientInfo(servicesManager); + + useEffect(() => { + if (isMixedPatients && expanded) { + setExpanded(false); + } + }, [isMixedPatients, expanded]); + + const handleOnClick = () => { + if (!isMixedPatients && appConfig.showPatientInfo !== PatientInfoVisibility.VISIBLE_READONLY) { + setExpanded(!expanded); + } + }; + + const formattedPatientName = formatWithEllipsis(patientInfo.PatientName, 27); + const formattedPatientID = formatWithEllipsis(patientInfo.PatientID, 15); + + return ( +
+ {isMixedPatients ? ( + + ) : ( + + )} +
+ {expanded ? ( + <> +
+ {formattedPatientName} +
+
+
{formattedPatientID}
+
{patientInfo.PatientSex}
+
{patientInfo.PatientDOB}
+
+ + ) : ( +
+ {isMixedPatients ? 'Multiple Patients' : 'Patient'} +
+ )} +
+ +
+ ); +} + +export default HeaderPatientInfo; diff --git a/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/index.js b/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/index.js new file mode 100644 index 00000000000..cc989ba5387 --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/HeaderPatientInfo/index.js @@ -0,0 +1,3 @@ +import HeaderPatientInfo from './HeaderPatientInfo'; + +export default HeaderPatientInfo; diff --git a/extensions/autometrics/src/ViewerLayout/ResizablePanelsHook.tsx b/extensions/autometrics/src/ViewerLayout/ResizablePanelsHook.tsx new file mode 100644 index 00000000000..0e3dce22206 --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/ResizablePanelsHook.tsx @@ -0,0 +1,337 @@ +import { useState, useCallback, useLayoutEffect, useRef } from 'react'; +import { getPanelElement, getPanelGroupElement } from 'react-resizable-panels'; +import { getPanelGroupDefinition } from './constants/panels'; + +/** + * Set the minimum and maximum css style width attributes for the given element. + * The two style attributes are cleared whenever the width + * argument is undefined. + *

+ * This utility is used as part of a HACK throughout the ViewerLayout component as + * the means of restricting the side panel widths during the resizing of the + * browser window. In general, the widths are always set unless the resize + * handle for either side panel is being dragged (i.e. a side panel is being resized). + * + * @param elem the element + * @param width the max and min width to set on the element + */ +const setMinMaxWidth = (elem, width?) => { + if (!elem) { + return; + } + + elem.style.minWidth = width === undefined ? '' : `${width}px`; + elem.style.maxWidth = elem.style.minWidth; +}; + +const useResizablePanels = ( + leftPanelClosed, + setLeftPanelClosed, + rightPanelClosed, + setRightPanelClosed, + hasLeftPanels, + hasRightPanels, + leftPanelInitialExpandedWidth, + rightPanelInitialExpandedWidth, + leftPanelMinimumExpandedWidth, + rightPanelMinimumExpandedWidth +) => { + const [panelGroupDefinition] = useState( + getPanelGroupDefinition({ + leftPanelInitialExpandedWidth, + rightPanelInitialExpandedWidth, + leftPanelMinimumExpandedWidth, + rightPanelMinimumExpandedWidth, + }) + ); + + const [leftPanelExpandedWidth, setLeftPanelExpandedWidth] = useState( + panelGroupDefinition.left.initialExpandedWidth + ); + const [rightPanelExpandedWidth, setRightPanelExpandedWidth] = useState( + panelGroupDefinition.right.initialExpandedWidth + ); + const [leftResizablePanelMinimumSize, setLeftResizablePanelMinimumSize] = useState(0); + const [rightResizablePanelMinimumSize, setRightResizablePanelMinimumSize] = useState(0); + const [leftResizablePanelCollapsedSize, setLeftResizePanelCollapsedSize] = useState(0); + const [rightResizePanelCollapsedSize, setRightResizePanelCollapsedSize] = useState(0); + + const resizablePanelGroupElemRef = useRef(null); + const resizableLeftPanelElemRef = useRef(null); + const resizableRightPanelElemRef = useRef(null); + const resizableLeftPanelAPIRef = useRef(null); + const resizableRightPanelAPIRef = useRef(null); + const isResizableHandleDraggingRef = useRef(false); + + // The total width of both handles. + const resizableHandlesWidth = useRef(null); + + // This useLayoutEffect is used to... + // - Grab a reference to the various resizable panel elements needed for + // converting between percentages and pixels in various callbacks. + // - Expand those panels that are initially expanded. + useLayoutEffect(() => { + const panelGroupElem = getPanelGroupElement(panelGroupDefinition.groupId); + resizablePanelGroupElemRef.current = panelGroupElem; + + const leftPanelElem = getPanelElement(panelGroupDefinition.left.panelId); + resizableLeftPanelElemRef.current = leftPanelElem; + + const rightPanelElem = getPanelElement(panelGroupDefinition.right.panelId); + resizableRightPanelElemRef.current = rightPanelElem; + + // Calculate and set the width of both handles combined. + const resizeHandles = document.querySelectorAll('[data-panel-resize-handle-id]'); + resizableHandlesWidth.current = 0; + resizeHandles.forEach(resizeHandle => { + resizableHandlesWidth.current += resizeHandle.offsetWidth; + }); + + // Since both resizable panels are collapsed by default (i.e. their default size is zero), + // on the very first render check if either/both side panels should be expanded. + // we use the initialExpandedOffsetWidth on the first render incase the panel has min width but we want the initial state to be larger than that + + if (!leftPanelClosed) { + const leftResizablePanelExpandedSize = getPercentageSize( + panelGroupDefinition.left.initialExpandedOffsetWidth + ); + resizableLeftPanelAPIRef?.current?.expand(leftResizablePanelExpandedSize); + setMinMaxWidth(leftPanelElem, panelGroupDefinition.left.initialExpandedOffsetWidth); + } + + if (!rightPanelClosed) { + const rightResizablePanelExpandedSize = getPercentageSize( + panelGroupDefinition.right.initialExpandedOffsetWidth + ); + resizableRightPanelAPIRef?.current?.expand(rightResizablePanelExpandedSize); + setMinMaxWidth(rightPanelElem, panelGroupDefinition.right.initialExpandedOffsetWidth); + } + }, []); // no dependencies because this useLayoutEffect is only needed on the very first render + + // This useLayoutEffect follows the pattern prescribed by the react-resizable-panels + // readme for converting between pixel values and percentages. An example of + // the pattern can be found here: + // https://github.com/bvaughn/react-resizable-panels/issues/46#issuecomment-1368108416 + // This useLayoutEffect is used to... + // - Ensure that the percentage size is up-to-date with the pixel sizes + // - Add a resize observer to the resizable panel group to reset various state + // values whenever the resizable panel group is resized (e.g. whenever the + // browser window is resized). + useLayoutEffect(() => { + // Ensure the side panels' percentage size is in synch with the pixel width of the + // expanded side panels. In general the two get out-of-sync during a browser + // window resize. Note that this code is here and NOT in the ResizeObserver + // because it has to be done AFTER the minimum percentage size for a panel is + // updated which occurs only AFTER the render following a browser window resize. + // And by virtue of the dependency on the minimum size state variables, this code + // is executed on the render following an update of the minimum percentage sizes + // for a panel. + if (!resizableLeftPanelAPIRef.current?.isCollapsed()) { + const leftSize = getPercentageSize( + leftPanelExpandedWidth + panelGroupDefinition.shared.expandedInsideBorderSize + ); + resizableLeftPanelAPIRef.current?.resize(leftSize); + } + + if (!resizableRightPanelAPIRef?.current?.isCollapsed()) { + const rightSize = getPercentageSize( + rightPanelExpandedWidth + panelGroupDefinition.shared.expandedInsideBorderSize + ); + resizableRightPanelAPIRef?.current?.resize(rightSize); + } + + // This observer kicks in when the ViewportLayout resizable panel group + // component is resized. This typically occurs when the browser window resizes. + const observer = new ResizeObserver(() => { + const minimumLeftSize = getPercentageSize( + panelGroupDefinition.left.minimumExpandedOffsetWidth + ); + const minimumRightSize = getPercentageSize( + panelGroupDefinition.right.minimumExpandedOffsetWidth + ); + + // Set the new minimum and collapsed resizable panel sizes. + setLeftResizablePanelMinimumSize(minimumLeftSize); + setRightResizablePanelMinimumSize(minimumRightSize); + setLeftResizePanelCollapsedSize( + getPercentageSize(panelGroupDefinition.left.collapsedOffsetWidth) + ); + setRightResizePanelCollapsedSize( + getPercentageSize(panelGroupDefinition.right.collapsedOffsetWidth) + ); + }); + + observer.observe(resizablePanelGroupElemRef.current); + + return () => { + observer.disconnect(); + }; + }, [ + leftPanelExpandedWidth, + rightPanelExpandedWidth, + leftResizablePanelMinimumSize, + rightResizablePanelMinimumSize, + hasLeftPanels, + hasRightPanels, + ]); + + /** + * Handles dragging of either side panel resize handle. + */ + const onHandleDragging = useCallback( + isStartDrag => { + if (isStartDrag) { + isResizableHandleDraggingRef.current = true; + + setMinMaxWidth(resizableLeftPanelElemRef.current); + setMinMaxWidth(resizableRightPanelElemRef.current); + } else { + isResizableHandleDraggingRef.current = false; + + if (resizableLeftPanelAPIRef?.current?.isExpanded()) { + setMinMaxWidth( + resizableLeftPanelElemRef.current, + leftPanelExpandedWidth + panelGroupDefinition.shared.expandedInsideBorderSize + ); + } + + if (resizableRightPanelAPIRef?.current?.isExpanded()) { + setMinMaxWidth( + resizableRightPanelElemRef.current, + rightPanelExpandedWidth + panelGroupDefinition.shared.expandedInsideBorderSize + ); + } + } + }, + [leftPanelExpandedWidth, rightPanelExpandedWidth] + ); + + const onLeftPanelClose = useCallback(() => { + setLeftPanelClosed(true); + setMinMaxWidth(resizableLeftPanelElemRef.current); + resizableLeftPanelAPIRef?.current?.collapse(); + }, [setLeftPanelClosed]); + + const onLeftPanelOpen = useCallback(() => { + resizableLeftPanelAPIRef?.current?.expand( + getPercentageSize(panelGroupDefinition.left.initialExpandedOffsetWidth) + ); + setLeftPanelClosed(false); + }, [setLeftPanelClosed]); + + const onLeftPanelResize = useCallback(size => { + if (!resizablePanelGroupElemRef?.current || resizableLeftPanelAPIRef.current?.isCollapsed()) { + return; + } + + const newExpandedWidth = getExpandedPixelWidth(size); + setLeftPanelExpandedWidth(newExpandedWidth); + + if (!isResizableHandleDraggingRef.current) { + // This typically gets executed when the left panel is expanded via one of the UI + // buttons. It is done here instead of in the onLeftPanelOpen method + // because here we know the size of the expanded panel. + setMinMaxWidth(resizableLeftPanelElemRef.current, newExpandedWidth); + } + }, []); + + const onRightPanelClose = useCallback(() => { + setRightPanelClosed(true); + setMinMaxWidth(resizableRightPanelElemRef.current); + resizableRightPanelAPIRef?.current?.collapse(); + }, [setRightPanelClosed]); + + const onRightPanelOpen = useCallback(() => { + resizableRightPanelAPIRef?.current?.expand( + getPercentageSize(panelGroupDefinition.right.initialExpandedOffsetWidth) + ); + setRightPanelClosed(false); + }, [setRightPanelClosed]); + + const onRightPanelResize = useCallback(size => { + if (!resizablePanelGroupElemRef?.current || resizableRightPanelAPIRef?.current?.isCollapsed()) { + return; + } + + const newExpandedWidth = getExpandedPixelWidth(size); + setRightPanelExpandedWidth(newExpandedWidth); + + if (!isResizableHandleDraggingRef.current) { + // This typically gets executed when the right panel is expanded via one of the UI + // buttons. It is done here instead of in the onRightPanelOpen method + // because here we know the size of the expanded panel. + setMinMaxWidth(resizableRightPanelElemRef.current, newExpandedWidth); + } + }, []); + + /** + * Gets the percentage size corresponding to the given pixel size. + * Note that the width attributed to the handles must be taken into account. + */ + const getPercentageSize = pixelSize => { + const { width: panelGroupWidth } = resizablePanelGroupElemRef.current?.getBoundingClientRect(); + return (pixelSize / (panelGroupWidth - resizableHandlesWidth.current)) * 100; + }; + + /** + * Gets the width in pixels for an expanded panel given its percentage size/width. + * Note that the width attributed to the handles must be taken into account. + */ + const getExpandedPixelWidth = percentageSize => { + const { width: panelGroupWidth } = resizablePanelGroupElemRef.current?.getBoundingClientRect(); + const expandedWidth = + (percentageSize / 100) * (panelGroupWidth - resizableHandlesWidth.current) - + panelGroupDefinition.shared.expandedInsideBorderSize; + return expandedWidth; + }; + + return [ + { + expandedWidth: leftPanelExpandedWidth, + collapsedWidth: panelGroupDefinition.shared.collapsedWidth, + collapsedInsideBorderSize: panelGroupDefinition.shared.collapsedInsideBorderSize, + collapsedOutsideBorderSize: panelGroupDefinition.shared.collapsedOutsideBorderSize, + expandedInsideBorderSize: panelGroupDefinition.shared.expandedInsideBorderSize, + onClose: onLeftPanelClose, + onOpen: onLeftPanelOpen, + }, + { + expandedWidth: rightPanelExpandedWidth, + collapsedWidth: panelGroupDefinition.shared.collapsedWidth, + collapsedInsideBorderSize: panelGroupDefinition.shared.collapsedInsideBorderSize, + collapsedOutsideBorderSize: panelGroupDefinition.shared.collapsedOutsideBorderSize, + expandedInsideBorderSize: panelGroupDefinition.shared.expandedInsideBorderSize, + onClose: onRightPanelClose, + onOpen: onRightPanelOpen, + }, + { direction: 'horizontal', id: panelGroupDefinition.groupId }, + { + defaultSize: leftResizablePanelMinimumSize, + minSize: leftResizablePanelMinimumSize, + onResize: onLeftPanelResize, + collapsible: true, + collapsedSize: leftResizablePanelCollapsedSize, + onCollapse: () => setLeftPanelClosed(true), + onExpand: () => setLeftPanelClosed(false), + ref: resizableLeftPanelAPIRef, + order: 0, + id: panelGroupDefinition.left.panelId, + }, + { order: 1, id: 'viewerLayoutResizableViewportGridPanel' }, + { + defaultSize: rightResizablePanelMinimumSize, + minSize: rightResizablePanelMinimumSize, + onResize: onRightPanelResize, + collapsible: true, + collapsedSize: rightResizePanelCollapsedSize, + onCollapse: () => setRightPanelClosed(true), + onExpand: () => setRightPanelClosed(false), + ref: resizableRightPanelAPIRef, + order: 2, + id: panelGroupDefinition.right.panelId, + }, + onHandleDragging, + ]; +}; + +export default useResizablePanels; diff --git a/extensions/autometrics/src/ViewerLayout/ToolbarButtonNestedMenu.tsx b/extensions/autometrics/src/ViewerLayout/ToolbarButtonNestedMenu.tsx new file mode 100644 index 00000000000..40ef8195daa --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/ToolbarButtonNestedMenu.tsx @@ -0,0 +1,42 @@ +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; +import { ToolbarButton } from '@ohif/ui'; + +function NestedMenu({ children, label = 'More', icon = 'tool-more-menu', isActive }) { + const [isOpen, setIsOpen] = useState(false); + + const toggleNestedMenu = () => setIsOpen(!isOpen); + + const closeNestedMenu = () => { + if (isOpen) { + setIsOpen(false); + } + }; + + useEffect(() => { + window.addEventListener('click', closeNestedMenu); + return () => { + window.removeEventListener('click', closeNestedMenu); + }; + }, [isOpen]); + + return ( + + ); +} + +NestedMenu.propTypes = { + children: PropTypes.any.isRequired, + icon: PropTypes.string, + label: PropTypes.string, +}; + +export default NestedMenu; diff --git a/extensions/autometrics/src/ViewerLayout/ViewerHeader.tsx b/extensions/autometrics/src/ViewerLayout/ViewerHeader.tsx new file mode 100644 index 00000000000..00e2f0ca376 --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/ViewerHeader.tsx @@ -0,0 +1,127 @@ +import React from 'react'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; + +import { Button, Icons, useModal } from '@ohif/ui-next'; +import { useSystem } from '@ohif/core'; +import { Toolbar } from '../Toolbar/Toolbar'; +import HeaderPatientInfo from './HeaderPatientInfo'; +import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo'; +import { preserveQueryParameters } from '@ohif/app'; +import { Types } from '@ohif/core'; + +function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config }>) { + const { servicesManager, extensionManager, commandsManager } = useSystem(); + const { customizationService } = servicesManager.services; + + const navigate = useNavigate(); + const location = useLocation(); + + const { t } = useTranslation(); + const { show } = useModal(); + + const AboutModal = customizationService.getCustomization( + 'ohif.aboutModal' + ) as Types.MenuComponentCustomization; + + const UserPreferencesModal = customizationService.getCustomization( + 'ohif.userPreferencesModal' + ) as Types.MenuComponentCustomization; + + const menuOptions = [ + { + title: AboutModal?.menuTitle ?? t('Header:About'), + icon: 'info', + onClick: () => + show({ + content: AboutModal, + title: AboutModal?.title ?? t('AboutModal:About OHIF Viewer'), + containerClassName: AboutModal?.containerClassName ?? 'max-w-md', + }), + }, + { + title: UserPreferencesModal.menuTitle ?? t('Header:Preferences'), + icon: 'settings', + onClick: () => + show({ + content: UserPreferencesModal, + title: UserPreferencesModal.title ?? t('UserPreferencesModal:User preferences'), + containerClassName: + UserPreferencesModal?.containerClassName ?? 'flex max-w-4xl p-6 flex-col', + }), + }, + ]; + + if (appConfig.oidc) { + menuOptions.push({ + title: t('Header:Logout'), + icon: 'power-off', + onClick: async () => { + navigate(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`); + }, + }); + } + + return ( +

+ {/* Left side - Patient Info */} +
+ {appConfig.showPatientInfo !== PatientInfoVisibility.DISABLED && ( + + )} +
+ + {/* Center - Primary Toolbar */} +
+ +
+ + {/* Right side - Secondary Toolbar and Menu */} +
+ + + {/* Menu Button */} +
+ + ` + ) + .join(''); + + const button = document.querySelector('[data-menu-button]'); + button?.parentElement?.appendChild(menu); + + // Close menu when clicking outside + document.addEventListener('click', function closeMenu(e) { + if (!menu.contains(e.target as Node)) { + menu.remove(); + document.removeEventListener('click', closeMenu); + } + }); + }} + data-menu-button + > + + +
+
+
+ ); +} + +export default ViewerHeader; diff --git a/extensions/autometrics/src/ViewerLayout/constants/panels.ts b/extensions/autometrics/src/ViewerLayout/constants/panels.ts new file mode 100644 index 00000000000..b1901689f5d --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/constants/panels.ts @@ -0,0 +1,42 @@ +const expandedInsideBorderSize = 0; +const collapsedInsideBorderSize = 4; +const collapsedOutsideBorderSize = 4; +const collapsedWidth = 25; + +const getPanelGroupDefinition = ({ + leftPanelInitialExpandedWidth = 282, + rightPanelInitialExpandedWidth = 280, + leftPanelMinimumExpandedWidth = 145, + rightPanelMinimumExpandedWidth = 280, +}) => { + return { + groupId: 'viewerLayoutResizablePanelGroup', + shared: { + expandedInsideBorderSize, + collapsedInsideBorderSize, + collapsedOutsideBorderSize, + collapsedWidth, + }, + left: { + // id + panelId: 'viewerLayoutResizableLeftPanel', + // expanded width + initialExpandedWidth: leftPanelInitialExpandedWidth, + // expanded width + expanded inside border + minimumExpandedOffsetWidth: leftPanelMinimumExpandedWidth + expandedInsideBorderSize, + // initial expanded width + initialExpandedOffsetWidth: leftPanelInitialExpandedWidth + expandedInsideBorderSize, + // collapsed width + collapsed inside border + collapsed outside border + collapsedOffsetWidth: collapsedWidth + collapsedInsideBorderSize + collapsedOutsideBorderSize, + }, + right: { + panelId: 'viewerLayoutResizableRightPanel', + initialExpandedWidth: rightPanelInitialExpandedWidth, + minimumExpandedOffsetWidth: rightPanelMinimumExpandedWidth + expandedInsideBorderSize, + initialExpandedOffsetWidth: rightPanelInitialExpandedWidth + expandedInsideBorderSize, + collapsedOffsetWidth: collapsedWidth + collapsedInsideBorderSize + collapsedOutsideBorderSize, + }, + }; +}; + +export { getPanelGroupDefinition }; diff --git a/extensions/autometrics/src/ViewerLayout/index.tsx b/extensions/autometrics/src/ViewerLayout/index.tsx new file mode 100644 index 00000000000..cfeb4e7d6f9 --- /dev/null +++ b/extensions/autometrics/src/ViewerLayout/index.tsx @@ -0,0 +1,243 @@ +import React, { useEffect, useState, useCallback } from 'react'; +import PropTypes from 'prop-types'; + +import { InvestigationalUseDialog } from '@ohif/ui-next'; +import { HangingProtocolService, CommandsManager } from '@ohif/core'; +import { useAppConfig } from '@state'; +import ViewerHeader from './CustomViewerHeader'; +import SidePanelWithServices from '../Components/SidePanelWithServices'; +import { Onboarding, ResizablePanelGroup, ResizablePanel, ResizableHandle } from '@ohif/ui-next'; +import useResizablePanels from './ResizablePanelsHook'; + +const resizableHandleClassName = 'mt-[1px] bg-black'; + +function ViewerLayout({ + // From Extension Module Params + extensionManager, + servicesManager, + hotkeysManager, + commandsManager, + // From Modes + viewports, + ViewportGridComp, + leftPanelClosed = false, + rightPanelClosed = false, + leftPanelResizable = false, + rightPanelResizable = false, + leftPanelInitialExpandedWidth, + rightPanelInitialExpandedWidth, + leftPanelMinimumExpandedWidth, + rightPanelMinimumExpandedWidth, +}: withAppTypes): React.FunctionComponent { + const [appConfig] = useAppConfig(); + + const { panelService, hangingProtocolService, customizationService } = servicesManager.services; + const [showLoadingIndicator, setShowLoadingIndicator] = useState(appConfig.showLoadingIndicator); + + const hasPanels = useCallback( + (side): boolean => !!panelService.getPanels(side).length, + [panelService] + ); + + const [hasRightPanels, setHasRightPanels] = useState(hasPanels('right')); + const [hasLeftPanels, setHasLeftPanels] = useState(hasPanels('left')); + const [leftPanelClosedState, setLeftPanelClosed] = useState(leftPanelClosed); + const [rightPanelClosedState, setRightPanelClosed] = useState(rightPanelClosed); + + const [ + leftPanelProps, + rightPanelProps, + resizablePanelGroupProps, + resizableLeftPanelProps, + resizableViewportGridPanelProps, + resizableRightPanelProps, + onHandleDragging, + ] = useResizablePanels( + leftPanelClosed, + setLeftPanelClosed, + rightPanelClosed, + setRightPanelClosed, + hasLeftPanels, + hasRightPanels, + leftPanelInitialExpandedWidth, + rightPanelInitialExpandedWidth, + leftPanelMinimumExpandedWidth, + rightPanelMinimumExpandedWidth + ); + + const handleMouseEnter = () => { + (document.activeElement as HTMLElement)?.blur(); + }; + + const LoadingIndicatorProgress = customizationService.getCustomization( + 'ui.loadingIndicatorProgress' + ); + + /** + * Set body classes (tailwindcss) that don't allow vertical + * or horizontal overflow (no scrolling). Also guarantee window + * is sized to our viewport. + */ + useEffect(() => { + document.body.classList.add('bg-black'); + document.body.classList.add('overflow-hidden'); + + return () => { + document.body.classList.remove('bg-black'); + document.body.classList.remove('overflow-hidden'); + }; + }, []); + + const getComponent = id => { + const entry = extensionManager.getModuleEntry(id); + + if (!entry || !entry.component) { + throw new Error( + `${id} is not valid for an extension module or no component found from extension ${id}. Please verify your configuration or ensure that the extension is properly registered. It's also possible that your mode is utilizing a module from an extension that hasn't been included in its dependencies (add the extension to the "extensionDependencies" array in your mode's index.js file). Check the reference string to the extension in your Mode configuration` + ); + } + + return { entry }; + }; + + useEffect(() => { + const { unsubscribe } = hangingProtocolService.subscribe( + HangingProtocolService.EVENTS.PROTOCOL_CHANGED, + + // 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, + // however, this might not be the only approach to set the loading indicator to false. we need to explore this further. + () => { + setShowLoadingIndicator(false); + } + ); + + return () => { + unsubscribe(); + }; + }, [hangingProtocolService]); + + const getViewportComponentData = viewportComponent => { + const { entry } = getComponent(viewportComponent.namespace); + + return { + component: entry.component, + isReferenceViewable: entry.isReferenceViewable, + displaySetsToDisplay: viewportComponent.displaySetsToDisplay, + }; + }; + + useEffect(() => { + const { unsubscribe } = panelService.subscribe( + panelService.EVENTS.PANELS_CHANGED, + ({ options }) => { + setHasLeftPanels(hasPanels('left')); + setHasRightPanels(hasPanels('right')); + if (options?.leftPanelClosed !== undefined) { + setLeftPanelClosed(options.leftPanelClosed); + } + if (options?.rightPanelClosed !== undefined) { + setRightPanelClosed(options.rightPanelClosed); + } + } + ); + + return () => { + unsubscribe(); + }; + }, [panelService, hasPanels]); + + const viewportComponents = viewports.map(getViewportComponentData); + + return ( +
+ +
+ + {showLoadingIndicator && } + + {/* LEFT SIDEPANELS */} + {hasLeftPanels ? ( + <> + + + + + + ) : null} + {/* TOOLBAR + GRID */} + +
+
+ +
+
+
+ {hasRightPanels ? ( + <> + + + + + + ) : null} +
+
+
+ + +
+ ); +} + +ViewerLayout.propTypes = { + // From extension module params + extensionManager: PropTypes.shape({ + getModuleEntry: PropTypes.func.isRequired, + }).isRequired, + commandsManager: PropTypes.instanceOf(CommandsManager), + servicesManager: PropTypes.object.isRequired, + // From modes + leftPanels: PropTypes.array, + rightPanels: PropTypes.array, + leftPanelClosed: PropTypes.bool.isRequired, + rightPanelClosed: PropTypes.bool.isRequired, + /** Responsible for rendering our grid of viewports; provided by consuming application */ + children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired, + viewports: PropTypes.array, +}; + +export default ViewerLayout; diff --git a/extensions/autometrics/src/commandsModule.ts b/extensions/autometrics/src/commandsModule.ts new file mode 100644 index 00000000000..d993a5624ef --- /dev/null +++ b/extensions/autometrics/src/commandsModule.ts @@ -0,0 +1,140 @@ +import { CommandsManager, ExtensionManager } from '@ohif/core'; +import { showTextInputDialog, showEditTextDialog } from './utils/textInputDialog'; +import CircleROIWithTextTool from './tools/CircleROIWithText'; + +export default function getCommandsModule({ + servicesManager, + commandsManager, + extensionManager, +}: { + servicesManager: AppTypes.ServicesManager; + commandsManager: CommandsManager; + extensionManager: ExtensionManager; +}) { + const { uiDialogService, viewportGridService } = servicesManager.services; + + const actions = { + /** + * Creates a circle ROI annotation with custom text + */ + createCircleROIWithText: async ({ + element, + annotation, + defaultText = '', + title = 'Enter Annotation Text', + placeholder = 'Enter text for annotation', + }) => { + try { + // Show text input dialog + const customText = await showTextInputDialog({ + uiDialogService, + defaultValue: defaultText, + title, + placeholder, + }); + + // Create the annotation with custom text + const createdAnnotation = CircleROIWithTextTool.createAnnotation( + { detail: { element } }, + annotation, + customText + ); + + return createdAnnotation; + } catch (error) { + console.error('Error creating circle ROI with text:', error); + throw error; + } + }, + + /** + * Edits the text of an existing circle ROI annotation + */ + editCircleROIText: async ({ + annotationUID, + currentText = '', + title = 'Edit Annotation Text', + placeholder = 'Enter new text for annotation', + }) => { + try { + // Show edit text dialog + const newText = await showEditTextDialog({ + uiDialogService, + currentText, + title, + placeholder, + }); + + // Update the annotation text + CircleROIWithTextTool.updateAnnotationText(annotationUID, newText); + + return newText; + } catch (error) { + console.error('Error editing circle ROI text:', error); + throw error; + } + }, + + /** + * Gets the text from a circle ROI annotation + */ + getCircleROIText: ({ annotationUID }) => { + try { + return CircleROIWithTextTool.getAnnotationText(annotationUID); + } catch (error) { + console.error('Error getting circle ROI text:', error); + return ''; + } + }, + + /** + * Shows a text input dialog for annotation text (generic) + */ + showTextInputDialog: async ({ + defaultValue = '', + title = 'Enter Text', + placeholder = 'Enter text', + }) => { + try { + return await showTextInputDialog({ + uiDialogService, + defaultValue, + title, + placeholder, + }); + } catch (error) { + console.error('Error showing text input dialog:', error); + return defaultValue; + } + }, + }; + + const definitions = { + createCircleROIWithText: { + commandFn: actions.createCircleROIWithText, + storeContexts: [], + options: {}, + }, + editCircleROIText: { + commandFn: actions.editCircleROIText, + storeContexts: [], + options: {}, + }, + getCircleROIText: { + commandFn: actions.getCircleROIText, + storeContexts: [], + options: {}, + }, + showTextInputDialog: { + commandFn: actions.showTextInputDialog, + storeContexts: [], + options: {}, + }, + }; + + return { + actions, + definitions, + defaultContext: 'AUTOMETRICS', + }; +} diff --git a/extensions/autometrics/src/docs/Talas-Design.png b/extensions/autometrics/src/docs/Talas-Design.png new file mode 100644 index 00000000000..4d0b1b4bb0b Binary files /dev/null and b/extensions/autometrics/src/docs/Talas-Design.png differ diff --git a/extensions/autometrics/src/docs/talas.md b/extensions/autometrics/src/docs/talas.md new file mode 100644 index 00000000000..520c7d216d6 --- /dev/null +++ b/extensions/autometrics/src/docs/talas.md @@ -0,0 +1,29 @@ +graph TD + A["TalasRefactored.tsx
(108 lines)
🎯 Main orchestrator"] --> B["useCoordinates
📊 State management"] + A --> C["useEventHandlers
🖱️ Click & mouse events"] + A --> D["useAnnotations
📍 Annotation system"] + A --> E["TalasHeader
🔙 Header component"] + A --> F["CoordinateGroup
📋 Input groups"] + A --> G["PopupModal
🖼️ Modal dialog"] + A --> H["LogoSection
🏢 Branding"] + + C --> I["AnnotationManager
🔧 Annotation utilities"] + D --> I + + B --> J["Coordinates State
📐 M1, M5, C, T values"] + B --> K["Selection State
🎯 Active group"] + + C --> L["Event Listeners
👂 Right-click capture"] + C --> M["Mouse Handlers
🖱️ Viewport interaction"] + + D --> N["Viewport Updates
🔄 Position tracking"] + D --> O["Crosshair Sync
➕ Multi-viewport sync"] + + I --> P["Element Creation
🏗️ DOM manipulation"] + I --> Q["Position Updates
📏 Screen coordinates"] + + style A fill:#e1f5fe + style B fill:#f3e5f5 + style C fill:#e8f5e8 + style D fill:#fff3e0 + style I fill:#fce4ec diff --git a/extensions/autometrics/src/examples/CircleROIWithTextExample.tsx b/extensions/autometrics/src/examples/CircleROIWithTextExample.tsx new file mode 100644 index 00000000000..fc31ff9f045 --- /dev/null +++ b/extensions/autometrics/src/examples/CircleROIWithTextExample.tsx @@ -0,0 +1,194 @@ +import React, { useState } from 'react'; +import { Button } from '@ohif/ui-next'; +import CircleROIWithTextTool from '../tools/CircleROIWithText'; + +interface CircleROIWithTextExampleProps { + commandsManager: any; + servicesManager: any; +} + +/** + * Example component demonstrating how to use the CircleROI with Text tool programmatically + */ +function CircleROIWithTextExample({ + commandsManager, + servicesManager, +}: CircleROIWithTextExampleProps) { + const [customText, setCustomText] = useState(''); + const [annotationUID, setAnnotationUID] = useState(''); + + const handleCreateAnnotation = async () => { + try { + // Get the active viewport element + const viewportElement = document.querySelector('.cornerstone-viewport-element'); + if (!viewportElement) { + console.warn('No viewport element found'); + return; + } + + // Create a sample annotation data structure + const sampleAnnotation = { + annotationUID: `example_${Date.now()}`, + metadata: { + toolName: 'CircleROIWithText', + label: 'Example Annotation', + }, + data: { + handles: { + points: [ + [100, 100, 0], // center point + [150, 100, 0], // radius point + ], + textBox: { + hasMoved: false, + worldPosition: [100, 100, 0], + worldBoundingBox: { + topLeft: [90, 90, 0], + bottomRight: [110, 110, 0], + }, + }, + }, + cachedStats: {}, + }, + }; + + // Create the annotation with custom text + const createdAnnotation = await commandsManager.run('createCircleROIWithText', { + element: viewportElement, + annotation: sampleAnnotation, + defaultText: customText || 'Example annotation', + title: 'Create Circle ROI with Text', + placeholder: 'Enter annotation text', + }); + + if (createdAnnotation) { + setAnnotationUID(createdAnnotation.annotationUID); + console.log('Annotation created:', createdAnnotation); + } + } catch (error) { + console.error('Error creating annotation:', error); + } + }; + + const handleEditAnnotation = async () => { + if (!annotationUID) { + console.warn('No annotation UID available'); + return; + } + + try { + const currentText = CircleROIWithTextTool.getAnnotationText(annotationUID); + const newText = await commandsManager.run('editCircleROIText', { + annotationUID, + currentText, + title: 'Edit Annotation Text', + placeholder: 'Enter new text', + }); + + console.log('Annotation text updated to:', newText); + } catch (error) { + console.error('Error editing annotation:', error); + } + }; + + const handleGetAnnotationText = () => { + if (!annotationUID) { + console.warn('No annotation UID available'); + return; + } + + const text = CircleROIWithTextTool.getAnnotationText(annotationUID); + console.log('Current annotation text:', text); + }; + + const handleShowTextDialog = async () => { + try { + const text = await commandsManager.run('showTextInputDialog', { + defaultValue: 'Sample text', + title: 'Enter Text', + placeholder: 'Enter your text here', + }); + + console.log('Text entered:', text); + setCustomText(text); + } catch (error) { + console.error('Error showing text dialog:', error); + } + }; + + return ( +
+

CircleROI with Text Tool Example

+ +
+
+ + setCustomText(e.target.value)} + className="w-full rounded-md border border-gray-600 bg-gray-700 px-3 py-2 text-white placeholder-gray-400" + placeholder="Enter custom text for annotation" + /> +
+ +
+ + + + + + + +
+ + {annotationUID && ( +
+

+ Annotation UID: {annotationUID} +

+
+ )} + +
+

Instructions:

+
    +
  • • Enter custom text in the input field
  • +
  • • Click "Create Annotation" to create a circle ROI with text
  • +
  • • Use "Edit Annotation" to modify existing annotation text
  • +
  • • "Get Text" retrieves the current text from the annotation
  • +
  • • "Show Text Dialog" demonstrates the text input dialog
  • +
+
+
+
+ ); +} + +export default CircleROIWithTextExample; diff --git a/extensions/autometrics/src/getLayoutTemplateModule.ts b/extensions/autometrics/src/getLayoutTemplateModule.ts new file mode 100644 index 00000000000..e5ddad92980 --- /dev/null +++ b/extensions/autometrics/src/getLayoutTemplateModule.ts @@ -0,0 +1,28 @@ +import ViewerLayout from './ViewerLayout'; + +const getLayoutTemplateModule = ({ + servicesManager, + extensionManager, + commandsManager, + hotkeysManager, +}) => { + function ViewerLayoutWithServices(props) { + return ViewerLayout({ + servicesManager, + extensionManager, + commandsManager, + hotkeysManager, + ...props, + }); + } + + return [ + { + name: 'viewerLayout', + id: 'viewerLayout', + component: ViewerLayoutWithServices, + }, + ]; +}; + +export default getLayoutTemplateModule; diff --git a/extensions/autometrics/src/getPanelModule.tsx b/extensions/autometrics/src/getPanelModule.tsx new file mode 100644 index 00000000000..240dcd25077 --- /dev/null +++ b/extensions/autometrics/src/getPanelModule.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { AutometricsPanel } from './Panels'; + +function getPanelModule({ commandsManager, servicesManager, extensionManager }) { + const wrappedAutometricsPanel = () => { + return ( + + ); + }; + + return [ + { + name: 'autometrics', + iconName: 'tab-autometrics', + iconLabel: 'Autometrics', + label: 'Autometrics', + component: wrappedAutometricsPanel, + }, + ]; +} + +export default getPanelModule; diff --git a/extensions/autometrics/src/hooks/useAnnotations.ts b/extensions/autometrics/src/hooks/useAnnotations.ts new file mode 100644 index 00000000000..7682077d0e3 --- /dev/null +++ b/extensions/autometrics/src/hooks/useAnnotations.ts @@ -0,0 +1,105 @@ +import { useEffect, useRef } from 'react'; +import { getEnabledElement } from '@cornerstonejs/core'; +import { AnnotationManager } from '../utils/annotationUtils'; + +export const useAnnotations = (commandsManager?: any) => { + const annotationManagerRef = useRef(new AnnotationManager()); + + // Add viewport change listener to update annotation positions + useEffect(() => { + let animationFrameId: number; + const annotationManager = annotationManagerRef.current; + + const updateAnnotationPositions = () => { + annotationManager.updateAnnotationPositions(); + }; + + const handleViewportChange = () => { + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + } + animationFrameId = requestAnimationFrame(updateAnnotationPositions); + }; + + // Listen for various viewport change events on all viewports + const allViewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + + allViewports.forEach(element => { + element.addEventListener('wheel', handleViewportChange, { passive: true }); + element.addEventListener( + 'mousemove', + e => { + if (e.buttons > 0) { + // Only update during panning + handleViewportChange(); + } + }, + { passive: true } + ); + }); + + // Use a more frequent update for smooth positioning + const intervalId = setInterval(updateAnnotationPositions, 100); + + return () => { + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + } + clearInterval(intervalId); + + // Remove event listeners from all viewports + allViewports.forEach(element => { + element.removeEventListener('wheel', handleViewportChange); + element.removeEventListener('mousemove', handleViewportChange); + }); + }; + }, []); + + const createAnnotationsForAllViewports = ( + groupName: string, + worldCoords: number[], + anatomicalName: string + ) => { + annotationManagerRef.current.createAnnotationsForAllViewports( + groupName, + worldCoords, + anatomicalName, + commandsManager + ); + }; + + const updateCrosshairPosition = (worldCoords: number[]) => { + try { + const { toolGroupService } = commandsManager.services; + const toolGroupIds = toolGroupService.getToolGroupIds(); + + toolGroupIds.forEach(toolGroupId => { + const toolGroup = toolGroupService.getToolGroup(toolGroupId); + const crosshairTool = toolGroup.getToolInstance('Crosshairs'); + + if (crosshairTool) { + // Try to set the crosshair position using the tool's method + if (crosshairTool.setCrosshairPosition) { + crosshairTool.setCrosshairPosition(worldCoords); + } else if (crosshairTool.setPosition) { + crosshairTool.setPosition(worldCoords); + } else { + // Fallback: try to update the tool's center + crosshairTool.computeToolCenter(); + } + } + }); + } catch (error) { + console.warn('Could not update crosshair position:', error); + } + }; + + return { + createAnnotationsForAllViewports, + updateCrosshairPosition, + annotationManager: annotationManagerRef.current, + }; +}; + diff --git a/extensions/autometrics/src/hooks/useCoordinates.ts b/extensions/autometrics/src/hooks/useCoordinates.ts new file mode 100644 index 00000000000..d7743ee272f --- /dev/null +++ b/extensions/autometrics/src/hooks/useCoordinates.ts @@ -0,0 +1,53 @@ +import { useState, useRef } from 'react'; + +interface Coordinates { + M1: { x: string; y: string; z: string }; + M5: { x: string; y: string; z: string }; + C: { x: string; y: string; z: string }; + T: { x: string; y: string; z: string }; +} + +export const useCoordinates = () => { + const [selectedGroup, setSelectedGroup] = useState(''); + const [coordinates, setCoordinates] = useState({ + M1: { x: '', y: '', z: '' }, + M5: { x: '', y: '', z: '' }, + C: { x: '', y: '', z: '' }, + T: { x: '', y: '', z: '' }, + }); + + const selectedGroupRef = useRef(''); + + const updateCoordinates = (groupName: string, worldCoords: number[]) => { + setCoordinates(prev => ({ + ...prev, + [groupName]: { + x: worldCoords[0].toFixed(2), + y: worldCoords[1].toFixed(2), + z: worldCoords[2].toFixed(2), + }, + })); + }; + + const selectGroup = (groupName: string) => { + setSelectedGroup(groupName); + selectedGroupRef.current = groupName; + document.body.style.cursor = 'crosshair'; + }; + + const clearSelection = () => { + setSelectedGroup(''); + selectedGroupRef.current = ''; + document.body.style.cursor = 'default'; + }; + + return { + selectedGroup, + coordinates, + selectedGroupRef, + updateCoordinates, + selectGroup, + clearSelection, + }; +}; + diff --git a/extensions/autometrics/src/hooks/useEventHandlers.ts b/extensions/autometrics/src/hooks/useEventHandlers.ts new file mode 100644 index 00000000000..8b6949afa97 --- /dev/null +++ b/extensions/autometrics/src/hooks/useEventHandlers.ts @@ -0,0 +1,143 @@ +import { useRef, useEffect } from 'react'; +import { getEnabledElement } from '@cornerstonejs/core'; + +interface EventHandlersRef { + handleRightClick: (event: MouseEvent) => void; + handleMouseDown: (event: MouseEvent) => void; + isProcessing: boolean; +} + +export const useEventHandlers = ( + selectedGroupRef: React.RefObject, + updateCoordinates: (groupName: string, worldCoords: number[]) => void, + clearSelection: () => void, + onCoordinateCapture?: (groupName: string, worldCoords: number[], anatomicalName: string) => void +) => { + const eventListenerRef = useRef(null); + + const removeClickListener = () => { + if (eventListenerRef.current) { + const viewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + viewportElements.forEach(element => { + element.removeEventListener( + 'contextmenu', + eventListenerRef.current!.handleRightClick, + true + ); + element.removeEventListener('mousedown', eventListenerRef.current!.handleMouseDown, true); + }); + eventListenerRef.current = null; + } + document.body.style.cursor = 'default'; + }; + + const addClickListener = () => { + // Always clear any previous listeners before adding + removeClickListener(); + + const viewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + if (!viewportElements || viewportElements.length === 0) { + console.warn('No cornerstone viewport elements found'); + return; + } + + console.log(`Found ${viewportElements.length} viewport elements`); + + const handleRightClick = (event: MouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + + const listenerRef = eventListenerRef.current; + if (!listenerRef || listenerRef.isProcessing) return; + + listenerRef.isProcessing = true; + + console.log('Right click detected'); + + const viewportElement = event.currentTarget as HTMLDivElement; + const rect = viewportElement.getBoundingClientRect(); + + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) { + listenerRef.isProcessing = false; + return; + } + + const viewport = enabledElement.viewport; + const pixelX = event.clientX - rect.left; + const pixelY = event.clientY - rect.top; + + const worldCoords = viewport.canvasToWorld([pixelX, pixelY]); + if (!worldCoords || worldCoords.length < 2) { + listenerRef.isProcessing = false; + return; + } + + const validWorldCoords = [ + Number(worldCoords[0]) || 0, + Number(worldCoords[1]) || 0, + Number(worldCoords[2]) || 0, + ]; + + const currentGroup = selectedGroupRef.current; + if (!currentGroup) { + listenerRef.isProcessing = false; + return; + } + + updateCoordinates(currentGroup, validWorldCoords); + + const anatomicalNames = { + M1: '1st Metatarsal', + M5: '5th Metatarsal', + C: 'Calcaneous', + T: 'Talus', + }; + const anatomicalName = anatomicalNames[currentGroup] || currentGroup; + + // Trigger callback if provided + if (onCoordinateCapture) { + onCoordinateCapture(currentGroup, validWorldCoords, anatomicalName); + } + + console.log(`Coordinates captured for ${currentGroup}:`, { + world: validWorldCoords, + }); + + clearSelection(); + listenerRef.isProcessing = false; + removeClickListener(); + }; + + const handleMouseDown = (event: MouseEvent) => { + if (event.button === 2) { + event.preventDefault(); + event.stopPropagation(); + } + }; + + // Store single instances to remove later + eventListenerRef.current = { handleRightClick, handleMouseDown, isProcessing: false }; + + // Attach the SAME handler instances to all viewports + viewportElements.forEach((element, index) => { + console.log(`Adding event listeners to viewport ${index}:`, element); + element.addEventListener('contextmenu', handleRightClick, true); + element.addEventListener('mousedown', handleMouseDown, true); + }); + }; + + // Cleanup event listeners on unmount + useEffect(() => { + return () => { + removeClickListener(); + }; + }, []); + + return { + addClickListener, + removeClickListener, + eventListenerRef, + }; +}; + diff --git a/extensions/autometrics/src/hooks/usePatientInfo.tsx b/extensions/autometrics/src/hooks/usePatientInfo.tsx new file mode 100644 index 00000000000..ba7ad4156d0 --- /dev/null +++ b/extensions/autometrics/src/hooks/usePatientInfo.tsx @@ -0,0 +1,63 @@ +import { useState, useEffect } from 'react'; +import { utils, useSystem } from '@ohif/core'; + +const { formatPN, formatDate } = utils; + +function usePatientInfo() { + const { servicesManager } = useSystem(); + const { displaySetService } = servicesManager.services; + + const [patientInfo, setPatientInfo] = useState({ + PatientName: '', + PatientID: '', + PatientSex: '', + PatientDOB: '', + }); + const [isMixedPatients, setIsMixedPatients] = useState(false); + + const checkMixedPatients = (PatientID: string) => { + const displaySets = displaySetService.getActiveDisplaySets(); + let isMixedPatients = false; + displaySets.forEach(displaySet => { + const instance = displaySet?.instances?.[0] || displaySet?.instance; + if (!instance) { + return; + } + if (instance.PatientID !== PatientID) { + isMixedPatients = true; + } + }); + setIsMixedPatients(isMixedPatients); + }; + + const updatePatientInfo = ({ displaySetsAdded }) => { + if (!displaySetsAdded.length) { + return; + } + const displaySet = displaySetsAdded[0]; + const instance = displaySet?.instances?.[0] || displaySet?.instance; + if (!instance) { + return; + } + + setPatientInfo({ + PatientID: instance.PatientID || null, + PatientName: instance.PatientName ? formatPN(instance.PatientName) : null, + PatientSex: instance.PatientSex || null, + PatientDOB: formatDate(instance.PatientBirthDate) || null, + }); + checkMixedPatients(instance.PatientID || null); + }; + + useEffect(() => { + const subscription = displaySetService.subscribe( + displaySetService.EVENTS.DISPLAY_SETS_ADDED, + props => updatePatientInfo(props) + ); + return () => subscription.unsubscribe(); + }, []); + + return { patientInfo, isMixedPatients }; +} + +export default usePatientInfo; diff --git a/extensions/autometrics/src/id.js b/extensions/autometrics/src/id.js new file mode 100644 index 00000000000..92cc4f8ddce --- /dev/null +++ b/extensions/autometrics/src/id.js @@ -0,0 +1 @@ +export const id = '@ohif/extension-autometrics'; diff --git a/extensions/autometrics/src/index.ts b/extensions/autometrics/src/index.ts new file mode 100644 index 00000000000..03d8038720c --- /dev/null +++ b/extensions/autometrics/src/index.ts @@ -0,0 +1,12 @@ +import { id } from './id'; +import getPanelModule from './getPanelModule'; +import getLayoutTemplateModule from './getLayoutTemplateModule'; +import './Icons'; // Register custom icons + +const autometricsExtension = { + id, + getPanelModule, + getLayoutTemplateModule, +}; + +export default autometricsExtension; diff --git a/extensions/autometrics/src/tools/CircleROIWithText.ts b/extensions/autometrics/src/tools/CircleROIWithText.ts new file mode 100644 index 00000000000..c784b07de8f --- /dev/null +++ b/extensions/autometrics/src/tools/CircleROIWithText.ts @@ -0,0 +1,100 @@ +import { CircleROITool } from '@cornerstonejs/tools'; +import { getEnabledElement } from '@cornerstonejs/core'; +import { annotation } from '@cornerstonejs/tools'; + +/** + * Custom CircleROI tool that allows users to specify annotation text + * Extends the standard CircleROI tool with text annotation capabilities + * Disables statistics calculation to show only the anatomical name + */ +class CircleROIWithTextTool extends CircleROITool { + static toolName = 'CircleROIWithText'; + + constructor(toolProps = {}, defaultToolProps = {}) { + super(toolProps, defaultToolProps); + } + + /** + * Creates a circle ROI annotation with custom text + * @param evt - The cornerstone event + * @param annotation - The annotation data + * @param customText - The custom text to display + */ + static createAnnotation(evt, annotation, customText = '') { + const { element } = evt.detail; + const enabledElement = getEnabledElement(element); + + if (!enabledElement) { + console.warn('No enabled element found'); + return; + } + + // Create a proper CircleROI annotation with custom text + const circleAnnotation = { + annotationUID: annotation.annotationUID, + highlighted: false, + isLocked: false, + invalidated: false, + metadata: { + toolName: 'CircleROIWithText', + label: annotation.metadata?.label || 'Circle ROI', + FrameOfReferenceUID: enabledElement.viewport.getFrameOfReferenceUID(), + referencedImageId: enabledElement.viewport.getCurrentImageId(), + }, + data: { + handles: annotation.data.handles, + label: annotation.metadata?.label || 'Circle ROI', + text: customText || annotation.metadata?.label || 'Circle ROI', // Use custom text + cachedStats: {}, // Empty stats to prevent measurement display + }, + }; + + // Add the annotation using the annotation manager + const annotationManager = annotation.state.getAnnotationManager(); + annotationManager.addAnnotation(circleAnnotation); + + // Trigger a re-render + enabledElement.viewport.render(); + + return circleAnnotation; + } + + /** + * Updates the text of an existing annotation + * @param annotationUID - The annotation UID to update + * @param newText - The new text to set + */ + static updateAnnotationText(annotationUID, newText) { + const annotationManager = annotation.state.getAnnotationManager(); + const existingAnnotation = annotationManager.getAnnotation(annotationUID); + + if (existingAnnotation) { + existingAnnotation.data.text = newText; + existingAnnotation.data.cachedStats = {}; // Clear stats + existingAnnotation.invalidated = true; + + // Trigger a re-render + const element = document.querySelector('.cornerstone-viewport-element') as HTMLDivElement; + if (element) { + const enabledElement = getEnabledElement(element); + if (enabledElement) { + enabledElement.viewport.render(); + } + } + } + } + + /** + * Gets the text from an annotation + * @param annotationUID - The annotation UID + * @returns The text of the annotation + */ + static getAnnotationText(annotationUID) { + const annotationManager = annotation.state.getAnnotationManager(); + const existingAnnotation = annotationManager.getAnnotation(annotationUID); + + return existingAnnotation?.data?.text || ''; + } +} + +export default CircleROIWithTextTool; diff --git a/extensions/autometrics/src/utils/annotationUtils.ts b/extensions/autometrics/src/utils/annotationUtils.ts new file mode 100644 index 00000000000..3986bb5f99f --- /dev/null +++ b/extensions/autometrics/src/utils/annotationUtils.ts @@ -0,0 +1,241 @@ +import { getEnabledElement } from '@cornerstonejs/core'; + +interface AnnotationData { + element: HTMLElement; + worldCoords: number[]; + sliceIndex: number; + viewportId: string; +} + +export class AnnotationManager { + private annotationsRef: Map = new Map(); + + private createAnnotationElement(groupName: string): HTMLDivElement { + const annotationDiv = document.createElement('div'); + annotationDiv.className = 'custom-annotation'; + annotationDiv.setAttribute('data-annotation-group', groupName); + annotationDiv.style.cssText = ` + position: absolute; + color: #ff0000; + font-size: 14px; + font-weight: bold; + pointer-events: none; + z-index: 1000; + transform: translate(-4px, -4px); + display: flex; + align-items: center; + gap: 4px; + `; + + // Create the red circle element + const circleDiv = document.createElement('div'); + circleDiv.style.cssText = ` + width: 8px; + height: 8px; + border: 2px solid #ff0000; + border-radius: 50%; + background: transparent; + flex-shrink: 0; + `; + + // Create the text element + const textDiv = document.createElement('span'); + textDiv.textContent = groupName; + textDiv.style.cssText = ` + color: #ff0000; + font-size: 14px; + font-weight: bold; + `; + + annotationDiv.appendChild(circleDiv); + annotationDiv.appendChild(textDiv); + + return annotationDiv; + } + + private getViewportInfo(viewportElement: HTMLDivElement) { + return ( + viewportElement.getAttribute('data-viewport-id') || + viewportElement.getAttribute('data-viewport-uid') || + viewportElement.getAttribute('data-viewportid') || + viewportElement.id || + 'viewport' + ); + } + + public createAnnotationInViewport( + viewportElement: HTMLDivElement, + groupName: string, + worldCoords: number[] + ): void { + // Remove existing annotation for this group in this viewport + const existingAnnotation = viewportElement.querySelector( + `[data-annotation-group="${groupName}"]` + ); + if (existingAnnotation) { + existingAnnotation.remove(); + console.log(`Removed existing annotation for ${groupName} in this viewport`); + } + + try { + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) { + console.warn('No enabled element found for viewport'); + return; + } + + const viewportId = this.getViewportInfo(viewportElement); + console.log(`Processing viewport: ${viewportId}`); + + // Navigate viewport to the clicked position + try { + const viewport = enabledElement.viewport; + const point3: [number, number, number] = [ + worldCoords[0], + worldCoords[1], + worldCoords[2] || 0, + ]; + viewport.jumpToWorld(point3); + console.log(`Navigated ${viewportId} to world coordinates:`, point3); + } catch (navError) { + console.warn(`Could not navigate ${viewportId}:`, navError); + } + + const annotationDiv = this.createAnnotationElement(groupName); + + // Convert world coordinates to screen coordinates for this viewport + const screenCoords = enabledElement.viewport.worldToCanvas([ + worldCoords[0], + worldCoords[1], + worldCoords[2] || 0, + ]); + + if (screenCoords && screenCoords.length >= 2) { + // Remove existing annotation for this group if it exists + const annotationKey = `${groupName}-${viewportId}`; + const existingAnnotation = this.annotationsRef.get(annotationKey); + if (existingAnnotation) { + existingAnnotation.element.remove(); + this.annotationsRef.delete(annotationKey); + console.log(`Removed existing annotation for ${groupName} in viewport ${viewportId}`); + } + + annotationDiv.style.left = `${screenCoords[0]}px`; + annotationDiv.style.top = `${screenCoords[1]}px`; + + // Add the annotation to the viewport + viewportElement.appendChild(annotationDiv); + + // Store the annotation reference and world coordinates for position updates + this.annotationsRef.set(annotationKey, { + element: annotationDiv, + worldCoords: worldCoords, + sliceIndex: enabledElement.viewport.getSliceIndex(), + viewportId: viewportId, + }); + + console.log( + `Custom annotation created for ${groupName} in viewport ${viewportId} at screen coordinates:`, + screenCoords + ); + } else { + console.warn( + 'Could not convert world coordinates to screen coordinates for viewport:', + viewportId + ); + } + } catch (error) { + console.error('Error creating annotation in viewport:', error); + } + } + + public createAnnotationsForAllViewports( + groupName: string, + worldCoords: number[], + anatomicalName: string, + commandsManager?: any + ): void { + try { + // Remove all group annotations globally first + const allViewportElements = document.querySelectorAll('.cornerstone-viewport-element'); + allViewportElements.forEach(viewportElement => { + viewportElement + .querySelectorAll(`[data-annotation-group="${groupName}"]`) + .forEach(el => el.remove()); + }); + + let viewportIds: string[] = []; + if (commandsManager?.services?.viewportGridService) { + viewportIds = commandsManager.services.viewportGridService.getViewportIds(); + } + + if (viewportIds.length > 0) { + viewportIds.forEach(viewportId => { + const viewportElement = document.querySelector( + `[data-viewport-id="${viewportId}"]` + ) as HTMLDivElement; + if (viewportElement) { + this.createAnnotationInViewport(viewportElement, groupName, worldCoords); + } + }); + return; + } + + // Fallback: DOM + const viewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + viewports.forEach(vp => this.createAnnotationInViewport(vp, groupName, worldCoords)); + } catch (error) { + console.error('Error creating annotations for all viewports:', error); + } + } + + public updateAnnotationPositions(): void { + const allViewports = document.querySelectorAll( + '.cornerstone-viewport-element' + ) as NodeListOf; + + allViewports.forEach(viewportElement => { + const enabledElement = getEnabledElement(viewportElement); + if (!enabledElement) return; + + const viewportId = this.getViewportInfo(viewportElement); + + // Update annotations for this specific viewport + this.annotationsRef.forEach((annotation, annotationKey) => { + try { + // Check if this annotation belongs to this viewport + if (annotation.viewportId === viewportId) { + // Check if we're on the correct slice for this annotation + const currentSliceIndex = enabledElement.viewport.getSliceIndex(); + + if (currentSliceIndex === annotation.sliceIndex) { + // Show annotation and update position + const screenCoords = enabledElement.viewport.worldToCanvas([ + annotation.worldCoords[0], + annotation.worldCoords[1], + annotation.worldCoords[2] || 0, + ]); + + if (screenCoords && screenCoords.length >= 2) { + annotation.element.style.left = `${screenCoords[0]}px`; + annotation.element.style.top = `${screenCoords[1]}px`; + annotation.element.style.display = 'flex'; + } + } else { + // Hide annotation if we're on a different slice + annotation.element.style.display = 'none'; + } + } + } catch (error) { + console.error(`Error updating annotation position for ${annotationKey}:`, error); + } + }); + }); + } + + public getAnnotations(): Map { + return this.annotationsRef; + } +} diff --git a/extensions/autometrics/src/utils/textInputDialog.ts b/extensions/autometrics/src/utils/textInputDialog.ts new file mode 100644 index 00000000000..b9f5c89aa5d --- /dev/null +++ b/extensions/autometrics/src/utils/textInputDialog.ts @@ -0,0 +1,63 @@ +import { callInputDialog } from '@ohif/extension-default'; + +/** + * Shows a text input dialog for annotation text + * @param uiDialogService - The UI dialog service + * @param defaultValue - Default text value + * @param title - Dialog title + * @param placeholder - Input placeholder text + * @returns Promise that resolves to the entered text + */ +export async function showTextInputDialog({ + uiDialogService, + defaultValue = '', + title = 'Enter Annotation Text', + placeholder = 'Enter text for annotation', +}: { + uiDialogService: any; + defaultValue?: string; + title?: string; + placeholder?: string; +}): Promise { + try { + const text = await callInputDialog({ + uiDialogService, + defaultValue, + title, + placeholder, + submitOnEnter: true, + }); + + return text; + } catch (error) { + console.error('Error showing text input dialog:', error); + return defaultValue; + } +} + +/** + * Shows a text input dialog for editing existing annotation text + * @param uiDialogService - The UI dialog service + * @param currentText - Current annotation text + * @param title - Dialog title + * @param placeholder - Input placeholder text + * @returns Promise that resolves to the new text + */ +export async function showEditTextDialog({ + uiDialogService, + currentText = '', + title = 'Edit Annotation Text', + placeholder = 'Enter new text for annotation', +}: { + uiDialogService: any; + currentText?: string; + title?: string; + placeholder?: string; +}): Promise { + return showTextInputDialog({ + uiDialogService, + defaultValue: currentText, + title, + placeholder, + }); +} diff --git a/modes/autometrics/.webpack/webpack.dev.js b/modes/autometrics/.webpack/webpack.dev.js new file mode 100644 index 00000000000..1b8e34cfd13 --- /dev/null +++ b/modes/autometrics/.webpack/webpack.dev.js @@ -0,0 +1,12 @@ +const path = require('path'); +const webpackCommon = require('./../../../.webpack/webpack.base.js'); +const SRC_DIR = path.join(__dirname, '../src'); +const DIST_DIR = path.join(__dirname, '../dist'); + +const ENTRY = { + app: `${SRC_DIR}/index.ts`, +}; + +module.exports = (env, argv) => { + return webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); +}; diff --git a/modes/autometrics/.webpack/webpack.prod.js b/modes/autometrics/.webpack/webpack.prod.js new file mode 100644 index 00000000000..b60b8908ae2 --- /dev/null +++ b/modes/autometrics/.webpack/webpack.prod.js @@ -0,0 +1,53 @@ +const webpack = require('webpack'); +const { merge } = require('webpack-merge'); +const path = require('path'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +const pkg = require('./../package.json'); +const webpackCommon = require('./../../../.webpack/webpack.base.js'); + +const ROOT_DIR = path.join(__dirname, './../'); +const SRC_DIR = path.join(__dirname, '../src'); +const DIST_DIR = path.join(__dirname, '../dist'); +const ENTRY = { + app: `${SRC_DIR}/index.ts`, +}; + +module.exports = (env, argv) => { + const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); + + return merge(commonConfig, { + stats: { + colors: true, + hash: true, + timings: true, + assets: true, + chunks: false, + chunkModules: false, + modules: false, + children: false, + warnings: true, + }, + optimization: { + minimize: true, + sideEffects: false, + }, + output: { + path: ROOT_DIR, + library: 'ohif-mode-longitudinal', + libraryTarget: 'umd', + libraryExport: 'default', + filename: pkg.main, + }, + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], + plugins: [ + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + // new MiniCssExtractPlugin({ + // filename: './dist/[name].css', + // chunkFilename: './dist/[id].css', + // }), + ], + }); +}; diff --git a/modes/autometrics/CHANGELOG.md b/modes/autometrics/CHANGELOG.md new file mode 100644 index 00000000000..401430b4f60 --- /dev/null +++ b/modes/autometrics/CHANGELOG.md @@ -0,0 +1,4494 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [3.12.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.12.0-beta.1...v3.12.0-beta.2) (2025-08-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.12.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.12.0-beta.0...v3.12.0-beta.1) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.12.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.12.0-beta.0) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.115](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.114...v3.11.0-beta.115) (2025-07-31) + + +### Features + +* add support to scoord3d ([#5016](https://github.com/OHIF/Viewers/issues/5016)) ([735405a](https://github.com/OHIF/Viewers/commit/735405a8554c7ee6283faa83fc42ff8bb9ac34ff)) + + + + + +# [3.11.0-beta.114](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.113...v3.11.0-beta.114) (2025-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.113](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.112...v3.11.0-beta.113) (2025-07-30) + + +### Features + +* improve segment label ([#5217](https://github.com/OHIF/Viewers/issues/5217)) ([271b84f](https://github.com/OHIF/Viewers/commit/271b84f78fcc3974006c7e1a4dbb2ef322fdb9ec)) + + + + + +# [3.11.0-beta.112](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.111...v3.11.0-beta.112) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.110...v3.11.0-beta.111) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.109...v3.11.0-beta.110) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.108...v3.11.0-beta.109) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.107...v3.11.0-beta.108) (2025-07-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.106...v3.11.0-beta.107) (2025-07-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.105...v3.11.0-beta.106) (2025-07-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.104...v3.11.0-beta.105) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.103...v3.11.0-beta.104) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.102...v3.11.0-beta.103) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.101...v3.11.0-beta.102) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.100...v3.11.0-beta.101) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.99...v3.11.0-beta.100) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.98...v3.11.0-beta.99) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.97...v3.11.0-beta.98) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.96...v3.11.0-beta.97) (2025-07-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.95...v3.11.0-beta.96) (2025-07-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.94...v3.11.0-beta.95) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.93...v3.11.0-beta.94) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.92...v3.11.0-beta.93) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.91...v3.11.0-beta.92) (2025-07-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.90...v3.11.0-beta.91) (2025-07-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.89...v3.11.0-beta.90) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.88...v3.11.0-beta.89) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.87...v3.11.0-beta.88) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.86...v3.11.0-beta.87) (2025-07-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.85...v3.11.0-beta.86) (2025-07-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.84...v3.11.0-beta.85) (2025-07-14) + + +### Features + +* **viewport:** Enhance Orientation Menu with Reformat Option and UI Improvements ([#5184](https://github.com/OHIF/Viewers/issues/5184)) ([c175837](https://github.com/OHIF/Viewers/commit/c175837273e664318fe51c426d98e4989f55b050)) + + + + + +# [3.11.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.83...v3.11.0-beta.84) (2025-07-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.82...v3.11.0-beta.83) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.81...v3.11.0-beta.82) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.80...v3.11.0-beta.81) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.79...v3.11.0-beta.80) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.78...v3.11.0-beta.79) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.77...v3.11.0-beta.78) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.76...v3.11.0-beta.77) (2025-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.75...v3.11.0-beta.76) (2025-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.74...v3.11.0-beta.75) (2025-07-09) + + +### Features + +* add segment label tool ([#5164](https://github.com/OHIF/Viewers/issues/5164)) ([ac85248](https://github.com/OHIF/Viewers/commit/ac852485cd5063122bcb9c0fbcca9f9cfb47d3f2)) + + + + + +# [3.11.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.73...v3.11.0-beta.74) (2025-07-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.72...v3.11.0-beta.73) (2025-07-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.71...v3.11.0-beta.72) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.70...v3.11.0-beta.71) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.69...v3.11.0-beta.70) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.68...v3.11.0-beta.69) (2025-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.67...v3.11.0-beta.68) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.66...v3.11.0-beta.67) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.65...v3.11.0-beta.66) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.64...v3.11.0-beta.65) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.63...v3.11.0-beta.64) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.62...v3.11.0-beta.63) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.61...v3.11.0-beta.62) (2025-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.60...v3.11.0-beta.61) (2025-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.59...v3.11.0-beta.60) (2025-06-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.58...v3.11.0-beta.59) (2025-06-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.57...v3.11.0-beta.58) (2025-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.56...v3.11.0-beta.57) (2025-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.55...v3.11.0-beta.56) (2025-06-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.54...v3.11.0-beta.55) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.53...v3.11.0-beta.54) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.52...v3.11.0-beta.53) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.51...v3.11.0-beta.52) (2025-06-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.50...v3.11.0-beta.51) (2025-06-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.49...v3.11.0-beta.50) (2025-06-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.48...v3.11.0-beta.49) (2025-06-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.47...v3.11.0-beta.48) (2025-06-05) + + +### Bug Fixes + +* **touch:** Allow for multi-touch in OHIF ([#5099](https://github.com/OHIF/Viewers/issues/5099)) ([1a6aa09](https://github.com/OHIF/Viewers/commit/1a6aa09a7708c943af3a1d920489311b3a0ee5da)) + + + + + +# [3.11.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.46...v3.11.0-beta.47) (2025-06-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.45...v3.11.0-beta.46) (2025-06-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.44...v3.11.0-beta.45) (2025-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.43...v3.11.0-beta.44) (2025-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.42...v3.11.0-beta.43) (2025-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.41...v3.11.0-beta.42) (2025-05-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.40...v3.11.0-beta.41) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.39...v3.11.0-beta.40) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.38...v3.11.0-beta.39) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.37...v3.11.0-beta.38) (2025-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.36...v3.11.0-beta.37) (2025-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.35...v3.11.0-beta.36) (2025-05-16) + + +### Bug Fixes + +* backward compatibility with toolbar service ([#5052](https://github.com/OHIF/Viewers/issues/5052)) ([9b1b501](https://github.com/OHIF/Viewers/commit/9b1b501d83502d13b285050bd5fca102b7f7612c)) + + + + + +# [3.11.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.34...v3.11.0-beta.35) (2025-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.33...v3.11.0-beta.34) (2025-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.32...v3.11.0-beta.33) (2025-05-15) + + +### Features + +* **actions:** simplify action corner api through the toolbarService ([#5033](https://github.com/OHIF/Viewers/issues/5033)) ([7c15bb8](https://github.com/OHIF/Viewers/commit/7c15bb8901001eefedc72498176ac24f6662bfab)) + + + + + +# [3.11.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.31...v3.11.0-beta.32) (2025-05-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.30...v3.11.0-beta.31) (2025-05-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.29...v3.11.0-beta.30) (2025-05-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.28...v3.11.0-beta.29) (2025-05-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.27...v3.11.0-beta.28) (2025-05-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.26...v3.11.0-beta.27) (2025-05-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.25...v3.11.0-beta.26) (2025-05-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.24...v3.11.0-beta.25) (2025-05-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.23...v3.11.0-beta.24) (2025-05-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.22...v3.11.0-beta.23) (2025-05-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.21...v3.11.0-beta.22) (2025-05-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.20...v3.11.0-beta.21) (2025-05-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.19...v3.11.0-beta.20) (2025-05-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.18...v3.11.0-beta.19) (2025-05-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.17...v3.11.0-beta.18) (2025-04-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.16...v3.11.0-beta.17) (2025-04-29) + + +### Bug Fixes + +* **referencelines:** and bring back the notification for worker updates but disallow duplication ([#5005](https://github.com/OHIF/Viewers/issues/5005)) ([98f8187](https://github.com/OHIF/Viewers/commit/98f8187dfeb8aec6eca145da75c855aec0da4e1d)) + + + + + +# [3.11.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.15...v3.11.0-beta.16) (2025-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.14...v3.11.0-beta.15) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.13...v3.11.0-beta.14) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.12...v3.11.0-beta.13) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.11...v3.11.0-beta.12) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.10...v3.11.0-beta.11) (2025-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.9...v3.11.0-beta.10) (2025-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.8...v3.11.0-beta.9) (2025-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.7...v3.11.0-beta.8) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.6...v3.11.0-beta.7) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.5...v3.11.0-beta.6) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.4...v3.11.0-beta.5) (2025-04-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.3...v3.11.0-beta.4) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.2...v3.11.0-beta.3) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.1...v3.11.0-beta.2) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.0...v3.11.0-beta.1) (2025-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.159...v3.11.0-beta.0) (2025-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.159](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.158...v3.10.0-beta.159) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.158](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.157...v3.10.0-beta.158) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.157](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.156...v3.10.0-beta.157) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.156](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.155...v3.10.0-beta.156) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.155](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.154...v3.10.0-beta.155) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.154](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.153...v3.10.0-beta.154) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.153](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.152...v3.10.0-beta.153) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.152](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.151...v3.10.0-beta.152) (2025-04-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.151](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.150...v3.10.0-beta.151) (2025-04-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.150](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.149...v3.10.0-beta.150) (2025-04-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.149](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.148...v3.10.0-beta.149) (2025-04-04) + + +### Features + +* **image capture:** Enhance SEG and RTSS Support with Dependency Updates and Bug Fixes ([#4924](https://github.com/OHIF/Viewers/issues/4924)) ([fc33bd0](https://github.com/OHIF/Viewers/commit/fc33bd0d594a1ac8de79b11080ead48630a8ca27)) + + + + + +# [3.10.0-beta.148](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.147...v3.10.0-beta.148) (2025-04-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.147](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.146...v3.10.0-beta.147) (2025-04-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.146](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.145...v3.10.0-beta.146) (2025-04-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.145](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.144...v3.10.0-beta.145) (2025-04-02) + + +### Bug Fixes + +* **seg:** Enhance segmentation tools and UI, refactor code, and update dependencies ([#4915](https://github.com/OHIF/Viewers/issues/4915)) ([8432d5f](https://github.com/OHIF/Viewers/commit/8432d5f6330b300ac6760b32372be382210ed05b)) + + + + + +# [3.10.0-beta.144](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.143...v3.10.0-beta.144) (2025-04-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.143](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.142...v3.10.0-beta.143) (2025-04-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.142](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.141...v3.10.0-beta.142) (2025-03-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.141](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.140...v3.10.0-beta.141) (2025-03-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.140](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.139...v3.10.0-beta.140) (2025-03-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.139](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.138...v3.10.0-beta.139) (2025-03-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.138](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.137...v3.10.0-beta.138) (2025-03-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.137](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.136...v3.10.0-beta.137) (2025-03-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.136](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.135...v3.10.0-beta.136) (2025-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.135](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.134...v3.10.0-beta.135) (2025-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.134](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.133...v3.10.0-beta.134) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.133](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.132...v3.10.0-beta.133) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.132](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.131...v3.10.0-beta.132) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.131](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.130...v3.10.0-beta.131) (2025-03-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.130](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.129...v3.10.0-beta.130) (2025-03-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.129](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.128...v3.10.0-beta.129) (2025-03-18) + + +### Features + +* overlapping segments ([#4849](https://github.com/OHIF/Viewers/issues/4849)) ([55d6393](https://github.com/OHIF/Viewers/commit/55d6393a3f3ed5b961809f77bf13a84da3c10be8)) + + + + + +# [3.10.0-beta.128](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.127...v3.10.0-beta.128) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.127](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.126...v3.10.0-beta.127) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.126](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.125...v3.10.0-beta.126) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.125](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.124...v3.10.0-beta.125) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.124](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.123...v3.10.0-beta.124) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.123](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.122...v3.10.0-beta.123) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.122](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.121...v3.10.0-beta.122) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.121](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.120...v3.10.0-beta.121) (2025-03-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.120](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.119...v3.10.0-beta.120) (2025-03-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.119](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.118...v3.10.0-beta.119) (2025-03-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.118](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.117...v3.10.0-beta.118) (2025-03-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.117](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.116...v3.10.0-beta.117) (2025-03-07) + + +### Features + +* **toolbox:** Refactor Toolbar and Toolbox to enable sections ([#4825](https://github.com/OHIF/Viewers/issues/4825)) ([cc5cdfb](https://github.com/OHIF/Viewers/commit/cc5cdfb08158eaa1fa576875f959a665e72f9d5e)) + + + + + +# [3.10.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.115...v3.10.0-beta.116) (2025-03-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.115](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.114...v3.10.0-beta.115) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.114](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.113...v3.10.0-beta.114) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.113](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.112...v3.10.0-beta.113) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.112](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.111...v3.10.0-beta.112) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.110...v3.10.0-beta.111) (2025-02-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.109...v3.10.0-beta.110) (2025-02-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.108...v3.10.0-beta.109) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.107...v3.10.0-beta.108) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.106...v3.10.0-beta.107) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.105...v3.10.0-beta.106) (2025-02-25) + + +### Features + +* **hotkeys:** Migrate hotkeys to customization service and fix issues with overrides ([#4777](https://github.com/OHIF/Viewers/issues/4777)) ([3e6913b](https://github.com/OHIF/Viewers/commit/3e6913b097569280a5cc2fa5bbe4add52f149305)) + + + + + +# [3.10.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.104...v3.10.0-beta.105) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.103...v3.10.0-beta.104) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.102...v3.10.0-beta.103) (2025-02-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.101...v3.10.0-beta.102) (2025-02-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.100...v3.10.0-beta.101) (2025-02-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.99...v3.10.0-beta.100) (2025-02-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.98...v3.10.0-beta.99) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.97...v3.10.0-beta.98) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.96...v3.10.0-beta.97) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.95...v3.10.0-beta.96) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.94...v3.10.0-beta.95) (2025-02-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.93...v3.10.0-beta.94) (2025-02-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.92...v3.10.0-beta.93) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.91...v3.10.0-beta.92) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.90...v3.10.0-beta.91) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.89...v3.10.0-beta.90) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.88...v3.10.0-beta.89) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.87...v3.10.0-beta.88) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.86...v3.10.0-beta.87) (2025-02-03) + + +### Bug Fixes + +* **measurement label auto-completion:** Customization of measurement label auto-completion fails for measurements following arrow annotations. ([#4739](https://github.com/OHIF/Viewers/issues/4739)) ([e035ef1](https://github.com/OHIF/Viewers/commit/e035ef1dcc72ecbe2a757e3b814551d768d7e610)) + + + + + +# [3.10.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.85...v3.10.0-beta.86) (2025-02-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.84...v3.10.0-beta.85) (2025-02-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.83...v3.10.0-beta.84) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.82...v3.10.0-beta.83) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.81...v3.10.0-beta.82) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.80...v3.10.0-beta.81) (2025-01-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.79...v3.10.0-beta.80) (2025-01-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.78...v3.10.0-beta.79) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.77...v3.10.0-beta.78) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.76...v3.10.0-beta.77) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.75...v3.10.0-beta.76) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.74...v3.10.0-beta.75) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.73...v3.10.0-beta.74) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.72...v3.10.0-beta.73) (2025-01-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.71...v3.10.0-beta.72) (2025-01-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.70...v3.10.0-beta.71) (2025-01-23) + + +### Features + +* **customization:** new customization service api ([#4688](https://github.com/OHIF/Viewers/issues/4688)) ([55ad8ef](https://github.com/OHIF/Viewers/commit/55ad8efbabc3fabd8031fc08927b2f92ae5aec69)) + + + + + +# [3.10.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.69...v3.10.0-beta.70) (2025-01-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.68...v3.10.0-beta.69) (2025-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.67...v3.10.0-beta.68) (2025-01-21) + + +### Features + +* **resizable-side-panels:** Make the left and right side panels (optionally) resizable. ([#4672](https://github.com/OHIF/Viewers/issues/4672)) ([d90a4cf](https://github.com/OHIF/Viewers/commit/d90a4cfb16cc0daed9b905de9780f44cca1323f9)) + + + + + +# [3.10.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.66...v3.10.0-beta.67) (2025-01-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.65...v3.10.0-beta.66) (2025-01-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.64...v3.10.0-beta.65) (2025-01-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.63...v3.10.0-beta.64) (2025-01-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.62...v3.10.0-beta.63) (2025-01-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.61...v3.10.0-beta.62) (2025-01-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.60...v3.10.0-beta.61) (2025-01-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.59...v3.10.0-beta.60) (2025-01-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.58...v3.10.0-beta.59) (2025-01-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.57...v3.10.0-beta.58) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.56...v3.10.0-beta.57) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.55...v3.10.0-beta.56) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.54...v3.10.0-beta.55) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.53...v3.10.0-beta.54) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.52...v3.10.0-beta.53) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.51...v3.10.0-beta.52) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.50...v3.10.0-beta.51) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.49...v3.10.0-beta.50) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.48...v3.10.0-beta.49) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.47...v3.10.0-beta.48) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.46...v3.10.0-beta.47) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.45...v3.10.0-beta.46) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.44...v3.10.0-beta.45) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.43...v3.10.0-beta.44) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.42...v3.10.0-beta.43) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.41...v3.10.0-beta.42) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.40...v3.10.0-beta.41) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.39...v3.10.0-beta.40) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.38...v3.10.0-beta.39) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.37...v3.10.0-beta.38) (2025-01-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.36...v3.10.0-beta.37) (2025-01-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.35...v3.10.0-beta.36) (2025-01-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.34...v3.10.0-beta.35) (2025-01-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.33...v3.10.0-beta.34) (2025-01-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.32...v3.10.0-beta.33) (2024-12-20) + + +### Bug Fixes + +* **tools:** enable additional tools in volume viewport ([#4620](https://github.com/OHIF/Viewers/issues/4620)) ([1992002](https://github.com/OHIF/Viewers/commit/1992002d2dced171c17b9a0163baf707fc551e3d)) + + + + + +# [3.10.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.31...v3.10.0-beta.32) (2024-12-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.30...v3.10.0-beta.31) (2024-12-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.29...v3.10.0-beta.30) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.28...v3.10.0-beta.29) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.27...v3.10.0-beta.28) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.26...v3.10.0-beta.27) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.25...v3.10.0-beta.26) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.24...v3.10.0-beta.25) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.23...v3.10.0-beta.24) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.22...v3.10.0-beta.23) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.21...v3.10.0-beta.22) (2024-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.20...v3.10.0-beta.21) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.19...v3.10.0-beta.20) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.18...v3.10.0-beta.19) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.17...v3.10.0-beta.18) (2024-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.16...v3.10.0-beta.17) (2024-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.15...v3.10.0-beta.16) (2024-12-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.14...v3.10.0-beta.15) (2024-12-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.13...v3.10.0-beta.14) (2024-12-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.12...v3.10.0-beta.13) (2024-12-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.11...v3.10.0-beta.12) (2024-11-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.10...v3.10.0-beta.11) (2024-11-28) + + +### Bug Fixes + +* **multiframe:** metadata handling of NM studies and loading order ([#4554](https://github.com/OHIF/Viewers/issues/4554)) ([7624ccb](https://github.com/OHIF/Viewers/commit/7624ccb5e495c0a151227a458d8d5bfb8babb22c)) + + + + + +# [3.10.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.9...v3.10.0-beta.10) (2024-11-28) + + +### Features + +* **segmentation:** Enhance dropdown menu functionality in SegmentationTable ([#4553](https://github.com/OHIF/Viewers/issues/4553)) ([397fd85](https://github.com/OHIF/Viewers/commit/397fd856539cd3b949a9614a9ea32d0d04a90000)) + + + + + +# [3.10.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.8...v3.10.0-beta.9) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.7...v3.10.0-beta.8) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.6...v3.10.0-beta.7) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.5...v3.10.0-beta.6) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.4...v3.10.0-beta.5) (2024-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.3...v3.10.0-beta.4) (2024-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.2...v3.10.0-beta.3) (2024-11-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.1...v3.10.0-beta.2) (2024-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.0...v3.10.0-beta.1) (2024-11-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.111...v3.10.0-beta.0) (2024-11-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.110...v3.9.0-beta.111) (2024-11-12) + + +### Bug Fixes + +* Measurement Tracking: Various UI and functionality improvements ([#4481](https://github.com/OHIF/Viewers/issues/4481)) ([62b2748](https://github.com/OHIF/Viewers/commit/62b27488471c9d5979142e2d15872a85778b90ed)) + + + + + +# [3.9.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.109...v3.9.0-beta.110) (2024-11-11) + + +### Bug Fixes + +* **bugs:** Update dependencies and enhance UI components ([#4478](https://github.com/OHIF/Viewers/issues/4478)) ([05d41c5](https://github.com/OHIF/Viewers/commit/05d41c52068a3b7ba249f15ecdf71838c352fd30)) + + + + + +# [3.9.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.108...v3.9.0-beta.109) (2024-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.107...v3.9.0-beta.108) (2024-11-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.106...v3.9.0-beta.107) (2024-11-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.105...v3.9.0-beta.106) (2024-11-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.104...v3.9.0-beta.105) (2024-11-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.103...v3.9.0-beta.104) (2024-10-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.102...v3.9.0-beta.103) (2024-10-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.101...v3.9.0-beta.102) (2024-10-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.100...v3.9.0-beta.101) (2024-10-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.99...v3.9.0-beta.100) (2024-10-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.98...v3.9.0-beta.99) (2024-10-17) + + +### Features + +* **SR:** SCOORD3D point annotations support for stack viewports ([#4315](https://github.com/OHIF/Viewers/issues/4315)) ([ac1cad2](https://github.com/OHIF/Viewers/commit/ac1cad25af12ee0f7d508647e3134ed724d9b4d3)) + + + + + +# [3.9.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.97...v3.9.0-beta.98) (2024-10-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.96...v3.9.0-beta.97) (2024-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.95...v3.9.0-beta.96) (2024-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.94...v3.9.0-beta.95) (2024-10-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.93...v3.9.0-beta.94) (2024-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.92...v3.9.0-beta.93) (2024-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.91...v3.9.0-beta.92) (2024-10-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.90...v3.9.0-beta.91) (2024-10-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.89...v3.9.0-beta.90) (2024-09-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.88...v3.9.0-beta.89) (2024-09-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.87...v3.9.0-beta.88) (2024-09-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.86...v3.9.0-beta.87) (2024-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.85...v3.9.0-beta.86) (2024-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.84...v3.9.0-beta.85) (2024-09-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.83...v3.9.0-beta.84) (2024-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.82...v3.9.0-beta.83) (2024-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.81...v3.9.0-beta.82) (2024-09-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.80...v3.9.0-beta.81) (2024-08-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.79...v3.9.0-beta.80) (2024-08-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.78...v3.9.0-beta.79) (2024-08-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.77...v3.9.0-beta.78) (2024-08-15) + + +### Features + +* Add CS3D WSI and Video Viewports and add annotation navigation for MPR ([#4182](https://github.com/OHIF/Viewers/issues/4182)) ([7599ec9](https://github.com/OHIF/Viewers/commit/7599ec9421129dcade94e6fa6ec7908424ab3134)) + + + + + +# [3.9.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.76...v3.9.0-beta.77) (2024-08-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.75...v3.9.0-beta.76) (2024-08-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.74...v3.9.0-beta.75) (2024-08-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.73...v3.9.0-beta.74) (2024-08-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.72...v3.9.0-beta.73) (2024-08-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.71...v3.9.0-beta.72) (2024-07-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.70...v3.9.0-beta.71) (2024-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.69...v3.9.0-beta.70) (2024-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.68...v3.9.0-beta.69) (2024-07-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.67...v3.9.0-beta.68) (2024-07-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.66...v3.9.0-beta.67) (2024-07-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.65...v3.9.0-beta.66) (2024-07-24) + + +### Features + +* **pmap:** added support for parametric map ([#4284](https://github.com/OHIF/Viewers/issues/4284)) ([fc0064f](https://github.com/OHIF/Viewers/commit/fc0064fd9d8cdc8fde81b81f0e71fd5d077ca22b)) + + + + + +# [3.9.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.64...v3.9.0-beta.65) (2024-07-23) + + +### Features + +* **SR:** text structured report (TEXT, CODE, NUM, PNAME, DATE, TIME and DATETIME) ([#4287](https://github.com/OHIF/Viewers/issues/4287)) ([246ebab](https://github.com/OHIF/Viewers/commit/246ebab6ebf5431a704a1861a5804045b9644ba4)) + + + + + +# [3.9.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.63...v3.9.0-beta.64) (2024-07-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.62...v3.9.0-beta.63) (2024-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.61...v3.9.0-beta.62) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.60...v3.9.0-beta.61) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.59...v3.9.0-beta.60) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.58...v3.9.0-beta.59) (2024-07-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.57...v3.9.0-beta.58) (2024-07-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.56...v3.9.0-beta.57) (2024-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.55...v3.9.0-beta.56) (2024-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.54...v3.9.0-beta.55) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.53...v3.9.0-beta.54) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.52...v3.9.0-beta.53) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.51...v3.9.0-beta.52) (2024-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.50...v3.9.0-beta.51) (2024-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.49...v3.9.0-beta.50) (2024-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.48...v3.9.0-beta.49) (2024-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.47...v3.9.0-beta.48) (2024-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.46...v3.9.0-beta.47) (2024-06-21) + + +### Features + +* **sort:** custom series sort in study panel ([#4214](https://github.com/OHIF/Viewers/issues/4214)) ([a433d40](https://github.com/OHIF/Viewers/commit/a433d406e2cac13f644203996c682260b54e8865)) + + + + + +# [3.9.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.45...v3.9.0-beta.46) (2024-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.44...v3.9.0-beta.45) (2024-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.43...v3.9.0-beta.44) (2024-06-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.42...v3.9.0-beta.43) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.41...v3.9.0-beta.42) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.40...v3.9.0-beta.41) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.39...v3.9.0-beta.40) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.38...v3.9.0-beta.39) (2024-06-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.37...v3.9.0-beta.38) (2024-06-07) + + +### Bug Fixes + +* **window-level:** move window level region to more tools menu ([#4215](https://github.com/OHIF/Viewers/issues/4215)) ([33f4c18](https://github.com/OHIF/Viewers/commit/33f4c18f2687d30a250fe7183df3daae8394a984)) + + + + + +# [3.9.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.36...v3.9.0-beta.37) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.35...v3.9.0-beta.36) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.34...v3.9.0-beta.35) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.33...v3.9.0-beta.34) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.32...v3.9.0-beta.33) (2024-06-05) + + +### Features + +* **window-level-region:** add window level region tool ([#4127](https://github.com/OHIF/Viewers/issues/4127)) ([ab1a18a](https://github.com/OHIF/Viewers/commit/ab1a18af5a5b0f9086c080ed81c8fda9bfaa975b)) + + + + + +# [3.9.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.31...v3.9.0-beta.32) (2024-05-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.30...v3.9.0-beta.31) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.29...v3.9.0-beta.30) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.28...v3.9.0-beta.29) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.27...v3.9.0-beta.28) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.26...v3.9.0-beta.27) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.25...v3.9.0-beta.26) (2024-05-29) + + +### Features + +* **hp:** Add displayArea option for Hanging protocols and example with Mamo([#3808](https://github.com/OHIF/Viewers/issues/3808)) ([18ac08e](https://github.com/OHIF/Viewers/commit/18ac08ed860d119721c52e4ffc270332259100b6)) + + + + + +# [3.9.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.24...v3.9.0-beta.25) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.23...v3.9.0-beta.24) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.22...v3.9.0-beta.23) (2024-05-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.21...v3.9.0-beta.22) (2024-05-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.20...v3.9.0-beta.21) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.19...v3.9.0-beta.20) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.18...v3.9.0-beta.19) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.17...v3.9.0-beta.18) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.16...v3.9.0-beta.17) (2024-05-23) + + +### Bug Fixes + +* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([73d9e99](https://github.com/OHIF/Viewers/commit/73d9e99d5d6f38ab6c36f4471d54f18798feacb4)) + + + + + +# [3.9.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.15...v3.9.0-beta.16) (2024-05-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.14...v3.9.0-beta.15) (2024-05-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.13...v3.9.0-beta.14) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.12...v3.9.0-beta.13) (2024-05-21) + + +### Features + +* **rt:** allow rendering of points in RT Struct ([#4128](https://github.com/OHIF/Viewers/issues/4128)) ([5903b07](https://github.com/OHIF/Viewers/commit/5903b0749aa41112d2e991bf53ed29b1fd7bd13f)) + + + + + +# [3.9.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.11...v3.9.0-beta.12) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.10...v3.9.0-beta.11) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.9...v3.9.0-beta.10) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.8...v3.9.0-beta.9) (2024-05-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.7...v3.9.0-beta.8) (2024-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.6...v3.9.0-beta.7) (2024-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.5...v3.9.0-beta.6) (2024-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.4...v3.9.0-beta.5) (2024-05-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.3...v3.9.0-beta.4) (2024-05-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.2...v3.9.0-beta.3) (2024-05-08) + + +### Features + +* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([374065b](https://github.com/OHIF/Viewers/commit/374065bc3bad9d212f9817a8d41546cc64cfabfb)) + + + + + +# [3.9.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.1...v3.9.0-beta.2) (2024-05-06) + + +### Bug Fixes + +* **bugs:** enhancements and bugs in several areas ([#4086](https://github.com/OHIF/Viewers/issues/4086)) ([730f434](https://github.com/OHIF/Viewers/commit/730f4349100f21b4489a21707dbb2dca9dbfbba2)) + + + + + +# [3.9.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.0...v3.9.0-beta.1) (2024-05-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.94...v3.9.0-beta.0) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0-beta.94) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.91...v3.8.0-beta.92) (2024-04-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.90...v3.8.0-beta.91) (2024-04-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.89...v3.8.0-beta.90) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.88...v3.8.0-beta.89) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.87...v3.8.0-beta.88) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.86...v3.8.0-beta.87) (2024-04-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.85...v3.8.0-beta.86) (2024-04-19) + + +### Bug Fixes + +* **layouts:** and fix thumbnail in touch and update migration guide for 3.8 release ([#4052](https://github.com/OHIF/Viewers/issues/4052)) ([d250d04](https://github.com/OHIF/Viewers/commit/d250d04580883446fcb8d748b2a97c5c198922af)) + + + + + +# [3.8.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.84...v3.8.0-beta.85) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.83...v3.8.0-beta.84) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.82...v3.8.0-beta.83) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.81...v3.8.0-beta.82) (2024-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.80...v3.8.0-beta.81) (2024-04-16) + + +### Bug Fixes + +* **viewport:** Reset viewport state and fix CINE looping, thumbnail resolution, and dynamic tool settings ([#4037](https://github.com/OHIF/Viewers/issues/4037)) ([f99a0bf](https://github.com/OHIF/Viewers/commit/f99a0bfb31434aa137bbb3ed1f9eef1dfcc09025)) + + + + + +# [3.8.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.79...v3.8.0-beta.80) (2024-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.78...v3.8.0-beta.79) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.77...v3.8.0-beta.78) (2024-04-10) + + +### Bug Fixes + +* **general:** enhancements and bug fixes ([#4018](https://github.com/OHIF/Viewers/issues/4018)) ([2b83393](https://github.com/OHIF/Viewers/commit/2b83393f91cb16ea06821d79d14ff60f80c29c90)) + + + + + +# [3.8.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.76...v3.8.0-beta.77) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.75...v3.8.0-beta.76) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.74...v3.8.0-beta.75) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.73...v3.8.0-beta.74) (2024-04-10) + + +### Features + +* **4D:** Add 4D dynamic volume rendering and new pre-clinical 4d pt/ct mode ([#3664](https://github.com/OHIF/Viewers/issues/3664)) ([d57e8bc](https://github.com/OHIF/Viewers/commit/d57e8bc1571c6da4effaa492ee2d162c552365a2)) + + + + + +# [3.8.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.72...v3.8.0-beta.73) (2024-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.71...v3.8.0-beta.72) (2024-04-05) + + +### Bug Fixes + +* **cornerstone-dicom-sr:** Freehand SR hydration support ([#3996](https://github.com/OHIF/Viewers/issues/3996)) ([5645ac1](https://github.com/OHIF/Viewers/commit/5645ac1b271e1ed8c57f5d71100809362447267e)) + + + + + +# [3.8.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.70...v3.8.0-beta.71) (2024-04-05) + + +### Features + +* **advanced-roi-tools:** new tools and icon updates and overlay bug fixes ([#4014](https://github.com/OHIF/Viewers/issues/4014)) ([cea27d4](https://github.com/OHIF/Viewers/commit/cea27d438d1de2c1ec90cbaefdc2b31a1d9980a1)) + + + + + +# [3.8.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.69...v3.8.0-beta.70) (2024-04-05) + + +### Features + +* **measurement:** Add support measurement label autocompletion ([#3855](https://github.com/OHIF/Viewers/issues/3855)) ([56b1eae](https://github.com/OHIF/Viewers/commit/56b1eae6356a6534960df1196bdd1e95b0a9a470)) + + + + + +# [3.8.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.68...v3.8.0-beta.69) (2024-04-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.67...v3.8.0-beta.68) (2024-04-03) + + +### Features + +* **segmentation:** Enhanced segmentation panel design for TMTV ([#3988](https://github.com/OHIF/Viewers/issues/3988)) ([9f3235f](https://github.com/OHIF/Viewers/commit/9f3235ff096636aafa88d8a42859e8dc85d9036d)) + + + + + +# [3.8.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.66...v3.8.0-beta.67) (2024-04-02) + + +### Features + +* **ViewportActionMenu:** window level per viewport / new patient info / colorbars/ 3D presets and 3D volume rendering ([#3963](https://github.com/OHIF/Viewers/issues/3963)) ([b7f90e3](https://github.com/OHIF/Viewers/commit/b7f90e3951845396f99b69f0a74fc56b2ffeada1)) + + + + + +# [3.8.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.65...v3.8.0-beta.66) (2024-03-28) + + +### Bug Fixes + +* **new layout:** address black screen bugs ([#4008](https://github.com/OHIF/Viewers/issues/4008)) ([158a181](https://github.com/OHIF/Viewers/commit/158a1816703e0ad66cae08cb9bd1ffb93bbd8d43)) + + + + + +# [3.8.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.64...v3.8.0-beta.65) (2024-03-28) + + +### Features + +* **layout:** new layout selector with 3D volume rendering ([#3923](https://github.com/OHIF/Viewers/issues/3923)) ([617043f](https://github.com/OHIF/Viewers/commit/617043fe0da5de91fbea4ac33a27f1df16ae1ca6)) + + + + + +# [3.8.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.63...v3.8.0-beta.64) (2024-03-27) + + +### Features + +* **toolbar:** new Toolbar to enable reactive state synchronization ([#3983](https://github.com/OHIF/Viewers/issues/3983)) ([566b25a](https://github.com/OHIF/Viewers/commit/566b25a54425399096864bd263193646556011a5)) + + + + + +# [3.8.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.62...v3.8.0-beta.63) (2024-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.61...v3.8.0-beta.62) (2024-03-19) + + +### Features + +* **worklist:** New worklist buttons and tooltips ([#3989](https://github.com/OHIF/Viewers/issues/3989)) ([9bcd1ae](https://github.com/OHIF/Viewers/commit/9bcd1ae6f51d61786cc1e99624f396b56a47cd69)) + + + + + +# [3.8.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.60...v3.8.0-beta.61) (2024-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.59...v3.8.0-beta.60) (2024-03-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.58...v3.8.0-beta.59) (2024-03-08) + + +### Bug Fixes + +* **cli:** mode creation template ([#3876](https://github.com/OHIF/Viewers/issues/3876)) ([#3981](https://github.com/OHIF/Viewers/issues/3981)) ([e485d68](https://github.com/OHIF/Viewers/commit/e485d68fd4619ce7187113cbe59e47f9523dbcc8)) + + + + + +# [3.8.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.57...v3.8.0-beta.58) (2024-03-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.56...v3.8.0-beta.57) (2024-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.55...v3.8.0-beta.56) (2024-02-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.54...v3.8.0-beta.55) (2024-02-21) + + +### Features + +* **resize:** Optimize resizing process and maintain zoom level ([#3889](https://github.com/OHIF/Viewers/issues/3889)) ([b3a0faf](https://github.com/OHIF/Viewers/commit/b3a0faf5f5f0a1993b2b017eb4cc1216164ea2c6)) + + + + + +# [3.8.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.53...v3.8.0-beta.54) (2024-02-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.52...v3.8.0-beta.53) (2024-02-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.51...v3.8.0-beta.52) (2024-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.50...v3.8.0-beta.51) (2024-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.49...v3.8.0-beta.50) (2024-01-22) + + +### Bug Fixes + +* **viewport-sync:** remember synced viewports bw stack and volume and RENAME StackImageSync to ImageSliceSync ([#3849](https://github.com/OHIF/Viewers/issues/3849)) ([e4a116b](https://github.com/OHIF/Viewers/commit/e4a116b074fcb85c8cbcc9db44fdec565f3386db)) + + + + + +# [3.8.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.48...v3.8.0-beta.49) (2024-01-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.47...v3.8.0-beta.48) (2024-01-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.46...v3.8.0-beta.47) (2024-01-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.45...v3.8.0-beta.46) (2024-01-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.44...v3.8.0-beta.45) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.43...v3.8.0-beta.44) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.42...v3.8.0-beta.43) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.41...v3.8.0-beta.42) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.40...v3.8.0-beta.41) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.39...v3.8.0-beta.40) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.38...v3.8.0-beta.39) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.37...v3.8.0-beta.38) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.36...v3.8.0-beta.37) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.35...v3.8.0-beta.36) (2023-12-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.34...v3.8.0-beta.35) (2023-12-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.33...v3.8.0-beta.34) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.32...v3.8.0-beta.33) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.31...v3.8.0-beta.32) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.30...v3.8.0-beta.31) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.29...v3.8.0-beta.30) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.28...v3.8.0-beta.29) (2023-12-13) + + +### Features + +* **config:** Add activateViewportBeforeInteraction parameter for viewport interaction customization ([#3847](https://github.com/OHIF/Viewers/issues/3847)) ([f707b4e](https://github.com/OHIF/Viewers/commit/f707b4ebc996f379cd30337badc06b07e6e35ac5)) +* **i18n:** enhanced i18n support ([#3761](https://github.com/OHIF/Viewers/issues/3761)) ([d14a8f0](https://github.com/OHIF/Viewers/commit/d14a8f0199db95cd9e85866a011b64d6bf830d57)) + + + + + +# [3.8.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.27...v3.8.0-beta.28) (2023-12-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.26...v3.8.0-beta.27) (2023-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.25...v3.8.0-beta.26) (2023-11-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.24...v3.8.0-beta.25) (2023-11-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.23...v3.8.0-beta.24) (2023-11-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.22...v3.8.0-beta.23) (2023-11-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.21...v3.8.0-beta.22) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.20...v3.8.0-beta.21) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.19...v3.8.0-beta.20) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.18...v3.8.0-beta.19) (2023-11-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.17...v3.8.0-beta.18) (2023-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.16...v3.8.0-beta.17) (2023-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.15...v3.8.0-beta.16) (2023-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.14...v3.8.0-beta.15) (2023-11-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.13...v3.8.0-beta.14) (2023-11-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.12...v3.8.0-beta.13) (2023-11-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.11...v3.8.0-beta.12) (2023-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.10...v3.8.0-beta.11) (2023-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.9...v3.8.0-beta.10) (2023-11-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.8...v3.8.0-beta.9) (2023-11-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.7...v3.8.0-beta.8) (2023-10-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.6...v3.8.0-beta.7) (2023-10-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.5...v3.8.0-beta.6) (2023-10-25) + + +### Bug Fixes + +* **toolbar:** allow customizable toolbar for active viewport and allow active tool to be deactivated via a click ([#3608](https://github.com/OHIF/Viewers/issues/3608)) ([dd6d976](https://github.com/OHIF/Viewers/commit/dd6d9768bbca1d3cc472e8c1e6d85822500b96ef)) + + + + + +# [3.8.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.4...v3.8.0-beta.5) (2023-10-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.3...v3.8.0-beta.4) (2023-10-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.2...v3.8.0-beta.3) (2023-10-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.1...v3.8.0-beta.2) (2023-10-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.0...v3.8.0-beta.1) (2023-10-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.110...v3.8.0-beta.0) (2023-10-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.109...v3.7.0-beta.110) (2023-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.108...v3.7.0-beta.109) (2023-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.107...v3.7.0-beta.108) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.106...v3.7.0-beta.107) (2023-10-10) + + +### Bug Fixes + +* **modules:** add stylus loader as an option to be uncommented ([#3710](https://github.com/OHIF/Viewers/issues/3710)) ([7c57f67](https://github.com/OHIF/Viewers/commit/7c57f67844b790fc6e47ac3f9708bf9d576389c8)) + + + + + +# [3.7.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.105...v3.7.0-beta.106) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.104...v3.7.0-beta.105) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.103...v3.7.0-beta.104) (2023-10-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.102...v3.7.0-beta.103) (2023-10-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.101...v3.7.0-beta.102) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.100...v3.7.0-beta.101) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.99...v3.7.0-beta.100) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.98...v3.7.0-beta.99) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.97...v3.7.0-beta.98) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.96...v3.7.0-beta.97) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.95...v3.7.0-beta.96) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.94...v3.7.0-beta.95) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.93...v3.7.0-beta.94) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.92...v3.7.0-beta.93) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.91...v3.7.0-beta.92) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.90...v3.7.0-beta.91) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.89...v3.7.0-beta.90) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.88...v3.7.0-beta.89) (2023-10-03) + + +### Bug Fixes + +* **StackSync:** Miscellaneous fixes for stack image sync ([#3663](https://github.com/OHIF/Viewers/issues/3663)) ([8a335bd](https://github.com/OHIF/Viewers/commit/8a335bd03d14ba87d65d7468d93f74040aa828d9)) + + + + + +# [3.7.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.87...v3.7.0-beta.88) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.86...v3.7.0-beta.87) (2023-09-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.85...v3.7.0-beta.86) (2023-09-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.84...v3.7.0-beta.85) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.83...v3.7.0-beta.84) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.82...v3.7.0-beta.83) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.81...v3.7.0-beta.82) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.80...v3.7.0-beta.81) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.79...v3.7.0-beta.80) (2023-09-22) + + +### Features + +* **segmentation mode:** Add create, and export SEG with Brushes ([#3632](https://github.com/OHIF/Viewers/issues/3632)) ([48bbd62](https://github.com/OHIF/Viewers/commit/48bbd6281a497ea68670239f5426a10ee6c56dc1)) + + + + + +# [3.7.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.78...v3.7.0-beta.79) (2023-09-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.77...v3.7.0-beta.78) (2023-09-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.76...v3.7.0-beta.77) (2023-09-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.75...v3.7.0-beta.76) (2023-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.74...v3.7.0-beta.75) (2023-09-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.73...v3.7.0-beta.74) (2023-09-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.72...v3.7.0-beta.73) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.71...v3.7.0-beta.72) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.70...v3.7.0-beta.71) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.69...v3.7.0-beta.70) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.68...v3.7.0-beta.69) (2023-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.67...v3.7.0-beta.68) (2023-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.66...v3.7.0-beta.67) (2023-09-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.65...v3.7.0-beta.66) (2023-09-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.64...v3.7.0-beta.65) (2023-09-06) + + +### Features + +* **ImageOverlayViewerTool:** add ImageOverlayViewer tool that can render image overlay (pixel overlay) of the DICOM images ([#3163](https://github.com/OHIF/Viewers/issues/3163)) ([69115da](https://github.com/OHIF/Viewers/commit/69115da06d2d437b57e66608b435bb0bc919a90f)) + + + + + +# [3.7.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.63...v3.7.0-beta.64) (2023-09-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.62...v3.7.0-beta.63) (2023-09-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.61...v3.7.0-beta.62) (2023-08-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.60...v3.7.0-beta.61) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.59...v3.7.0-beta.60) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.58...v3.7.0-beta.59) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.57...v3.7.0-beta.58) (2023-08-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.56...v3.7.0-beta.57) (2023-08-23) + +**Note:** Version bump only for package @ohif/mode-autometrics diff --git a/modes/autometrics/LICENSE b/modes/autometrics/LICENSE new file mode 100644 index 00000000000..19e20dd35ca --- /dev/null +++ b/modes/autometrics/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Open Health Imaging Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/modes/autometrics/README.md b/modes/autometrics/README.md new file mode 100644 index 00000000000..fd4384b30c6 --- /dev/null +++ b/modes/autometrics/README.md @@ -0,0 +1,40 @@ +# Autometrics Mode + +This mode provides a specialized viewer for automated measurements with the Autometrics panel prominently displayed. + +## Features + +- **Autometrics Panel**: Right panel with automated measurement tools organized in groups: + - Angular Measurements: M1M2, TMT-DOR, TMT-LAT, CP, HA + - Foot Ankle Offset: TALAS +- **Standard Viewer Tools**: All standard OHIF viewer tools and measurements +- **Multiple Viewport Support**: Supports various DICOM modalities and viewport types + +## Usage + +1. Select the "Autometrics" mode from the study list +2. The Autometrics panel will be open by default in the right sidebar +3. Use the automated measurement buttons for quick measurements +4. Standard measurement tools are still available in the toolbar + +## Route + +The mode is accessible via the `/autometrics` route. + +## Configuration + +The mode includes: +- Left panel: Series list with measurement tracking +- Right panel: Autometrics panel (open by default) +- Viewports: Support for various DICOM modalities including: + - Standard DICOM images + - DICOM SR (Structured Reports) + - DICOM SEG (Segmentation) + - DICOM PMAP (Parametric Maps) + - DICOM RT (Radiation Therapy) + - DICOM Video + - DICOM PDF + +## Dependencies + +This mode requires the `@ohif/extension-autometrics` extension to be installed and configured. diff --git a/modes/autometrics/assets/locked.png b/modes/autometrics/assets/locked.png new file mode 100644 index 00000000000..40e782045b0 Binary files /dev/null and b/modes/autometrics/assets/locked.png differ diff --git a/modes/autometrics/assets/preview.png b/modes/autometrics/assets/preview.png new file mode 100644 index 00000000000..2b8cfb39321 Binary files /dev/null and b/modes/autometrics/assets/preview.png differ diff --git a/modes/autometrics/assets/restore.png b/modes/autometrics/assets/restore.png new file mode 100644 index 00000000000..cfd6622d2ba Binary files /dev/null and b/modes/autometrics/assets/restore.png differ diff --git a/modes/autometrics/assets/sr-import.png b/modes/autometrics/assets/sr-import.png new file mode 100644 index 00000000000..0d31e4c8dab Binary files /dev/null and b/modes/autometrics/assets/sr-import.png differ diff --git a/modes/autometrics/assets/tracked.png b/modes/autometrics/assets/tracked.png new file mode 100644 index 00000000000..7da69fbaa48 Binary files /dev/null and b/modes/autometrics/assets/tracked.png differ diff --git a/modes/autometrics/assets/workflow.png b/modes/autometrics/assets/workflow.png new file mode 100644 index 00000000000..2291ac3ad87 Binary files /dev/null and b/modes/autometrics/assets/workflow.png differ diff --git a/modes/autometrics/autometrics/.webpack/webpack.dev.js b/modes/autometrics/autometrics/.webpack/webpack.dev.js new file mode 100644 index 00000000000..1b8e34cfd13 --- /dev/null +++ b/modes/autometrics/autometrics/.webpack/webpack.dev.js @@ -0,0 +1,12 @@ +const path = require('path'); +const webpackCommon = require('./../../../.webpack/webpack.base.js'); +const SRC_DIR = path.join(__dirname, '../src'); +const DIST_DIR = path.join(__dirname, '../dist'); + +const ENTRY = { + app: `${SRC_DIR}/index.ts`, +}; + +module.exports = (env, argv) => { + return webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); +}; diff --git a/modes/autometrics/autometrics/.webpack/webpack.prod.js b/modes/autometrics/autometrics/.webpack/webpack.prod.js new file mode 100644 index 00000000000..b60b8908ae2 --- /dev/null +++ b/modes/autometrics/autometrics/.webpack/webpack.prod.js @@ -0,0 +1,53 @@ +const webpack = require('webpack'); +const { merge } = require('webpack-merge'); +const path = require('path'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +const pkg = require('./../package.json'); +const webpackCommon = require('./../../../.webpack/webpack.base.js'); + +const ROOT_DIR = path.join(__dirname, './../'); +const SRC_DIR = path.join(__dirname, '../src'); +const DIST_DIR = path.join(__dirname, '../dist'); +const ENTRY = { + app: `${SRC_DIR}/index.ts`, +}; + +module.exports = (env, argv) => { + const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR, ENTRY }); + + return merge(commonConfig, { + stats: { + colors: true, + hash: true, + timings: true, + assets: true, + chunks: false, + chunkModules: false, + modules: false, + children: false, + warnings: true, + }, + optimization: { + minimize: true, + sideEffects: false, + }, + output: { + path: ROOT_DIR, + library: 'ohif-mode-longitudinal', + libraryTarget: 'umd', + libraryExport: 'default', + filename: pkg.main, + }, + externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/], + plugins: [ + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + // new MiniCssExtractPlugin({ + // filename: './dist/[name].css', + // chunkFilename: './dist/[id].css', + // }), + ], + }); +}; diff --git a/modes/autometrics/autometrics/CHANGELOG.md b/modes/autometrics/autometrics/CHANGELOG.md new file mode 100644 index 00000000000..401430b4f60 --- /dev/null +++ b/modes/autometrics/autometrics/CHANGELOG.md @@ -0,0 +1,4494 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [3.12.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.12.0-beta.1...v3.12.0-beta.2) (2025-08-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.12.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.12.0-beta.0...v3.12.0-beta.1) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.12.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.116...v3.12.0-beta.0) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.115...v3.11.0-beta.116) (2025-08-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.115](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.114...v3.11.0-beta.115) (2025-07-31) + + +### Features + +* add support to scoord3d ([#5016](https://github.com/OHIF/Viewers/issues/5016)) ([735405a](https://github.com/OHIF/Viewers/commit/735405a8554c7ee6283faa83fc42ff8bb9ac34ff)) + + + + + +# [3.11.0-beta.114](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.113...v3.11.0-beta.114) (2025-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.113](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.112...v3.11.0-beta.113) (2025-07-30) + + +### Features + +* improve segment label ([#5217](https://github.com/OHIF/Viewers/issues/5217)) ([271b84f](https://github.com/OHIF/Viewers/commit/271b84f78fcc3974006c7e1a4dbb2ef322fdb9ec)) + + + + + +# [3.11.0-beta.112](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.111...v3.11.0-beta.112) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.110...v3.11.0-beta.111) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.109...v3.11.0-beta.110) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.108...v3.11.0-beta.109) (2025-07-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.107...v3.11.0-beta.108) (2025-07-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.106...v3.11.0-beta.107) (2025-07-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.105...v3.11.0-beta.106) (2025-07-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.104...v3.11.0-beta.105) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.103...v3.11.0-beta.104) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.102...v3.11.0-beta.103) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.101...v3.11.0-beta.102) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.100...v3.11.0-beta.101) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.99...v3.11.0-beta.100) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.98...v3.11.0-beta.99) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.97...v3.11.0-beta.98) (2025-07-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.96...v3.11.0-beta.97) (2025-07-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.95...v3.11.0-beta.96) (2025-07-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.94...v3.11.0-beta.95) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.93...v3.11.0-beta.94) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.92...v3.11.0-beta.93) (2025-07-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.91...v3.11.0-beta.92) (2025-07-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.90...v3.11.0-beta.91) (2025-07-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.89...v3.11.0-beta.90) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.88...v3.11.0-beta.89) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.87...v3.11.0-beta.88) (2025-07-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.86...v3.11.0-beta.87) (2025-07-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.85...v3.11.0-beta.86) (2025-07-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.84...v3.11.0-beta.85) (2025-07-14) + + +### Features + +* **viewport:** Enhance Orientation Menu with Reformat Option and UI Improvements ([#5184](https://github.com/OHIF/Viewers/issues/5184)) ([c175837](https://github.com/OHIF/Viewers/commit/c175837273e664318fe51c426d98e4989f55b050)) + + + + + +# [3.11.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.83...v3.11.0-beta.84) (2025-07-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.82...v3.11.0-beta.83) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.81...v3.11.0-beta.82) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.80...v3.11.0-beta.81) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.79...v3.11.0-beta.80) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.78...v3.11.0-beta.79) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.77...v3.11.0-beta.78) (2025-07-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.76...v3.11.0-beta.77) (2025-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.75...v3.11.0-beta.76) (2025-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.74...v3.11.0-beta.75) (2025-07-09) + + +### Features + +* add segment label tool ([#5164](https://github.com/OHIF/Viewers/issues/5164)) ([ac85248](https://github.com/OHIF/Viewers/commit/ac852485cd5063122bcb9c0fbcca9f9cfb47d3f2)) + + + + + +# [3.11.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.73...v3.11.0-beta.74) (2025-07-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.72...v3.11.0-beta.73) (2025-07-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.71...v3.11.0-beta.72) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.70...v3.11.0-beta.71) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.69...v3.11.0-beta.70) (2025-07-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.68...v3.11.0-beta.69) (2025-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.67...v3.11.0-beta.68) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.66...v3.11.0-beta.67) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.65...v3.11.0-beta.66) (2025-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.64...v3.11.0-beta.65) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.63...v3.11.0-beta.64) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.62...v3.11.0-beta.63) (2025-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.61...v3.11.0-beta.62) (2025-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.60...v3.11.0-beta.61) (2025-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.59...v3.11.0-beta.60) (2025-06-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.58...v3.11.0-beta.59) (2025-06-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.57...v3.11.0-beta.58) (2025-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.56...v3.11.0-beta.57) (2025-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.55...v3.11.0-beta.56) (2025-06-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.54...v3.11.0-beta.55) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.53...v3.11.0-beta.54) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.52...v3.11.0-beta.53) (2025-06-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.51...v3.11.0-beta.52) (2025-06-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.50...v3.11.0-beta.51) (2025-06-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.49...v3.11.0-beta.50) (2025-06-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.48...v3.11.0-beta.49) (2025-06-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.47...v3.11.0-beta.48) (2025-06-05) + + +### Bug Fixes + +* **touch:** Allow for multi-touch in OHIF ([#5099](https://github.com/OHIF/Viewers/issues/5099)) ([1a6aa09](https://github.com/OHIF/Viewers/commit/1a6aa09a7708c943af3a1d920489311b3a0ee5da)) + + + + + +# [3.11.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.46...v3.11.0-beta.47) (2025-06-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.45...v3.11.0-beta.46) (2025-06-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.44...v3.11.0-beta.45) (2025-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.43...v3.11.0-beta.44) (2025-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.42...v3.11.0-beta.43) (2025-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.41...v3.11.0-beta.42) (2025-05-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.40...v3.11.0-beta.41) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.39...v3.11.0-beta.40) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.38...v3.11.0-beta.39) (2025-05-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.37...v3.11.0-beta.38) (2025-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.36...v3.11.0-beta.37) (2025-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.35...v3.11.0-beta.36) (2025-05-16) + + +### Bug Fixes + +* backward compatibility with toolbar service ([#5052](https://github.com/OHIF/Viewers/issues/5052)) ([9b1b501](https://github.com/OHIF/Viewers/commit/9b1b501d83502d13b285050bd5fca102b7f7612c)) + + + + + +# [3.11.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.34...v3.11.0-beta.35) (2025-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.33...v3.11.0-beta.34) (2025-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.32...v3.11.0-beta.33) (2025-05-15) + + +### Features + +* **actions:** simplify action corner api through the toolbarService ([#5033](https://github.com/OHIF/Viewers/issues/5033)) ([7c15bb8](https://github.com/OHIF/Viewers/commit/7c15bb8901001eefedc72498176ac24f6662bfab)) + + + + + +# [3.11.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.31...v3.11.0-beta.32) (2025-05-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.30...v3.11.0-beta.31) (2025-05-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.29...v3.11.0-beta.30) (2025-05-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.28...v3.11.0-beta.29) (2025-05-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.27...v3.11.0-beta.28) (2025-05-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.26...v3.11.0-beta.27) (2025-05-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.25...v3.11.0-beta.26) (2025-05-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.24...v3.11.0-beta.25) (2025-05-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.23...v3.11.0-beta.24) (2025-05-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.22...v3.11.0-beta.23) (2025-05-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.21...v3.11.0-beta.22) (2025-05-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.20...v3.11.0-beta.21) (2025-05-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.19...v3.11.0-beta.20) (2025-05-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.18...v3.11.0-beta.19) (2025-05-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.17...v3.11.0-beta.18) (2025-04-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.16...v3.11.0-beta.17) (2025-04-29) + + +### Bug Fixes + +* **referencelines:** and bring back the notification for worker updates but disallow duplication ([#5005](https://github.com/OHIF/Viewers/issues/5005)) ([98f8187](https://github.com/OHIF/Viewers/commit/98f8187dfeb8aec6eca145da75c855aec0da4e1d)) + + + + + +# [3.11.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.15...v3.11.0-beta.16) (2025-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.14...v3.11.0-beta.15) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.13...v3.11.0-beta.14) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.12...v3.11.0-beta.13) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.11...v3.11.0-beta.12) (2025-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.10...v3.11.0-beta.11) (2025-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.9...v3.11.0-beta.10) (2025-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.8...v3.11.0-beta.9) (2025-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.7...v3.11.0-beta.8) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.6...v3.11.0-beta.7) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.5...v3.11.0-beta.6) (2025-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.4...v3.11.0-beta.5) (2025-04-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.3...v3.11.0-beta.4) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.2...v3.11.0-beta.3) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.1...v3.11.0-beta.2) (2025-04-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.11.0-beta.0...v3.11.0-beta.1) (2025-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.11.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.159...v3.11.0-beta.0) (2025-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.159](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.158...v3.10.0-beta.159) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.158](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.157...v3.10.0-beta.158) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.157](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.156...v3.10.0-beta.157) (2025-04-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.156](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.155...v3.10.0-beta.156) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.155](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.154...v3.10.0-beta.155) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.154](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.153...v3.10.0-beta.154) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.153](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.152...v3.10.0-beta.153) (2025-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.152](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.151...v3.10.0-beta.152) (2025-04-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.151](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.150...v3.10.0-beta.151) (2025-04-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.150](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.149...v3.10.0-beta.150) (2025-04-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.149](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.148...v3.10.0-beta.149) (2025-04-04) + + +### Features + +* **image capture:** Enhance SEG and RTSS Support with Dependency Updates and Bug Fixes ([#4924](https://github.com/OHIF/Viewers/issues/4924)) ([fc33bd0](https://github.com/OHIF/Viewers/commit/fc33bd0d594a1ac8de79b11080ead48630a8ca27)) + + + + + +# [3.10.0-beta.148](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.147...v3.10.0-beta.148) (2025-04-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.147](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.146...v3.10.0-beta.147) (2025-04-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.146](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.145...v3.10.0-beta.146) (2025-04-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.145](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.144...v3.10.0-beta.145) (2025-04-02) + + +### Bug Fixes + +* **seg:** Enhance segmentation tools and UI, refactor code, and update dependencies ([#4915](https://github.com/OHIF/Viewers/issues/4915)) ([8432d5f](https://github.com/OHIF/Viewers/commit/8432d5f6330b300ac6760b32372be382210ed05b)) + + + + + +# [3.10.0-beta.144](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.143...v3.10.0-beta.144) (2025-04-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.143](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.142...v3.10.0-beta.143) (2025-04-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.142](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.141...v3.10.0-beta.142) (2025-03-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.141](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.140...v3.10.0-beta.141) (2025-03-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.140](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.139...v3.10.0-beta.140) (2025-03-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.139](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.138...v3.10.0-beta.139) (2025-03-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.138](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.137...v3.10.0-beta.138) (2025-03-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.137](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.136...v3.10.0-beta.137) (2025-03-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.136](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.135...v3.10.0-beta.136) (2025-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.135](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.134...v3.10.0-beta.135) (2025-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.134](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.133...v3.10.0-beta.134) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.133](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.132...v3.10.0-beta.133) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.132](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.131...v3.10.0-beta.132) (2025-03-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.131](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.130...v3.10.0-beta.131) (2025-03-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.130](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.129...v3.10.0-beta.130) (2025-03-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.129](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.128...v3.10.0-beta.129) (2025-03-18) + + +### Features + +* overlapping segments ([#4849](https://github.com/OHIF/Viewers/issues/4849)) ([55d6393](https://github.com/OHIF/Viewers/commit/55d6393a3f3ed5b961809f77bf13a84da3c10be8)) + + + + + +# [3.10.0-beta.128](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.127...v3.10.0-beta.128) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.127](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.126...v3.10.0-beta.127) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.126](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.125...v3.10.0-beta.126) (2025-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.125](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.124...v3.10.0-beta.125) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.124](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.123...v3.10.0-beta.124) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.123](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.122...v3.10.0-beta.123) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.122](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.121...v3.10.0-beta.122) (2025-03-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.121](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.120...v3.10.0-beta.121) (2025-03-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.120](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.119...v3.10.0-beta.120) (2025-03-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.119](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.118...v3.10.0-beta.119) (2025-03-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.118](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.117...v3.10.0-beta.118) (2025-03-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.117](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.116...v3.10.0-beta.117) (2025-03-07) + + +### Features + +* **toolbox:** Refactor Toolbar and Toolbox to enable sections ([#4825](https://github.com/OHIF/Viewers/issues/4825)) ([cc5cdfb](https://github.com/OHIF/Viewers/commit/cc5cdfb08158eaa1fa576875f959a665e72f9d5e)) + + + + + +# [3.10.0-beta.116](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.115...v3.10.0-beta.116) (2025-03-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.115](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.114...v3.10.0-beta.115) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.114](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.113...v3.10.0-beta.114) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.113](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.112...v3.10.0-beta.113) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.112](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.111...v3.10.0-beta.112) (2025-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.110...v3.10.0-beta.111) (2025-02-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.109...v3.10.0-beta.110) (2025-02-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.108...v3.10.0-beta.109) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.107...v3.10.0-beta.108) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.106...v3.10.0-beta.107) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.105...v3.10.0-beta.106) (2025-02-25) + + +### Features + +* **hotkeys:** Migrate hotkeys to customization service and fix issues with overrides ([#4777](https://github.com/OHIF/Viewers/issues/4777)) ([3e6913b](https://github.com/OHIF/Viewers/commit/3e6913b097569280a5cc2fa5bbe4add52f149305)) + + + + + +# [3.10.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.104...v3.10.0-beta.105) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.103...v3.10.0-beta.104) (2025-02-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.102...v3.10.0-beta.103) (2025-02-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.101...v3.10.0-beta.102) (2025-02-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.100...v3.10.0-beta.101) (2025-02-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.99...v3.10.0-beta.100) (2025-02-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.98...v3.10.0-beta.99) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.97...v3.10.0-beta.98) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.96...v3.10.0-beta.97) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.95...v3.10.0-beta.96) (2025-02-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.94...v3.10.0-beta.95) (2025-02-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.93...v3.10.0-beta.94) (2025-02-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.92...v3.10.0-beta.93) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.91...v3.10.0-beta.92) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.90...v3.10.0-beta.91) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.89...v3.10.0-beta.90) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.88...v3.10.0-beta.89) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.87...v3.10.0-beta.88) (2025-02-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.86...v3.10.0-beta.87) (2025-02-03) + + +### Bug Fixes + +* **measurement label auto-completion:** Customization of measurement label auto-completion fails for measurements following arrow annotations. ([#4739](https://github.com/OHIF/Viewers/issues/4739)) ([e035ef1](https://github.com/OHIF/Viewers/commit/e035ef1dcc72ecbe2a757e3b814551d768d7e610)) + + + + + +# [3.10.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.85...v3.10.0-beta.86) (2025-02-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.84...v3.10.0-beta.85) (2025-02-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.83...v3.10.0-beta.84) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.82...v3.10.0-beta.83) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.81...v3.10.0-beta.82) (2025-01-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.80...v3.10.0-beta.81) (2025-01-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.79...v3.10.0-beta.80) (2025-01-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.78...v3.10.0-beta.79) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.77...v3.10.0-beta.78) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.76...v3.10.0-beta.77) (2025-01-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.75...v3.10.0-beta.76) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.74...v3.10.0-beta.75) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.73...v3.10.0-beta.74) (2025-01-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.72...v3.10.0-beta.73) (2025-01-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.71...v3.10.0-beta.72) (2025-01-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.70...v3.10.0-beta.71) (2025-01-23) + + +### Features + +* **customization:** new customization service api ([#4688](https://github.com/OHIF/Viewers/issues/4688)) ([55ad8ef](https://github.com/OHIF/Viewers/commit/55ad8efbabc3fabd8031fc08927b2f92ae5aec69)) + + + + + +# [3.10.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.69...v3.10.0-beta.70) (2025-01-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.68...v3.10.0-beta.69) (2025-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.67...v3.10.0-beta.68) (2025-01-21) + + +### Features + +* **resizable-side-panels:** Make the left and right side panels (optionally) resizable. ([#4672](https://github.com/OHIF/Viewers/issues/4672)) ([d90a4cf](https://github.com/OHIF/Viewers/commit/d90a4cfb16cc0daed9b905de9780f44cca1323f9)) + + + + + +# [3.10.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.66...v3.10.0-beta.67) (2025-01-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.65...v3.10.0-beta.66) (2025-01-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.64...v3.10.0-beta.65) (2025-01-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.63...v3.10.0-beta.64) (2025-01-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.62...v3.10.0-beta.63) (2025-01-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.61...v3.10.0-beta.62) (2025-01-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.60...v3.10.0-beta.61) (2025-01-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.59...v3.10.0-beta.60) (2025-01-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.58...v3.10.0-beta.59) (2025-01-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.57...v3.10.0-beta.58) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.56...v3.10.0-beta.57) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.55...v3.10.0-beta.56) (2025-01-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.54...v3.10.0-beta.55) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.53...v3.10.0-beta.54) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.52...v3.10.0-beta.53) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.51...v3.10.0-beta.52) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.50...v3.10.0-beta.51) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.49...v3.10.0-beta.50) (2025-01-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.48...v3.10.0-beta.49) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.47...v3.10.0-beta.48) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.46...v3.10.0-beta.47) (2025-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.45...v3.10.0-beta.46) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.44...v3.10.0-beta.45) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.43...v3.10.0-beta.44) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.42...v3.10.0-beta.43) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.41...v3.10.0-beta.42) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.40...v3.10.0-beta.41) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.39...v3.10.0-beta.40) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.38...v3.10.0-beta.39) (2025-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.37...v3.10.0-beta.38) (2025-01-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.36...v3.10.0-beta.37) (2025-01-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.35...v3.10.0-beta.36) (2025-01-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.34...v3.10.0-beta.35) (2025-01-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.33...v3.10.0-beta.34) (2025-01-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.32...v3.10.0-beta.33) (2024-12-20) + + +### Bug Fixes + +* **tools:** enable additional tools in volume viewport ([#4620](https://github.com/OHIF/Viewers/issues/4620)) ([1992002](https://github.com/OHIF/Viewers/commit/1992002d2dced171c17b9a0163baf707fc551e3d)) + + + + + +# [3.10.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.31...v3.10.0-beta.32) (2024-12-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.30...v3.10.0-beta.31) (2024-12-20) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.29...v3.10.0-beta.30) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.28...v3.10.0-beta.29) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.27...v3.10.0-beta.28) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.26...v3.10.0-beta.27) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.25...v3.10.0-beta.26) (2024-12-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.24...v3.10.0-beta.25) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.23...v3.10.0-beta.24) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.22...v3.10.0-beta.23) (2024-12-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.21...v3.10.0-beta.22) (2024-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.20...v3.10.0-beta.21) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.19...v3.10.0-beta.20) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.18...v3.10.0-beta.19) (2024-12-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.17...v3.10.0-beta.18) (2024-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.16...v3.10.0-beta.17) (2024-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.15...v3.10.0-beta.16) (2024-12-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.14...v3.10.0-beta.15) (2024-12-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.13...v3.10.0-beta.14) (2024-12-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.12...v3.10.0-beta.13) (2024-12-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.11...v3.10.0-beta.12) (2024-11-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.10...v3.10.0-beta.11) (2024-11-28) + + +### Bug Fixes + +* **multiframe:** metadata handling of NM studies and loading order ([#4554](https://github.com/OHIF/Viewers/issues/4554)) ([7624ccb](https://github.com/OHIF/Viewers/commit/7624ccb5e495c0a151227a458d8d5bfb8babb22c)) + + + + + +# [3.10.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.9...v3.10.0-beta.10) (2024-11-28) + + +### Features + +* **segmentation:** Enhance dropdown menu functionality in SegmentationTable ([#4553](https://github.com/OHIF/Viewers/issues/4553)) ([397fd85](https://github.com/OHIF/Viewers/commit/397fd856539cd3b949a9614a9ea32d0d04a90000)) + + + + + +# [3.10.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.8...v3.10.0-beta.9) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.7...v3.10.0-beta.8) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.6...v3.10.0-beta.7) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.5...v3.10.0-beta.6) (2024-11-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.4...v3.10.0-beta.5) (2024-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.3...v3.10.0-beta.4) (2024-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.2...v3.10.0-beta.3) (2024-11-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.1...v3.10.0-beta.2) (2024-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.10.0-beta.0...v3.10.0-beta.1) (2024-11-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.10.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.111...v3.10.0-beta.0) (2024-11-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.111](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.110...v3.9.0-beta.111) (2024-11-12) + + +### Bug Fixes + +* Measurement Tracking: Various UI and functionality improvements ([#4481](https://github.com/OHIF/Viewers/issues/4481)) ([62b2748](https://github.com/OHIF/Viewers/commit/62b27488471c9d5979142e2d15872a85778b90ed)) + + + + + +# [3.9.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.109...v3.9.0-beta.110) (2024-11-11) + + +### Bug Fixes + +* **bugs:** Update dependencies and enhance UI components ([#4478](https://github.com/OHIF/Viewers/issues/4478)) ([05d41c5](https://github.com/OHIF/Viewers/commit/05d41c52068a3b7ba249f15ecdf71838c352fd30)) + + + + + +# [3.9.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.108...v3.9.0-beta.109) (2024-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.107...v3.9.0-beta.108) (2024-11-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.106...v3.9.0-beta.107) (2024-11-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.105...v3.9.0-beta.106) (2024-11-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.104...v3.9.0-beta.105) (2024-11-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.103...v3.9.0-beta.104) (2024-10-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.102...v3.9.0-beta.103) (2024-10-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.101...v3.9.0-beta.102) (2024-10-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.100...v3.9.0-beta.101) (2024-10-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.99...v3.9.0-beta.100) (2024-10-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.98...v3.9.0-beta.99) (2024-10-17) + + +### Features + +* **SR:** SCOORD3D point annotations support for stack viewports ([#4315](https://github.com/OHIF/Viewers/issues/4315)) ([ac1cad2](https://github.com/OHIF/Viewers/commit/ac1cad25af12ee0f7d508647e3134ed724d9b4d3)) + + + + + +# [3.9.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.97...v3.9.0-beta.98) (2024-10-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.96...v3.9.0-beta.97) (2024-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.95...v3.9.0-beta.96) (2024-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.94...v3.9.0-beta.95) (2024-10-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.93...v3.9.0-beta.94) (2024-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.92...v3.9.0-beta.93) (2024-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.91...v3.9.0-beta.92) (2024-10-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.90...v3.9.0-beta.91) (2024-10-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.89...v3.9.0-beta.90) (2024-09-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.88...v3.9.0-beta.89) (2024-09-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.87...v3.9.0-beta.88) (2024-09-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.86...v3.9.0-beta.87) (2024-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.85...v3.9.0-beta.86) (2024-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.84...v3.9.0-beta.85) (2024-09-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.83...v3.9.0-beta.84) (2024-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.82...v3.9.0-beta.83) (2024-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.81...v3.9.0-beta.82) (2024-09-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.80...v3.9.0-beta.81) (2024-08-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.79...v3.9.0-beta.80) (2024-08-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.78...v3.9.0-beta.79) (2024-08-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.77...v3.9.0-beta.78) (2024-08-15) + + +### Features + +* Add CS3D WSI and Video Viewports and add annotation navigation for MPR ([#4182](https://github.com/OHIF/Viewers/issues/4182)) ([7599ec9](https://github.com/OHIF/Viewers/commit/7599ec9421129dcade94e6fa6ec7908424ab3134)) + + + + + +# [3.9.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.76...v3.9.0-beta.77) (2024-08-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.75...v3.9.0-beta.76) (2024-08-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.74...v3.9.0-beta.75) (2024-08-07) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.73...v3.9.0-beta.74) (2024-08-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.72...v3.9.0-beta.73) (2024-08-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.71...v3.9.0-beta.72) (2024-07-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.70...v3.9.0-beta.71) (2024-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.69...v3.9.0-beta.70) (2024-07-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.68...v3.9.0-beta.69) (2024-07-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.67...v3.9.0-beta.68) (2024-07-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.66...v3.9.0-beta.67) (2024-07-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.65...v3.9.0-beta.66) (2024-07-24) + + +### Features + +* **pmap:** added support for parametric map ([#4284](https://github.com/OHIF/Viewers/issues/4284)) ([fc0064f](https://github.com/OHIF/Viewers/commit/fc0064fd9d8cdc8fde81b81f0e71fd5d077ca22b)) + + + + + +# [3.9.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.64...v3.9.0-beta.65) (2024-07-23) + + +### Features + +* **SR:** text structured report (TEXT, CODE, NUM, PNAME, DATE, TIME and DATETIME) ([#4287](https://github.com/OHIF/Viewers/issues/4287)) ([246ebab](https://github.com/OHIF/Viewers/commit/246ebab6ebf5431a704a1861a5804045b9644ba4)) + + + + + +# [3.9.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.63...v3.9.0-beta.64) (2024-07-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.62...v3.9.0-beta.63) (2024-07-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.61...v3.9.0-beta.62) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.60...v3.9.0-beta.61) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.59...v3.9.0-beta.60) (2024-07-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.58...v3.9.0-beta.59) (2024-07-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.57...v3.9.0-beta.58) (2024-07-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.56...v3.9.0-beta.57) (2024-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.55...v3.9.0-beta.56) (2024-07-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.54...v3.9.0-beta.55) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.53...v3.9.0-beta.54) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.52...v3.9.0-beta.53) (2024-06-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.51...v3.9.0-beta.52) (2024-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.50...v3.9.0-beta.51) (2024-06-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.49...v3.9.0-beta.50) (2024-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.48...v3.9.0-beta.49) (2024-06-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.47...v3.9.0-beta.48) (2024-06-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.46...v3.9.0-beta.47) (2024-06-21) + + +### Features + +* **sort:** custom series sort in study panel ([#4214](https://github.com/OHIF/Viewers/issues/4214)) ([a433d40](https://github.com/OHIF/Viewers/commit/a433d406e2cac13f644203996c682260b54e8865)) + + + + + +# [3.9.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.45...v3.9.0-beta.46) (2024-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.44...v3.9.0-beta.45) (2024-06-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.43...v3.9.0-beta.44) (2024-06-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.42...v3.9.0-beta.43) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.41...v3.9.0-beta.42) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.40...v3.9.0-beta.41) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.39...v3.9.0-beta.40) (2024-06-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.38...v3.9.0-beta.39) (2024-06-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.37...v3.9.0-beta.38) (2024-06-07) + + +### Bug Fixes + +* **window-level:** move window level region to more tools menu ([#4215](https://github.com/OHIF/Viewers/issues/4215)) ([33f4c18](https://github.com/OHIF/Viewers/commit/33f4c18f2687d30a250fe7183df3daae8394a984)) + + + + + +# [3.9.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.36...v3.9.0-beta.37) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.35...v3.9.0-beta.36) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.34...v3.9.0-beta.35) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.33...v3.9.0-beta.34) (2024-06-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.32...v3.9.0-beta.33) (2024-06-05) + + +### Features + +* **window-level-region:** add window level region tool ([#4127](https://github.com/OHIF/Viewers/issues/4127)) ([ab1a18a](https://github.com/OHIF/Viewers/commit/ab1a18af5a5b0f9086c080ed81c8fda9bfaa975b)) + + + + + +# [3.9.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.31...v3.9.0-beta.32) (2024-05-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.30...v3.9.0-beta.31) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.29...v3.9.0-beta.30) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.28...v3.9.0-beta.29) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.27...v3.9.0-beta.28) (2024-05-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.26...v3.9.0-beta.27) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.25...v3.9.0-beta.26) (2024-05-29) + + +### Features + +* **hp:** Add displayArea option for Hanging protocols and example with Mamo([#3808](https://github.com/OHIF/Viewers/issues/3808)) ([18ac08e](https://github.com/OHIF/Viewers/commit/18ac08ed860d119721c52e4ffc270332259100b6)) + + + + + +# [3.9.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.24...v3.9.0-beta.25) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.23...v3.9.0-beta.24) (2024-05-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.22...v3.9.0-beta.23) (2024-05-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.21...v3.9.0-beta.22) (2024-05-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.20...v3.9.0-beta.21) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.19...v3.9.0-beta.20) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.18...v3.9.0-beta.19) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.17...v3.9.0-beta.18) (2024-05-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.16...v3.9.0-beta.17) (2024-05-23) + + +### Bug Fixes + +* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([73d9e99](https://github.com/OHIF/Viewers/commit/73d9e99d5d6f38ab6c36f4471d54f18798feacb4)) + + + + + +# [3.9.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.15...v3.9.0-beta.16) (2024-05-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.14...v3.9.0-beta.15) (2024-05-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.13...v3.9.0-beta.14) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.12...v3.9.0-beta.13) (2024-05-21) + + +### Features + +* **rt:** allow rendering of points in RT Struct ([#4128](https://github.com/OHIF/Viewers/issues/4128)) ([5903b07](https://github.com/OHIF/Viewers/commit/5903b0749aa41112d2e991bf53ed29b1fd7bd13f)) + + + + + +# [3.9.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.11...v3.9.0-beta.12) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.10...v3.9.0-beta.11) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.9...v3.9.0-beta.10) (2024-05-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.8...v3.9.0-beta.9) (2024-05-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.7...v3.9.0-beta.8) (2024-05-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.6...v3.9.0-beta.7) (2024-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.5...v3.9.0-beta.6) (2024-05-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.4...v3.9.0-beta.5) (2024-05-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.3...v3.9.0-beta.4) (2024-05-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.2...v3.9.0-beta.3) (2024-05-08) + + +### Features + +* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([374065b](https://github.com/OHIF/Viewers/commit/374065bc3bad9d212f9817a8d41546cc64cfabfb)) + + + + + +# [3.9.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.1...v3.9.0-beta.2) (2024-05-06) + + +### Bug Fixes + +* **bugs:** enhancements and bugs in several areas ([#4086](https://github.com/OHIF/Viewers/issues/4086)) ([730f434](https://github.com/OHIF/Viewers/commit/730f4349100f21b4489a21707dbb2dca9dbfbba2)) + + + + + +# [3.9.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.9.0-beta.0...v3.9.0-beta.1) (2024-05-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.9.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.94...v3.9.0-beta.0) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0-beta.94) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.91...v3.8.0-beta.92) (2024-04-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.90...v3.8.0-beta.91) (2024-04-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.89...v3.8.0-beta.90) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.88...v3.8.0-beta.89) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.87...v3.8.0-beta.88) (2024-04-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.86...v3.8.0-beta.87) (2024-04-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.85...v3.8.0-beta.86) (2024-04-19) + + +### Bug Fixes + +* **layouts:** and fix thumbnail in touch and update migration guide for 3.8 release ([#4052](https://github.com/OHIF/Viewers/issues/4052)) ([d250d04](https://github.com/OHIF/Viewers/commit/d250d04580883446fcb8d748b2a97c5c198922af)) + + + + + +# [3.8.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.84...v3.8.0-beta.85) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.83...v3.8.0-beta.84) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.82...v3.8.0-beta.83) (2024-04-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.81...v3.8.0-beta.82) (2024-04-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.80...v3.8.0-beta.81) (2024-04-16) + + +### Bug Fixes + +* **viewport:** Reset viewport state and fix CINE looping, thumbnail resolution, and dynamic tool settings ([#4037](https://github.com/OHIF/Viewers/issues/4037)) ([f99a0bf](https://github.com/OHIF/Viewers/commit/f99a0bfb31434aa137bbb3ed1f9eef1dfcc09025)) + + + + + +# [3.8.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.79...v3.8.0-beta.80) (2024-04-16) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.78...v3.8.0-beta.79) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.77...v3.8.0-beta.78) (2024-04-10) + + +### Bug Fixes + +* **general:** enhancements and bug fixes ([#4018](https://github.com/OHIF/Viewers/issues/4018)) ([2b83393](https://github.com/OHIF/Viewers/commit/2b83393f91cb16ea06821d79d14ff60f80c29c90)) + + + + + +# [3.8.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.76...v3.8.0-beta.77) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.75...v3.8.0-beta.76) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.74...v3.8.0-beta.75) (2024-04-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.73...v3.8.0-beta.74) (2024-04-10) + + +### Features + +* **4D:** Add 4D dynamic volume rendering and new pre-clinical 4d pt/ct mode ([#3664](https://github.com/OHIF/Viewers/issues/3664)) ([d57e8bc](https://github.com/OHIF/Viewers/commit/d57e8bc1571c6da4effaa492ee2d162c552365a2)) + + + + + +# [3.8.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.72...v3.8.0-beta.73) (2024-04-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.71...v3.8.0-beta.72) (2024-04-05) + + +### Bug Fixes + +* **cornerstone-dicom-sr:** Freehand SR hydration support ([#3996](https://github.com/OHIF/Viewers/issues/3996)) ([5645ac1](https://github.com/OHIF/Viewers/commit/5645ac1b271e1ed8c57f5d71100809362447267e)) + + + + + +# [3.8.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.70...v3.8.0-beta.71) (2024-04-05) + + +### Features + +* **advanced-roi-tools:** new tools and icon updates and overlay bug fixes ([#4014](https://github.com/OHIF/Viewers/issues/4014)) ([cea27d4](https://github.com/OHIF/Viewers/commit/cea27d438d1de2c1ec90cbaefdc2b31a1d9980a1)) + + + + + +# [3.8.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.69...v3.8.0-beta.70) (2024-04-05) + + +### Features + +* **measurement:** Add support measurement label autocompletion ([#3855](https://github.com/OHIF/Viewers/issues/3855)) ([56b1eae](https://github.com/OHIF/Viewers/commit/56b1eae6356a6534960df1196bdd1e95b0a9a470)) + + + + + +# [3.8.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.68...v3.8.0-beta.69) (2024-04-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.67...v3.8.0-beta.68) (2024-04-03) + + +### Features + +* **segmentation:** Enhanced segmentation panel design for TMTV ([#3988](https://github.com/OHIF/Viewers/issues/3988)) ([9f3235f](https://github.com/OHIF/Viewers/commit/9f3235ff096636aafa88d8a42859e8dc85d9036d)) + + + + + +# [3.8.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.66...v3.8.0-beta.67) (2024-04-02) + + +### Features + +* **ViewportActionMenu:** window level per viewport / new patient info / colorbars/ 3D presets and 3D volume rendering ([#3963](https://github.com/OHIF/Viewers/issues/3963)) ([b7f90e3](https://github.com/OHIF/Viewers/commit/b7f90e3951845396f99b69f0a74fc56b2ffeada1)) + + + + + +# [3.8.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.65...v3.8.0-beta.66) (2024-03-28) + + +### Bug Fixes + +* **new layout:** address black screen bugs ([#4008](https://github.com/OHIF/Viewers/issues/4008)) ([158a181](https://github.com/OHIF/Viewers/commit/158a1816703e0ad66cae08cb9bd1ffb93bbd8d43)) + + + + + +# [3.8.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.64...v3.8.0-beta.65) (2024-03-28) + + +### Features + +* **layout:** new layout selector with 3D volume rendering ([#3923](https://github.com/OHIF/Viewers/issues/3923)) ([617043f](https://github.com/OHIF/Viewers/commit/617043fe0da5de91fbea4ac33a27f1df16ae1ca6)) + + + + + +# [3.8.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.63...v3.8.0-beta.64) (2024-03-27) + + +### Features + +* **toolbar:** new Toolbar to enable reactive state synchronization ([#3983](https://github.com/OHIF/Viewers/issues/3983)) ([566b25a](https://github.com/OHIF/Viewers/commit/566b25a54425399096864bd263193646556011a5)) + + + + + +# [3.8.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.62...v3.8.0-beta.63) (2024-03-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.61...v3.8.0-beta.62) (2024-03-19) + + +### Features + +* **worklist:** New worklist buttons and tooltips ([#3989](https://github.com/OHIF/Viewers/issues/3989)) ([9bcd1ae](https://github.com/OHIF/Viewers/commit/9bcd1ae6f51d61786cc1e99624f396b56a47cd69)) + + + + + +# [3.8.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.60...v3.8.0-beta.61) (2024-03-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.59...v3.8.0-beta.60) (2024-03-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.58...v3.8.0-beta.59) (2024-03-08) + + +### Bug Fixes + +* **cli:** mode creation template ([#3876](https://github.com/OHIF/Viewers/issues/3876)) ([#3981](https://github.com/OHIF/Viewers/issues/3981)) ([e485d68](https://github.com/OHIF/Viewers/commit/e485d68fd4619ce7187113cbe59e47f9523dbcc8)) + + + + + +# [3.8.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.57...v3.8.0-beta.58) (2024-03-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.56...v3.8.0-beta.57) (2024-02-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.56](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.55...v3.8.0-beta.56) (2024-02-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.55](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.54...v3.8.0-beta.55) (2024-02-21) + + +### Features + +* **resize:** Optimize resizing process and maintain zoom level ([#3889](https://github.com/OHIF/Viewers/issues/3889)) ([b3a0faf](https://github.com/OHIF/Viewers/commit/b3a0faf5f5f0a1993b2b017eb4cc1216164ea2c6)) + + + + + +# [3.8.0-beta.54](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.53...v3.8.0-beta.54) (2024-02-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.53](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.52...v3.8.0-beta.53) (2024-02-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.52](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.51...v3.8.0-beta.52) (2024-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.51](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.50...v3.8.0-beta.51) (2024-01-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.50](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.49...v3.8.0-beta.50) (2024-01-22) + + +### Bug Fixes + +* **viewport-sync:** remember synced viewports bw stack and volume and RENAME StackImageSync to ImageSliceSync ([#3849](https://github.com/OHIF/Viewers/issues/3849)) ([e4a116b](https://github.com/OHIF/Viewers/commit/e4a116b074fcb85c8cbcc9db44fdec565f3386db)) + + + + + +# [3.8.0-beta.49](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.48...v3.8.0-beta.49) (2024-01-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.48](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.47...v3.8.0-beta.48) (2024-01-17) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.47](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.46...v3.8.0-beta.47) (2024-01-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.46](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.45...v3.8.0-beta.46) (2024-01-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.45](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.44...v3.8.0-beta.45) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.44](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.43...v3.8.0-beta.44) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.43](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.42...v3.8.0-beta.43) (2024-01-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.42](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.41...v3.8.0-beta.42) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.41](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.40...v3.8.0-beta.41) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.40](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.39...v3.8.0-beta.40) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.39](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.38...v3.8.0-beta.39) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.38](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.37...v3.8.0-beta.38) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.37](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.36...v3.8.0-beta.37) (2024-01-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.36](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.35...v3.8.0-beta.36) (2023-12-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.35](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.34...v3.8.0-beta.35) (2023-12-14) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.34](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.33...v3.8.0-beta.34) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.33](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.32...v3.8.0-beta.33) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.32](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.31...v3.8.0-beta.32) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.31](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.30...v3.8.0-beta.31) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.30](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.29...v3.8.0-beta.30) (2023-12-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.29](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.28...v3.8.0-beta.29) (2023-12-13) + + +### Features + +* **config:** Add activateViewportBeforeInteraction parameter for viewport interaction customization ([#3847](https://github.com/OHIF/Viewers/issues/3847)) ([f707b4e](https://github.com/OHIF/Viewers/commit/f707b4ebc996f379cd30337badc06b07e6e35ac5)) +* **i18n:** enhanced i18n support ([#3761](https://github.com/OHIF/Viewers/issues/3761)) ([d14a8f0](https://github.com/OHIF/Viewers/commit/d14a8f0199db95cd9e85866a011b64d6bf830d57)) + + + + + +# [3.8.0-beta.28](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.27...v3.8.0-beta.28) (2023-12-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.27](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.26...v3.8.0-beta.27) (2023-12-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.26](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.25...v3.8.0-beta.26) (2023-11-28) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.25](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.24...v3.8.0-beta.25) (2023-11-27) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.24](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.23...v3.8.0-beta.24) (2023-11-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.23](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.22...v3.8.0-beta.23) (2023-11-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.22](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.21...v3.8.0-beta.22) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.21](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.20...v3.8.0-beta.21) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.20](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.19...v3.8.0-beta.20) (2023-11-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.19](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.18...v3.8.0-beta.19) (2023-11-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.18](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.17...v3.8.0-beta.18) (2023-11-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.17](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.16...v3.8.0-beta.17) (2023-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.16](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.15...v3.8.0-beta.16) (2023-11-13) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.15](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.14...v3.8.0-beta.15) (2023-11-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.14](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.13...v3.8.0-beta.14) (2023-11-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.13](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.12...v3.8.0-beta.13) (2023-11-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.12](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.11...v3.8.0-beta.12) (2023-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.11](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.10...v3.8.0-beta.11) (2023-11-08) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.10](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.9...v3.8.0-beta.10) (2023-11-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.9](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.8...v3.8.0-beta.9) (2023-11-02) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.8](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.7...v3.8.0-beta.8) (2023-10-31) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.7](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.6...v3.8.0-beta.7) (2023-10-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.6](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.5...v3.8.0-beta.6) (2023-10-25) + + +### Bug Fixes + +* **toolbar:** allow customizable toolbar for active viewport and allow active tool to be deactivated via a click ([#3608](https://github.com/OHIF/Viewers/issues/3608)) ([dd6d976](https://github.com/OHIF/Viewers/commit/dd6d9768bbca1d3cc472e8c1e6d85822500b96ef)) + + + + + +# [3.8.0-beta.5](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.4...v3.8.0-beta.5) (2023-10-24) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.4](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.3...v3.8.0-beta.4) (2023-10-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.3](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.2...v3.8.0-beta.3) (2023-10-23) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.2](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.1...v3.8.0-beta.2) (2023-10-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.1](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.0...v3.8.0-beta.1) (2023-10-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.8.0-beta.0](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.110...v3.8.0-beta.0) (2023-10-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.110](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.109...v3.7.0-beta.110) (2023-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.109](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.108...v3.7.0-beta.109) (2023-10-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.108](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.107...v3.7.0-beta.108) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.107](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.106...v3.7.0-beta.107) (2023-10-10) + + +### Bug Fixes + +* **modules:** add stylus loader as an option to be uncommented ([#3710](https://github.com/OHIF/Viewers/issues/3710)) ([7c57f67](https://github.com/OHIF/Viewers/commit/7c57f67844b790fc6e47ac3f9708bf9d576389c8)) + + + + + +# [3.7.0-beta.106](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.105...v3.7.0-beta.106) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.105](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.104...v3.7.0-beta.105) (2023-10-10) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.104](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.103...v3.7.0-beta.104) (2023-10-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.103](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.102...v3.7.0-beta.103) (2023-10-09) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.102](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.101...v3.7.0-beta.102) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.101](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.100...v3.7.0-beta.101) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.100](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.99...v3.7.0-beta.100) (2023-10-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.99](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.98...v3.7.0-beta.99) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.98](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.97...v3.7.0-beta.98) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.97](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.96...v3.7.0-beta.97) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.96](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.95...v3.7.0-beta.96) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.95](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.94...v3.7.0-beta.95) (2023-10-04) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.94](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.93...v3.7.0-beta.94) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.92...v3.7.0-beta.93) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.92](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.91...v3.7.0-beta.92) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.91](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.90...v3.7.0-beta.91) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.90](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.89...v3.7.0-beta.90) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.89](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.88...v3.7.0-beta.89) (2023-10-03) + + +### Bug Fixes + +* **StackSync:** Miscellaneous fixes for stack image sync ([#3663](https://github.com/OHIF/Viewers/issues/3663)) ([8a335bd](https://github.com/OHIF/Viewers/commit/8a335bd03d14ba87d65d7468d93f74040aa828d9)) + + + + + +# [3.7.0-beta.88](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.87...v3.7.0-beta.88) (2023-10-03) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.87](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.86...v3.7.0-beta.87) (2023-09-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.86](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.85...v3.7.0-beta.86) (2023-09-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.85](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.84...v3.7.0-beta.85) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.84](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.83...v3.7.0-beta.84) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.83](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.82...v3.7.0-beta.83) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.82](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.81...v3.7.0-beta.82) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.81](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.80...v3.7.0-beta.81) (2023-09-26) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.80](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.79...v3.7.0-beta.80) (2023-09-22) + + +### Features + +* **segmentation mode:** Add create, and export SEG with Brushes ([#3632](https://github.com/OHIF/Viewers/issues/3632)) ([48bbd62](https://github.com/OHIF/Viewers/commit/48bbd6281a497ea68670239f5426a10ee6c56dc1)) + + + + + +# [3.7.0-beta.79](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.78...v3.7.0-beta.79) (2023-09-22) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.78](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.77...v3.7.0-beta.78) (2023-09-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.77](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.76...v3.7.0-beta.77) (2023-09-21) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.76](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.75...v3.7.0-beta.76) (2023-09-19) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.75](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.74...v3.7.0-beta.75) (2023-09-18) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.74](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.73...v3.7.0-beta.74) (2023-09-15) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.73](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.72...v3.7.0-beta.73) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.72](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.71...v3.7.0-beta.72) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.71](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.70...v3.7.0-beta.71) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.70](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.69...v3.7.0-beta.70) (2023-09-12) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.69](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.68...v3.7.0-beta.69) (2023-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.68](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.67...v3.7.0-beta.68) (2023-09-11) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.67](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.66...v3.7.0-beta.67) (2023-09-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.66](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.65...v3.7.0-beta.66) (2023-09-06) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.65](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.64...v3.7.0-beta.65) (2023-09-06) + + +### Features + +* **ImageOverlayViewerTool:** add ImageOverlayViewer tool that can render image overlay (pixel overlay) of the DICOM images ([#3163](https://github.com/OHIF/Viewers/issues/3163)) ([69115da](https://github.com/OHIF/Viewers/commit/69115da06d2d437b57e66608b435bb0bc919a90f)) + + + + + +# [3.7.0-beta.64](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.63...v3.7.0-beta.64) (2023-09-05) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.63](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.62...v3.7.0-beta.63) (2023-09-01) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.62](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.61...v3.7.0-beta.62) (2023-08-30) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.61](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.60...v3.7.0-beta.61) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.60](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.59...v3.7.0-beta.60) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.59](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.58...v3.7.0-beta.59) (2023-08-29) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.58](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.57...v3.7.0-beta.58) (2023-08-25) + +**Note:** Version bump only for package @ohif/mode-autometrics + + + + + +# [3.7.0-beta.57](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.56...v3.7.0-beta.57) (2023-08-23) + +**Note:** Version bump only for package @ohif/mode-autometrics diff --git a/modes/autometrics/autometrics/LICENSE b/modes/autometrics/autometrics/LICENSE new file mode 100644 index 00000000000..19e20dd35ca --- /dev/null +++ b/modes/autometrics/autometrics/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Open Health Imaging Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/modes/autometrics/autometrics/README.md b/modes/autometrics/autometrics/README.md new file mode 100644 index 00000000000..fd4384b30c6 --- /dev/null +++ b/modes/autometrics/autometrics/README.md @@ -0,0 +1,40 @@ +# Autometrics Mode + +This mode provides a specialized viewer for automated measurements with the Autometrics panel prominently displayed. + +## Features + +- **Autometrics Panel**: Right panel with automated measurement tools organized in groups: + - Angular Measurements: M1M2, TMT-DOR, TMT-LAT, CP, HA + - Foot Ankle Offset: TALAS +- **Standard Viewer Tools**: All standard OHIF viewer tools and measurements +- **Multiple Viewport Support**: Supports various DICOM modalities and viewport types + +## Usage + +1. Select the "Autometrics" mode from the study list +2. The Autometrics panel will be open by default in the right sidebar +3. Use the automated measurement buttons for quick measurements +4. Standard measurement tools are still available in the toolbar + +## Route + +The mode is accessible via the `/autometrics` route. + +## Configuration + +The mode includes: +- Left panel: Series list with measurement tracking +- Right panel: Autometrics panel (open by default) +- Viewports: Support for various DICOM modalities including: + - Standard DICOM images + - DICOM SR (Structured Reports) + - DICOM SEG (Segmentation) + - DICOM PMAP (Parametric Maps) + - DICOM RT (Radiation Therapy) + - DICOM Video + - DICOM PDF + +## Dependencies + +This mode requires the `@ohif/extension-autometrics` extension to be installed and configured. diff --git a/modes/autometrics/autometrics/assets/locked.png b/modes/autometrics/autometrics/assets/locked.png new file mode 100644 index 00000000000..40e782045b0 Binary files /dev/null and b/modes/autometrics/autometrics/assets/locked.png differ diff --git a/modes/autometrics/autometrics/assets/preview.png b/modes/autometrics/autometrics/assets/preview.png new file mode 100644 index 00000000000..2b8cfb39321 Binary files /dev/null and b/modes/autometrics/autometrics/assets/preview.png differ diff --git a/modes/autometrics/autometrics/assets/restore.png b/modes/autometrics/autometrics/assets/restore.png new file mode 100644 index 00000000000..cfd6622d2ba Binary files /dev/null and b/modes/autometrics/autometrics/assets/restore.png differ diff --git a/modes/autometrics/autometrics/assets/sr-import.png b/modes/autometrics/autometrics/assets/sr-import.png new file mode 100644 index 00000000000..0d31e4c8dab Binary files /dev/null and b/modes/autometrics/autometrics/assets/sr-import.png differ diff --git a/modes/autometrics/autometrics/assets/tracked.png b/modes/autometrics/autometrics/assets/tracked.png new file mode 100644 index 00000000000..7da69fbaa48 Binary files /dev/null and b/modes/autometrics/autometrics/assets/tracked.png differ diff --git a/modes/autometrics/autometrics/assets/workflow.png b/modes/autometrics/autometrics/assets/workflow.png new file mode 100644 index 00000000000..2291ac3ad87 Binary files /dev/null and b/modes/autometrics/autometrics/assets/workflow.png differ diff --git a/modes/autometrics/autometrics/babel.config.js b/modes/autometrics/autometrics/babel.config.js new file mode 100644 index 00000000000..325ca2a8ee7 --- /dev/null +++ b/modes/autometrics/autometrics/babel.config.js @@ -0,0 +1 @@ +module.exports = require('../../babel.config.js'); diff --git a/modes/autometrics/autometrics/package.json b/modes/autometrics/autometrics/package.json new file mode 100644 index 00000000000..213bc9f7f81 --- /dev/null +++ b/modes/autometrics/autometrics/package.json @@ -0,0 +1,55 @@ +{ + "name": "@ohif/mode-autometrics", + "version": "3.12.0-beta.2", + "description": "Autometrics Workflow", + "author": "OHIF", + "license": "MIT", + "repository": "OHIF/Viewers", + "main": "dist/ohif-mode-autometrics.js", + "module": "src/index.ts", + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1.16.0" + }, + "files": [ + "dist", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "keywords": [ + "ohif-mode" + ], + "scripts": { + "clean": "shx rm -rf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", + "dev": "cross-env NODE_ENV=development webpack --config .webpack/webpack.dev.js --watch --output-pathinfo", + "dev:cornerstone": "yarn run dev", + "build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js", + "build:package": "yarn run build", + "start": "yarn run dev", + "test:unit": "jest --watchAll", + "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.2", + "@ohif/extension-cornerstone": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.2", + "@ohif/extension-default": "3.12.0-beta.2", + "@ohif/extension-dicom-pdf": "3.12.0-beta.2", + "@ohif/extension-dicom-video": "3.12.0-beta.2", + "@ohif/extension-measurement-tracking": "3.12.0-beta.2" + }, + "dependencies": { + "@babel/runtime": "^7.20.13", + "i18next": "^17.0.3" + }, + "devDependencies": { + "webpack": "5.95.0", + "webpack-merge": "^5.7.3" + } +} diff --git a/modes/autometrics/autometrics/src/id.js b/modes/autometrics/autometrics/src/id.js new file mode 100644 index 00000000000..ebe5acd98ae --- /dev/null +++ b/modes/autometrics/autometrics/src/id.js @@ -0,0 +1,5 @@ +import packageJson from '../package.json'; + +const id = packageJson.name; + +export { id }; diff --git a/modes/autometrics/autometrics/src/index.ts b/modes/autometrics/autometrics/src/index.ts new file mode 100644 index 00000000000..46ff0f2fd7c --- /dev/null +++ b/modes/autometrics/autometrics/src/index.ts @@ -0,0 +1,283 @@ +import i18n from 'i18next'; +import { id } from './id'; +import initToolGroups from './initToolGroups'; +import toolbarButtons from './toolbarButtons'; + +// Allow this mode by excluding non-imaging modalities such as SR, SEG +// Also, SM is not a simple imaging modalities, so exclude it. +const NON_IMAGE_MODALITIES = ['ECG', 'SEG', 'RTSTRUCT', 'RTPLAN', 'PR']; + +const ohif = { + layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout', + sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack', + thumbnailList: '@ohif/extension-default.panelModule.seriesList', + wsiSopClassHandler: + '@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler', +}; + +const autometrics = { + autometrics: '@ohif/extension-autometrics.panelModule.autometrics', +}; + +const tracked = { + thumbnailList: '@ohif/extension-measurement-tracking.panelModule.seriesList', + viewport: '@ohif/extension-measurement-tracking.viewportModule.cornerstone-tracked', +}; + +const dicomsr = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr', + sopClassHandler3D: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr-3d', + viewport: '@ohif/extension-cornerstone-dicom-sr.viewportModule.dicom-sr', +}; + +const dicomvideo = { + sopClassHandler: '@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video', + viewport: '@ohif/extension-dicom-video.viewportModule.dicom-video', +}; + +const dicompdf = { + sopClassHandler: '@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf', + viewport: '@ohif/extension-dicom-pdf.viewportModule.dicom-pdf', +}; + +const dicomSeg = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg', + viewport: '@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg', +}; + +const dicomPmap = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-pmap.sopClassHandlerModule.dicom-pmap', + viewport: '@ohif/extension-cornerstone-dicom-pmap.viewportModule.dicom-pmap', +}; + +const dicomRT = { + viewport: '@ohif/extension-cornerstone-dicom-rt.viewportModule.dicom-rt', + sopClassHandler: '@ohif/extension-cornerstone-dicom-rt.sopClassHandlerModule.dicom-rt', +}; + +const extensionDependencies = { + // Can derive the versions at least process.env.from npm_package_version + '@ohif/extension-default': '^3.0.0', + '@ohif/extension-cornerstone': '^3.0.0', + '@ohif/extension-measurement-tracking': '^3.0.0', + '@ohif/extension-cornerstone-dicom-sr': '^3.0.0', + '@ohif/extension-cornerstone-dicom-seg': '^3.0.0', + '@ohif/extension-cornerstone-dicom-pmap': '^3.0.0', + '@ohif/extension-cornerstone-dicom-rt': '^3.0.0', + '@ohif/extension-dicom-pdf': '^3.0.1', + '@ohif/extension-dicom-video': '^3.0.1', + '@ohif/extension-autometrics': '^3.0.0', +}; + +function modeFactory({ modeConfiguration }) { + let _activatePanelTriggersSubscriptions = []; + return { + // TODO: We're using this as a route segment + // We should not be. + id, + routeName: 'autometrics', + displayName: i18n.t('Modes:Autometrics'), + /** + * Lifecycle hooks + */ + onModeEnter: function ({ servicesManager, extensionManager, commandsManager }: withAppTypes) { + const { measurementService, toolbarService, toolGroupService, customizationService } = + servicesManager.services; + + measurementService.clearMeasurements(); + + // Init Default and SR ToolGroups + initToolGroups(extensionManager, toolGroupService, commandsManager); + + toolbarService.register(toolbarButtons); + toolbarService.updateSection(toolbarService.sections.primary, [ + 'MeasurementTools', + 'Zoom', + 'Pan', + 'TrackballRotate', + 'WindowLevel', + 'Capture', + 'Layout', + 'Crosshairs', + 'MoreTools', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.topLeft, [ + 'orientationMenu', + 'dataOverlayMenu', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.bottomMiddle, [ + 'AdvancedRenderingControls', + ]); + + toolbarService.updateSection('AdvancedRenderingControls', [ + 'windowLevelMenuEmbedded', + 'voiManualControlMenu', + 'Colorbar', + 'opacityMenu', + 'thresholdMenu', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.topRight, [ + 'modalityLoadBadge', + 'trackingStatus', + 'navigationComponent', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.bottomLeft, [ + 'windowLevelMenu', + ]); + + toolbarService.updateSection('MeasurementTools', [ + 'Length', + 'Bidirectional', + 'ArrowAnnotate', + 'EllipticalROI', + 'RectangleROI', + 'CircleROI', + 'PlanarFreehandROI', + 'SplineROI', + 'LivewireContour', + ]); + + toolbarService.updateSection('MoreTools', [ + 'Reset', + 'rotate-right', + 'flipHorizontal', + 'ImageSliceSync', + 'ReferenceLines', + 'ImageOverlayViewer', + 'StackScroll', + 'invert', + 'Probe', + 'Cine', + 'Angle', + 'CobbAngle', + 'Magnify', + 'CalibrationLine', + 'TagBrowser', + 'AdvancedMagnify', + 'UltrasoundDirectionalTool', + 'WindowLevelRegion', + 'SegmentLabelTool', + ]); + + // ]; + }, + onModeExit: ({ servicesManager }: withAppTypes) => { + const { + toolGroupService, + syncGroupService, + segmentationService, + cornerstoneViewportService, + uiDialogService, + uiModalService, + } = servicesManager.services; + + _activatePanelTriggersSubscriptions.forEach(sub => sub.unsubscribe()); + _activatePanelTriggersSubscriptions = []; + + uiDialogService.hideAll(); + uiModalService.hide(); + toolGroupService.destroy(); + syncGroupService.destroy(); + segmentationService.destroy(); + cornerstoneViewportService.destroy(); + }, + validationTags: { + study: [], + series: [], + }, + + isValidMode: function ({ modalities }) { + const modalities_list = modalities.split('\\'); + + // Exclude non-image modalities + return { + valid: !!modalities_list.filter(modality => NON_IMAGE_MODALITIES.indexOf(modality) === -1) + .length, + description: + 'The mode does not support studies that ONLY include the following modalities: SM, ECG, SEG, RTSTRUCT', + }; + }, + routes: [ + { + path: 'autometrics', + /*init: ({ servicesManager, extensionManager }) => { + //defaultViewerRouteInit + },*/ + layoutTemplate: () => { + return { + id: ohif.layout, + props: { + leftPanels: [tracked.thumbnailList], + leftPanelResizable: true, + rightPanels: [autometrics.autometrics], + rightPanelClosed: false, + rightPanelResizable: true, + viewports: [ + { + namespace: tracked.viewport, + displaySetsToDisplay: [ + ohif.sopClassHandler, + dicomvideo.sopClassHandler, + ohif.wsiSopClassHandler, + ], + }, + { + namespace: dicomsr.viewport, + displaySetsToDisplay: [dicomsr.sopClassHandler, dicomsr.sopClassHandler3D], + }, + { + namespace: dicompdf.viewport, + displaySetsToDisplay: [dicompdf.sopClassHandler], + }, + { + namespace: dicomSeg.viewport, + displaySetsToDisplay: [dicomSeg.sopClassHandler], + }, + { + namespace: dicomPmap.viewport, + displaySetsToDisplay: [dicomPmap.sopClassHandler], + }, + { + namespace: dicomRT.viewport, + displaySetsToDisplay: [dicomRT.sopClassHandler], + }, + ], + }, + }; + }, + }, + ], + extensions: extensionDependencies, + // Default protocol gets self-registered by default in the init + hangingProtocol: 'default', + // Order is important in sop class handlers when two handlers both use + // the same sop class under different situations. In that case, the more + // general handler needs to come last. For this case, the dicomvideo must + // come first to remove video transfer syntax before ohif uses images + sopClassHandlers: [ + dicomvideo.sopClassHandler, + dicomSeg.sopClassHandler, + dicomPmap.sopClassHandler, + ohif.sopClassHandler, + ohif.wsiSopClassHandler, + dicompdf.sopClassHandler, + dicomsr.sopClassHandler3D, + dicomsr.sopClassHandler, + dicomRT.sopClassHandler, + ], + ...modeConfiguration, + }; +} + +const mode = { + id, + modeFactory, + extensionDependencies, +}; + +export default mode; +export { initToolGroups, toolbarButtons }; diff --git a/modes/autometrics/autometrics/src/initToolGroups.js b/modes/autometrics/autometrics/src/initToolGroups.js new file mode 100644 index 00000000000..110f5bdd069 --- /dev/null +++ b/modes/autometrics/autometrics/src/initToolGroups.js @@ -0,0 +1,318 @@ +import { toolNames as SRToolNames } from '@ohif/extension-cornerstone-dicom-sr'; + +const colours = { + 'viewport-0': 'rgb(200, 0, 0)', + 'viewport-1': 'rgb(200, 200, 0)', + 'viewport-2': 'rgb(0, 200, 0)', +}; + +const colorsByOrientation = { + axial: 'rgb(200, 0, 0)', + sagittal: 'rgb(200, 200, 0)', + coronal: 'rgb(0, 200, 0)', +}; + +function initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, toolGroupId) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: toolNames.Length }, + { + toolName: toolNames.ArrowAnnotate, + configuration: { + getTextCallback: (callback, eventDetails) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + eventDetails, + }); + }, + changeTextCallback: (data, eventDetails, callback) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + data, + eventDetails, + }); + }, + }, + }, + { + toolName: toolNames.SegmentBidirectional, + }, + { toolName: toolNames.Bidirectional }, + { toolName: toolNames.DragProbe }, + { toolName: toolNames.Probe }, + { toolName: toolNames.EllipticalROI }, + { toolName: toolNames.CircleROI }, + { toolName: toolNames.RectangleROI }, + { toolName: toolNames.StackScroll }, + { toolName: toolNames.Angle }, + { toolName: toolNames.CobbAngle }, + { toolName: toolNames.Magnify }, + { toolName: toolNames.CalibrationLine }, + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, + { toolName: toolNames.UltrasoundDirectional }, + { toolName: toolNames.PlanarFreehandROI }, + { toolName: toolNames.SplineROI }, + { toolName: toolNames.LivewireContour }, + { toolName: toolNames.WindowLevelRegion }, + ], + enabled: [ + { toolName: toolNames.ImageOverlayViewer }, + { toolName: toolNames.ReferenceLines }, + { + toolName: SRToolNames.SRSCOORD3DPoint, + }, + ], + disabled: [ + { + toolName: toolNames.AdvancedMagnify, + }, + ], + }; + + const updatedTools = commandsManager.run('initializeSegmentLabelTool', { tools }); + + toolGroupService.createToolGroupAndAddTools(toolGroupId, updatedTools); +} + +function initSRToolGroup(extensionManager, toolGroupService) { + const SRUtilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone-dicom-sr.utilityModule.tools' + ); + + if (!SRUtilityModule) { + return; + } + + const CS3DUtilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames: SRToolNames } = SRUtilityModule.exports; + const { toolNames, Enums } = CS3DUtilityModule.exports; + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [ + { + mouseButton: Enums.MouseBindings.Primary, + }, + ], + }, + { + toolName: toolNames.Pan, + bindings: [ + { + mouseButton: Enums.MouseBindings.Auxiliary, + }, + ], + }, + { + toolName: toolNames.Zoom, + bindings: [ + { + mouseButton: Enums.MouseBindings.Secondary, + }, + { numTouchPoints: 2 }, + ], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: SRToolNames.SRLength }, + { toolName: SRToolNames.SRArrowAnnotate }, + { toolName: SRToolNames.SRBidirectional }, + { toolName: SRToolNames.SREllipticalROI }, + { toolName: SRToolNames.SRCircleROI }, + { toolName: SRToolNames.SRPlanarFreehandROI }, + { toolName: SRToolNames.SRRectangleROI }, + { toolName: toolNames.WindowLevelRegion }, + ], + enabled: [ + { + toolName: SRToolNames.DICOMSRDisplay, + }, + ], + // disabled + }; + + const toolGroupId = 'SRToolGroup'; + toolGroupService.createToolGroupAndAddTools(toolGroupId, tools); +} + +function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const serviceManager = extensionManager._servicesManager; + const { cornerstoneViewportService } = serviceManager.services; + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: toolNames.Length }, + { + toolName: toolNames.ArrowAnnotate, + configuration: { + getTextCallback: (callback, eventDetails) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + eventDetails, + }); + }, + changeTextCallback: (data, eventDetails, callback) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + data, + eventDetails, + }); + }, + }, + }, + { toolName: toolNames.Bidirectional }, + { toolName: toolNames.DragProbe }, + { toolName: toolNames.Probe }, + { toolName: toolNames.EllipticalROI }, + { toolName: toolNames.CircleROI }, + { toolName: toolNames.RectangleROI }, + { toolName: toolNames.StackScroll }, + { toolName: toolNames.Angle }, + { toolName: toolNames.CobbAngle }, + { toolName: toolNames.PlanarFreehandROI }, + { toolName: toolNames.SplineROI }, + { toolName: toolNames.LivewireContour }, + { toolName: toolNames.WindowLevelRegion }, + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, + ], + disabled: [ + { + toolName: toolNames.Crosshairs, + configuration: { + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, + disableOnPassive: true, + autoPan: { + enabled: false, + panSize: 10, + }, + getReferenceLineColor: viewportId => { + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); + const viewportOptions = viewportInfo?.viewportOptions; + if (viewportOptions) { + return ( + colours[viewportOptions.id] || + colorsByOrientation[viewportOptions.orientation] || + '#0c0' + ); + } else { + console.warn('missing viewport?', viewportId); + return '#0c0'; + } + }, + }, + }, + { + toolName: toolNames.AdvancedMagnify, + }, + { toolName: toolNames.ReferenceLines }, + ], + }; + + toolGroupService.createToolGroupAndAddTools('mpr', tools); +} +function initVolume3DToolGroup(extensionManager, toolGroupService) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.TrackballRotateTool, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }, { numTouchPoints: 3 }], + }, + ], + }; + + toolGroupService.createToolGroupAndAddTools('volume3d', tools); +} + +function initToolGroups(extensionManager, toolGroupService, commandsManager) { + initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, 'default'); + initSRToolGroup(extensionManager, toolGroupService); + initMPRToolGroup(extensionManager, toolGroupService, commandsManager); + initVolume3DToolGroup(extensionManager, toolGroupService); +} + +export default initToolGroups; diff --git a/modes/autometrics/autometrics/src/toolbarButtons.ts b/modes/autometrics/autometrics/src/toolbarButtons.ts new file mode 100644 index 00000000000..c9db3f257b6 --- /dev/null +++ b/modes/autometrics/autometrics/src/toolbarButtons.ts @@ -0,0 +1,709 @@ +import type { Button } from '@ohif/core/types'; + +import { EVENTS } from '@cornerstonejs/core'; +import { ViewportGridService } from '@ohif/core'; + +const callbacks = (toolName: string) => [ + { + commandName: 'setViewportForToolConfiguration', + commandOptions: { + toolName, + }, + }, +]; + +export const setToolActiveToolbar = { + commandName: 'setToolActiveToolbar', + commandOptions: { + toolGroupIds: ['default', 'mpr', 'SRToolGroup', 'volume3d'], + }, +}; + +const toolbarButtons: Button[] = [ + // sections + { + id: 'MeasurementTools', + uiType: 'ohif.toolButtonList', + props: { + buttonSection: true, + }, + }, + { + id: 'MoreTools', + uiType: 'ohif.toolButtonList', + props: { + buttonSection: true, + }, + }, + { + id: 'AdvancedRenderingControls', + uiType: 'ohif.advancedRenderingControls', + props: { + buttonSection: true, + }, + }, + // tool defs + { + id: 'modalityLoadBadge', + uiType: 'ohif.modalityLoadBadge', + props: { + icon: 'Status', + label: 'Status', + tooltip: 'Status', + evaluate: { + name: 'evaluate.modalityLoadBadge', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'navigationComponent', + uiType: 'ohif.navigationComponent', + props: { + icon: 'Navigation', + label: 'Navigation', + tooltip: 'Navigate between segments/measurements and manage their visibility', + evaluate: { + name: 'evaluate.navigationComponent', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'trackingStatus', + uiType: 'ohif.trackingStatus', + props: { + icon: 'TrackingStatus', + label: 'Tracking Status', + tooltip: 'View and manage tracking status of measurements and annotations', + evaluate: { + name: 'evaluate.trackingStatus', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'dataOverlayMenu', + uiType: 'ohif.dataOverlayMenu', + props: { + icon: 'ViewportViews', + label: 'Data Overlay', + tooltip: 'Configure data overlay options and manage foreground/background display sets', + evaluate: 'evaluate.dataOverlayMenu', + }, + }, + { + id: 'orientationMenu', + uiType: 'ohif.orientationMenu', + props: { + icon: 'OrientationSwitch', + label: 'Orientation', + tooltip: 'Change viewport orientation between axial, sagittal, coronal and reformat planes', + evaluate: { + name: 'evaluate.orientationMenu', + // hideWhenDisabled: true, + }, + }, + }, + { + id: 'windowLevelMenuEmbedded', + uiType: 'ohif.windowLevelMenuEmbedded', + props: { + icon: 'WindowLevel', + label: 'Window Level', + tooltip: 'Adjust window/level presets and customize image contrast settings', + evaluate: { + name: 'evaluate.windowLevelMenuEmbedded', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'windowLevelMenu', + uiType: 'ohif.windowLevelMenu', + props: { + icon: 'WindowLevel', + label: 'Window Level', + tooltip: 'Adjust window/level presets and customize image contrast settings', + evaluate: { + name: 'evaluate.windowLevelMenu', + }, + }, + }, + { + id: 'voiManualControlMenu', + uiType: 'ohif.voiManualControlMenu', + props: { + icon: 'WindowLevelAdvanced', + label: 'Advanced Window Level', + tooltip: 'Advanced window/level settings with manual controls and presets', + evaluate: 'evaluate.voiManualControlMenu', + }, + }, + { + id: 'thresholdMenu', + uiType: 'ohif.thresholdMenu', + props: { + icon: 'Threshold', + label: 'Threshold', + tooltip: 'Image threshold settings', + evaluate: { + name: 'evaluate.thresholdMenu', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'opacityMenu', + uiType: 'ohif.opacityMenu', + props: { + icon: 'Opacity', + label: 'Opacity', + tooltip: 'Image opacity settings', + evaluate: { + name: 'evaluate.opacityMenu', + hideWhenDisabled: true, + }, + }, + }, + { + id: 'Colorbar', + uiType: 'ohif.colorbar', + props: { + type: 'tool', + label: 'Colorbar', + }, + }, + { + id: 'Reset', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-reset', + label: 'Reset View', + tooltip: 'Reset View', + commands: 'resetViewport', + evaluate: 'evaluate.action', + }, + }, + { + id: 'rotate-right', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-rotate-right', + label: 'Rotate Right', + tooltip: 'Rotate +90', + commands: 'rotateViewportCW', + evaluate: [ + 'evaluate.action', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'flipHorizontal', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-flip-horizontal', + label: 'Flip Horizontal', + tooltip: 'Flip Horizontally', + commands: 'flipViewportHorizontal', + evaluate: [ + 'evaluate.viewportProperties.toggle', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video', 'volume3d'], + }, + ], + }, + }, + { + id: 'ImageSliceSync', + uiType: 'ohif.toolButton', + props: { + icon: 'link', + label: 'Image Slice Sync', + tooltip: 'Enable position synchronization on stack viewports', + commands: { + commandName: 'toggleSynchronizer', + commandOptions: { + type: 'imageSlice', + }, + }, + listeners: { + [EVENTS.VIEWPORT_NEW_IMAGE_SET]: { + commandName: 'toggleImageSliceSync', + commandOptions: { toggledState: true }, + }, + }, + evaluate: [ + 'evaluate.cornerstone.synchronizer', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video', 'volume3d'], + }, + ], + }, + }, + { + id: 'ReferenceLines', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-referenceLines', + label: 'Reference Lines', + tooltip: 'Show Reference Lines', + commands: 'toggleEnabledDisabledToolbar', + listeners: { + [ViewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED]: callbacks('ReferenceLines'), + [ViewportGridService.EVENTS.VIEWPORTS_READY]: callbacks('ReferenceLines'), + }, + evaluate: [ + 'evaluate.cornerstoneTool.toggle', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'ImageOverlayViewer', + uiType: 'ohif.toolButton', + props: { + icon: 'toggle-dicom-overlay', + label: 'Image Overlay', + tooltip: 'Toggle Image Overlay', + commands: 'toggleEnabledDisabledToolbar', + evaluate: [ + 'evaluate.cornerstoneTool.toggle', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'StackScroll', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-stack-scroll', + label: 'Stack Scroll', + tooltip: 'Stack Scroll', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'invert', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-invert', + label: 'Invert', + tooltip: 'Invert Colors', + commands: 'invertViewport', + evaluate: [ + 'evaluate.viewportProperties.toggle', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'Probe', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-probe', + label: 'Probe', + tooltip: 'Probe', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Cine', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-cine', + label: 'Cine', + tooltip: 'Cine', + commands: 'toggleCine', + evaluate: [ + 'evaluate.cine', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['volume3d'], + }, + ], + }, + }, + { + id: 'Angle', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-angle', + label: 'Angle', + tooltip: 'Angle', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'CobbAngle', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-cobb-angle', + label: 'Cobb Angle', + tooltip: 'Cobb Angle', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Magnify', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-magnify', + label: 'Zoom-in', + tooltip: 'Zoom-in', + commands: setToolActiveToolbar, + evaluate: [ + 'evaluate.cornerstoneTool', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'CalibrationLine', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-calibration', + label: 'Calibration', + tooltip: 'Calibration Line', + commands: setToolActiveToolbar, + evaluate: [ + 'evaluate.cornerstoneTool', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'TagBrowser', + uiType: 'ohif.toolButton', + props: { + icon: 'dicom-tag-browser', + label: 'Dicom Tag Browser', + tooltip: 'Dicom Tag Browser', + commands: 'openDICOMTagViewer', + }, + }, + { + id: 'AdvancedMagnify', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-loupe', + label: 'Magnify Probe', + tooltip: 'Magnify Probe', + commands: 'toggleActiveDisabledToolbar', + evaluate: [ + 'evaluate.cornerstoneTool.toggle.ifStrictlyDisabled', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'UltrasoundDirectionalTool', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-ultrasound-bidirectional', + label: 'Ultrasound Directional', + tooltip: 'Ultrasound Directional', + commands: setToolActiveToolbar, + evaluate: [ + 'evaluate.cornerstoneTool', + { + name: 'evaluate.modality.supported', + supportedModalities: ['US'], + }, + ], + }, + }, + { + id: 'WindowLevelRegion', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-window-region', + label: 'Window Level Region', + tooltip: 'Window Level Region', + commands: setToolActiveToolbar, + evaluate: [ + 'evaluate.cornerstoneTool', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video'], + }, + ], + }, + }, + { + id: 'Length', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-length', + label: 'Length', + tooltip: 'Length Tool', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Bidirectional', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-bidirectional', + label: 'Bidirectional', + tooltip: 'Bidirectional Tool', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'ArrowAnnotate', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-annotate', + label: 'Annotation', + tooltip: 'Arrow Annotate', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'EllipticalROI', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-ellipse', + label: 'Ellipse', + tooltip: 'Ellipse ROI', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'RectangleROI', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-rectangle', + label: 'Rectangle', + tooltip: 'Rectangle ROI', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'CircleROI', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-circle', + label: 'Circle', + tooltip: 'Circle Tool', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'PlanarFreehandROI', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-freehand-roi', + label: 'Freehand ROI', + tooltip: 'Freehand ROI', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'SplineROI', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-spline-roi', + label: 'Spline ROI', + tooltip: 'Spline ROI', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'LivewireContour', + uiType: 'ohif.toolButton', + props: { + icon: 'icon-tool-livewire', + label: 'Livewire tool', + tooltip: 'Livewire tool', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + // Window Level + { + id: 'WindowLevel', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-window-level', + label: 'Window Level', + commands: setToolActiveToolbar, + evaluate: [ + 'evaluate.cornerstoneTool', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['wholeSlide'], + }, + ], + }, + }, + { + id: 'Pan', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-move', + label: 'Pan', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Zoom', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-zoom', + label: 'Zoom', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'TrackballRotate', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-3d-rotate', + label: '3D Rotate', + commands: setToolActiveToolbar, + evaluate: { + name: 'evaluate.cornerstoneTool', + disabledText: 'Select a 3D viewport to enable this tool', + }, + }, + }, + { + id: 'Capture', + uiType: 'ohif.toolButton', + props: { + icon: 'tool-capture', + label: 'Capture', + commands: 'showDownloadViewportModal', + evaluate: [ + 'evaluate.action', + { + name: 'evaluate.viewport.supported', + unsupportedViewportTypes: ['video', 'wholeSlide'], + }, + ], + }, + }, + { + id: 'Layout', + uiType: 'ohif.layoutSelector', + props: { + rows: 3, + columns: 4, + evaluate: 'evaluate.action', + }, + }, + { + id: 'Crosshairs', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-crosshair', + label: 'Crosshairs', + commands: { + commandName: 'setToolActiveToolbar', + commandOptions: { + toolGroupIds: ['mpr'], + }, + }, + evaluate: { + name: 'evaluate.cornerstoneTool', + disabledText: 'Select an MPR viewport to enable this tool', + }, + }, + }, + // Section containers for the nested toolbox + { + id: 'SegmentationUtilities', + uiType: 'ohif.toolBoxButton', + props: { + buttonSection: true, + }, + }, + { + id: 'SegmentLabelTool', + uiType: 'ohif.toolBoxButton', + props: { + icon: 'tool-segment-label', + label: 'Segment Label Display', + tooltip: 'Click to show or hide segment labels when hovering with your mouse.', + commands: { commandName: 'toggleSegmentLabel' }, + evaluate: [ + 'evaluate.cornerstoneTool.toggle', + { + name: 'evaluate.cornerstone.hasSegmentation', + }, + ], + }, + }, + // { + // id: 'Undo', + // uiType: 'ohif.toolButton', + // props: { + // type: 'tool', + // icon: 'prev-arrow', + // label: 'Undo', + // commands: { + // commandName: 'undo', + // }, + // evaluate: 'evaluate.action', + // }, + // }, + // { + // id: 'Redo', + // uiType: 'ohif.toolButton', + // props: { + // type: 'tool', + // icon: 'next-arrow', + // label: 'Redo', + // commands: { + // commandName: 'redo', + // }, + // evaluate: 'evaluate.action', + // }, + // }, +]; + +export default toolbarButtons; diff --git a/modes/autometrics/babel.config.js b/modes/autometrics/babel.config.js new file mode 100644 index 00000000000..325ca2a8ee7 --- /dev/null +++ b/modes/autometrics/babel.config.js @@ -0,0 +1 @@ +module.exports = require('../../babel.config.js'); diff --git a/modes/autometrics/package.json b/modes/autometrics/package.json new file mode 100644 index 00000000000..213bc9f7f81 --- /dev/null +++ b/modes/autometrics/package.json @@ -0,0 +1,55 @@ +{ + "name": "@ohif/mode-autometrics", + "version": "3.12.0-beta.2", + "description": "Autometrics Workflow", + "author": "OHIF", + "license": "MIT", + "repository": "OHIF/Viewers", + "main": "dist/ohif-mode-autometrics.js", + "module": "src/index.ts", + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1.16.0" + }, + "files": [ + "dist", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "keywords": [ + "ohif-mode" + ], + "scripts": { + "clean": "shx rm -rf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", + "dev": "cross-env NODE_ENV=development webpack --config .webpack/webpack.dev.js --watch --output-pathinfo", + "dev:cornerstone": "yarn run dev", + "build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js", + "build:package": "yarn run build", + "start": "yarn run dev", + "test:unit": "jest --watchAll", + "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests" + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.2", + "@ohif/extension-cornerstone": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.2", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.2", + "@ohif/extension-default": "3.12.0-beta.2", + "@ohif/extension-dicom-pdf": "3.12.0-beta.2", + "@ohif/extension-dicom-video": "3.12.0-beta.2", + "@ohif/extension-measurement-tracking": "3.12.0-beta.2" + }, + "dependencies": { + "@babel/runtime": "^7.20.13", + "i18next": "^17.0.3" + }, + "devDependencies": { + "webpack": "5.95.0", + "webpack-merge": "^5.7.3" + } +} diff --git a/modes/autometrics/src/id.js b/modes/autometrics/src/id.js new file mode 100644 index 00000000000..ebe5acd98ae --- /dev/null +++ b/modes/autometrics/src/id.js @@ -0,0 +1,5 @@ +import packageJson from '../package.json'; + +const id = packageJson.name; + +export { id }; diff --git a/modes/autometrics/src/index.ts b/modes/autometrics/src/index.ts new file mode 100644 index 00000000000..0f2f9796612 --- /dev/null +++ b/modes/autometrics/src/index.ts @@ -0,0 +1,283 @@ +import i18n from 'i18next'; +import { id } from './id'; +import initToolGroups from './initToolGroups'; +import toolbarButtons from './toolbarButtons'; + +// Allow this mode by excluding non-imaging modalities such as SR, SEG +// Also, SM is not a simple imaging modalities, so exclude it. +const NON_IMAGE_MODALITIES = ['ECG', 'SEG', 'RTSTRUCT', 'RTPLAN', 'PR']; + +const ohif = { + layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout', + sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack', + thumbnailList: '@ohif/extension-default.panelModule.seriesList', + wsiSopClassHandler: + '@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler', +}; + +const autometricsLayout = { + layout: '@ohif/extension-autometrics.layoutTemplateModule.viewerLayout', +}; + +const autometrics = { + autometrics: '@ohif/extension-autometrics.panelModule.autometrics', +}; + +const tracked = { + thumbnailList: '@ohif/extension-measurement-tracking.panelModule.seriesList', + viewport: '@ohif/extension-measurement-tracking.viewportModule.cornerstone-tracked', +}; + +const dicomsr = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr', + sopClassHandler3D: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr-3d', + viewport: '@ohif/extension-cornerstone-dicom-sr.viewportModule.dicom-sr', +}; + +const dicomvideo = { + sopClassHandler: '@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video', + viewport: '@ohif/extension-dicom-video.viewportModule.dicom-video', +}; + +const dicompdf = { + sopClassHandler: '@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf', + viewport: '@ohif/extension-dicom-pdf.viewportModule.dicom-pdf', +}; + +const dicomSeg = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg', + viewport: '@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg', +}; + +const dicomPmap = { + sopClassHandler: '@ohif/extension-cornerstone-dicom-pmap.sopClassHandlerModule.dicom-pmap', + viewport: '@ohif/extension-cornerstone-dicom-pmap.viewportModule.dicom-pmap', +}; + +const dicomRT = { + viewport: '@ohif/extension-cornerstone-dicom-rt.viewportModule.dicom-rt', + sopClassHandler: '@ohif/extension-cornerstone-dicom-rt.sopClassHandlerModule.dicom-rt', +}; + +const extensionDependencies = { + // Can derive the versions at least process.env.from npm_package_version + '@ohif/extension-default': '^3.0.0', + '@ohif/extension-cornerstone': '^3.0.0', + '@ohif/extension-measurement-tracking': '^3.0.0', + '@ohif/extension-cornerstone-dicom-sr': '^3.0.0', + '@ohif/extension-cornerstone-dicom-seg': '^3.0.0', + '@ohif/extension-cornerstone-dicom-pmap': '^3.0.0', + '@ohif/extension-cornerstone-dicom-rt': '^3.0.0', + '@ohif/extension-dicom-pdf': '^3.0.1', + '@ohif/extension-dicom-video': '^3.0.1', + '@ohif/extension-autometrics': '^3.0.0', +}; + +function modeFactory({ modeConfiguration }) { + return { + // TODO: We're using this as a route segment + // We should not be. + id, + routeName: 'autometrics', + displayName: i18n.t('Modes:Autometrics'), + /** + * Lifecycle hooks + */ + onModeEnter: ({ servicesManager, extensionManager, commandsManager }: withAppTypes) => { + const { measurementService, toolbarService, toolGroupService, customizationService } = + servicesManager.services; + + measurementService.clearMeasurements(); + + // Init Default and SR ToolGroups + initToolGroups(extensionManager, toolGroupService, commandsManager); + + toolbarService.register(toolbarButtons); + toolbarService.updateSection(toolbarService.sections.primary, [ + 'MeasurementTools', + 'Zoom', + 'Pan', + 'TrackballRotate', + 'WindowLevel', + 'Capture', + 'Layout', + 'Crosshairs', + 'MoreTools', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.topLeft, [ + 'orientationMenu', + 'dataOverlayMenu', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.bottomMiddle, [ + 'AdvancedRenderingControls', + ]); + + toolbarService.updateSection('AdvancedRenderingControls', [ + 'windowLevelMenuEmbedded', + 'voiManualControlMenu', + 'Colorbar', + 'opacityMenu', + 'thresholdMenu', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.topRight, [ + 'modalityLoadBadge', + 'trackingStatus', + 'navigationComponent', + ]); + + toolbarService.updateSection(toolbarService.sections.viewportActionMenu.bottomLeft, [ + 'windowLevelMenu', + ]); + + toolbarService.updateSection('MeasurementTools', [ + 'Length', + 'Bidirectional', + 'ArrowAnnotate', + 'EllipticalROI', + 'RectangleROI', + 'CircleROI', + 'PlanarFreehandROI', + 'SplineROI', + 'LivewireContour', + ]); + + toolbarService.updateSection('MoreTools', [ + 'Reset', + 'rotate-right', + 'flipHorizontal', + 'ImageSliceSync', + 'ReferenceLines', + 'ImageOverlayViewer', + 'StackScroll', + 'invert', + 'Probe', + 'Cine', + 'Angle', + 'CobbAngle', + 'Magnify', + 'CalibrationLine', + 'TagBrowser', + 'AdvancedMagnify', + 'UltrasoundDirectionalTool', + 'WindowLevelRegion', + 'SegmentLabelTool', + ]); + + // ]; + }, + onModeExit: ({ servicesManager }: withAppTypes) => { + const { + toolGroupService, + syncGroupService, + segmentationService, + cornerstoneViewportService, + uiDialogService, + uiModalService, + } = servicesManager.services; + + uiDialogService.hideAll(); + uiModalService.hide(); + toolGroupService.destroy(); + syncGroupService.destroy(); + segmentationService.destroy(); + cornerstoneViewportService.destroy(); + }, + validationTags: { + study: [], + series: [], + }, + + isValidMode: function ({ modalities }) { + const modalities_list = modalities.split('\\'); + + // Exclude non-image modalities + return { + valid: !!modalities_list.filter(modality => NON_IMAGE_MODALITIES.indexOf(modality) === -1) + .length, + description: + 'The mode does not support studies that ONLY include the following modalities: SM, ECG, SEG, RTSTRUCT', + }; + }, + routes: [ + { + path: 'autometrics', + /*init: ({ servicesManager, extensionManager }) => { + //defaultViewerRouteInit + },*/ + layoutTemplate: () => { + return { + id: autometricsLayout.layout, + props: { + leftPanels: [tracked.thumbnailList], + leftPanelResizable: true, + rightPanels: [autometrics.autometrics], + rightPanelClosed: false, + rightPanelResizable: true, + viewports: [ + { + namespace: tracked.viewport, + displaySetsToDisplay: [ + ohif.sopClassHandler, + dicomvideo.sopClassHandler, + ohif.wsiSopClassHandler, + ], + }, + { + namespace: dicomsr.viewport, + displaySetsToDisplay: [dicomsr.sopClassHandler, dicomsr.sopClassHandler3D], + }, + { + namespace: dicompdf.viewport, + displaySetsToDisplay: [dicompdf.sopClassHandler], + }, + { + namespace: dicomSeg.viewport, + displaySetsToDisplay: [dicomSeg.sopClassHandler], + }, + { + namespace: dicomPmap.viewport, + displaySetsToDisplay: [dicomPmap.sopClassHandler], + }, + { + namespace: dicomRT.viewport, + displaySetsToDisplay: [dicomRT.sopClassHandler], + }, + ], + }, + }; + }, + }, + ], + extensions: extensionDependencies, + // Default protocol gets self-registered by default in the init + hangingProtocol: 'default', + // Order is important in sop class handlers when two handlers both use + // the same sop class under different situations. In that case, the more + // general handler needs to come last. For this case, the dicomvideo must + // come first to remove video transfer syntax before ohif uses images + sopClassHandlers: [ + dicomvideo.sopClassHandler, + dicomSeg.sopClassHandler, + dicomPmap.sopClassHandler, + ohif.sopClassHandler, + ohif.wsiSopClassHandler, + dicompdf.sopClassHandler, + dicomsr.sopClassHandler3D, + dicomsr.sopClassHandler, + dicomRT.sopClassHandler, + ], + ...modeConfiguration, + }; +} + +const mode = { + id, + modeFactory, + extensionDependencies, +}; + +export default mode; +export { initToolGroups, toolbarButtons }; diff --git a/modes/autometrics/src/initToolGroups.js b/modes/autometrics/src/initToolGroups.js new file mode 100644 index 00000000000..7d3369c92c5 --- /dev/null +++ b/modes/autometrics/src/initToolGroups.js @@ -0,0 +1,318 @@ +import { toolNames as SRToolNames } from '@ohif/extension-cornerstone-dicom-sr'; + +const colours = { + 'viewport-0': 'rgb(200, 0, 0)', + 'viewport-1': 'rgb(200, 200, 0)', + 'viewport-2': 'rgb(0, 200, 0)', +}; + +const colorsByOrientation = { + axial: 'rgb(200, 0, 0)', + sagittal: 'rgb(200, 200, 0)', + coronal: 'rgb(0, 200, 0)', +}; + +function initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, toolGroupId) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: toolNames.Length }, + { + toolName: toolNames.ArrowAnnotate, + configuration: { + getTextCallback: (callback, eventDetails) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + eventDetails, + }); + }, + changeTextCallback: (data, eventDetails, callback) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + data, + eventDetails, + }); + }, + }, + }, + { + toolName: toolNames.SegmentBidirectional, + }, + { toolName: toolNames.Bidirectional }, + { toolName: toolNames.DragProbe }, + { toolName: toolNames.Probe }, + { toolName: toolNames.EllipticalROI }, + { toolName: toolNames.CircleROI }, + { toolName: toolNames.RectangleROI }, + { toolName: toolNames.StackScroll }, + { toolName: toolNames.Angle }, + { toolName: toolNames.CobbAngle }, + { toolName: toolNames.Magnify }, + { toolName: toolNames.CalibrationLine }, + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, + { toolName: toolNames.UltrasoundDirectional }, + { toolName: toolNames.PlanarFreehandROI }, + { toolName: toolNames.SplineROI }, + { toolName: toolNames.LivewireContour }, + { toolName: toolNames.WindowLevelRegion }, + ], + enabled: [ + { toolName: toolNames.ImageOverlayViewer }, + { + toolName: SRToolNames.SRSCOORD3DPoint, + }, + ], + disabled: [ + { + toolName: toolNames.AdvancedMagnify, + }, + { toolName: toolNames.ReferenceLines }, + ], + }; + + const updatedTools = commandsManager.run('initializeSegmentLabelTool', { tools }); + + toolGroupService.createToolGroupAndAddTools(toolGroupId, updatedTools); +} + +function initSRToolGroup(extensionManager, toolGroupService) { + const SRUtilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone-dicom-sr.utilityModule.tools' + ); + + if (!SRUtilityModule) { + return; + } + + const CS3DUtilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames: SRToolNames } = SRUtilityModule.exports; + const { toolNames, Enums } = CS3DUtilityModule.exports; + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [ + { + mouseButton: Enums.MouseBindings.Primary, + }, + ], + }, + { + toolName: toolNames.Pan, + bindings: [ + { + mouseButton: Enums.MouseBindings.Auxiliary, + }, + ], + }, + { + toolName: toolNames.Zoom, + bindings: [ + { + mouseButton: Enums.MouseBindings.Secondary, + }, + { numTouchPoints: 2 }, + ], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: SRToolNames.SRLength }, + { toolName: SRToolNames.SRArrowAnnotate }, + { toolName: SRToolNames.SRBidirectional }, + { toolName: SRToolNames.SREllipticalROI }, + { toolName: SRToolNames.SRCircleROI }, + { toolName: SRToolNames.SRPlanarFreehandROI }, + { toolName: SRToolNames.SRRectangleROI }, + { toolName: toolNames.WindowLevelRegion }, + ], + enabled: [ + { + toolName: SRToolNames.DICOMSRDisplay, + }, + ], + // disabled + }; + + const toolGroupId = 'SRToolGroup'; + toolGroupService.createToolGroupAndAddTools(toolGroupId, tools); +} + +function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const serviceManager = extensionManager._servicesManager; + const { cornerstoneViewportService } = serviceManager.services; + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.WindowLevel, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.StackScroll, + bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }], + }, + ], + passive: [ + { toolName: toolNames.Length }, + { + toolName: toolNames.ArrowAnnotate, + configuration: { + getTextCallback: (callback, eventDetails) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + eventDetails, + }); + }, + changeTextCallback: (data, eventDetails, callback) => { + commandsManager.runCommand('arrowTextCallback', { + callback, + data, + eventDetails, + }); + }, + }, + }, + { toolName: toolNames.Bidirectional }, + { toolName: toolNames.DragProbe }, + { toolName: toolNames.Probe }, + { toolName: toolNames.EllipticalROI }, + { toolName: toolNames.CircleROI }, + { toolName: toolNames.RectangleROI }, + { toolName: toolNames.StackScroll }, + { toolName: toolNames.Angle }, + { toolName: toolNames.CobbAngle }, + { toolName: toolNames.PlanarFreehandROI }, + { toolName: toolNames.SplineROI }, + { toolName: toolNames.LivewireContour }, + { toolName: toolNames.WindowLevelRegion }, + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, + ], + disabled: [ + { + toolName: toolNames.Crosshairs, + configuration: { + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, + disableOnPassive: true, + autoPan: { + enabled: false, + panSize: 10, + }, + getReferenceLineColor: viewportId => { + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); + const viewportOptions = viewportInfo?.viewportOptions; + if (viewportOptions) { + return ( + colours[viewportOptions.id] || + colorsByOrientation[viewportOptions.orientation] || + '#0c0' + ); + } else { + console.warn('missing viewport?', viewportId); + return '#0c0'; + } + }, + }, + }, + { + toolName: toolNames.AdvancedMagnify, + }, + { toolName: toolNames.ReferenceLines }, + ], + }; + + toolGroupService.createToolGroupAndAddTools('mpr', tools); +} +function initVolume3DToolGroup(extensionManager, toolGroupService) { + const utilityModule = extensionManager.getModuleEntry( + '@ohif/extension-cornerstone.utilityModule.tools' + ); + + const { toolNames, Enums } = utilityModule.exports; + + const tools = { + active: [ + { + toolName: toolNames.TrackballRotateTool, + bindings: [{ mouseButton: Enums.MouseBindings.Primary }], + }, + { + toolName: toolNames.Zoom, + bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }], + }, + { + toolName: toolNames.Pan, + bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }, { numTouchPoints: 3 }], + }, + ], + }; + + toolGroupService.createToolGroupAndAddTools('volume3d', tools); +} + +function initToolGroups(extensionManager, toolGroupService, commandsManager) { + initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, 'default'); + initSRToolGroup(extensionManager, toolGroupService); + initMPRToolGroup(extensionManager, toolGroupService, commandsManager); + initVolume3DToolGroup(extensionManager, toolGroupService); +} + +export default initToolGroups; diff --git a/modes/autometrics/src/toolbarButtons.ts b/modes/autometrics/src/toolbarButtons.ts new file mode 100644 index 00000000000..bc89db4d813 --- /dev/null +++ b/modes/autometrics/src/toolbarButtons.ts @@ -0,0 +1,86 @@ +import { EVENTS } from '@cornerstonejs/core'; +import { ViewportGridService } from '@ohif/core'; + +const callbacks = (toolName: string) => [ + { + commandName: 'setViewportForToolConfiguration', + commandOptions: { + toolName, + }, + }, +]; + +export const setToolActiveToolbar = { + commandName: 'setToolActiveToolbar', + commandOptions: { + toolGroupIds: ['default', 'mpr', 'SRToolGroup'], + }, +}; + +const toolbarButtons = [ + // Window Level + { + id: 'WindowLevel', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-window-level', + label: 'Window Level', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Pan', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-move', + label: 'Pan', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Zoom', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-zoom', + label: 'Zoom', + commands: setToolActiveToolbar, + evaluate: 'evaluate.cornerstoneTool', + }, + }, + { + id: 'Crosshairs', + uiType: 'ohif.toolButton', + props: { + type: 'tool', + icon: 'tool-crosshair', + label: 'Crosshairs', + commands: { + commandName: 'setToolActiveToolbar', + commandOptions: { + toolGroupIds: ['mpr'], + }, + }, + evaluate: { + name: 'evaluate.cornerstoneTool', + disabledText: 'Select an MPR viewport to enable this tool', + }, + }, + }, + { + id: 'TagBrowser', + uiType: 'ohif.toolButton', + props: { + icon: 'dicom-tag-browser', + label: 'Dicom Tag Browser', + tooltip: 'Dicom Tag Browser', + commands: 'openDICOMTagViewer', + }, + }, +]; + +export default toolbarButtons; diff --git a/platform/app/pluginConfig.json b/platform/app/pluginConfig.json index d1bbc6a7bba..a74e4187d77 100644 --- a/platform/app/pluginConfig.json +++ b/platform/app/pluginConfig.json @@ -65,6 +65,10 @@ { "packageName": "@ohif/extension-ultrasound-pleura-bline", "version": "3.0.0" + }, + { + "packageName": "@ohif/extension-autometrics", + "version": "3.0.0" } ], "modes": [ @@ -96,6 +100,10 @@ { "packageName": "@ohif/mode-ultrasound-pleura-bline", "version": "3.0.0" + }, + { + "packageName": "@ohif/mode-autometrics", + "version": "3.0.0" } ], "public": [ diff --git a/platform/app/public/Autometrics.png b/platform/app/public/Autometrics.png new file mode 100644 index 00000000000..0f63b6a3796 Binary files /dev/null and b/platform/app/public/Autometrics.png differ diff --git a/platform/app/public/Curvebeam-Logo.png b/platform/app/public/Curvebeam-Logo.png new file mode 100644 index 00000000000..becf83bdcb2 Binary files /dev/null and b/platform/app/public/Curvebeam-Logo.png differ diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index 327de4fd27a..b5d79fa3a67 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -3,7 +3,10 @@ window.config = { name: 'config/default.js', routerBasename: null, - // whiteLabeling: {}, + whiteLabeling: { + createLogoComponentFn: () => null, + isReturnEnabled: false, + }, extensions: [], modes: [], customizationService: {}, diff --git a/platform/app/public/talas_visualization.png b/platform/app/public/talas_visualization.png new file mode 100644 index 00000000000..67ae24a8d0b Binary files /dev/null and b/platform/app/public/talas_visualization.png differ diff --git a/platform/app/src/routes/index.tsx b/platform/app/src/routes/index.tsx index d364bc36f71..340a3e02201 100644 --- a/platform/app/src/routes/index.tsx +++ b/platform/app/src/routes/index.tsx @@ -77,6 +77,10 @@ const bakedInRoutes = [ path: `/localbasic`, children: Local.bind(null, { modePath: 'viewer/dicomlocal' }), }, + { + path: `/local-autometrics`, + children: Local.bind(null, { modePath: 'autometrics/dicomlocal' }), + }, ]; // NOT FOUND (404) diff --git a/platform/i18n/src/locales/en-US/Modes.json b/platform/i18n/src/locales/en-US/Modes.json index 813dfe9d63b..2fb7716e9e3 100644 --- a/platform/i18n/src/locales/en-US/Modes.json +++ b/platform/i18n/src/locales/en-US/Modes.json @@ -4,5 +4,6 @@ "Basic Viewer": "Basic Viewer", "Microscopy": "Microscopy", "Segmentation": "Segmentation", - "Total Metabolic Tumor Volume": "Total Metabolic Tumor Volume" + "Total Metabolic Tumor Volume": "Total Metabolic Tumor Volume", + "Autometrics": "Autometrics Measurements" } diff --git a/yarn.lock b/yarn.lock index d09a866b2f7..0bf3866617f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2851,6 +2851,46 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@ohif/ui-next@^3.0.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@ohif/ui-next/-/ui-next-3.11.0.tgz#0412db6ce439a88c2882fd656313cb7502a4bfa1" + integrity sha512-S+WMV9FbxONL8j17xCzBq0WOAWcqKkGrUsA4IJq5f1cNZJKwtzDguQrMxo1Uyl4jxAZ/oNb+WK/9PE+aSV9D1w== + dependencies: + "@radix-ui/react-accordion" "^1.2.0" + "@radix-ui/react-checkbox" "^1.1.1" + "@radix-ui/react-context-menu" "^2.2.4" + "@radix-ui/react-dialog" "^1.1.1" + "@radix-ui/react-dropdown-menu" "^2.1.1" + "@radix-ui/react-hover-card" "^1.1.6" + "@radix-ui/react-icons" "^1.3.0" + "@radix-ui/react-label" "^2.1.0" + "@radix-ui/react-popover" "^1.0.7" + "@radix-ui/react-scroll-area" "^1.1.0" + "@radix-ui/react-select" "^2.1.1" + "@radix-ui/react-separator" "^1.1.0" + "@radix-ui/react-slider" "^1.2.0" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-switch" "^1.1.0" + "@radix-ui/react-tabs" "^1.1.0" + "@radix-ui/react-toggle" "^1.1.0" + "@radix-ui/react-tooltip" "^1.1.2" + class-variance-authority "^0.7.0" + clsx "*" + cmdk "^1.0.0" + date-fns "^3.6.0" + framer-motion "6.2.4" + lucide-react "^0.379.0" + next-themes "^0.3.0" + react "^18.3.1" + react-day-picker "^8.10.1" + react-resizable-panels "^2.1.7" + react-shepherd "6.1.1" + shepherd.js "13.0.3" + sonner "^1.5.0" + tailwind-merge "^2.3.0" + tailwindcss "3.2.4" + tailwindcss-animate "^1.0.7" + "@oozcitak/dom@1.15.10": version "1.15.10" resolved "https://registry.yarnpkg.com/@oozcitak/dom/-/dom-1.15.10.tgz#dca7289f2b292cff2a901ea4fbbcc0a1ab0b05c2"