Skip to content

Commit 184adf0

Browse files
authored
Merge pull request #1878 from plt-joey/metadata-equality
Fixing error loading when orientation is decimals different among slices of a series
2 parents 28b52ee + cf07102 commit 184adf0

File tree

4 files changed

+32
-7
lines changed

4 files changed

+32
-7
lines changed

src/dicom/dataElement.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,18 @@ export function safeGet(tags, key) {
8989
}
9090
return res;
9191
};
92+
93+
/**
94+
* Safely get all of an elements' values from a list of elements.
95+
*
96+
* @param {Object<string, DataElement>} tags The list of tags.
97+
* @param {string} key The tag key as for example '00100020'.
98+
* @returns {any[]|undefined} The elements' values or undefined.
99+
*/
100+
export function safeGetAll(tags, key) {
101+
let res;
102+
if (typeof tags[key] !== 'undefined') {
103+
res = tags[key].value;
104+
}
105+
return res;
106+
};

src/image/image.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {isMonochrome} from '../dicom/dicomElementsWrapper';
1313
// doc imports
1414
/* eslint-disable no-unused-vars */
1515
import {Geometry} from './geometry';
16-
import {Matrix33} from '../math/matrix';
16+
import {Matrix33, REAL_WORLD_EPSILON} from '../math/matrix';
1717
import {NumberRange} from '../math/stats';
1818
import {DataElement} from '../dicom/dataElement';
1919
import {RGB} from '../utils/colour';
@@ -781,7 +781,7 @@ export class Image {
781781
throw new Error('Cannot append a slice with different number of rows');
782782
}
783783
if (!this.#geometry.getOrientation().isSimilar(
784-
rhs.getGeometry().getOrientation(), 0.0001)) {
784+
rhs.getGeometry().getOrientation(), REAL_WORLD_EPSILON)) {
785785
throw new Error('Cannot append a slice with different orientation');
786786
}
787787
if (this.#photometricInterpretation !==
@@ -791,10 +791,16 @@ export class Image {
791791
}
792792
// all meta should be equal
793793
for (const key in this.#meta) {
794-
if (key === 'windowPresets' || key === 'numberOfFiles' ||
795-
key === 'custom') {
794+
if (
795+
key === 'windowPresets' ||
796+
key === 'numberOfFiles' ||
797+
key === 'custom' ||
798+
// This was already checked with #geometry.getOrientation()
799+
key === 'ImageOrientationPatient'
800+
) {
796801
continue;
797802
}
803+
798804
if (this.#meta[key] !== rhs.getMeta()[key]) {
799805
throw new Error('Cannot append a slice with different ' + key +
800806
': ' + this.#meta[key] + ' != ' + rhs.getMeta()[key]);

src/image/imageFactory.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {RescaleSlopeAndIntercept} from './rsi';
44
import {WindowLevel} from './windowLevel';
55
import {Image} from './image';
66
import {ColourMap} from './luts';
7-
import {safeGet} from '../dicom/dataElement';
7+
import {safeGet, safeGetAll} from '../dicom/dataElement';
88
import {
99
isJpeg2000TransferSyntax,
1010
isJpegBaselineTransferSyntax,
@@ -253,6 +253,10 @@ export class ImageFactory {
253253
return safeGet(dataElements, key);
254254
};
255255

256+
const safeGetAllLocal = function (key) {
257+
return safeGetAll(dataElements, key);
258+
};
259+
256260
// defaults
257261
meta.TransferSyntaxUID = safeGetLocal('00020010');
258262
meta.MediaStorageSOPClassUID = safeGetLocal('00020002');
@@ -287,7 +291,7 @@ export class ImageFactory {
287291
meta.DeviceSerialNumber = safeGetLocal('00181000');
288292
meta.SoftwareVersions = safeGetLocal('00181020');
289293

290-
meta.ImageOrientationPatient = safeGetLocal('00200037');
294+
meta.ImageOrientationPatient = safeGetAllLocal('00200037');
291295
meta.FrameOfReferenceUID = safeGetLocal('00200052');
292296

293297
// PixelRepresentation -> is signed

tests/pacs/viewer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function viewerSetup() {
128128

129129
// bind events
130130
_app.addEventListener('error', function (event) {
131-
console.error('load error', event);
131+
console.error('load error', event, event.error);
132132
// abort load
133133
_app.abortLoad(event.dataid);
134134
});

0 commit comments

Comments
 (0)