Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(SR): SCOORD3D point annotations support for stack viewport #3857

Closed
wants to merge 45 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e7522e7
Add docs
igoroctaviano Dec 12, 2023
f9603b8
Make panel work
igoroctaviano Dec 12, 2023
0e3489c
Address jump to measurement by for
igoroctaviano Dec 13, 2023
8b5b0a9
Fix labels
igoroctaviano Dec 13, 2023
a8bf58b
Remove unused code
igoroctaviano Dec 13, 2023
2410996
Address coordinates
igoroctaviano Dec 13, 2023
b3b7411
Update get rendrable data
igoroctaviano Dec 14, 2023
2fb8540
Update jump to measurement logic
igoroctaviano Dec 14, 2023
4251470
Pass appConfig to onModeEnter
igoroctaviano Dec 14, 2023
c56dc6d
Address SR loading for OHIF master
igoroctaviano Dec 15, 2023
f84c1d9
Clean up
igoroctaviano Dec 15, 2023
652691e
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Dec 18, 2023
d8ae3b4
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 8, 2024
cf93db0
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 8, 2024
165d53d
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 8, 2024
6172124
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 8, 2024
f6bca1f
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jan 8, 2024
6f74fc1
Update manager to add annotation
igoroctaviano Jan 8, 2024
2f7d134
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jan 8, 2024
9e315ea
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 8, 2024
82e9642
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 9, 2024
839809d
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jan 9, 2024
6df2111
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Jan 23, 2024
10a1f29
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Feb 9, 2024
012548d
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano Feb 21, 2024
7862742
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Feb 21, 2024
4d83134
Merge branch 'feat/scoord3d-point-annotations-support' of github.com:…
igoroctaviano Feb 21, 2024
bd0dc35
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano May 15, 2024
7572942
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano May 15, 2024
2d920a9
Revert config changes
igoroctaviano May 15, 2024
d1c0e22
Revert extension config
igoroctaviano May 15, 2024
4bbcc12
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano May 24, 2024
eb0497f
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano May 24, 2024
f54fc6c
Merge branch 'master' into feat/scoord3d-point-annotations-support
igoroctaviano May 27, 2024
5833e38
Revert plugin json config
igoroctaviano May 27, 2024
a74441f
Merge branch 'feat/scoord3d-point-annotations-support' of github.com:…
igoroctaviano May 27, 2024
941d828
Revert some measurement tracking table updates
igoroctaviano May 27, 2024
c1d8257
Revert viewport grid service updates
igoroctaviano May 27, 2024
4528712
Revert isRehydratable changes
igoroctaviano May 27, 2024
c5c7f7c
Fix SR style and rollback tracking panel changes
igoroctaviano May 28, 2024
b6cafc7
Rollback tracking panel changes
igoroctaviano May 28, 2024
6033d3e
CR Update
igoroctaviano May 28, 2024
38dc811
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jun 28, 2024
b87679a
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jul 9, 2024
0a985d1
Merge branch 'master' of github.com:ohif/Viewers into feat/scoord3d-p…
igoroctaviano Jul 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 123 additions & 0 deletions extensions/cornerstone-dicom-sr/src/DICOMSRDisplayPoint.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { MeasurementService } from '@ohif/core';
import { getSOPInstanceAttributes } from '@ohif/extension-cornerstone';

const getValueTypeByGraphicType = graphicType => {
const { POINT } = MeasurementService.VALUE_TYPES;
const GRAPHIC_TYPE_TO_VALUE_TYPE = { POINT: POINT };
return GRAPHIC_TYPE_TO_VALUE_TYPE[graphicType];
};

const DICOMSRDisplayPoint = {
toAnnotation: () => {},
toMeasurement: (csToolsEventDetail, displaySetService) => {
const { annotation } = csToolsEventDetail;
const { metadata, data, annotationUID } = annotation;

if (!metadata || !data) {
console.warn('DICOM SR Diaply tool: Missing metadata or data');
return null;
}

const { graphicType, referencedImageId, FrameOfReferenceUID } = metadata;

const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } =
getSOPInstanceAttributes(referencedImageId);

let displaySet;

if (SOPInstanceUID) {
displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID,
SeriesInstanceUID
);
} else {
displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);
}

