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 108 109 110 111 112 113 114 115 116 117 118 | import { IStackViewport, IVolumeViewport, Point3 } from '../types';
import { setVolumesForViewports } from '../RenderingEngine/helpers';
import {
createAndCacheVolume,
getUnknownVolumeLoaderSchema,
} from '../loaders/volumeLoader';
import { Events, OrientationAxis, ViewportType } from '../enums';
/**
* Converts a stack viewport to a volume viewport.
*
* @param params - The parameters for the conversion.
* @param params.viewport - The stack viewport to convert.
* @param params.options - The options for the conversion.
* @param [params.options.volumeId] - The volumeId that will get generated, it should have the volume loader schema defined if not we will use the default one.
* @param [params.options.viewportId] - The viewportId that will get used for new viewport. If not provided, the stack viewport id will be used.
* @param [params.options.background] - The background color of the volume viewport.
* @returns The converted volume viewport.
*/
async function convertStackToVolumeViewport({
viewport,
options,
}: {
viewport: IStackViewport;
options: {
volumeId: string;
viewportId?: string;
background?: Point3;
orientation?: OrientationAxis;
};
}): Promise<IVolumeViewport> {
const renderingEngine = viewport.getRenderingEngine();
let { volumeId } = options;
// if there is no loader schema for the volume Id, we will use the default one
// which we can get from the volume loader
if (volumeId.split(':').length === 1) {
const schema = getUnknownVolumeLoaderSchema();
volumeId = `${schema}:${volumeId}`;
}
const { id, element } = viewport;
const viewportId = options.viewportId || id;
const imageIds = viewport.getImageIds();
// It is important to keep the camera before enabling the viewport
const prevCamera = viewport.getCamera();
// this will disable the stack viewport and remove it from the toolGroup
renderingEngine.enableElement({
viewportId,
type: ViewportType.ORTHOGRAPHIC,
element,
defaultOptions: {
background: options.background,
orientation: options.orientation,
},
});
// Ideally here we should be able to just create a local volume and not use the
// volume louder but we don't know if the stack is already pre-cached for all its
// imageIds or not so we just let the loader handle it and we have cache
// optimizations in place to avoid fetching the same imageId if it is already
// cached
const volume = await createAndCacheVolume(volumeId, {
imageIds,
});
volume.load();
// we should get the new viewport from the renderingEngine since the stack viewport
// was disabled and replaced with a volume viewport of the same id
const volumeViewport = <IVolumeViewport>(
renderingEngine.getViewport(viewportId)
);
setVolumesForViewports(
renderingEngine,
[
{
volumeId,
},
],
[viewportId]
);
const volumeViewportNewVolumeHandler = () => {
if (!options.orientation) {
volumeViewport.setCamera({
...prevCamera,
});
}
volumeViewport.render();
element.removeEventListener(
Events.VOLUME_VIEWPORT_NEW_VOLUME,
volumeViewportNewVolumeHandler
);
};
const addVolumeViewportNewVolumeListener = () => {
element.addEventListener(
Events.VOLUME_VIEWPORT_NEW_VOLUME,
volumeViewportNewVolumeHandler
);
};
addVolumeViewportNewVolumeListener();
volumeViewport.render();
return volumeViewport;
}
export { convertStackToVolumeViewport };
|