Fix contour annotations RTSS saving (#5545)

* [WIP] Fix contour annotations RTSS saving

* fix: Export image sop image reference provider

* Fixes for download with filename

* Updates to fix metadata issues with CS3D

* Updates to save menu

* Fixing some additional re-save metadata

* Add support for saving with predecessor image sequence

* PR comment fixes

* fix: Load RTSS after save

* fix segmentation save

* fix load of mixed seg/rt studies

* Use frame module to get information on the frame shown

* Fix study browser to use instances.length when numImageFrames not present

* fix: Load of display set split from multiple non-FOR referenes

* Fix RT and SEG applying to wrong series because of using
referenced series sequence without checkout sop instances

* Fix save seg

* Update to released CS3D versions

* test: Add revokeObjectURL to test download blob

* Add hard dependency on mode-basic to fix build order issues

* fix: build

* Try to fix build segmentation

* PR comments

* PR comment update
This commit is contained in:
Bill Wallace authored and GitHub committed 2025-11-21 13:07:26 -05:00
1 parent 9c5043ca2c
commit 57205703bb
68 files changed
+962 -648

No files matched your search

@@ -3,8 +3,6 @@ import { utils } from '@ohif/core';
import createReportAsync from '../Actions/createReportAsync';
import { createReportDialogPrompt } from '../Panels';
import PROMPT_RESPONSES from './_shared/PROMPT_RESPONSES';
import { getSRSeriesAndInstanceNumber } from './getSRSeriesAndInstanceNumber';
import { getSeriesDateTime } from './getCurrentDicomDateTime';
const { filterAnd, filterMeasurementsByStudyUID, filterMeasurementsBySeriesUID } =
utils.MeasurementFilters;
@@ -27,9 +25,14 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan
} = ctx;
let displaySetInstanceUIDs;
const measurementData = measurementService.getMeasurements(measurementFilter);
const predecessorImageId = findPredecessorImageId(measurementData);
try {
const promptResult = await createReportDialogPrompt({
title: defaultSaveTitle,
predecessorImageId,
minSeriesNumber: 3000,
extensionManager,
servicesManager,
});
@@ -37,16 +40,9 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan
if (promptResult.action === PROMPT_RESPONSES.CREATE_REPORT) {
const dataSources = extensionManager.getDataSources(promptResult.dataSourceName);
const dataSource = dataSources[0];
const measurementData = measurementService.getMeasurements(measurementFilter);
const SeriesDescription = promptResult.value || defaultSaveTitle;
const { SeriesNumber, InstanceNumber, referenceDisplaySet } = getSRSeriesAndInstanceNumber({
displaySetService,
SeriesInstanceUid: promptResult.series,
});
const { SeriesDate, SeriesTime } = referenceDisplaySet ?? getSeriesDateTime();
const { series, priorSeriesNumber, value: reportName } = promptResult;
const SeriesDescription = reportName || defaultSaveTitle;
const getReport = async () => {
return commandsManager.runCommand(
@@ -57,11 +53,8 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan
additionalFindingTypes: ['ArrowAnnotate'],
options: {
SeriesDescription,
SeriesNumber,
InstanceNumber,
SeriesInstanceUID: promptResult.series,
SeriesDate,
SeriesTime,
SeriesNumber: 1 + priorSeriesNumber,
predecessorImageId: series,
},
},
'CORNERSTONE_STRUCTURED_REPORT'
@@ -90,4 +83,20 @@ async function promptSaveReport({ servicesManager, commandsManager, extensionMan
}
}
export function findPredecessorImageId(annotations) {
let predecessorImageId;
for (const annotation of annotations) {
if (
predecessorImageId &&
annotation.predecessorImageId &&
annotation.predecessorImageId !== predecessorImageId
) {
console.warn('Found multiple source predecessors, not defaulting to same series');
return;
}
predecessorImageId ||= annotation.predecessorImageId;
}
return predecessorImageId;
}
export default promptSaveReport;