feat: Annotation and Measurements support on multi-frame DICOM (#2973)

* added utilities to get frameNumber from imageId and add frameNumber to per-frame instance copy

* Fix measurements' display texts on the Measurements Panel to have the correct instance number and frame number

* fixed minor React bugs (errors on console)

* fixed React's console bugs that are logged for some series that doesn't have "description"

* bug fix - multi-frame files was not loading frames correctly. It was loading Frame 1 twice, and not loading the last frame. Due to wrong frame number indexing (frame number begins with 1, not 0)

* metadata parser fix - providing default values of imagePlaneModule

* measurement SR support on multi-frame DICOM

* bug fix - jumping to the selected measurment on multi-frame DICOM

* upgrade dcmjs dependency to 2.8.1

* StudySummary component - allow "description" to be null

* make getUIDsFromImageID() method public from MetadataProvider

* imageId usage fixes to be more stable

* change the variable name to be more meaningful

* fix metaProvider importing

* for(...of) instead of for(i=0;i<length;..)
as that doesn't assume anything about the layout/design and just gets next until done.

* use Array.findIndex instead of plain for loop

* use ReferencedSOPSequence[0] - because the ReferencedSOPSequence is an array that happens to have attributes of child zero when of length 1, but you shouldn't count on that.

* DisplaySetService.getDisplaySetForSOPInstanceUID() - added optional frameNumber parameter for future usage : now they are just ignored as we are not supporting multiframe splits

* simple code refactoring

* refactoring for checking undefined values - mappedAnnotations

* remove unreachable code

* code refactoring  - prefer conditional chaining

* fix how we access imageIds of viewport (StackViewport)
This commit is contained in:
md-prog authored and GitHub committed 2022-10-13 11:07:56 -04:00
1 parent af09578544
commit b93067b6a2
30 files changed
+276 -132

No files matched your search

@@ -235,6 +235,7 @@ Button.propTypes = {
]),
border: PropTypes.oneOf([
'none',
'light',
'default',
'primary',
'secondary',
@@ -52,9 +52,9 @@ const MeasurementItem = ({
</div>
<div className="relative flex flex-col flex-1 px-2 py-1">
<span className="mb-1 text-base text-primary-light">{label}</span>
{displayText.map(line => (
{displayText.map((line, i) => (
<span
key={line}
key={i}
className="pl-2 text-base text-white border-l border-primary-light"
dangerouslySetInnerHTML={{ __html: line }}
></span>
@@ -11,7 +11,7 @@ const StudySummary = ({ date, modality, description }) => {
</span>
</div>
<div className="pt-2 text-base leading-none truncate text-primary-light ellipse">
{description}
{description || ''}
</div>
</div>
);
@@ -20,7 +20,7 @@ const StudySummary = ({ date, modality, description }) => {
StudySummary.propTypes = {
date: PropTypes.string.isRequired,
modality: PropTypes.string.isRequired,
description: PropTypes.string.isRequired,
description: PropTypes.string,
};
export default StudySummary;