import React, { useState, useEffect } from 'react'; import { Tabs, TabsList, TabsTrigger, TabsContent, Numeric, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from '@ohif/ui-next'; import { useViewportDisplaySets } from '../../hooks/useViewportDisplaySets'; import { useViewportRendering } from '../../hooks/useViewportRendering'; import { useSystem } from '@ohif/core'; import { cache } from '@cornerstonejs/core'; interface VOIManualControlMenuProps { viewportId: string; className?: string; } const TABS = { MINMAX: 'minmax', MANUAL: 'manual', }; function VOIManualControlMenu({ viewportId, className }: VOIManualControlMenuProps) { const { servicesManager } = useSystem(); const { displaySetService } = servicesManager.services; const [activeTab, setActiveTab] = useState(TABS.MINMAX); const { viewportDisplaySets } = useViewportDisplaySets(viewportId); const [selectedDisplaySetUID, setSelectedDisplaySetUID] = useState( viewportDisplaySets.length > 0 ? viewportDisplaySets[0].displaySetInstanceUID : undefined ); const { voiRange, setVOIRange, windowLevel, setWindowLevel } = useViewportRendering(viewportId, { displaySetInstanceUID: selectedDisplaySetUID, }); useEffect(() => { if (viewportDisplaySets.length > 0 && !selectedDisplaySetUID) { setSelectedDisplaySetUID(viewportDisplaySets[0].displaySetInstanceUID); } }, [viewportDisplaySets, selectedDisplaySetUID]); if (!voiRange) { return null; } const { upper, lower } = voiRange; const { windowWidth, windowCenter } = windowLevel; const selectedViewportImageIds = displaySetService.getDisplaySetByUID(selectedDisplaySetUID)?.imageIds; let min = Infinity; let max = -Infinity; if (selectedViewportImageIds) { for (const imageId of selectedViewportImageIds) { const image = cache.getImage(imageId); if (image) { min = Math.min(min, image.minPixelValue); max = Math.max(max, image.maxPixelValue); } } } // Provide reasonable defaults if min/max couldn't be determined if (min === Infinity || max === -Infinity) { min = 0; max = 255; } const selectedDisplaySet = viewportDisplaySets.find( ds => ds.displaySetInstanceUID === selectedDisplaySetUID ); return (
{viewportDisplaySets.length > 1 && ( )} Min/Max Manual
{ const [newLower, newUpper] = vals; if (newLower !== lower || newUpper !== upper) { setVOIRange({ lower: newLower, upper: newUpper }); } }} >
{ if (val !== windowWidth) { setWindowLevel({ windowWidth: val, windowCenter }); } }} >
W:
{ if (val !== windowCenter) { setWindowLevel({ windowWidth, windowCenter: val }); } }} >
L:
); } export default VOIManualControlMenu;