@cornerstonejs/core
Version:
Cornerstone3D Core
126 lines (125 loc) • 4.67 kB
JavaScript
import { Events as EVENTS, ViewportType } from '../../../enums/index.js';
import triggerEvent from '../../../utilities/triggerEvent.js';
import { getDicomMicroscopyViewer } from '../../../utilities/WSIUtilities.js';
const EVENT_POSTRENDER = 'postrender';
export class DicomMicroscopyRenderPath {
async addData(ctx, data, options) {
const payload = data;
const DicomMicroscopyViewer = await getDicomMicroscopyViewer();
const microscopyElement = document.createElement('div');
microscopyElement.setAttribute('class', 'DicomMicroscopyViewer');
microscopyElement.style.background = 'black';
microscopyElement.style.width = '100%';
microscopyElement.style.height = '100%';
microscopyElement.style.position = 'absolute';
microscopyElement.style.left = '0';
microscopyElement.style.top = '0';
ctx.element.appendChild(microscopyElement);
const viewer = new DicomMicroscopyViewer.viewer.VolumeImageViewer({
client: payload.client,
metadata: payload.volumeImages,
controls: ['overview', 'position'],
retrieveRendered: false,
bindings: {},
});
viewer.render({ container: microscopyElement });
viewer.deactivateDragPanInteraction();
const map = viewer.getMap();
const postrenderHandler = () => {
triggerEvent(ctx.element, EVENTS.IMAGE_RENDERED, {
element: ctx.element,
viewportId: ctx.viewportId,
renderingEngineId: ctx.renderingEngineId,
rendering: {
dataId: data.id,
renderMode: 'wsi2d',
},
});
};
map.on(EVENT_POSTRENDER, postrenderHandler);
Object.assign(microscopyElement.style, {
'--ol-partial-background-color': 'rgba(127, 127, 127, 0.7)',
'--ol-foreground-color': '#000000',
'--ol-subtle-foreground-color': '#000',
'--ol-subtle-background-color': 'rgba(78, 78, 78, 0.5)',
background: 'none',
});
const rendering = {
renderMode: 'wsi2d',
microscopyElement,
viewer,
map,
transformUtils: DicomMicroscopyViewer.utils,
postrenderHandler,
};
return {
rendering,
updateDataPresentation: (props) => {
this.updateDataPresentation(rendering, props);
},
applyViewState: (camera) => {
this.applyViewState(rendering, camera);
},
getFrameOfReferenceUID: () => {
return this.getFrameOfReferenceUID(payload);
},
render: () => {
map.render?.();
},
resize: () => {
map.updateSize?.();
map.render?.();
},
removeData: () => {
this.removeData(rendering);
},
};
}
updateDataPresentation(rendering, props) {
const wsiProps = props;
const { microscopyElement } = rendering;
microscopyElement.style.display = wsiProps?.visible === false ? 'none' : '';
microscopyElement.style.opacity = String(wsiProps?.opacity ?? 1);
}
applyViewState(rendering, camera) {
const wsiCamera = camera;
const { map } = rendering;
const view = map?.getView?.();
if (!view) {
return;
}
if (typeof wsiCamera.resolution === 'number') {
view.setResolution?.(wsiCamera.resolution);
}
if (typeof wsiCamera.zoom === 'number') {
view.setZoom(wsiCamera.zoom);
}
if (wsiCamera.centerIndex) {
view.setCenter(wsiCamera.centerIndex);
}
if (typeof wsiCamera.rotation === 'number') {
view.setRotation(wsiCamera.rotation);
}
}
getFrameOfReferenceUID(payload) {
return payload.frameOfReferenceUID ?? undefined;
}
removeData(rendering) {
const { map, microscopyElement, viewer, postrenderHandler } = rendering;
map?.un?.(EVENT_POSTRENDER, postrenderHandler);
viewer?.cleanup?.();
microscopyElement.remove();
}
}
export class DicomMicroscopyPath {
constructor() {
this.id = 'wsi:dicom-microscopy-viewer';
this.type = ViewportType.WHOLE_SLIDE_NEXT;
}
matches(data, options) {
return data.type === 'wsi' && options.renderMode === 'wsi2d';
}
createRenderPath() {
return new DicomMicroscopyRenderPath();
}
}