@cornerstonejs/core
Version:
Cornerstone3D Core
95 lines (94 loc) • 3.32 kB
JavaScript
import { ECG_PROJECTION_ID, } from './ECGProjectionTypes.js';
import { normalizeECGViewState } from './ecgViewportCamera.js';
function clonePoint2(point) {
return [point[0], point[1]];
}
function getCenterCanvasPoint(canvasWidth, canvasHeight) {
return [canvasWidth / 2, canvasHeight / 2];
}
function getSignalScale(resolvedView) {
const origin = resolvedView.canvasToWorld([0, 0]);
const nextSample = resolvedView.canvasToWorld([1, 0]);
const nextValue = resolvedView.canvasToWorld([0, 1]);
return {
kind: 'signal',
samplesPerCanvasPixel: Math.abs(nextSample[0] - origin[0]) || 0,
valueUnitsPerCanvasPixel: Math.abs(nextValue[1] - origin[1]) || 0,
};
}
function getScale(resolvedView, zoom) {
if (!resolvedView) {
return { kind: 'fit', value: zoom };
}
return getSignalScale(resolvedView);
}
function getSignalPosition(worldPoint, canvasPoint) {
if (!worldPoint) {
return;
}
return {
kind: 'signalPoint',
sampleIndex: worldPoint[0],
value: worldPoint[1],
channelIndex: worldPoint[2],
canvasPoint,
};
}
export function getECGProjectionSnapshot(request) {
const { viewport } = request;
const currentViewState = request.viewState ?? viewport.getViewState?.();
if (!currentViewState) {
return;
}
const viewState = normalizeECGViewState(currentViewState);
const resolvedView = request.resolvedView ?? viewport.getResolvedView?.();
const canvasWidth = request.canvasWidth ??
resolvedView?.state?.canvas?.clientWidth ??
viewport.canvas?.clientWidth ??
viewport.element?.clientWidth ??
1;
const canvasHeight = request.canvasHeight ??
resolvedView?.state?.canvas?.clientHeight ??
viewport.canvas?.clientHeight ??
viewport.element?.clientHeight ??
1;
const canvasPoint = getCenterCanvasPoint(canvasWidth, canvasHeight);
const signalPoint = resolvedView?.canvasToWorld(canvasPoint);
const zoom = resolvedView?.zoom ?? Math.max(viewState.scale ?? 1, 0.001);
const rawPan = resolvedView?.pan ?? [0, 0];
const rendererCamera = resolvedView?.toICamera();
const frameOfReferenceUID = request.frameOfReferenceUID ??
resolvedView?.getFrameOfReferenceUID() ??
viewport.getFrameOfReferenceUID?.();
return {
kind: ECG_PROJECTION_ID,
adapterId: ECG_PROJECTION_ID,
canvasHeight,
canvasWidth,
dataId: request.dataId,
frameOfReferenceUID,
presentation: {
pan: clonePoint2(rawPan),
position: getSignalPosition(signalPoint, canvasPoint),
rawPan: clonePoint2(rawPan),
scale: getScale(resolvedView, zoom),
zoom,
},
rendererCamera,
resolvedView,
spaces: {
canvas: true,
image: false,
renderer: Boolean(rendererCamera),
world: Boolean(resolvedView),
},
transforms: resolvedView
? {
canvasToWorld: (point) => resolvedView.canvasToWorld(point),
worldToCanvas: (point) => resolvedView.worldToCanvas(point),
}
: undefined,
viewState,
viewportType: viewport.type,
};
}