From 923d34e70d12cd3017d4362d0b855d0bdd1d34dd Mon Sep 17 00:00:00 2001 From: AlfandiMario Date: Tue, 4 Nov 2025 12:08:48 +0700 Subject: [PATCH] req custom overlay: additional field untuk MRI --- .../Overlays/CustomizableViewportOverlay.tsx | 50 ++++++++++++++++++- .../Overlays/studyDataForOverlayItem.ts | 12 +++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx index 5434b14..2eb8f05 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx @@ -154,10 +154,18 @@ const phaseFieldOfViewItem = { id: 'PhaseFOV', customizationType: 'ohif.overlayItem', label: '% Phase FOV: ', - title: '% Phase FOV', + title: 'Percent Phase FOV', condition: ({ mriInstanceData }) => mriInstanceData?.percentPhaseFieldOfView, contentF: ({ mriInstanceData }) => `${mriInstanceData.percentPhaseFieldOfView} %`, }; +const phaseFieldOfViewDimensionsItem = { + id: 'FOVDimensions', + customizationType: 'ohif.overlayItem', + label: 'FOV Dim: ', + title: 'Field of View Dimensions', + condition: ({ mriInstanceData }) => mriInstanceData?.fieldOfViewDimensions, + contentF: ({ mriInstanceData }) => mriInstanceData?.fieldOfViewDimensions.join(' x '), +}; const acquisitionMatrixItem = { id: 'AcquisitionMatrix', customizationType: 'ohif.overlayItem', @@ -166,6 +174,16 @@ const acquisitionMatrixItem = { condition: ({ mriInstanceData }) => mriInstanceData?.acquisitionMatrix, contentF: ({ mriInstanceData }) => `${mriInstanceData.acquisitionMatrix.join(' x ')}`, }; +const imageMatrixItem = { + id: 'ImageMatrix', + customizationType: 'ohif.overlayItem', + label: 'Image Matrix (RxC): ', + title: 'Image Matrix', + condition: ({ mriInstanceData }) => + mriInstanceData?.imageMatrixRows && mriInstanceData?.imageMatrixColumns, + contentF: ({ mriInstanceData }) => + `${mriInstanceData.imageMatrixRows} x ${mriInstanceData.imageMatrixColumns}`, +}; const mriTopLeftItems = { id: 'cornerstoneOverlayTopLeft', @@ -174,7 +192,9 @@ const mriTopLeftItems = { sliceLocationItem, sliceSpacingItem, phaseFieldOfViewItem, + phaseFieldOfViewDimensionsItem, acquisitionMatrixItem, + imageMatrixItem, ], }; @@ -225,6 +245,14 @@ const phaseEncodingDirectionItem = { condition: ({ mriInstanceData }) => mriInstanceData?.phaseEncodingDirection, contentF: ({ mriInstanceData }) => `${mriInstanceData.phaseEncodingDirection} `, }; +const numOfAveragesItem = { + id: 'MRINumOfAverages', + customizationType: 'ohif.overlayItem', + label: 'NEX: ', + title: 'MRI Number of Averages', + condition: ({ mriInstanceData }) => mriInstanceData?.numOfAverages, + contentF: ({ mriInstanceData }) => `${mriInstanceData.numOfAverages} `, +}; const echoTrainLengthItem = { id: 'MRIEchoTrainLength', customizationType: 'ohif.overlayItem', @@ -262,6 +290,22 @@ const acquisitionTimeItem = { return `${time}`.trim(); }, }; +const acquisitionDurationTotalItem = { + id: 'MRIAcquisitionDurationTotal', + customizationType: 'ohif.overlayItem', + label: 'Total Acq Dur: ', + title: 'MRI Total Duration Acquisition', + condition: ({ mriInstanceData }) => mriInstanceData?.acquisitionDurationTotal, + contentF: ({ mriInstanceData }) => mriInstanceData.acquisitionDurationTotal, +}; +const acquisitionDurationPerFrameItem = { + id: 'MRIAcquisitionDurationPerFrame', + customizationType: 'ohif.overlayItem', + label: 'Frame Acq Dur: ', + title: 'MRI Duration Acquisition Per Frame', + condition: ({ mriInstanceData }) => mriInstanceData?.acquisitionDurationPerFrame, + contentF: ({ mriInstanceData }) => mriInstanceData.acquisitionDurationPerFrame, +}; const parallelImagingItem = { id: 'MRIParallelImaging', customizationType: 'ohif.overlayItem', @@ -279,10 +323,12 @@ const mriBottomLeftItems = { receiverCoilItem, mriScanModeItem, phaseEncodingDirectionItem, + numOfAveragesItem, echoTrainLengthItem, flipAngleItem, pixelBandwidthItem, - acquisitionTimeItem, + acquisitionDurationTotalItem, + acquisitionDurationPerFrameItem, parallelImagingItem, ], }; diff --git a/extensions/cornerstone/src/Viewport/Overlays/studyDataForOverlayItem.ts b/extensions/cornerstone/src/Viewport/Overlays/studyDataForOverlayItem.ts index 2586929..ed7731a 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/studyDataForOverlayItem.ts +++ b/extensions/cornerstone/src/Viewport/Overlays/studyDataForOverlayItem.ts @@ -148,7 +148,10 @@ interface MriOverlayInstanceData { sliceLocation?: string; spacingBetweenSlices?: string; percentPhaseFieldOfView?: string; + fieldOfViewDimensions?: string; acquisitionMatrix?: string; + imageMatrixRows?: number; + imageMatrixColumns?: number; scanningSequence?: string; repetitionTime?: string; echoTime?: string; @@ -156,10 +159,13 @@ interface MriOverlayInstanceData { receiveCoilName?: string; mrAcquisitionType?: string; phaseEncodingDirection?: string; + numOfAverages?: string; echoTrainLength?: string; flipAngle?: string; pixelBandwidth?: string; acquisitionTime?: string; + acquisitionDurationTotal?: string; + acquisitionDurationPerFrame?: string; parallelAcquisitionTechnique?: string; } @@ -225,7 +231,10 @@ export const instanceDataForMriOverlayItem = ( sliceLocation: instance['00201041']?.Value?.[0], spacingBetweenSlices: instance['00180088']?.Value?.[0], percentPhaseFieldOfView: instance['00180094']?.Value?.[0], + fieldOfViewDimensions: instance['00181149']?.Value, acquisitionMatrix: instance['00181310']?.Value, + imageMatrixRows: instance['00280010']?.Value?.[0], + imageMatrixColumns: instance['00280011']?.Value?.[0], scanningSequence: instance['00180020']?.Value?.[0], repetitionTime: instance['00180080']?.Value?.[0], echoTime: instance['00180081']?.Value?.[0], @@ -233,10 +242,13 @@ export const instanceDataForMriOverlayItem = ( receiveCoilName: instance['00181250']?.Value?.[0], mrAcquisitionType: instance['00180023']?.Value?.[0], phaseEncodingDirection: instance['00181312']?.Value?.[0], + numOfAverages: instance['00180083']?.Value?.[0], echoTrainLength: instance['00180091']?.Value?.[0], flipAngle: instance['00181314']?.Value?.[0], pixelBandwidth: instance['00180095']?.Value?.[0], acquisitionTime: instance['00080032']?.Value?.[0], + acquisitionDurationTotal: instance['00181242']?.Value?.[0], + acquisitionDurationPerFrame: instance['00181243']?.Value?.[0], parallelAcquisitionTechnique: instance['00181316']?.Value?.[0], };