import React, { ReactElement, useCallback, useState, useEffect } from 'react'; import { VolumeRenderingQualityProps } from '../../types/ViewportPresets'; export function VolumeRenderingQuality({ volumeRenderingQualityRange, commandsManager, serviceManager, viewportId, }: VolumeRenderingQualityProps): ReactElement { const { cornerstoneViewportService } = serviceManager.services; const { min, max, step } = volumeRenderingQualityRange; const [quality, setQuality] = useState(null); const onChange = useCallback( (value: number) => { commandsManager.runCommand('setVolumeRenderingQulaity', { viewportId, volumeQuality: value, }); setQuality(value); }, [commandsManager, viewportId] ); const calculateBackground = value => { const percentage = ((value - 0) / (1 - 0)) * 100; return `linear-gradient(to right, #5acce6 0%, #5acce6 ${percentage}%, #3a3f99 ${percentage}%, #3a3f99 100%)`; }; useEffect(() => { const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const { actor } = viewport.getActors()[0]; const mapper = actor.getMapper(); const image = mapper.getInputData(); const spacing = image.getSpacing(); const sampleDistance = mapper.getSampleDistance(); const averageSpacing = spacing.reduce((a, b) => a + b) / 3.0; if (sampleDistance === averageSpacing) { setQuality(1); } else { setQuality(Math.sqrt(averageSpacing / (sampleDistance * 0.5))); } }, [cornerstoneViewportService, viewportId]); return ( <>
{quality !== null && ( onChange(parseInt(e.target.value, 10))} style={{ background: calculateBackground((quality - min) / (max - min)) }} /> )}
); }