const { points } = data.handles;

const mappedAnnotations = getMappedAnnotations(annotation, displaySetService);
const displayText = getDisplayText(mappedAnnotations, displaySet);

return {
uid: annotationUID,
SOPInstanceUID,
FrameOfReferenceUID,
points,
label: data.label[0].value,
metadata,
referenceSeriesUID: SeriesInstanceUID,
referenceStudyUID: StudyInstanceUID,
frameNumber: mappedAnnotations[0]?.frameNumber || 1,
toolName: metadata.toolName,
displaySetInstanceUID: displaySet.displaySetInstanceUID,
displayText: displayText,
data: data.cachedStats,
type: getValueTypeByGraphicType(graphicType),
getReport: () => {
throw new Error('Not implemented');
},
};
},
matchingCriteria: [
{
valueType: MeasurementService.VALUE_TYPES.POINT,
points: 1,
},
],
};

function getMappedAnnotations(annotation, displaySetService) {
const { metadata, data } = annotation;
const { text } = data;
const { referencedImageId } = metadata;

const annotations = [];

const { SOPInstanceUID, SeriesInstanceUID, frameNumber } =
getSOPInstanceAttributes(referencedImageId);

const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(
SOPInstanceUID,
SeriesInstanceUID,
frameNumber
);

const { SeriesNumber } = displaySet;

annotations.push({
SeriesInstanceUID,
SOPInstanceUID,
SeriesNumber,
frameNumber,
text,
});

return annotations;
}

function getDisplayText(mappedAnnotations, displaySet) {
if (!mappedAnnotations) {
return '';
}

const displayText = [];

// Area is the same for all series
const { SeriesNumber, SOPInstanceUID, frameNumber } = mappedAnnotations[0];

const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
let InstanceNumber;
if (instance) {
InstanceNumber = instance.InstanceNumber;
}

const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : '';
const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : '';

displayText.push(`(S: ${SeriesNumber}${instanceText}${frameText})`);

return displayText;
}

export default DICOMSRDisplayPoint;
39 changes: 39 additions & 0 deletions extensions/cornerstone-dicom-sr/src/enums.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { adaptersSR } from '@cornerstonejs/adapters';

const { CodeScheme: Cornerstone3DCodeScheme } = adaptersSR.Cornerstone3D;

export const CodeNameCodeSequenceValues = {
ImagingMeasurementReport: '126000',
ImageLibrary: '111028',
ImagingMeasurements: '126010',
MeasurementGroup: '125007',
ImageLibraryGroup: '126200',
TrackingUniqueIdentifier: '112040',
TrackingIdentifier: '112039',
Finding: '121071',
FindingSite: 'G-C0E3', // SRT
FindingSiteSCT: '363698007', // SCT
CornerstoneFreeText: Cornerstone3DCodeScheme.codeValues.CORNERSTONEFREETEXT,
};

export const CodingSchemeDesignators = {
SRT: 'SRT',
SCT: 'SCT',
CornerstoneCodeSchemes: [Cornerstone3DCodeScheme.CodingSchemeDesignator, 'CST4'],
};

export const RELATIONSHIP_TYPE = {
INFERRED_FROM: 'INFERRED FROM',
CONTAINS: 'CONTAINS',
};

export const CORNERSTONE_FREETEXT_CODE_VALUE = 'CORNERSTONEFREETEXT';

const enums = {
CodeNameCodeSequenceValues,
CodingSchemeDesignators,
RELATIONSHIP_TYPE,
CORNERSTONE_FREETEXT_CODE_VALUE,
};

export default enums;
igoroctaviano marked this conversation as resolved.
Show resolved Hide resolved
Loading
Loading