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 | import { vec3, mat4 } from 'gl-matrix';
import { IStackViewport } from '../types';
import { StackViewport } from '../RenderingEngine';
import spatialRegistrationMetadataProvider from './spatialRegistrationMetadataProvider';
import { metaData } from '..';
import isEqual from './isEqual';
/**
* It calculates the registration matrix between two viewports (currently only
* translation is supported)
* If the viewports are in the same frame of reference, it will return early,
* but otherwise it will use the current image's metadata to calculate the
* translation between the two viewports and adds it to the spatialRegistrationModule
* metadata provider
*
*
* @param viewport1 - The first stack viewport
* @param viewport2 - The second stack viewport
*/
function calculateViewportsSpatialRegistration(
viewport1: IStackViewport,
viewport2: IStackViewport
): void {
if (
!(viewport1 instanceof StackViewport) ||
!(viewport2 instanceof StackViewport)
) {
throw new Error(
'calculateViewportsSpatialRegistration: Both viewports must be StackViewports, volume viewports are not supported yet'
);
}
const isSameFrameOfReference =
viewport1.getFrameOfReferenceUID() === viewport2.getFrameOfReferenceUID();
if (isSameFrameOfReference) {
return;
}
const imageId1 = viewport1.getCurrentImageId();
const imageId2 = viewport2.getCurrentImageId();
const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);
const imagePlaneModule2 = metaData.get('imagePlaneModule', imageId2);
const isSameImagePlane =
imagePlaneModule1 &&
imagePlaneModule2 &&
isEqual(
imagePlaneModule1.imageOrientationPatient,
imagePlaneModule2.imageOrientationPatient
);
if (!isSameImagePlane) {
throw new Error(
'Viewport spatial registration only supported for same orientation (hence translation only) for now'
);
}
const imagePositionPatient1 = imagePlaneModule1.imagePositionPatient;
const imagePositionPatient2 = imagePlaneModule2.imagePositionPatient;
const translation = vec3.subtract(
vec3.create(),
imagePositionPatient1,
imagePositionPatient2
);
const mat = mat4.fromTranslation(mat4.create(), translation);
spatialRegistrationMetadataProvider.add([viewport1.id, viewport2.id], mat);
}
export default calculateViewportsSpatialRegistration;
|