UNPKG

@cornerstonejs/core

Version:
126 lines (125 loc) 4.67 kB
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(); } }