Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import { BaseDisplaySet, type BaseDisplaySetOptions } from './BaseDisplaySet';
import type { NaturalizedInstance, ViewportTypeHint } from './types';
export type ImageStackDisplaySetOptions = Omit<
BaseDisplaySetOptions,
'imageIds' | 'underlyingImageIds'
> & {
instances?: NaturalizedInstance[];
imageIds?: Iterable<string>;
underlyingImageIds?: Iterable<string>;
};
function collectUnderlyingImageIds(instances: NaturalizedInstance[]): string[] {
const ids: string[] = [];
for (const instance of instances) {
if (instance.imageId) {
ids.push(instance.imageId);
}
}
return ids;
}
function collectImageIds(
instances: NaturalizedInstance[],
underlyingImageIds: string[]
): string[] {
const imageIds: string[] = [];
for (const instance of instances) {
if (instance.imageId) {
imageIds.push(instance.imageId);
}
}
if (imageIds.length === 0) {
return [...underlyingImageIds];
}
return imageIds;
}
/**
* Image/stack display set metadata with underlying vs frame image id semantics.
*/
export class ImageStackDisplaySet extends BaseDisplaySet {
isMultiFrame: boolean;
constructor(options: ImageStackDisplaySetOptions) {
const instances = options.instances ?? [];
const underlyingImageIds =
options.underlyingImageIds ?? collectUnderlyingImageIds(instances);
const underlyingList = [...underlyingImageIds];
const imageIds =
options.imageIds ?? collectImageIds(instances, underlyingList);
super({
...options,
instances,
imageIds,
underlyingImageIds: underlyingList,
});
this.isMultiFrame = instances.some(
(instance) => Number(instance.NumberOfFrames) > 1
);
}
static fromInstances(
instances: NaturalizedInstance[],
options?: {
displaySetId?: string;
viewportTypes?: readonly ViewportTypeHint[];
imageIds?: Iterable<string>;
}
): ImageStackDisplaySet {
const displaySetId =
options?.displaySetId ??
instances[0]?.SeriesInstanceUID ??
`display-set-${instances[0]?.imageId ?? 'unknown'}`;
return new ImageStackDisplaySet({
displaySetId,
viewportTypes: options?.viewportTypes ?? ['stack', 'volume', 'volume3d'],
instances,
imageIds: options?.imageIds,
});
}
static fromImageIds(
imageIds: string[],
getNaturalizedInstance: (
imageId: string
) => NaturalizedInstance | undefined,
options?: {
displaySetId?: string;
viewportTypes?: readonly ViewportTypeHint[];
}
): ImageStackDisplaySet {
const instances = imageIds
.map((imageId) => getNaturalizedInstance(imageId))
.filter(
(instance): instance is NaturalizedInstance => instance !== undefined
);
return ImageStackDisplaySet.fromInstances(instances, {
...options,
imageIds,
});
}
}
|