diff --git a/packages/cornerstone-image-loader-streaming-volume/examples/basic/index.ts b/packages/cornerstone-image-loader-streaming-volume/examples/basic/index.ts index 867558fc37..8666b47788 100644 --- a/packages/cornerstone-image-loader-streaming-volume/examples/basic/index.ts +++ b/packages/cornerstone-image-loader-streaming-volume/examples/basic/index.ts @@ -1,13 +1,13 @@ import { RenderingEngine, - VIEWPORT_TYPE, + Enums, init as csRenderInit, Types, } from '@precisionmetrics/cornerstone-render' import * as cs from '@precisionmetrics/cornerstone-render' import * as csTools3d from '@precisionmetrics/cornerstone-tools' -import { registerWebImageLoader } from '@precisionmetrics/cornerstone-image-loader-streaming-volume' +// import { registerWebImageLoader } from '@precisionmetrics/cornerstone-image-loader-streaming-volume' const content = document.getElementById('content') @@ -18,13 +18,12 @@ element.style.height = '500px' content.appendChild(element) -console.warn('hello!! - ERIK') async function setup() { await csRenderInit() csTools3d.init() - registerWebImageLoader(cs) + // registerWebImageLoader(cs) const renderingEngineUID = 'myRenderingEngine' const renderingEngine = new RenderingEngine(renderingEngineUID) @@ -32,7 +31,7 @@ async function setup() { const viewportInput = [ { viewportUID: 'CT_STACK', - type: VIEWPORT_TYPE.STACK, + type: Enums.ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-image-loader-streaming-volume/src/StreamingImageVolume.ts b/packages/cornerstone-image-loader-streaming-volume/src/StreamingImageVolume.ts index 3ced76d6bd..8b264cb431 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/StreamingImageVolume.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/StreamingImageVolume.ts @@ -1,5 +1,5 @@ import { - EVENTS, + Enums, eventTarget, metaData, imageLoadPoolManager, @@ -7,20 +7,19 @@ import { ImageVolume, cache, Types, - loadImage, - Utilities as cornerstoneUtils, - REQUEST_TYPE, - ERROR_CODES, + imageLoader, + utilities as cornerstoneUtils, } from '@precisionmetrics/cornerstone-render' import { scaleArray, autoLoad } from './helpers' -const requestType = REQUEST_TYPE.Prefetch +const requestType = Enums.RequestType.Prefetch const { getMinMax } = cornerstoneUtils -// TODO James wants another layer in between ImageVolume and SliceStreamingImageVolume -// which adds loaded/loading as an interface? - +/** + * Streaming Image Volume Class that extends ImageVolume base class. + * It implements load method to load the imageIds and insert them into the volume. + */ export default class StreamingImageVolume extends ImageVolume { private _cornerstoneImageMetaData @@ -45,8 +44,6 @@ export default class StreamingImageVolume extends ImageVolume { /** * Creates the metadata required for converting the volume to an cornerstoneImage - * - * @returns {void} */ private _createCornerstoneImageMetaData() { const numImages = this.imageIds.length @@ -99,6 +96,11 @@ export default class StreamingImageVolume extends ImageVolume { return true } + /** + * It cancels loading the images of the volume. It sets the loading status to false + * and filters any imageLoad request in the requestPoolManager that has the same + * volumeUID + */ public cancelLoading(): void { const { loadStatus } = this @@ -124,10 +126,19 @@ export default class StreamingImageVolume extends ImageVolume { imageLoadPoolManager.filterRequests(filterFunction) } + /** + * Clear the load callbacks + */ public clearLoadCallbacks(): void { this.loadStatus.callbacks = [] } + /** + * It triggers a prefetch for images in the volume. + * @param callback - A callback function to be called when the volume is fully loaded + * @param priority - The priority for loading the volume images, lower number is higher priority + * @returns + */ public load = ( callback: (...args: unknown[]) => void, priority = 5 @@ -162,9 +173,16 @@ export default class StreamingImageVolume extends ImageVolume { } /** - * Useful for sorting requests outside of the volume loader itself - * e.g. loading a single slice of CT, followed by a single slice of PET, before - * moving to the next slice + * It returns the imageLoad requests for the streaming image volume instance. + * It involves getting all the imageIds of the volume and creating a success callback + * which would update the texture (when the image has loaded) and the failure callback. + * Note that this method does not run executes the requests but only returns the requests. + * It can be used for sorting requests outside of the volume loader itself + * e.g. loading a single slice of CT, followed by a single slice of PET (interleaved), before + * moving to the next slice. + * + * @returns Array of requests including imageId of the request, its imageIdIndex, + * options (targetBuffer and scaling parameters), and additionalDetails (volumeUID) */ public getImageLoadRequests = () => { const { scalarData, loadStatus } = this @@ -294,7 +312,7 @@ export default class StreamingImageVolume extends ImageVolume { imageVolume: volume, } - triggerEvent(eventTarget, EVENTS.IMAGE_VOLUME_MODIFIED, eventDetail) + triggerEvent(eventTarget, Enums.Events.IMAGE_VOLUME_MODIFIED, eventDetail) if (framesProcessed === numFrames) { loadStatus.loaded = true @@ -358,7 +376,7 @@ export default class StreamingImageVolume extends ImageVolume { imageId, } - triggerEvent(eventTarget, ERROR_CODES.IMAGE_LOAD_ERROR, eventDetail) + triggerEvent(eventTarget, Enums.Events.IMAGE_LOAD_ERROR, eventDetail) } const requests = imageIds.map((imageId, imageIdIndex) => { @@ -404,7 +422,7 @@ export default class StreamingImageVolume extends ImageVolume { // Use loadImage because we are skipping the Cornerstone Image cache // when we load directly into the Volume cache function callLoadImage(imageId, imageIdIndex, options) { - return loadImage(imageId, options).then( + return imageLoader.loadImage(imageId, options).then( () => { successCallback(imageIdIndex, imageId, scalingParameters) }, @@ -427,6 +445,7 @@ export default class StreamingImageVolume extends ImageVolume { return requests } + private _prefetchImageIds(priority: number) { const requests = this.getImageLoadRequests() @@ -639,7 +658,6 @@ export default class StreamingImageVolume extends ImageVolume { * It iterates over all the imageIds and convert them until there is no * enough space left inside the imageCache. Finally it will decache the Volume. * - * @returns {void} */ private _convertToImages() { // 1. Try to decache images in the volatile Image Cache to provide @@ -683,6 +701,12 @@ export default class StreamingImageVolume extends ImageVolume { this._removeFromCache() } + /** + * If completelyRemove is true, remove the volume completely from the cache. Otherwise, + * convert the volume to cornerstone images (stack images) and store it in the cache + * @param completelyRemove - If true, the image will be removed from the + * cache completely. + */ public decache(completelyRemove = false): void { if (completelyRemove) { this._removeFromCache() diff --git a/packages/cornerstone-image-loader-streaming-volume/src/cornerstoneStreamingImageVolumeLoader.ts b/packages/cornerstone-image-loader-streaming-volume/src/cornerstoneStreamingImageVolumeLoader.ts index 5f04a1a9cb..fc033a9469 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/cornerstoneStreamingImageVolumeLoader.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/cornerstoneStreamingImageVolumeLoader.ts @@ -1,22 +1,33 @@ import { - registerVolumeLoader, - registerUnknownVolumeLoader, + volumeLoader, cache, - Utilities, - ERROR_CODES, + utilities, + Enums, Types, } from '@precisionmetrics/cornerstone-render' import { vec3 } from 'gl-matrix' import { makeVolumeMetadata, sortImageIdsAndGetSpacing } from './helpers' import StreamingImageVolume from './StreamingImageVolume' -const { createUint8SharedArray, createFloat32SharedArray } = Utilities +const { createUint8SharedArray, createFloat32SharedArray } = utilities interface IVolumeLoader { promise: Promise cancel: () => void } +/** + * It handles loading of a image by streaming in its imageIds. It will be the + * volume loader if the schema for the volumeID is `cornerstoneStreamingImageVolume`. + * This function returns a promise that resolves to the StreamingImageVolume instance. + * + * In order to use the cornerstoneStreamingImageVolumeLoader you should use + * createAndCacheVolume helper from the cornerstone-core volumeLoader module. + * + * @param volumeId - The ID of the volume + * @param options - options for loading, imageIds + * @returns a promise that resolves to a StreamingImageVolume + */ function cornerstoneStreamingImageVolumeLoader( volumeId: string, options: { @@ -92,7 +103,7 @@ function cornerstoneStreamingImageVolumeLoader( // check if there is enough space in unallocated + image Cache const isCacheable = cache.isCacheable(sizeInBytes) if (!isCacheable) { - throw new Error(ERROR_CODES.CACHE_SIZE_EXCEEDED) + throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED) } cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes) @@ -162,8 +173,8 @@ function cornerstoneStreamingImageVolumeLoader( } } -registerUnknownVolumeLoader(cornerstoneStreamingImageVolumeLoader) -registerVolumeLoader( +volumeLoader.registerUnknownVolumeLoader(cornerstoneStreamingImageVolumeLoader) +volumeLoader.registerVolumeLoader( 'cornerstoneStreamingImageVolume', cornerstoneStreamingImageVolumeLoader ) diff --git a/packages/cornerstone-image-loader-streaming-volume/src/helpers/autoLoad.ts b/packages/cornerstone-image-loader-streaming-volume/src/helpers/autoLoad.ts index ec15b721d6..f2eed1b96d 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/helpers/autoLoad.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/helpers/autoLoad.ts @@ -1,7 +1,7 @@ import { getRenderingEngines, RenderingEngine, - getVolumeViewportsContainingVolumeUID, + utilities, } from '@precisionmetrics/cornerstone-render' type RenderingEngineAndViewportUIDs = { @@ -9,6 +9,12 @@ type RenderingEngineAndViewportUIDs = { viewportUIDs: Array } +/** + * Given a volumeUID, it finds the viewports and renderingEngines that + * include that volume, and triggers a render if renderingEngine is available. + * + * @param volumeUID - The UID of the volume + */ const autoLoad = (volumeUID: string): void => { const renderingEngineAndViewportUIDs = getRenderingEngineAndViewportsContainingVolume(volumeUID) @@ -38,7 +44,7 @@ function getRenderingEngineAndViewportsContainingVolume( for (let i = 0; i < renderingEnginesArray.length; i++) { const renderingEngine = renderingEnginesArray[i] - const viewports = getVolumeViewportsContainingVolumeUID( + const viewports = utilities.getVolumeViewportsContainingVolumeUID( volumeUID, renderingEngine.uid ) diff --git a/packages/cornerstone-image-loader-streaming-volume/src/helpers/makeVolumeMetadata.ts b/packages/cornerstone-image-loader-streaming-volume/src/helpers/makeVolumeMetadata.ts index 3413c9dd24..75bfe7bf67 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/helpers/makeVolumeMetadata.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/helpers/makeVolumeMetadata.ts @@ -1,5 +1,12 @@ import { metaData, Types } from '@precisionmetrics/cornerstone-render' +/** + * It creates a metadata object for a volume given the imageIds that compose it. + * It uses the first imageId to get the metadata. + * + * @param imageIds - array of imageIds + * @returns The volume metadata + */ export default function makeVolumeMetadata( imageIds: Array ): Types.Metadata { diff --git a/packages/cornerstone-image-loader-streaming-volume/src/helpers/scaleArray.ts b/packages/cornerstone-image-loader-streaming-volume/src/helpers/scaleArray.ts index b34c2c6172..009496e242 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/helpers/scaleArray.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/helpers/scaleArray.ts @@ -1,15 +1,15 @@ -// array is of type Any number array - -type ScalingParameters = { - modality: string - rescaleSlope: number - rescaleIntercept: number - suvbw?: number -} +import type { Types } from '@precisionmetrics/cornerstone-render' +/** + * Given a pixel array, rescale the pixel values using the rescale slope and + * intercept and if modality is PT it uses the suv values to scale the array + * @param array - The array to be scaled. + * @param scalingParameters - The scaling parameters + * @returns The array is being scaled + */ export default function scaleArray( array: Float32Array | Uint8Array, - scalingParameters: ScalingParameters + scalingParameters: Types.ScalingParameters ): Float32Array | Uint8Array { const arrayLength = array.length const { rescaleSlope, rescaleIntercept, suvbw } = scalingParameters diff --git a/packages/cornerstone-image-loader-streaming-volume/src/helpers/sortImageIdsAndGetSpacing.ts b/packages/cornerstone-image-loader-streaming-volume/src/helpers/sortImageIdsAndGetSpacing.ts index 8677515bdd..87cc4c123e 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/helpers/sortImageIdsAndGetSpacing.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/helpers/sortImageIdsAndGetSpacing.ts @@ -13,7 +13,7 @@ type SortedImageIdsItem = { * @param imageIds - array of imageIds * @param scanAxisNormal - [x, y, z] array or gl-matrix vec3 * - * @returns The sortedImageIds, zSpacing, and origin of the first imageg in the series. + * @returns The sortedImageIds, zSpacing, and origin of the first image in the series. */ export default function sortImageIdsAndGetSpacing( imageIds: Array, diff --git a/packages/cornerstone-image-loader-streaming-volume/src/index.ts b/packages/cornerstone-image-loader-streaming-volume/src/index.ts index 0742940e79..615c28d6c7 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/index.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/index.ts @@ -1,11 +1,9 @@ import cornerstoneStreamingImageVolumeLoader from './cornerstoneStreamingImageVolumeLoader' import sharedArrayBufferImageLoader from './sharedArrayBufferImageLoader' import StreamingImageVolume from './StreamingImageVolume' -import { registerWebImageLoader } from './registerWebImageLoader' export { cornerstoneStreamingImageVolumeLoader, sharedArrayBufferImageLoader, StreamingImageVolume, - registerWebImageLoader, } diff --git a/packages/cornerstone-image-loader-streaming-volume/src/sharedArrayBufferImageLoader.ts b/packages/cornerstone-image-loader-streaming-volume/src/sharedArrayBufferImageLoader.ts index 3181039bc3..4e182b889e 100644 --- a/packages/cornerstone-image-loader-streaming-volume/src/sharedArrayBufferImageLoader.ts +++ b/packages/cornerstone-image-loader-streaming-volume/src/sharedArrayBufferImageLoader.ts @@ -1,7 +1,4 @@ -import { - registerImageLoader, - REQUEST_TYPE, -} from '@precisionmetrics/cornerstone-render' +import { imageLoader, Enums } from '@precisionmetrics/cornerstone-render' import { getPixelData, decodeImageFrame, @@ -14,10 +11,17 @@ function getImageRetrievalPool() { } /** - * Small stripped down loader from cornerstoneWADOImageLoader - * Which doesn't create cornerstone images that we don't need + * Small stripped image loader from cornerstoneWADOImageLoader + * Which doesn't create cornerstone images that we don't need. It it mainly + * used (currently) by StreamingImageVolume to load each imageId and + * insert the image into the volume at the correct location. Note: the reason + * we don't use CornerstoneImageLoader (e.g., wadors image loader) is because + * we don't need to create cornerstone image instance, since we treat a volume + * as a whole which has one metadata and one 3D image. + * + * @param imageId - The imageId to load + * @param options - options for loading * - * @private */ function sharedArrayBufferImageLoader( imageId: string, @@ -69,8 +73,7 @@ function sharedArrayBufferImageLoader( // TODO: These probably need to be pulled from somewhere? // TODO: Make sure volume ID is also included? - // TODO: Use ENUM for requestType? Or nuke the types entirely - const requestType = options.requestType || REQUEST_TYPE.Interaction + const requestType = options.requestType || Enums.RequestType.Interaction const additionalDetails = options.additionalDetails || { imageId } const priority = options.priority === undefined ? 5 : options.priority @@ -80,8 +83,6 @@ function sharedArrayBufferImageLoader( additionalDetails, priority ) - - // console.warn(imageRetrievalPool.numRequests.interaction) }) return { @@ -93,7 +94,7 @@ function sharedArrayBufferImageLoader( /** * Helper method to extract the transfer-syntax from the response of the server. * - * @param contentType The value of the content-type header as returned by a WADO-RS server. + * @param contentType - The value of the content-type header as returned by a WADO-RS server. */ function getTransferSyntaxForContentType(contentType: string): string { const defaultTransferSyntax = '1.2.840.10008.1.2' // Default is Implicit Little Endian. @@ -146,7 +147,7 @@ function getTransferSyntaxForContentType(contentType: string): string { return defaultTransferSyntax } -registerImageLoader('csiv', sharedArrayBufferImageLoader) +imageLoader.registerImageLoader('csiv', sharedArrayBufferImageLoader) export default sharedArrayBufferImageLoader diff --git a/packages/cornerstone-image-loader-streaming-volume/test/StreamingImageVolume_test.js b/packages/cornerstone-image-loader-streaming-volume/test/StreamingImageVolume_test.js index 997c1b618d..90c65ed627 100644 --- a/packages/cornerstone-image-loader-streaming-volume/test/StreamingImageVolume_test.js +++ b/packages/cornerstone-image-loader-streaming-volume/test/StreamingImageVolume_test.js @@ -1,16 +1,8 @@ import * as cornerstoneStreamingImageVolumeLoader from '../src' import * as cornerstone from '@precisionmetrics/cornerstone-render' -const { - cache, - metaData, - Utilities, - registerVolumeLoader, - unregisterAllImageLoaders, -} = cornerstone - -const { testUtils } = Utilities -// import { User } from ... doesn't work right now since we don't have named exports set up +const { cache, metaData, utilities, imageLoader, volumeLoader } = cornerstone +const { testUtils } = utilities const { StreamingImageVolume } = cornerstoneStreamingImageVolumeLoader const imageIds = [ @@ -48,7 +40,7 @@ const fakeSharedBufferImageLoader = (imageId, options) => { } // regular imageLoader -const imageLoader = (imageId) => { +const fakeImageLoader = (imageId) => { // imageId1 => all voxels = 1 // imageId2 => all voxels = 2 // etc. @@ -73,8 +65,8 @@ const imageLoader = (imageId) => { } function setupLoaders() { - cornerstone.registerImageLoader('fakeImageLoader', imageLoader) - cornerstone.registerImageLoader( + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader( 'fakeSharedBufferImageLoader', fakeSharedBufferImageLoader ) @@ -125,7 +117,7 @@ function setupLoaders() { } } - cornerstone.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) return { imageIds, @@ -149,10 +141,10 @@ describe('StreamingImageVolume', () => { it('load: correctly streams pixel data from Images into Volume via a SharedArrayBuffer', async function () { const volumeId = 'fakeVolumeLoader:VOLUME' - await cornerstone.createAndCacheVolume(volumeId, { + await volumeLoader.createAndCacheVolume(volumeId, { imageIds: this.imageIds, }) - const volume = cornerstone.getVolume(volumeId) + const volume = cache.getVolume(volumeId) let framesLoaded = 0 const callback = (evt) => { @@ -192,14 +184,14 @@ describe('StreamingImageVolume', () => { ] // caching volume - await cornerstone.createAndCacheVolume('fakeVolumeLoader:VOLUME', { + await volumeLoader.createAndCacheVolume('fakeVolumeLoader:VOLUME', { imageIds: this.imageIds, }) expect(cache.getCacheSize()).toBe(50000) // loading the volume - const volume = cornerstone.getVolume(volumeId) + const volume = cache.getVolume(volumeId) const callback = undefined // adding requests to the pool manager volume.load(callback) @@ -207,7 +199,7 @@ describe('StreamingImageVolume', () => { expect(cache.getImageLoadObject(imageIds[0])).not.toBeDefined() // loading the images - await cornerstone.loadAndCacheImages(imageIds) + await imageLoader.loadAndCacheImages(imageIds) // imageLoader is not being called for any imageIds expect(spyedImageLoader).not.toHaveBeenCalled() @@ -225,12 +217,12 @@ describe('StreamingImageVolume', () => { }) // it('cancelLoading: ', async function () { - // await cornerstone.createAndCacheVolume('fakeVolumeLoader:VOLUME', { + // await volumeLoader.createAndCacheVolume('fakeVolumeLoader:VOLUME', { // imageIds: this.imageIds, // }) // const volumeId = 'fakeVolumeLoader:VOLUME' - // const volume = cornerstone.getVolume(volumeId) + // const volume = cache.getVolume(volumeId) // const callback = undefined // const prefetch = false @@ -257,12 +249,12 @@ describe('StreamingImageVolume', () => { // }) it('decache: properly decaches the Volume into a set of Images', async function () { - await cornerstone.createAndCacheVolume('fakeVolumeLoader:VOLUME', { + await volumeLoader.createAndCacheVolume('fakeVolumeLoader:VOLUME', { imageIds: this.imageIds, }) const volumeId = 'fakeVolumeLoader:VOLUME' - const volume = cornerstone.getVolume(volumeId) + const volume = cache.getVolume(volumeId) const completelyRemove = false volume.load() @@ -275,7 +267,7 @@ describe('StreamingImageVolume', () => { const cacheSizeAfterDecache = cache.getCacheSize() // Gets the volume - const volAfterDecache = cornerstone.getVolume(volumeId) + const volAfterDecache = cache.getVolume(volumeId) expect(volAfterDecache).not.toBeDefined() expect(cacheSizeBeforeDecache - cacheSizeAfterDecache).toBe(50000) @@ -294,12 +286,12 @@ describe('StreamingImageVolume', () => { }) it('decache: completely removes the Volume from the cache', async function () { - await cornerstone.createAndCacheVolume('fakeVolumeLoader:VOLUME', { + await volumeLoader.createAndCacheVolume('fakeVolumeLoader:VOLUME', { imageIds: this.imageIds, }) const volumeId = 'fakeVolumeLoader:VOLUME' - const volume = cornerstone.getVolume(volumeId) + const volume = cache.getVolume(volumeId) const completelyRemove = true @@ -311,7 +303,7 @@ describe('StreamingImageVolume', () => { volume.decache(completelyRemove) // Gets the volume - const volAfterDecache = cornerstone.getVolume(volumeId) + const volAfterDecache = cache.getVolume(volumeId) expect(volAfterDecache).not.toBeDefined() const cacheSizeAfterPurge = cache.getCacheSize() @@ -352,21 +344,21 @@ describe('StreamingImageVolume', () => { // ] // // loading the images first - // await cornerstone.loadAndCacheImages(imageIds) + // await imageLoader.loadAndCacheImages(imageIds) // // only cached images so far // expect(cache.getCacheSize()).toBe(50000) // expect(cache.getImageLoadObject(imageIds[0])).toBeDefined() // // caching volume - // await cornerstone.createAndCacheVolume('fakeVolumeLoader:VOLUME', { + // await volumeLoader.createAndCacheVolume('fakeVolumeLoader:VOLUME', { // imageIds: this.imageIds, // }) // expect(cache.getCacheSize()).toBe(100000) // // loading the volume - // const volume = cornerstone.getVolume(volumeId) + // const volume = cache.getVolume(volumeId) // const prefetch = false // const callback = undefined // // adding requests to the pool manager @@ -404,11 +396,11 @@ describe('StreamingImageVolume', () => { beforeEach(function () { cache.purgeCache() metaData.addProvider(testUtils.fakeMetaDataProvider, 10000) - cornerstone.registerImageLoader( + imageLoader.registerImageLoader( 'fakeSharedBufferImageLoader', fakeSharedBufferImageLoader ) - registerVolumeLoader( + volumeLoader.registerVolumeLoader( 'fakeSharedBufferImageLoader', testUtils.fakeImageLoader ) @@ -417,7 +409,7 @@ describe('StreamingImageVolume', () => { afterEach(function () { cache.purgeCache() metaData.removeProvider(testUtils.fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() }) it('should successfully use metadata for streaming image volume', async function () { @@ -434,10 +426,10 @@ describe('StreamingImageVolume', () => { const volumeId = 'cornerstoneStreamingImageVolume:volume' try { - await cornerstone.createAndCacheVolume(volumeId, { + await volumeLoader.createAndCacheVolume(volumeId, { imageIds: imageIds, }) - const volume = cornerstone.getVolume(volumeId) + const volume = cache.getVolume(volumeId) let framesLoaded = 0 const callback = (evt) => { diff --git a/packages/cornerstone-render/examples/multiVolumeAPI/index.ts b/packages/cornerstone-render/examples/multiVolumeAPI/index.ts index ed59928987..e8a54d1dc7 100644 --- a/packages/cornerstone-render/examples/multiVolumeAPI/index.ts +++ b/packages/cornerstone-render/examples/multiVolumeAPI/index.ts @@ -1,10 +1,10 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, + Enums, + volumeLoader, getRenderingEngine, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -17,6 +17,8 @@ import { // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS const renderingEngineUID = 'myRenderingEngine' const viewportUID = 'CT_SAGITTAL_STACK' @@ -207,7 +209,7 @@ async function run() { // Create a stack viewport const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -223,7 +225,7 @@ async function run() { ) // Define a volume in memory - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctImageIds, }) @@ -239,7 +241,7 @@ async function run() { // Load the PT in the background as we know we'll need it // Define a volume in memory - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) diff --git a/packages/cornerstone-render/examples/multiVolumeCanvasToWorld/index.ts b/packages/cornerstone-render/examples/multiVolumeCanvasToWorld/index.ts index 515cec3f5d..2990d047d3 100644 --- a/packages/cornerstone-render/examples/multiVolumeCanvasToWorld/index.ts +++ b/packages/cornerstone-render/examples/multiVolumeCanvasToWorld/index.ts @@ -1,10 +1,10 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, - Utilities as csUtils, + volumeLoader, + Enums, + utilities as csUtils, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' // TODO -> A load of the utilities in cornerstone tools are just about the volumes and should be in core instead import { @@ -16,6 +16,9 @@ import { // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + // Define unique ids for the volumes const volumeLoaderProtocolName = 'cornerstoneStreamingImageVolume' // Loader id which defines which volume loader to use const ctVolumeName = 'CT_VOLUME_UID' // Id of the volume less loader prefix @@ -95,7 +98,7 @@ async function run() { const viewportUID = 'CT_SAGITTAL_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -111,7 +114,7 @@ async function run() { ) // Define a volume in memory - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctImageIds, }) @@ -119,7 +122,7 @@ async function run() { ctVolume.load() // Define a volume in memory - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) diff --git a/packages/cornerstone-render/examples/stackAPI/index.ts b/packages/cornerstone-render/examples/stackAPI/index.ts index 765a405b09..9d9ab5f651 100644 --- a/packages/cornerstone-render/examples/stackAPI/index.ts +++ b/packages/cornerstone-render/examples/stackAPI/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, getRenderingEngine, } from '@precisionmetrics/cornerstone-render' import { @@ -12,6 +12,8 @@ import { camera as cameraHelpers, } from '../../../../utils/demo/helpers' +const { ViewportType } = Enums + // ======== Constants ======= // const renderingEngineUID = 'myRenderingEngine' const viewportUID = 'CT_STACK' @@ -221,7 +223,7 @@ async function run() { const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-render/examples/stackBasic/index.ts b/packages/cornerstone-render/examples/stackBasic/index.ts index ce477cd83c..2aba001a49 100644 --- a/packages/cornerstone-render/examples/stackBasic/index.ts +++ b/packages/cornerstone-render/examples/stackBasic/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -9,6 +9,8 @@ import { setTitleAndDescription, } from '../../../../utils/demo/helpers' +const { ViewportType } = Enums + // ======== Set up page ======== // setTitleAndDescription( 'Basic Stack', @@ -49,7 +51,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-render/examples/stackCanvasToWorld/index.ts b/packages/cornerstone-render/examples/stackCanvasToWorld/index.ts index 7c98e9faec..2dfdbbfb3d 100644 --- a/packages/cornerstone-render/examples/stackCanvasToWorld/index.ts +++ b/packages/cornerstone-render/examples/stackCanvasToWorld/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -9,6 +9,8 @@ import { setTitleAndDescription, } from '../../../../utils/demo/helpers' +const { ViewportType } = Enums + // ======== Set up page ======== // setTitleAndDescription( 'Stack CanvasToWorld', @@ -63,7 +65,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-render/examples/stackEvents/index.ts b/packages/cornerstone-render/examples/stackEvents/index.ts index 402e892d04..684498022b 100644 --- a/packages/cornerstone-render/examples/stackEvents/index.ts +++ b/packages/cornerstone-render/examples/stackEvents/index.ts @@ -1,9 +1,8 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, getRenderingEngine, - EVENTS as RenderingEngineEvents, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -13,6 +12,8 @@ import { } from '../../../../utils/demo/helpers' import { vec3 } from 'gl-matrix' +const { ViewportType } = Enums + // ======== Constants ======= // const renderingEngineUID = 'myRenderingEngine' const viewportUID = 'CT_STACK' @@ -58,8 +59,7 @@ function updateLastEvents(number, eventName, detail) { let eventNumber = 1 -const { IMAGE_RENDERED, CAMERA_MODIFIED, STACK_NEW_IMAGE } = - RenderingEngineEvents +const { IMAGE_RENDERED, CAMERA_MODIFIED, STACK_NEW_IMAGE } = Enums.Events element.addEventListener( IMAGE_RENDERED, @@ -252,7 +252,7 @@ async function run() { const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-render/examples/volumeAPI/index.ts b/packages/cornerstone-render/examples/volumeAPI/index.ts index 8d92eab0f4..8992e66aea 100644 --- a/packages/cornerstone-render/examples/volumeAPI/index.ts +++ b/packages/cornerstone-render/examples/volumeAPI/index.ts @@ -1,11 +1,11 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, + Enums, + volumeLoader, getRenderingEngine, - Utilities, + utilities, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -20,6 +20,8 @@ import vtkConstants from 'vtk.js/Sources/Rendering/Core/VolumeMapper/Constants' // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS const { BlendMode } = vtkConstants const renderingEngineUID = 'myRenderingEngine' @@ -118,7 +120,7 @@ addButtonToToolbar('Invert', () => { .getProperty() .getRGBTransferFunction(0) - Utilities.invertRgbTransferFunction(rgbTransferFunction) + utilities.invertRgbTransferFunction(rgbTransferFunction) viewport.render() }) @@ -286,7 +288,7 @@ async function run() { // Create a stack viewport const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -302,7 +304,7 @@ async function run() { ) // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds, }) diff --git a/packages/cornerstone-render/examples/volumeBasic/index.ts b/packages/cornerstone-render/examples/volumeBasic/index.ts index 4f1ef99215..35d6f6bdd0 100644 --- a/packages/cornerstone-render/examples/volumeBasic/index.ts +++ b/packages/cornerstone-render/examples/volumeBasic/index.ts @@ -1,9 +1,9 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, + Enums, + volumeLoader, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -13,6 +13,9 @@ import { // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + // ======== Set up page ======== // setTitleAndDescription( 'Basic Volume', @@ -53,7 +56,7 @@ async function run() { const viewportUID = 'CT_SAGITTAL_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -74,7 +77,7 @@ async function run() { const volumeUID = `${volumeLoaderProtocolName}:${volumeName}` // VolumeUID with loader id + volume id // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds, }) diff --git a/packages/cornerstone-render/examples/volumeEvents/index.ts b/packages/cornerstone-render/examples/volumeEvents/index.ts index ca7463fe77..bb4159f8b0 100644 --- a/packages/cornerstone-render/examples/volumeEvents/index.ts +++ b/packages/cornerstone-render/examples/volumeEvents/index.ts @@ -1,11 +1,10 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, getRenderingEngine, - EVENTS as RenderingEngineEvents, + volumeLoader, + Enums, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -14,11 +13,11 @@ import { addButtonToToolbar, camera as cameraHelpers, } from '../../../../utils/demo/helpers' -import vtkConstants from 'vtk.js/Sources/Rendering/Core/VolumeMapper/Constants' // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader -const { BlendMode } = vtkConstants +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS const renderingEngineUID = 'myRenderingEngine' const viewportUID = 'CT_SAGITTAL_STACK' @@ -69,8 +68,7 @@ function updateLastEvents(number, eventName, detail) { let eventNumber = 1 -const { IMAGE_RENDERED, CAMERA_MODIFIED, STACK_NEW_IMAGE } = - RenderingEngineEvents +const { IMAGE_RENDERED, CAMERA_MODIFIED, STACK_NEW_IMAGE } = Enums.Events element.addEventListener( IMAGE_RENDERED, @@ -196,7 +194,7 @@ async function run() { // Create a stack viewport const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -212,7 +210,7 @@ async function run() { ) // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds, }) diff --git a/packages/cornerstone-render/examples/volumePriorityLoading/index.ts b/packages/cornerstone-render/examples/volumePriorityLoading/index.ts index 08e8aaf21f..59bd9b2fbb 100644 --- a/packages/cornerstone-render/examples/volumePriorityLoading/index.ts +++ b/packages/cornerstone-render/examples/volumePriorityLoading/index.ts @@ -1,10 +1,10 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, + Enums, + volumeLoader, imageLoadPoolManager, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -15,6 +15,9 @@ import { // Auto registers volume loader import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + // Define unique ids for the volumes const volumeLoaderProtocolName = 'cornerstoneStreamingImageVolume' // Loader id which defines which volume loader to use const ctVolumeName = 'CT_VOLUME_UID' // Id of the volume less loader prefix @@ -116,7 +119,7 @@ async function run() { const viewportUID = 'CT_SAGITTAL_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -132,12 +135,12 @@ async function run() { ) // Define a volume in memory - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctImageIds, }) // Define a volume in memory - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) diff --git a/packages/cornerstone-render/src/RenderingEngine/RenderingEngine.ts b/packages/cornerstone-render/src/RenderingEngine/RenderingEngine.ts index d5ae6f7f8c..ce7e83daa0 100644 --- a/packages/cornerstone-render/src/RenderingEngine/RenderingEngine.ts +++ b/packages/cornerstone-render/src/RenderingEngine/RenderingEngine.ts @@ -1,9 +1,9 @@ -import EVENTS from '../enums/events' +import Events from '../enums/Events' import renderingEngineCache from './renderingEngineCache' import eventTarget from '../eventTarget' import { triggerEvent, uuidv4 } from '../utilities' import { vtkOffscreenMultiRenderWindow } from './vtkClasses' -import VIEWPORT_TYPE from '../enums/viewportType' +import ViewportType from '../enums/ViewportType' import { PublicViewportInput, EventTypes, @@ -126,7 +126,7 @@ class RenderingEngine implements IRenderingEngine { * ```typescript * renderingEngine.enableElement({ * viewportUID: viewportUID, - * type: VIEWPORT_TYPE.ORTHOGRAPHIC, + * type: ViewportType.ORTHOGRAPHIC, * element, * defaultOptions: { * orientation: ORIENTATION[orientation], @@ -135,7 +135,7 @@ class RenderingEngine implements IRenderingEngine { * }) * ``` * - * @fires EVENTS.ELEMENT_ENABLED + * @fires Events.ELEMENT_ENABLED * * @param viewportInputEntry - viewport specifications */ @@ -192,7 +192,7 @@ class RenderingEngine implements IRenderingEngine { * 3) resetting the viewport to remove the canvas attributes and canvas data * 4) resize the offScreen appropriately (if using vtk.js driven rendering pipeline) * - * @fires EVENTS.ELEMENT_ENABLED + * @fires Events.ELEMENT_ENABLED * * @param viewportUID - viewport UID * @@ -244,7 +244,7 @@ class RenderingEngine implements IRenderingEngine { *renderingEngine.setViewports([ * { * viewportUID: axialViewportUID, - * type: VIEWPORT_TYPE.ORTHOGRAPHIC, + * type: ViewportType.ORTHOGRAPHIC, * element: document.getElementById('axialDiv'), * defaultOptions: { * orientation: ORIENTATION.AXIAL, @@ -252,7 +252,7 @@ class RenderingEngine implements IRenderingEngine { * }, * { * viewportUID: sagittalViewportUID, - * type: VIEWPORT_TYPE.ORTHOGRAPHIC, + * type: ViewportType.ORTHOGRAPHIC, * element: document.getElementById('sagittalDiv'), * defaultOptions: { * orientation: ORIENTATION.SAGITTAL, @@ -260,7 +260,7 @@ class RenderingEngine implements IRenderingEngine { * }, * { * viewportUID: customOrientationViewportUID, - * type: VIEWPORT_TYPE.ORTHOGRAPHIC, + * type: ViewportType.ORTHOGRAPHIC, * element: document.getElementById('customOrientationDiv'), * defaultOptions: { * orientation: { sliceNormal: [0, 0, 1], viewUp: [0, 1, 0] }, @@ -269,7 +269,7 @@ class RenderingEngine implements IRenderingEngine { * ]) * ``` * - * @fires EVENTS.ELEMENT_ENABLED + * @fires Events.ELEMENT_ENABLED * * @param viewportInputEntries - Array */ @@ -396,7 +396,7 @@ class RenderingEngine implements IRenderingEngine { /** * Renders all viewports on the next animation frame. * - * @fires EVENTS.IMAGE_RENDERED + * @fires Events.IMAGE_RENDERED */ public render(): void { const viewports = this.getViewports() @@ -676,10 +676,10 @@ class RenderingEngine implements IRenderingEngine { // 4. Create a proper viewport based on the type of the viewport let viewport - if (type === VIEWPORT_TYPE.STACK) { + if (type === ViewportType.STACK) { // 4.a Create stack viewport viewport = new StackViewport(viewportInput) - } else if (type === VIEWPORT_TYPE.ORTHOGRAPHIC) { + } else if (type === ViewportType.ORTHOGRAPHIC) { // 4.b Create a volume viewport viewport = new VolumeViewport(viewportInput) } else { @@ -696,7 +696,7 @@ class RenderingEngine implements IRenderingEngine { } if (!viewport.suppressEvents) { - triggerEvent(eventTarget, EVENTS.ELEMENT_ENABLED, eventDetail) + triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail) } } @@ -738,7 +738,7 @@ class RenderingEngine implements IRenderingEngine { // 4. Create a proper viewport based on the type of the viewport - if (type !== VIEWPORT_TYPE.STACK) { + if (type !== ViewportType.STACK) { // In the future these will need to be pluggable, but we aren't there yet // and these are just Stacks for now. throw new Error('Support for fully custom viewports not yet implemented') @@ -756,7 +756,7 @@ class RenderingEngine implements IRenderingEngine { renderingEngineUID: this.uid, } - triggerEvent(eventTarget, EVENTS.ELEMENT_ENABLED, eventDetail) + triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail) } /** @@ -1028,7 +1028,7 @@ class RenderingEngine implements IRenderingEngine { this._animationFrameHandle = null eventDetailArray.forEach((eventDetail) => { - triggerEvent(eventDetail.element, EVENTS.IMAGE_RENDERED, eventDetail) + triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail) }) } @@ -1167,7 +1167,7 @@ class RenderingEngine implements IRenderingEngine { // Trigger first before removing the data attributes, as we need the enabled // element to remove tools associated with the viewport - triggerEvent(eventTarget, EVENTS.ELEMENT_DISABLED, eventDetail) + triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail) element.removeAttribute('data-viewport-uid') element.removeAttribute('data-rendering-engine-uid') diff --git a/packages/cornerstone-render/src/RenderingEngine/StackViewport.ts b/packages/cornerstone-render/src/RenderingEngine/StackViewport.ts index 77d530e384..852cf878b0 100644 --- a/packages/cornerstone-render/src/RenderingEngine/StackViewport.ts +++ b/packages/cornerstone-render/src/RenderingEngine/StackViewport.ts @@ -9,7 +9,7 @@ import { vec2, vec3, mat4 } from 'gl-matrix' import metaData from '../metaData' import Viewport from './Viewport' import eventTarget from '../eventTarget' -import EVENTS from '../enums/events' +import Events from '../enums/Events' import { triggerEvent, isEqual, @@ -41,8 +41,7 @@ import { getColormap } from './helpers/cpuFallback/colors/index' import { loadAndCacheImage } from '../imageLoader' import imageLoadPoolManager from '../requestPool/imageLoadPoolManager' -import ERROR_CODES from '../enums/errorCodes' -import INTERPOLATION_TYPE from '../enums/interpolationType' +import InterpolationType from '../enums/InterpolationType' import canvasToPixel from './helpers/cpuFallback/rendering/canvasToPixel' import pixelToCanvas from './helpers/cpuFallback/rendering/pixelToCanvas' import getDefaultViewport from './helpers/cpuFallback/rendering/getDefaultViewport' @@ -52,7 +51,7 @@ import resize from './helpers/cpuFallback/rendering/resize' import resetCamera from './helpers/cpuFallback/rendering/resetCamera' import { Transform } from './helpers/cpuFallback/rendering/transform' import { getShouldUseCPURendering } from '../init' -import REQUEST_TYPE from '../enums/requestType' +import RequestType from '../enums/RequestType' const EPSILON = 1 // Slice Thickness @@ -89,7 +88,7 @@ class StackViewport extends Viewport implements IStackViewport { // Viewport Properties private voiRange: VOIRange private invert = false - private interpolationType: INTERPOLATION_TYPE + private interpolationType: InterpolationType private rotation = 0 // Helpers @@ -585,7 +584,7 @@ class StackViewport extends Viewport implements IStackViewport { this.setProperties({ voiRange: undefined, rotation: 0, - interpolationType: INTERPOLATION_TYPE.LINEAR, + interpolationType: InterpolationType.LINEAR, invert: false, flipHorizontal: false, flipVertical: false, @@ -679,7 +678,7 @@ class StackViewport extends Viewport implements IStackViewport { renderingEngineUID: this.renderingEngineUID, } - triggerEvent(this.element, EVENTS.CAMERA_MODIFIED, eventDetail) + triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail) } private setFlipDirection(flipDirection: FlipDirection): void { @@ -719,7 +718,7 @@ class StackViewport extends Viewport implements IStackViewport { this.setRotationGPU(rotationCache, rotation) } - private setInterpolationType(interpolationType: INTERPOLATION_TYPE): void { + private setInterpolationType(interpolationType: InterpolationType): void { if (this.useCPURendering) { this.setInterpolationTypeCPU(interpolationType) return @@ -755,7 +754,7 @@ class StackViewport extends Viewport implements IStackViewport { this.rotation = rotation } - private setInterpolationTypeGPU(interpolationType: INTERPOLATION_TYPE): void { + private setInterpolationTypeGPU(interpolationType: InterpolationType): void { const actor = this.getDefaultActor() if (!actor) { @@ -770,10 +769,10 @@ class StackViewport extends Viewport implements IStackViewport { this.interpolationType = interpolationType } - private setInterpolationTypeCPU(interpolationType: INTERPOLATION_TYPE): void { + private setInterpolationTypeCPU(interpolationType: InterpolationType): void { const { viewport } = this._cpuFallbackEnabledElement - if (interpolationType === INTERPOLATION_TYPE.LINEAR) { + if (interpolationType === InterpolationType.LINEAR) { viewport.pixelReplication = false } else { viewport.pixelReplication = true @@ -1229,7 +1228,7 @@ class StackViewport extends Viewport implements IStackViewport { renderingEngineUID: this.renderingEngineUID, } - triggerEvent(this.element, EVENTS.STACK_NEW_IMAGE, eventDetail) + triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail) const metadata = this._getImageDataMetadata(image) as ImageDataMetaData @@ -1300,7 +1299,7 @@ class StackViewport extends Viewport implements IStackViewport { } if (!this.suppressEvents) { - triggerEvent(eventTarget, ERROR_CODES.IMAGE_LOAD_ERROR, eventDetail) + triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail) } reject(error) @@ -1335,7 +1334,7 @@ class StackViewport extends Viewport implements IStackViewport { const type = 'Float32Array' const priority = -5 - const requestType = REQUEST_TYPE.Interaction + const requestType = RequestType.Interaction const additionalDetails = { imageId } const options = { targetBuffer: { @@ -1368,7 +1367,7 @@ class StackViewport extends Viewport implements IStackViewport { renderingEngineUID: this.renderingEngineUID, } - triggerEvent(this.element, EVENTS.STACK_NEW_IMAGE, eventDetail) + triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail) this._updateActorToDisplayImageId(image) @@ -1398,7 +1397,7 @@ class StackViewport extends Viewport implements IStackViewport { imageId, } - triggerEvent(eventTarget, ERROR_CODES.IMAGE_LOAD_ERROR, eventDetail) + triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail) reject(error) } @@ -1431,7 +1430,7 @@ class StackViewport extends Viewport implements IStackViewport { const type = 'Float32Array' const priority = -5 - const requestType = REQUEST_TYPE.Interaction + const requestType = RequestType.Interaction const additionalDetails = { imageId } const options = { targetBuffer: { @@ -1715,7 +1714,7 @@ class StackViewport extends Viewport implements IStackViewport { if (!this.suppressEvents) { // For crosshairs to adapt to new viewport size - triggerEvent(this.element, EVENTS.CAMERA_MODIFIED, eventDetail) + triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail) } } @@ -1736,7 +1735,7 @@ class StackViewport extends Viewport implements IStackViewport { if (!this.suppressEvents) { // Let the tools know the image spacing has been calibrated - triggerEvent(this.element, EVENTS.IMAGE_SPACING_CALIBRATED, eventDetail) + triggerEvent(this.element, Events.IMAGE_SPACING_CALIBRATED, eventDetail) } this._publishCalibratedEvent = false diff --git a/packages/cornerstone-render/src/RenderingEngine/Viewport.ts b/packages/cornerstone-render/src/RenderingEngine/Viewport.ts index ca47e2765a..04a1752cb7 100644 --- a/packages/cornerstone-render/src/RenderingEngine/Viewport.ts +++ b/packages/cornerstone-render/src/RenderingEngine/Viewport.ts @@ -5,8 +5,8 @@ import vtkMath from 'vtk.js/Sources/Common/Core/Math' import { vec3, mat4 } from 'gl-matrix' import _cloneDeep from 'lodash.clonedeep' -import Events from '../enums/events' -import VIEWPORT_TYPE from '../enums/viewportType' +import Events from '../enums/Events' +import ViewportType from '../enums/ViewportType' import { ICamera, ActorEntry } from '../types' import { ViewportInput, IViewport } from '../types/IViewport' import renderingEngineCache from './renderingEngineCache' @@ -34,7 +34,7 @@ class Viewport implements IViewport { /** RenderingEngine uid that the viewport belongs to */ readonly renderingEngineUID: string /** Type of viewport */ - readonly type: VIEWPORT_TYPE + readonly type: ViewportType protected flipHorizontal = false protected flipVertical = false @@ -795,7 +795,7 @@ class Viewport implements IViewport { triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail) } - if (this.type == VIEWPORT_TYPE.PERSPECTIVE) { + if (this.type == ViewportType.PERSPECTIVE) { const renderer = this.getRenderer() renderer.resetCameraClippingRange() diff --git a/packages/cornerstone-render/src/RenderingEngine/VolumeViewport.ts b/packages/cornerstone-render/src/RenderingEngine/VolumeViewport.ts index f6c07fdb2d..8697910a0e 100644 --- a/packages/cornerstone-render/src/RenderingEngine/VolumeViewport.ts +++ b/packages/cornerstone-render/src/RenderingEngine/VolumeViewport.ts @@ -1,7 +1,7 @@ import { vec3 } from 'gl-matrix' import cache from '../cache' -import VIEWPORT_TYPE from '../enums/viewportType' +import ViewportType from '../enums/ViewportType' import Viewport from './Viewport' import { Point2, Point3, IImageData, IVolumeInput } from '../types' import { ViewportInput } from '../types/IViewport' @@ -20,7 +20,7 @@ const EPSILON = 1e-3 * use SharedVolumeMappers behind the scene, memory footprint of visualizations * of the same volume in different orientations is very small. * - * For setting volumes on viewports you need to use {@link addVolumesOnViewports} + * For setting volumes on viewports you need to use {@link addVolumesToViewports} * which will add volumes to the specified viewports. */ class VolumeViewport extends Viewport implements IVolumeViewport { @@ -44,10 +44,10 @@ class VolumeViewport extends Viewport implements IVolumeViewport { renderer.setActiveCamera(camera) switch (this.type) { - case VIEWPORT_TYPE.ORTHOGRAPHIC: + case ViewportType.ORTHOGRAPHIC: camera.setParallelProjection(true) break - case VIEWPORT_TYPE.PERSPECTIVE: + case ViewportType.PERSPECTIVE: camera.setParallelProjection(false) break default: @@ -343,7 +343,7 @@ class VolumeViewport extends Viewport implements IVolumeViewport { // volumeActorEntries.forEach((va) => renderer.addActor(va.volumeActor)) let slabThickness = null - if (this.type === VIEWPORT_TYPE.ORTHOGRAPHIC) { + if (this.type === ViewportType.ORTHOGRAPHIC) { volumeActorEntries.forEach((va) => { if (va.slabThickness && va.slabThickness > slabThickness) { slabThickness = va.slabThickness diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesOnViewports.ts b/packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesToViewports.ts similarity index 91% rename from packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesOnViewports.ts rename to packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesToViewports.ts index b7286fec1b..f49fa7dc75 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesOnViewports.ts +++ b/packages/cornerstone-render/src/RenderingEngine/helpers/addVolumesToViewports.ts @@ -13,7 +13,7 @@ import { IVolumeInput } from '../../types' * @param immediateRender - If true, the volumes will be rendered immediately * @returns A promise that resolves when all volumes have been added */ -async function addVolumesOnViewports( +async function addVolumesToViewports( renderingEngine: RenderingEngine, volumeInputs: Array, viewportUIDs: Array, @@ -29,7 +29,7 @@ async function addVolumesOnViewports( // if not instance of VolumeViewport, throw if (!(viewport instanceof VolumeViewport)) { - throw new Error('addVolumesOnViewports only supports VolumeViewport') + throw new Error('addVolumesToViewports only supports VolumeViewport') } }) @@ -44,4 +44,4 @@ async function addVolumesOnViewports( return } -export default addVolumesOnViewports +export default addVolumesToViewports diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/index.ts b/packages/cornerstone-render/src/RenderingEngine/helpers/index.ts index 661cb51248..8c1099fc36 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/index.ts +++ b/packages/cornerstone-render/src/RenderingEngine/helpers/index.ts @@ -2,18 +2,14 @@ import createVolumeActor from './createVolumeActor' import createVolumeMapper from './createVolumeMapper' import getOrCreateCanvas from './getOrCreateCanvas' import renderToCanvas from './renderToCanvas' -import setVolumesOnViewports from './setVolumesOnViewports' -import addVolumesOnViewports from './addVolumesOnViewports' -import getVolumeViewportsContainingSameVolumes from './getVolumeViewportsContainingSameVolumes' -import getVolumeViewportsContainingVolumeUID from './getVolumeViewportsContainingVolumeUID' +import setVolumesForViewports from './setVolumesForViewports' +import addVolumesToViewports from './addVolumesToViewports' export { createVolumeActor, createVolumeMapper, getOrCreateCanvas, renderToCanvas, - setVolumesOnViewports, - addVolumesOnViewports, - getVolumeViewportsContainingSameVolumes, - getVolumeViewportsContainingVolumeUID, + setVolumesForViewports, + addVolumesToViewports, } diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/renderToCanvas.ts b/packages/cornerstone-render/src/RenderingEngine/helpers/renderToCanvas.ts index 0572dc4a43..d63fa9f218 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/renderToCanvas.ts +++ b/packages/cornerstone-render/src/RenderingEngine/helpers/renderToCanvas.ts @@ -1,10 +1,10 @@ import RenderingEngine from '../RenderingEngine' import { getRenderingEngine } from '../getRenderingEngine' import getOrCreateCanvas from './getOrCreateCanvas' -import VIEWPORT_TYPE from '../../enums/viewportType' +import ViewportType from '../../enums/ViewportType' import ORIENTATION from '../../constants/orientation' import StackViewport from '../StackViewport' -import Events from '../../enums/events' +import Events from '../../enums/Events' /** * Renders an imageId to a Canvas. This method will handle creation @@ -79,7 +79,7 @@ export default function renderToCanvas( const stackViewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { orientation: ORIENTATION.AXIAL, diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesOnViewports.ts b/packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesForViewports.ts similarity index 87% rename from packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesOnViewports.ts rename to packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesForViewports.ts index b75939b750..e1fa0a250c 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesOnViewports.ts +++ b/packages/cornerstone-render/src/RenderingEngine/helpers/setVolumesForViewports.ts @@ -2,7 +2,7 @@ import { RenderingEngine, VolumeViewport } from '../' import { IVolumeInput } from '../../types' /** - * Similar to {@link addVolumesOnViewports} it adds volumes to viewports; however, + * Similar to {@link addVolumesToViewports} it adds volumes to viewports; however, * this method will Set the volumes on the viewports which means that the previous * volumes will be removed. * @@ -13,7 +13,7 @@ import { IVolumeInput } from '../../types' * @param immediateRender - If true, the volumes will be rendered immediately * @returns A promise that resolves when all volumes have been added */ -async function setVolumesOnViewports( +async function setVolumesForViewports( renderingEngine: RenderingEngine, volumeInputs: Array, viewportUIDs: Array, @@ -29,7 +29,7 @@ async function setVolumesOnViewports( // if not instance of VolumeViewport, throw if (!(viewport instanceof VolumeViewport)) { - throw new Error('setVolumesOnViewports only supports VolumeViewport') + throw new Error('setVolumesForViewports only supports VolumeViewport') } }) @@ -44,4 +44,4 @@ async function setVolumesOnViewports( return } -export default setVolumesOnViewports +export default setVolumesForViewports diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts b/packages/cornerstone-render/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts index bf4347ffa7..e353b339e1 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts +++ b/packages/cornerstone-render/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts @@ -1,12 +1,12 @@ // TODO -> Eventually we'll need to register to this list import StackViewport from '../StackViewport' import VolumeViewport from '../VolumeViewport' -import VIEWPORT_TYPE from '../../enums/viewportType' +import ViewportType from '../../enums/ViewportType' const viewportTypeToViewportClass = { - [VIEWPORT_TYPE.ORTHOGRAPHIC]: VolumeViewport, - [VIEWPORT_TYPE.PERSPECTIVE]: VolumeViewport, - [VIEWPORT_TYPE.STACK]: StackViewport, + [ViewportType.ORTHOGRAPHIC]: VolumeViewport, + [ViewportType.PERSPECTIVE]: VolumeViewport, + [ViewportType.STACK]: StackViewport, } export default viewportTypeToViewportClass diff --git a/packages/cornerstone-render/src/cache/cache.ts b/packages/cornerstone-render/src/cache/cache.ts index 979885b00e..b094c85902 100644 --- a/packages/cornerstone-render/src/cache/cache.ts +++ b/packages/cornerstone-render/src/cache/cache.ts @@ -10,8 +10,7 @@ import { } from '../types' import { triggerEvent, imageIdToURI } from '../utilities' import eventTarget from '../eventTarget' -import EVENTS from '../enums/events' -import ERROR_CODES from '../enums/errorCodes' +import Events from '../enums/Events' const MAX_CACHE_SIZE_1GB = 1073741824 @@ -185,8 +184,8 @@ class Cache implements ICache { * Relevant events are fired for each decached image (IMAGE_CACHE_IMAGE_REMOVED) and * the decached volume (VOLUME_CACHE_VOLUME_REMOVED). * - * @fires EVENTS.IMAGE_CACHE_IMAGE_REMOVED - * @fires EVENTS.VOLUME_CACHE_VOLUME_REMOVED + * @fires Events.IMAGE_CACHE_IMAGE_REMOVED + * @fires Events.VOLUME_CACHE_VOLUME_REMOVED * * @param numBytes - number of bytes * @@ -205,7 +204,7 @@ class Cache implements ICache { this.removeImageLoadObject(imageId) - triggerEvent(eventTarget, EVENTS.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) + triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) } const volumeIterator = this._volumeCache.keys() @@ -220,7 +219,7 @@ class Cache implements ICache { this.removeVolumeLoadObject(volumeId) - triggerEvent(eventTarget, EVENTS.VOLUME_CACHE_VOLUME_REMOVED, { + triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, { volumeId, }) } @@ -240,7 +239,7 @@ class Cache implements ICache { * re-fetched, but we must do this not to straddle over the given memory * limit, even for a short time, as this may crash the application. * - * @fires EVENTS.IMAGE_CACHE_IMAGE_REMOVED + * @fires Events.IMAGE_CACHE_IMAGE_REMOVED * * @param numBytes - Number of bytes for the image/volume that is * going to be stored inside the cache @@ -293,7 +292,7 @@ class Cache implements ICache { for (const imageId of imageIdsToPurge) { this.removeImageLoadObject(imageId) - triggerEvent(eventTarget, EVENTS.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) + triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) bytesAvailable = this.getBytesAvailable() if (bytesAvailable >= numBytes) { @@ -310,7 +309,7 @@ class Cache implements ICache { for (const imageId of cachedImageIds) { this.removeImageLoadObject(imageId) - triggerEvent(eventTarget, EVENTS.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) + triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId }) bytesAvailable = this.getBytesAvailable() if (bytesAvailable >= numBytes) { @@ -334,8 +333,8 @@ class Cache implements ICache { * iterates over the imageCache and decache them one by one until the cache * size becomes less than the maximum allowed cache size * - * @fires EVENTS.IMAGE_CACHE_IMAGE_ADDED - * @fires EVENTS.CACHE_SIZE_EXCEEDED if the cache size exceeds the maximum + * @fires Events.IMAGE_CACHE_IMAGE_ADDED + * @fires Events.CACHE_SIZE_EXCEEDED if the cache size exceeds the maximum * * @param imageId - ImageId for the image * @param imageLoadObject - The object that is loading or loaded the image @@ -401,7 +400,7 @@ class Cache implements ICache { // check if there is enough space in unallocated + image Cache if (!this.isCacheable(image.sizeInBytes)) { - throw new Error(ERROR_CODES.CACHE_SIZE_EXCEEDED) + throw new Error(Events.CACHE_SIZE_EXCEEDED) } // if there is, decache if necessary @@ -416,7 +415,7 @@ class Cache implements ICache { image: cachedImage, } - triggerEvent(eventTarget, EVENTS.IMAGE_CACHE_IMAGE_ADDED, eventDetails) + triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_ADDED, eventDetails) cachedImage.sharedCacheKey = image.sharedCacheKey }) @@ -513,7 +512,7 @@ class Cache implements ICache { * iterates over the imageCache (not volumeCache) and decache them one by one * until the cache size becomes less than the maximum allowed cache size * - * @fires EVENTS.VOLUME_CACHE_VOLUME_ADDED + * @fires Events.VOLUME_CACHE_VOLUME_ADDED * * @param volumeId - volumeId of the volume * @param volumeLoadObject - The object that is loading or loaded the volume @@ -598,7 +597,7 @@ class Cache implements ICache { triggerEvent( eventTarget, - EVENTS.VOLUME_CACHE_VOLUME_ADDED, + Events.VOLUME_CACHE_VOLUME_ADDED, eventDetails ) }) @@ -657,7 +656,7 @@ class Cache implements ICache { * * It increases the cache size after removing the image. * - * @fires EVENTS.IMAGE_CACHE_IMAGE_REMOVED + * @fires Events.IMAGE_CACHE_IMAGE_REMOVED * * @param imageId - Image ID */ @@ -679,7 +678,7 @@ class Cache implements ICache { imageId, } - triggerEvent(eventTarget, EVENTS.IMAGE_CACHE_IMAGE_REMOVED, eventDetails) + triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, eventDetails) this._decacheImage(imageId) } @@ -688,7 +687,7 @@ class Cache implements ICache { * * It increases the cache size after removing the image. * - * @fires EVENTS.VOLUME_CACHE_VOLUME_REMOVED + * @fires Events.VOLUME_CACHE_VOLUME_REMOVED * * @param imageId - ImageId */ @@ -711,7 +710,7 @@ class Cache implements ICache { volumeId, } - triggerEvent(eventTarget, EVENTS.VOLUME_CACHE_VOLUME_REMOVED, eventDetails) + triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, eventDetails) this._decacheVolume(volumeId) } diff --git a/packages/cornerstone-render/src/configuration.ts b/packages/cornerstone-render/src/configuration.ts deleted file mode 100644 index e834d22708..0000000000 --- a/packages/cornerstone-render/src/configuration.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { LibraryConfiguration } from './types' - -const _configuration: LibraryConfiguration = { - autoRenderOnLoad: true, - autoRenderPercentage: 2, -} - -/** - * Configuration used by the library that impacts behavior. Supports updating - * one or more configuration value at a time. - */ -const configuration = { - /** - * Returns the Library Configuration's current values - * - * @example - * Retrieving a library configuration value: - * ``` - * const { autoRenderOnLoad } = configuration.get(); - * ``` - */ - get: (): LibraryConfiguration => { - return JSON.parse(JSON.stringify(_configuration)) - }, - /** - * Set one or more library configuration values - * - * @param newConfiguration - key/value pairs to update - * @example - * Update a single configuration field's value: - * ``` - * // => { autoRenderOnLoad: true, autoRenderPercentage: 2 } - * configuration.set({ autoRenderOnLoad: false }); - * // => { autoRenderOnLoad: false, autoRenderPercentage: 2 } - * ``` - * @example - * Update multiple configuration field values: - * ``` - * // => { autoRenderOnLoad: true, autoRenderPercentage: 2 } - * configuration.set({ autoRenderOnLoad: false, autoRenderPercentage: 10 }); - * // => { autoRenderOnLoad: false, autoRenderPercentage: 10 } - * ``` - */ - set: (newConfiguration: LibraryConfiguration): void => { - Object.assign(_configuration, newConfiguration) - }, -} - -export default configuration diff --git a/packages/cornerstone-render/src/constants/orientation.ts b/packages/cornerstone-render/src/constants/orientation.ts index c1fabbded4..2103034d26 100644 --- a/packages/cornerstone-render/src/constants/orientation.ts +++ b/packages/cornerstone-render/src/constants/orientation.ts @@ -23,7 +23,7 @@ import { Orientation, Point3 } from '../types' * renderingEngine.setViewports([ * { * viewportUID: 'a-viewport-uid', - * type: VIEWPORT_TYPE.ORTHOGRAPHIC, + * type: ViewportType.ORTHOGRAPHIC, * element: document.querySelector('div'), * defaultOptions: { * // 👇 Leveraging our reference constant diff --git a/packages/cornerstone-tools/src/enums/BlendModes.ts b/packages/cornerstone-render/src/enums/BlendModes.ts similarity index 100% rename from packages/cornerstone-tools/src/enums/BlendModes.ts rename to packages/cornerstone-render/src/enums/BlendModes.ts diff --git a/packages/cornerstone-render/src/enums/events.ts b/packages/cornerstone-render/src/enums/Events.ts similarity index 95% rename from packages/cornerstone-render/src/enums/events.ts rename to packages/cornerstone-render/src/enums/Events.ts index 1e850c4fd1..836195b1cc 100644 --- a/packages/cornerstone-render/src/enums/events.ts +++ b/packages/cornerstone-render/src/enums/Events.ts @@ -2,6 +2,21 @@ * Cornerstone Core events */ enum Events { + /** + * ERROR CODES + */ + + /** + * Error that is thrown when the ImageCache exceeds its max cache size. + * This can happen for both volumes and stack images. + */ + CACHE_SIZE_EXCEEDED = 'CACHE_SIZE_EXCEEDED', + /** + * Happens if an image (either a single image in stack viewport) or a slice + * of a volume fails to load by the image/volume loaders. + */ + IMAGE_LOAD_ERROR = 'IMAGE_LOAD_ERROR', + /** * Triggers on the HTML element when the viewport camera changes. * diff --git a/packages/cornerstone-render/src/enums/interpolationType.ts b/packages/cornerstone-render/src/enums/InterpolationType.ts similarity index 100% rename from packages/cornerstone-render/src/enums/interpolationType.ts rename to packages/cornerstone-render/src/enums/InterpolationType.ts diff --git a/packages/cornerstone-render/src/enums/requestType.ts b/packages/cornerstone-render/src/enums/RequestType.ts similarity index 100% rename from packages/cornerstone-render/src/enums/requestType.ts rename to packages/cornerstone-render/src/enums/RequestType.ts diff --git a/packages/cornerstone-render/src/enums/viewportType.ts b/packages/cornerstone-render/src/enums/ViewportType.ts similarity index 100% rename from packages/cornerstone-render/src/enums/viewportType.ts rename to packages/cornerstone-render/src/enums/ViewportType.ts diff --git a/packages/cornerstone-render/src/enums/errorCodes.ts b/packages/cornerstone-render/src/enums/errorCodes.ts deleted file mode 100644 index e8637128b9..0000000000 --- a/packages/cornerstone-render/src/enums/errorCodes.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Exceptions/Error Messages that the library raises. - */ -enum ERROR_CODES { - /** - * Error that is thrown when the ImageCache exceeds its max cache size. - * This can happen for both volumes and stack images. - */ - CACHE_SIZE_EXCEEDED = 'CACHE_SIZE_EXCEEDED', - /** - * Happens if an image (either a single image in stack viewport) or a slice - * of a volume fails to load by the image/volume loaders. - */ - IMAGE_LOAD_ERROR = 'IMAGE_LOAD_ERROR', -} - -export default ERROR_CODES diff --git a/packages/cornerstone-render/src/imageLoader.ts b/packages/cornerstone-render/src/imageLoader.ts index 6566831f00..967d9addbb 100644 --- a/packages/cornerstone-render/src/imageLoader.ts +++ b/packages/cornerstone-render/src/imageLoader.ts @@ -1,5 +1,5 @@ import cache from './cache/cache' -import EVENTS from './enums/events' +import Events from './enums/Events' import eventTarget from './eventTarget' import { triggerEvent } from './utilities' import { IImage, ImageLoaderFn, IImageLoadObject, EventTypes } from './types' @@ -26,7 +26,6 @@ let unknownImageLoader * @param Options - to be passed to the Image Loader * * @returns - An Object which can be used to act after an image is loaded or loading fails - * @category ImageLoader */ function loadImageFromImageLoader( imageId: string, @@ -47,14 +46,14 @@ function loadImageFromImageLoader( // Broadcast an image loaded event once the image is loaded imageLoadObject.promise.then( function (image) { - triggerEvent(eventTarget, EVENTS.IMAGE_LOADED, { image }) + triggerEvent(eventTarget, Events.IMAGE_LOADED, { image }) }, function (error) { const errorObject: EventTypes.ImageLoadedFailedEventDetail = { imageId, error, } - triggerEvent(eventTarget, EVENTS.IMAGE_LOAD_FAILED, errorObject) + triggerEvent(eventTarget, Events.IMAGE_LOAD_FAILED, errorObject) } ) return imageLoadObject @@ -72,7 +71,6 @@ function loadImageFromImageLoader( * @param options - Options to be passed to the Image Loader * * @returns An Object which can be used to act after an image is loaded or loading fails - * @category ImageLoader */ function loadImageFromCacheOrVolume( imageId: string, @@ -118,7 +116,6 @@ function loadImageFromCacheOrVolume( * @param options - Options to be passed to the Image Loader * * @returns An Object which can be used to act after an image is loaded or loading fails - * @category ImageLoader */ export function loadImage( imageId: string, @@ -140,7 +137,6 @@ export function loadImage( * @param options - Options to be passed to the Image Loader * * @returns Image Loader Object - * @category ImageLoader */ export function loadAndCacheImage( imageId: string, @@ -168,7 +164,6 @@ export function loadAndCacheImage( * * @param imageIds - list of imageIds * @param options - options for loader - * @category ImageLoader * */ export function loadAndCacheImages( @@ -194,7 +189,6 @@ export function loadAndCacheImages( * * @param imageId - A Cornerstone Image Object's imageId * - * @category ImageLoader */ export function cancelLoadImage(imageId: string): void { const filterFunction = ({ additionalDetails }) => { @@ -227,7 +221,6 @@ export function cancelLoadImage(imageId: string): void { * * @param imageIds - Array of Cornerstone Image Object's imageIds * - * @category ImageLoader */ export function cancelLoadImages(imageIds: Array): void { imageIds.forEach((imageId) => cancelLoadImage(imageId)) @@ -237,7 +230,6 @@ export function cancelLoadImages(imageIds: Array): void { * Removes all the ongoing image loads by calling the `cancel` method on each * imageLoadObject. If no `cancel` method is available, it will be ignored. * - * @category ImageLoader */ export function cancelLoadAll(): void { const requestPool = imageLoadPoolManager.getRequestPool() @@ -272,7 +264,6 @@ export function cancelLoadAll(): void { * * @param scheme - The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http') * @param imageLoader - A Cornerstone Image Loader function - * @category ImageLoader */ export function registerImageLoader( scheme: string, @@ -286,7 +277,6 @@ export function registerImageLoader( * @param imageLoader - A Cornerstone Image Loader * * @returns The previous Unknown Image Loader - * @category ImageLoader */ export function registerUnknownImageLoader( imageLoader: ImageLoaderFn @@ -299,7 +289,6 @@ export function registerUnknownImageLoader( * Removes all registered and unknown image loaders. This should be called * when the application is unmounted to prevent memory leaks. * - * @category ImageLoader */ export function unregisterAllImageLoaders(): void { Object.keys(imageLoaders).forEach( diff --git a/packages/cornerstone-render/src/index.ts b/packages/cornerstone-render/src/index.ts index b1f4b2192e..01607e5114 100644 --- a/packages/cornerstone-render/src/index.ts +++ b/packages/cornerstone-render/src/index.ts @@ -1,8 +1,8 @@ -import EVENTS from './enums/events' -import ERROR_CODES from './enums/errorCodes' -import REQUEST_TYPE from './enums/requestType' -import VIEWPORT_TYPE from './enums/viewportType' -import INTERPOLATION_TYPE from './enums/interpolationType' +import Events from './enums/Events' +import RequestType from './enums/RequestType' +import ViewportType from './enums/ViewportType' +import InterpolationType from './enums/InterpolationType' +import BlendModes from './enums/BlendModes' // import ORIENTATION from './constants/orientation' // @@ -21,136 +21,102 @@ import { getRenderingEngine, getRenderingEngines, } from './RenderingEngine/getRenderingEngine' -import cache, { Cache } from './cache' +import cache from './cache' import { ImageVolume } from './cache/classes/ImageVolume' -import { - loadImage, - loadAndCacheImage, - loadAndCacheImages, - registerImageLoader, - registerUnknownImageLoader, - unregisterAllImageLoaders, - cancelLoadAll, - cancelLoadImage, - cancelLoadImages, -} from './imageLoader' -import { RequestPoolManager } from './requestPool/requestPoolManager' import imageRetrievalPoolManager from './requestPool/imageRetrievalPoolManager' import imageLoadPoolManager from './requestPool/imageLoadPoolManager' import { setMaxSimultaneousRequests } from './requestPool/getMaxSimultaneousRequests' -import cpuColormaps from './RenderingEngine/helpers/cpuFallback/colors/colormaps' +import CPU_COLORMAPS from './RenderingEngine/helpers/cpuFallback/colors/colormaps' -import { - createAndCacheVolume, - createAndCacheDerivedVolume, - createLocalVolume, - registerVolumeLoader, - registerUnknownVolumeLoader, -} from './volumeLoader' import getEnabledElement, { getEnabledElementByUIDs } from './getEnabledElement' -import configuration from './configuration' import metaData from './metaData' import { init, getShouldUseCPURendering, isCornerstoneInitialized, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + setUseCPURendering, + resetUseCPURendering, } from './init' // Classes import Settings from './Settings' // Namespaces +import * as volumeLoader from './volumeLoader' +import * as imageLoader from './imageLoader' import * as Types from './types' -import * as Utilities from './utilities' +import * as utilities from './utilities' +import { registerImageLoader } from './imageLoader' // since it is used by CSWIL right now import triggerEvent from './utilities/triggerEvent' import { - setVolumesOnViewports, - addVolumesOnViewports, - getVolumeViewportsContainingSameVolumes, - getVolumeViewportsContainingVolumeUID, + setVolumesForViewports, + addVolumesToViewports, } from './RenderingEngine/helpers' -/** Cache getVolume, returns a volume from cache given the volumeUID {@link cache} */ -const getVolume = cache.getVolume -/** - * @packageDocumentation - * @module cornerstone-render - */ +const Enums = { + Events, + ViewportType, + InterpolationType, + RequestType, + BlendModes, +} + +const CONSTANTS = { + ORIENTATION, + CPU_COLORMAPS, +} + +export type { Types } + export { + init, + isCornerstoneInitialized, // enums - ERROR_CODES, - EVENTS, - VIEWPORT_TYPE, - // constants - ORIENTATION, - INTERPOLATION_TYPE, - REQUEST_TYPE, + Enums, + CONSTANTS, + Events as EVENTS, // CornerstoneWADOImageLoader uses this, Todo: remove it after fixing wado // - configuration, - Types, Settings, // Rendering Engine VolumeViewport, Viewport, StackViewport, RenderingEngine, - // Rendering Engine Helpers + ImageVolume, + // Helpers getRenderingEngine, getRenderingEngines, + getEnabledElement, + getEnabledElementByUIDs, createVolumeActor, getOrCreateCanvas, createVolumeMapper, - getVolumeViewportsContainingSameVolumes, - getVolumeViewportsContainingVolumeUID, - // - cache, - Cache, - getEnabledElement, - getEnabledElementByUIDs, renderToCanvas, - // + // cache + cache, + // event helpers eventTarget, triggerEvent, - // Image Loaders - loadImage, - loadAndCacheImage, - loadAndCacheImages, - cancelLoadAll, - cancelLoadImage, - cancelLoadImages, - registerImageLoader, - registerUnknownImageLoader, - unregisterAllImageLoaders, - // - createAndCacheVolume, // naming may not be perfect? async createAndCacheVolume? // createAndCacheVolume(id, options).then(volume => volume.load()) - createAndCacheDerivedVolume, // naming may not be perfect? async createAndCacheVolume? // createAndCacheVolume(id, options).then(volume => volume.load()) - createLocalVolume, - registerVolumeLoader, - registerUnknownVolumeLoader, - // - getVolume, + // Image Loader + imageLoader, + registerImageLoader, // Todo: remove this after CSWIL uses imageLoader now + // Volume Loader + volumeLoader, // metaData, // - Utilities, - setVolumesOnViewports, - addVolumesOnViewports, + utilities, + setVolumesForViewports, + addVolumesToViewports, // imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, - RequestPoolManager, setMaxSimultaneousRequests, - ImageVolume, // CPU Rendering - init, - isCornerstoneInitialized, getShouldUseCPURendering, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, - cpuColormaps, + setUseCPURendering, + resetUseCPURendering, } diff --git a/packages/cornerstone-render/src/init.ts b/packages/cornerstone-render/src/init.ts index 8cba53097c..2d5a1e7580 100644 --- a/packages/cornerstone-render/src/init.ts +++ b/packages/cornerstone-render/src/init.ts @@ -67,7 +67,7 @@ async function init(defaultConfiguration = {}): Promise { * @category Initialization * */ -function setUseCPURenderingOnlyForDebugOrTests(status: boolean): void { +function setUseCPURendering(status: boolean): void { useCPURendering = status csRenderInitialized = true } @@ -78,7 +78,7 @@ function setUseCPURenderingOnlyForDebugOrTests(status: boolean): void { * @category Initialization * */ -function resetCPURenderingOnlyForDebugOrTests() { +function resetUseCPURendering() { useCPURendering = !hasActiveWebGLContext() } @@ -107,6 +107,6 @@ export { init, getShouldUseCPURendering, isCornerstoneInitialized, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + setUseCPURendering, + resetUseCPURendering, } diff --git a/packages/cornerstone-render/src/requestPool/requestPoolManager.ts b/packages/cornerstone-render/src/requestPool/requestPoolManager.ts index a35b24330f..bb93f10a3c 100644 --- a/packages/cornerstone-render/src/requestPool/requestPoolManager.ts +++ b/packages/cornerstone-render/src/requestPool/requestPoolManager.ts @@ -1,4 +1,4 @@ -import REQUEST_TYPE from '../enums/requestType' +import RequestType from '../enums/RequestType' type AdditionalDetails = { imageId?: string @@ -7,12 +7,12 @@ type AdditionalDetails = { type RequestDetailsInterface = { requestFn: () => Promise - type: REQUEST_TYPE + type: RequestType additionalDetails: AdditionalDetails } type RequestPool = { - [name in REQUEST_TYPE]: { [key: number]: RequestDetailsInterface[] } + [name in RequestType]: { [key: number]: RequestDetailsInterface[] } } // TODO: Some of this stuff shouldn't be public but it's easier right now @@ -44,7 +44,7 @@ type RequestPool = { * ```javascript * * const priority = -5 - * const requestType = REQUEST_TYPE.Interaction + * const requestType = RequestType.Interaction * const additionalDetails = { imageId } * const options = { * targetBuffer: { @@ -141,7 +141,7 @@ class RequestPoolManager { */ public addRequest( requestFn: () => Promise, - type: REQUEST_TYPE, + type: RequestType, additionalDetails: Record, priority = 0 ): void { diff --git a/packages/cornerstone-render/src/types/IViewport.ts b/packages/cornerstone-render/src/types/IViewport.ts index 6a78565f21..2b548c3189 100644 --- a/packages/cornerstone-render/src/types/IViewport.ts +++ b/packages/cornerstone-render/src/types/IViewport.ts @@ -3,7 +3,7 @@ import Point2 from './Point2' import Point3 from './Point3' import ViewportInputOptions from './ViewportInputOptions' import { ActorEntry } from './IActor' -import VIEWPORT_TYPE from '../enums/viewportType' +import ViewportType from '../enums/ViewportType' /** * Viewport interface for cornerstone viewports @@ -14,7 +14,7 @@ interface IViewport { /** renderingEngineUID the viewport belongs to */ renderingEngineUID: string /** viewport type, can be ORTHOGRAPHIC or STACK for now */ - type: VIEWPORT_TYPE + type: ViewportType /** canvas associated to the viewport */ canvas: HTMLCanvasElement /** public DOM element associated to the viewport */ @@ -83,7 +83,7 @@ type PublicViewportInput = { /** unique id for the viewport in the renderingEngine */ viewportUID: string /** type of the viewport */ - type: VIEWPORT_TYPE + type: ViewportType /** options for the viewport */ defaultOptions: ViewportInputOptions } @@ -92,7 +92,7 @@ type InternalViewportInput = { element: HTMLElement canvas: HTMLCanvasElement viewportUID: string - type: VIEWPORT_TYPE + type: ViewportType defaultOptions: ViewportInputOptions } @@ -101,7 +101,7 @@ type ViewportInput = { element: HTMLElement canvas: HTMLCanvasElement renderingEngineUID: string - type: VIEWPORT_TYPE + type: ViewportType sx: number sy: number sWidth: number diff --git a/packages/cornerstone-render/src/types/LibraryConfiguration.ts b/packages/cornerstone-render/src/types/LibraryConfiguration.ts deleted file mode 100644 index 626c517f5b..0000000000 --- a/packages/cornerstone-render/src/types/LibraryConfiguration.ts +++ /dev/null @@ -1,14 +0,0 @@ -type LibraryConfiguration = { - /** - * When an image is successfully loaded, automatically render it's volume's - * rendering engine's volume viewports. (Tied to autoRenderPercentage) - */ - autoRenderOnLoad?: boolean - /** - * When autoRenderOnLoad is true, the percentage of frames that should be - * loaded before the automatic rendering behavior occurs. - */ - autoRenderPercentage?: number -} - -export default LibraryConfiguration diff --git a/packages/cornerstone-render/src/types/StackViewportProperties.ts b/packages/cornerstone-render/src/types/StackViewportProperties.ts index d2c36060ee..ec84efcf18 100644 --- a/packages/cornerstone-render/src/types/StackViewportProperties.ts +++ b/packages/cornerstone-render/src/types/StackViewportProperties.ts @@ -1,4 +1,4 @@ -import INTERPOLATION_TYPE from '../enums/interpolationType' +import InterpolationType from '../enums/InterpolationType' import { VOIRange } from './voi' /** @@ -10,7 +10,7 @@ type StackViewportProperties = { /** invert flag - whether the image is inverted */ invert?: boolean /** interpolation type - linear or nearest neighbor */ - interpolationType?: INTERPOLATION_TYPE + interpolationType?: InterpolationType /** image rotation */ rotation?: number /** flip horizontal flag */ diff --git a/packages/cornerstone-render/src/types/index.ts b/packages/cornerstone-render/src/types/index.ts index 5942fc14fc..c3ee333664 100644 --- a/packages/cornerstone-render/src/types/index.ts +++ b/packages/cornerstone-render/src/types/index.ts @@ -14,7 +14,6 @@ import type CustomEventType from './CustomEventType' import type { IViewport, PublicViewportInput } from './IViewport' import type { VolumeActor, ActorEntry } from './IActor' import type { IImageLoadObject, IVolumeLoadObject } from './ILoadObject' -import type LibraryConfiguration from './LibraryConfiguration' import type Metadata from './Metadata' import type Orientation from './Orientation' import type Point2 from './Point2' @@ -83,7 +82,6 @@ export type { IVolumeInput, VolumeInputCallback, // - LibraryConfiguration, Metadata, Orientation, Point2, diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingSameVolumes.ts b/packages/cornerstone-render/src/utilities/getVolumeViewportsContainingSameVolumes.ts similarity index 88% rename from packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingSameVolumes.ts rename to packages/cornerstone-render/src/utilities/getVolumeViewportsContainingSameVolumes.ts index c9bde31b0b..4d88b915bc 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingSameVolumes.ts +++ b/packages/cornerstone-render/src/utilities/getVolumeViewportsContainingSameVolumes.ts @@ -1,5 +1,8 @@ -import VolumeViewport from '../VolumeViewport' -import { getRenderingEngines, getRenderingEngine } from '../getRenderingEngine' +import { IVolumeViewport } from '../types' +import { + getRenderingEngines, + getRenderingEngine, +} from '../RenderingEngine/getRenderingEngine' /** * Returns the viewports containing the same volume actors (all actors) the same @@ -14,9 +17,9 @@ import { getRenderingEngines, getRenderingEngine } from '../getRenderingEngine' * @returns array of viewports that have the same volume actor as the target viewport */ function getVolumeViewportsContainingSameVolumes( - targetViewport: VolumeViewport, + targetViewport: IVolumeViewport, renderingEngineUID?: string -): Array { +): Array { // If rendering engine is not provided, use all rendering engines let renderingEngines if (renderingEngineUID) { diff --git a/packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingVolumeUID.ts b/packages/cornerstone-render/src/utilities/getVolumeViewportsContainingVolumeUID.ts similarity index 85% rename from packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingVolumeUID.ts rename to packages/cornerstone-render/src/utilities/getVolumeViewportsContainingVolumeUID.ts index b361f7b397..b030c668ba 100644 --- a/packages/cornerstone-render/src/RenderingEngine/helpers/getVolumeViewportsContainingVolumeUID.ts +++ b/packages/cornerstone-render/src/utilities/getVolumeViewportsContainingVolumeUID.ts @@ -1,5 +1,8 @@ -import VolumeViewport from '../VolumeViewport' -import { getRenderingEngines, getRenderingEngine } from '../getRenderingEngine' +import { IVolumeViewport } from '../types' +import { + getRenderingEngines, + getRenderingEngine, +} from '../RenderingEngine/getRenderingEngine' /** * Similar to {@link getVolumeViewportsContainingSameVolumes}, but uses the volumeUID @@ -10,7 +13,7 @@ import { getRenderingEngines, getRenderingEngine } from '../getRenderingEngine' function getVolumeViewportsContainingVolumeUID( uid: string, renderingEngineUID?: string -): Array { +): Array { // If rendering engine is not provided, use all rendering engines let renderingEngines if (renderingEngineUID) { diff --git a/packages/cornerstone-render/src/utilities/index.ts b/packages/cornerstone-render/src/utilities/index.ts index bc32b08b15..e858dc09a4 100644 --- a/packages/cornerstone-render/src/utilities/index.ts +++ b/packages/cornerstone-render/src/utilities/index.ts @@ -15,6 +15,8 @@ import getSpacingInNormalDirection from './getSpacingInNormalDirection' import getTargetVolumeAndSpacingInNormalDir from './getTargetVolumeAndSpacingInNormalDir' import getVolumeActorCorners from './getVolumeActorCorners' import indexWithinDimensions from './indexWithinDimensions' +import getVolumeViewportsContainingSameVolumes from './getVolumeViewportsContainingSameVolumes' +import getVolumeViewportsContainingVolumeUID from './getVolumeViewportsContainingVolumeUID' // name spaces import * as planar from './planar' @@ -42,4 +44,6 @@ export { getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, + getVolumeViewportsContainingSameVolumes, + getVolumeViewportsContainingVolumeUID, } diff --git a/packages/cornerstone-render/src/utilities/testUtils.js b/packages/cornerstone-render/src/utilities/testUtils.js index 9494a32206..f48401925b 100644 --- a/packages/cornerstone-render/src/utilities/testUtils.js +++ b/packages/cornerstone-render/src/utilities/testUtils.js @@ -53,11 +53,9 @@ function compareImages(imageDataURL, baseline, outputName) { // and download the difference image // Todo: this should be a configurable threshold if (mismatch > 1) { - const diff = data.getImageDataUrl() console.log('mismatch of ' + mismatch + '%') - console.log('diff image is') + const diff = data.getImageDataUrl() console.log(diff) - // Todo: we should store the diff image somewhere reject(new Error(`mismatch between images for ${outputName}`)) diff --git a/packages/cornerstone-render/src/utilities/testUtilsImageLoader.js b/packages/cornerstone-render/src/utilities/testUtilsImageLoader.js index b5cee976d1..96b92dd2cd 100644 --- a/packages/cornerstone-render/src/utilities/testUtilsImageLoader.js +++ b/packages/cornerstone-render/src/utilities/testUtilsImageLoader.js @@ -14,7 +14,7 @@ import { * * @example * ```javascript - * cornerstone.registerImageLoader('fakeImageLoader', imageLoader) + * imageLoader.registerImageLoader('fakeImageLoader', imageLoader) * ``` * * then you can use imageId like: 'fakeImageLoader: myImage_64_64_10_20_1_1_0' diff --git a/packages/cornerstone-render/src/utilities/triggerEvent.ts b/packages/cornerstone-render/src/utilities/triggerEvent.ts index 01388ca080..eecee221c3 100644 --- a/packages/cornerstone-render/src/utilities/triggerEvent.ts +++ b/packages/cornerstone-render/src/utilities/triggerEvent.ts @@ -6,7 +6,7 @@ import eventTarget from '../eventTarget' * @example * * ```javascript - * triggerEvent(element, EVENTS.IMAGE_RENDERED, { element }) + * triggerEvent(element, Events.IMAGE_RENDERED, { element }) * ``` * or it can trigger event on the eventTarget itself * diff --git a/packages/cornerstone-render/src/volumeLoader.ts b/packages/cornerstone-render/src/volumeLoader.ts index f9eb2d2375..639265407b 100644 --- a/packages/cornerstone-render/src/volumeLoader.ts +++ b/packages/cornerstone-render/src/volumeLoader.ts @@ -3,10 +3,9 @@ import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray' import cloneDeep from 'lodash.clonedeep' import { ImageVolume } from './cache/classes/ImageVolume' -import ERROR_CODES from './enums/errorCodes' import * as Types from './types' import cache from './cache/cache' -import EVENTS from './enums/events' +import Events from './enums/Events' import eventTarget from './eventTarget' import triggerEvent from './utilities/triggerEvent' import { uuidv4 } from './utilities' @@ -105,7 +104,7 @@ function loadVolumeFromVolumeLoader( // Broadcast a volume loaded event once the image is loaded volumeLoadObject.promise.then( function (volume) { - triggerEvent(eventTarget, EVENTS.VOLUME_LOADED, { volume }) + triggerEvent(eventTarget, Events.VOLUME_LOADED, { volume }) }, function (error) { const errorObject: EventTypes.VolumeLoadedFailedEventDetail = { @@ -113,7 +112,7 @@ function loadVolumeFromVolumeLoader( error, } - triggerEvent(eventTarget, EVENTS.VOLUME_LOADED_FAILED, errorObject) + triggerEvent(eventTarget, Events.VOLUME_LOADED_FAILED, errorObject) } ) @@ -128,7 +127,6 @@ function loadVolumeFromVolumeLoader( * @param options - Options to be passed to the Volume Loader * * @returns An Object which can be used to act after an image is loaded or loading fails - * @category VolumeLoader */ export function loadVolume( volumeId: string, @@ -160,7 +158,6 @@ export function loadVolume( * @param options - Options to be passed to the Volume Loader * * @returns Volume Loader Object - * @category VolumeLoader */ export async function createAndCacheVolume( volumeId: string, @@ -200,7 +197,6 @@ export async function createAndCacheVolume( * @param referencedVolumeUID - the volumeUID from which the new volume will get its metadata * @param options - DerivedVolumeOptions {uid: derivedVolumeUID, targetBuffer: { type: FLOAT32Array | Uint8Array}, scalarData: if provided} * - * @category VolumeLoader * @returns ImageVolume */ export function createAndCacheDerivedVolume( @@ -248,7 +244,7 @@ export function createAndCacheDerivedVolume( // check if there is enough space in unallocated + image Cache const isCacheable = cache.isCacheable(numBytes) if (!isCacheable) { - throw new Error(ERROR_CODES.CACHE_SIZE_EXCEEDED) + throw new Error(Events.CACHE_SIZE_EXCEEDED) } const volumeScalarData = new TypedArray(scalarLength) @@ -296,7 +292,6 @@ export function createAndCacheDerivedVolume( * UID exists in the cache it returns it immediately. * @param options - { scalarData, metadata, dimensions, spacing, origin, direction } * @param uid - UID of the generated volume - * @category VolumeLoader * * @returns ImageVolume */ @@ -335,7 +330,7 @@ export function createLocalVolume( // check if there is enough space in unallocated + image Cache const isCacheable = cache.isCacheable(numBytes) if (!isCacheable) { - throw new Error(ERROR_CODES.CACHE_SIZE_EXCEEDED) + throw new Error(Events.CACHE_SIZE_EXCEEDED) } const scalarArray = vtkDataArray.newInstance({ @@ -381,7 +376,6 @@ export function createLocalVolume( * * @param scheme - The scheme to use for this volume loader (e.g. 'dicomweb', 'wadouri', 'http') * @param volumeLoader - A Cornerstone Volume Loader function - * @category VolumeLoader */ export function registerVolumeLoader( scheme: string, @@ -396,7 +390,6 @@ export function registerVolumeLoader( * @param volumeLoader - A Cornerstone Volume Loader * * @returns The previous Unknown Volume Loader - * @category VolumeLoader */ export function registerUnknownVolumeLoader( volumeLoader: Types.VolumeLoaderFn diff --git a/packages/cornerstone-render/test/RenderingEngineAPI_test.js b/packages/cornerstone-render/test/RenderingEngineAPI_test.js index e04e650f25..5a5d57bba1 100644 --- a/packages/cornerstone-render/test/RenderingEngineAPI_test.js +++ b/packages/cornerstone-render/test/RenderingEngineAPI_test.js @@ -1,10 +1,12 @@ import * as cornerstone3D from '../src/index' // import { User } from ... doesn't work right now since we don't have named exports set up -const { RenderingEngine, cache, Utilities, VIEWPORT_TYPE, ORIENTATION } = - cornerstone3D +const { RenderingEngine, cache, utilities, Enums, CONSTANTS } = cornerstone3D -const renderingEngineUID = Utilities.uuidv4() +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + +const renderingEngineUID = utilities.uuidv4() const axialViewportUID = 'AXIAL_VIEWPORT' const sagittalViewportUID = 'SAGITTAL_VIEWPORT' @@ -12,7 +14,7 @@ const customOrientationViewportUID = 'OFF_AXIS_VIEWPORT' describe('RenderingEngineAPI -- ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('RenderingEngine API:', function () { @@ -37,7 +39,7 @@ describe('RenderingEngineAPI -- ', () => { this.renderingEngine.setViewports([ { viewportUID: axialViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementAxial, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -45,7 +47,7 @@ describe('RenderingEngineAPI -- ', () => { }, { viewportUID: sagittalViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementSagittal, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -53,7 +55,7 @@ describe('RenderingEngineAPI -- ', () => { }, { viewportUID: customOrientationViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementCustom, defaultOptions: { orientation: { sliceNormal: [0, 0, 1], viewUp: [0, 1, 0] }, @@ -152,7 +154,7 @@ describe('RenderingEngineAPI -- ', () => { const viewportInputEntries = [ { viewportUID: axialViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementAxial, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -160,7 +162,7 @@ describe('RenderingEngineAPI -- ', () => { }, { viewportUID: sagittalViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementSagittal, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -168,7 +170,7 @@ describe('RenderingEngineAPI -- ', () => { }, { viewportUID: customOrientationViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementCustomOrientation, defaultOptions: { orientation: { sliceNormal: [0, 0, 1], viewUp: [0, 1, 0] }, @@ -189,7 +191,7 @@ describe('RenderingEngineAPI -- ', () => { it('should not enable element without an element', function () { const entry = { viewportUID: axialViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, defaultOptions: { orientation: ORIENTATION.AXIAL, }, @@ -204,7 +206,7 @@ describe('RenderingEngineAPI -- ', () => { it('should successfully use disable element API', function () { const entry = { viewportUID: axialViewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.elementAxial, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -223,7 +225,7 @@ describe('RenderingEngineAPI -- ', () => { it('should successfully get StackViewports', function () { const entry = { viewportUID: axialViewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this.elementAxial, defaultOptions: { orientation: ORIENTATION.AXIAL, diff --git a/packages/cornerstone-render/test/cache_test.js b/packages/cornerstone-render/test/cache_test.js index 3f42fc0a0e..0a1ee42d5f 100644 --- a/packages/cornerstone-render/test/cache_test.js +++ b/packages/cornerstone-render/test/cache_test.js @@ -3,7 +3,7 @@ import * as cornerstone from '@precisionmetrics/cornerstone-render' import { createFloat32SharedArray } from '../src/utilities' // import { User } from ... doesn't work right now since we don't have named exports set up -const { cache, ERROR_CODES } = cornerstone +const { cache, Enums } = cornerstone const { StreamingImageVolume } = cornerstoneStreamingImageVolumeLoader describe('Cache', () => { @@ -326,7 +326,7 @@ describe('Cache', () => { await expectAsync( cache.putImageLoadObject(image1.imageId, imageLoadObject1) - ).toBeRejectedWithError(ERROR_CODES.CACHE_SIZE_EXCEEDED) + ).toBeRejectedWithError(Enums.Events.CACHE_SIZE_EXCEEDED) expect(cache.getImageLoadObject(image1.imageId)).not.toBeDefined() @@ -655,7 +655,7 @@ describe('Cache', () => { await expectAsync( cache.putImageLoadObject(volume2.uid, volumeLoadObject2) - ).toBeRejectedWithError(ERROR_CODES.CACHE_SIZE_EXCEEDED) + ).toBeRejectedWithError(Enums.Events.CACHE_SIZE_EXCEEDED) expect(cache.getVolumeLoadObject(volume2.uid)).not.toBeDefined() diff --git a/packages/cornerstone-render/test/imageLoader_test.js b/packages/cornerstone-render/test/imageLoader_test.js index 547c51afbf..3b595701ce 100644 --- a/packages/cornerstone-render/test/imageLoader_test.js +++ b/packages/cornerstone-render/test/imageLoader_test.js @@ -1,17 +1,10 @@ import * as cornerstone3D from '../src/index' -const { - registerImageLoader, - registerUnknownImageLoader, - unregisterAllImageLoaders, - loadImage, - loadAndCacheImage, - cache, -} = cornerstone3D +const { imageLoader, cache } = cornerstone3D describe('imageLoader -- ', function () { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -75,26 +68,38 @@ describe('imageLoader -- ', function () { cache.purgeCache() }) it('allows registration of new image loader', async function () { - registerImageLoader(this.exampleScheme1, this.exampleImageLoader1) - registerImageLoader(this.exampleScheme2, this.exampleImageLoader2) + imageLoader.registerImageLoader( + this.exampleScheme1, + this.exampleImageLoader1 + ) + imageLoader.registerImageLoader( + this.exampleScheme2, + this.exampleImageLoader2 + ) - await loadAndCacheImage(this.exampleScheme1ImageId, this.options) + await imageLoader.loadAndCacheImage( + this.exampleScheme1ImageId, + this.options + ) - await loadAndCacheImage(this.exampleScheme2ImageId, this.options) + await imageLoader.loadAndCacheImage( + this.exampleScheme2ImageId, + this.options + ) expect(cache.getImageLoadObject(this.exampleScheme1ImageId)).toBeDefined() expect(cache.getImageLoadObject(this.exampleScheme2ImageId)).toBeDefined() }) it('allows registration of unknown image loader', function () { - let oldUnknownImageLoader = registerUnknownImageLoader( + let oldUnknownImageLoader = imageLoader.registerUnknownImageLoader( this.exampleImageLoader1 ) expect(oldUnknownImageLoader).not.toBeDefined() // Check that it returns the old value for the unknown image loader - oldUnknownImageLoader = registerUnknownImageLoader( + oldUnknownImageLoader = imageLoader.registerUnknownImageLoader( this.exampleImageLoader1 ) @@ -108,8 +113,11 @@ describe('imageLoader -- ', function () { }) it('allows loading with storage in image cache (loadImage)', async function () { - registerImageLoader(this.exampleScheme1, this.exampleImageLoader1) - const imageLoadObject = loadAndCacheImage( + imageLoader.registerImageLoader( + this.exampleScheme1, + this.exampleImageLoader1 + ) + const imageLoadObject = imageLoader.loadAndCacheImage( this.exampleScheme1ImageId, this.options ) @@ -117,9 +125,12 @@ describe('imageLoader -- ', function () { await expectAsync(imageLoadObject).toBeResolvedTo(this.image1) }) - it('allows loading without storage in image cache (loadAndCacheImage)', async function () { - registerImageLoader(this.exampleScheme2, this.exampleImageLoader2) - const imageLoadObject = loadImage( + it('allows loading without storage in image cache (imageLoader.loadAndCacheImage)', async function () { + imageLoader.registerImageLoader( + this.exampleScheme2, + this.exampleImageLoader2 + ) + const imageLoadObject = imageLoader.loadImage( this.exampleScheme2ImageId, this.options ) @@ -128,9 +139,12 @@ describe('imageLoader -- ', function () { }) it('falls back to the unknownImageLoader if no appropriate scheme is present', async function () { - registerImageLoader(this.exampleScheme1, this.exampleImageLoader1) - registerUnknownImageLoader(this.exampleImageLoader2) - const imageLoadObject = loadAndCacheImage( + imageLoader.registerImageLoader( + this.exampleScheme1, + this.exampleImageLoader1 + ) + imageLoader.registerUnknownImageLoader(this.exampleImageLoader2) + const imageLoadObject = imageLoader.loadAndCacheImage( this.exampleScheme2ImageId, this.options ) @@ -144,9 +158,12 @@ describe('imageLoader -- ', function () { cache.purgeCache() }) - it('allows loading with storage in image cache (loadAndCacheImage)', async function () { - registerImageLoader(this.exampleScheme1, this.exampleImageLoader1) - const imageLoadObject = loadAndCacheImage( + it('allows loading with storage in image cache (imageLoader.loadAndCacheImage)', async function () { + imageLoader.registerImageLoader( + this.exampleScheme1, + this.exampleImageLoader1 + ) + const imageLoadObject = imageLoader.loadAndCacheImage( this.exampleScheme1ImageId, this.options ) @@ -156,7 +173,7 @@ describe('imageLoader -- ', function () { }) afterEach(() => { - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() cache.purgeCache() }) }) diff --git a/packages/cornerstone-render/test/stackViewport_cpu_render_test.js b/packages/cornerstone-render/test/stackViewport_cpu_render_test.js index f511c04816..d36dcdb235 100644 --- a/packages/cornerstone-render/test/stackViewport_cpu_render_test.js +++ b/packages/cornerstone-render/test/stackViewport_cpu_render_test.js @@ -15,21 +15,21 @@ import * as cpu_imageURI_256_256_100_100_1_1_0_hotIron from './groundTruth/cpu_i const { cache, RenderingEngine, - VIEWPORT_TYPE, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + utilities, + imageLoader, metaData, - EVENTS, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, - cpuColormaps, + Enums, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { CPU_COLORMAPS } = CONSTANTS const { fakeImageLoader, fakeMetaDataProvider, compareImages } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' const AXIAL = 'AXIAL' @@ -44,7 +44,7 @@ function createViewport(renderingEngine, orientation, width, height) { renderingEngine.setViewports([ { viewportUID: viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -56,11 +56,11 @@ function createViewport(renderingEngine, orientation, width, height) { describe('StackViewport CPU -- ', () => { beforeEach(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterEach(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) describe('Basic Rendering --- ', function () { @@ -69,7 +69,7 @@ describe('StackViewport CPU -- ', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -77,7 +77,7 @@ describe('StackViewport CPU -- ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -93,7 +93,7 @@ describe('StackViewport CPU -- ', () => { const imageId = 'fakeImageLoader:imageURI_64_64_20_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -119,7 +119,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -145,7 +145,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -158,7 +158,7 @@ describe('StackViewport CPU -- ', () => { try { vp.setStack([imageId], 0) - // vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }); + // vp.setProperties({ interpolationType: InterpolationType.NEAREST }); vp.render() } catch (e) { done.fail(e) @@ -177,7 +177,7 @@ describe('StackViewport CPU -- ', () => { this.renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -186,7 +186,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -215,7 +215,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -244,7 +244,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -270,7 +270,7 @@ describe('StackViewport CPU -- ', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -278,7 +278,7 @@ describe('StackViewport CPU -- ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -294,7 +294,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -326,7 +326,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -353,7 +353,7 @@ describe('StackViewport CPU -- ', () => { const imageId2 = 'fakeImageLoader:imageURI_256_256_50_10_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -377,7 +377,7 @@ describe('StackViewport CPU -- ', () => { const imageId1 = 'fakeImageLoader:imageURI_64_64_20_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -403,7 +403,7 @@ describe('StackViewport CPU -- ', () => { const imageId1 = 'fakeImageLoader:imageURI_64_64_20_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -429,7 +429,7 @@ describe('StackViewport CPU -- ', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -437,7 +437,7 @@ describe('StackViewport CPU -- ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -453,7 +453,7 @@ describe('StackViewport CPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -466,7 +466,7 @@ describe('StackViewport CPU -- ', () => { try { vp.setStack([imageId], 0).then(() => { - vp.setColormap(cpuColormaps.hotIron) + vp.setColormap(CPU_COLORMAPS.hotIron) vp.render() }) } catch (e) { diff --git a/packages/cornerstone-render/test/stackViewport_gpu_render_test.js b/packages/cornerstone-render/test/stackViewport_gpu_render_test.js index d2a55b6703..81fbd39a62 100644 --- a/packages/cornerstone-render/test/stackViewport_gpu_render_test.js +++ b/packages/cornerstone-render/test/stackViewport_gpu_render_test.js @@ -22,27 +22,19 @@ import * as calibrated_1_5_imageURI_11_11_4_1_1_1_0_1 from './groundTruth/calibr // import { User } from ... doesn't work right now since we don't have named exports set up const { - Utilities: { calibrateImageSpacing }, + utilities: { calibrateImageSpacing }, } = csTools3d -const { - cache, - RenderingEngine, - VIEWPORT_TYPE, - INTERPOLATION_TYPE, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, - metaData, - EVENTS, -} = cornerstone3D - -const { calibratedPixelSpacingMetadataProvider } = Utilities +const { cache, RenderingEngine, utilities, imageLoader, metaData, Enums } = + cornerstone3D + +const { Events, ViewportType, InterpolationType } = Enums +const { calibratedPixelSpacingMetadataProvider } = utilities const { fakeImageLoader, fakeMetaDataProvider, compareImages } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -58,7 +50,7 @@ function createViewport(renderingEngine, orientation, width, height) { renderingEngine.setViewports([ { viewportUID: viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -71,7 +63,7 @@ function createViewport(renderingEngine, orientation, width, height) { describe('renderingCore -- Stack', () => { beforeAll(() => { // initialize cornerstone - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Stack Viewport Nearest Neighbor Interpolation --- ', function () { beforeEach(function () { @@ -79,7 +71,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -87,7 +79,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -102,7 +94,7 @@ describe('renderingCore -- Stack', () => { const imageId = 'fakeImageLoader:imageURI_64_64_20_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -114,7 +106,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -130,7 +122,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -142,7 +134,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -158,7 +150,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -171,7 +163,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -191,7 +183,7 @@ describe('renderingCore -- Stack', () => { this.renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -200,7 +192,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -213,7 +205,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -231,7 +223,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -244,7 +236,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId1, imageId2, imageId3], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -262,7 +254,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -275,7 +267,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId1, imageId2, imageId3], 2).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -291,7 +283,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -306,7 +298,7 @@ describe('renderingCore -- Stack', () => { vp.setStack([imageId], 0).then(() => { vp.setProperties({ voiRange: { lower: -160, upper: 240 }, - interpolationType: INTERPOLATION_TYPE.NEAREST, + interpolationType: InterpolationType.NEAREST, }) }) @@ -325,7 +317,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -338,7 +330,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId1, imageId2], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -355,7 +347,7 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -368,7 +360,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId1, imageId2], 1).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -382,7 +374,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -390,7 +382,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -404,7 +396,7 @@ describe('renderingCore -- Stack', () => { const imageId1 = 'fakeImageLoader:imageURI_11_11_4_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -431,7 +423,7 @@ describe('renderingCore -- Stack', () => { const imageId2 = 'fakeImageLoader:imageURI_256_256_50_10_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -456,7 +448,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -464,7 +456,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -479,7 +471,7 @@ describe('renderingCore -- Stack', () => { // color image generation with 10 strips of different colors const imageId1 = 'fakeImageLoader:imageURI_100_100_0_10_1_1_1' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -505,7 +497,7 @@ describe('renderingCore -- Stack', () => { // color image generation with 10 strips of different colors const imageId1 = 'fakeImageLoader:imageURI_100_100_0_10_1_1_1' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -517,7 +509,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId1], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { @@ -532,7 +524,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) metaData.addProvider( calibratedPixelSpacingMetadataProvider.get.bind( @@ -546,7 +538,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -561,7 +553,7 @@ describe('renderingCore -- Stack', () => { const imageId1 = 'fakeImageLoader:imageURI_11_11_4_1_1_1_0_1' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { expect(vp.scaling.PET).toEqual({ suvbwToSuvlbm: 1, suvbwToSuvbsa: 1, @@ -589,11 +581,11 @@ describe('renderingCore -- Stack', () => { vp.calibrateSpacing(imageId1) element.removeEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, imageRenderedCallback ) element.addEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, secondImageRenderedCallbackAfterCalibration ) } @@ -602,9 +594,9 @@ describe('renderingCore -- Stack', () => { done() } - element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback) + element.addEventListener(Events.IMAGE_RENDERED, imageRenderedCallback) - element.addEventListener(EVENTS.IMAGE_SPACING_CALIBRATED, (evt) => { + element.addEventListener(Events.IMAGE_SPACING_CALIBRATED, (evt) => { const { rowScale, columnScale } = evt.detail expect(rowScale).toBe(2) expect(columnScale).toBe(2) @@ -625,7 +617,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) metaData.addProvider( calibratedPixelSpacingMetadataProvider.get.bind( @@ -640,7 +632,7 @@ describe('renderingCore -- Stack', () => { this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -657,13 +649,13 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) const subscribeToImageRendered = () => { - element.addEventListener(EVENTS.IMAGE_RENDERED, (evt) => { + element.addEventListener(Events.IMAGE_RENDERED, (evt) => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') let props = vp.getProperties() expect(props.rotation).toBe(90) - expect(props.interpolationType).toBe(INTERPOLATION_TYPE.NEAREST) + expect(props.interpolationType).toBe(InterpolationType.NEAREST) expect(props.invert).toBe(true) compareImages( @@ -678,7 +670,7 @@ describe('renderingCore -- Stack', () => { vp.setStack([imageId1], 0).then(() => { subscribeToImageRendered() vp.setProperties({ - interpolationType: INTERPOLATION_TYPE.NEAREST, + interpolationType: InterpolationType.NEAREST, voiRange: { lower: -260, upper: 140 }, invert: true, rotation: 90, @@ -701,13 +693,13 @@ describe('renderingCore -- Stack', () => { const firstImageRenderedCallback = () => { element.removeEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, firstImageRenderedCallback ) let props = vp.getProperties() expect(props.rotation).toBe(90) - expect(props.interpolationType).toBe(INTERPOLATION_TYPE.NEAREST) + expect(props.interpolationType).toBe(InterpolationType.NEAREST) expect(props.invert).toBe(true) setTimeout(() => { @@ -716,7 +708,7 @@ describe('renderingCore -- Stack', () => { }) element.addEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, secondImageRenderedCallback ) } @@ -725,7 +717,7 @@ describe('renderingCore -- Stack', () => { console.log('resetProperties callback') const props = vp.getProperties() expect(props.rotation).toBe(0) - expect(props.interpolationType).toBe(INTERPOLATION_TYPE.LINEAR) + expect(props.interpolationType).toBe(InterpolationType.LINEAR) expect(props.invert).toBe(false) done() @@ -733,14 +725,14 @@ describe('renderingCore -- Stack', () => { } element.addEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, firstImageRenderedCallback ) try { vp.setStack([imageId1], 0).then(() => { vp.setProperties({ - interpolationType: INTERPOLATION_TYPE.NEAREST, + interpolationType: InterpolationType.NEAREST, voiRange: { lower: -260, upper: 140 }, invert: true, rotation: 90, @@ -759,7 +751,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) metaData.addProvider( calibratedPixelSpacingMetadataProvider.get.bind( @@ -773,7 +765,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -790,8 +782,8 @@ describe('renderingCore -- Stack', () => { const vp = this.renderingEngine.getViewport(viewportUID) const firstCallback = () => { - element.removeEventListener(EVENTS.IMAGE_RENDERED, firstCallback) - element.addEventListener(EVENTS.IMAGE_RENDERED, secondCallback) + element.removeEventListener(Events.IMAGE_RENDERED, firstCallback) + element.addEventListener(Events.IMAGE_RENDERED, secondCallback) const imageId = this.renderingEngine .getViewport(viewportUID) .getCurrentImageId() @@ -808,7 +800,7 @@ describe('renderingCore -- Stack', () => { ).then(done, done.fail) } - element.addEventListener(EVENTS.IMAGE_RENDERED, firstCallback) + element.addEventListener(Events.IMAGE_RENDERED, firstCallback) try { vp.setStack([imageId1], 0) @@ -825,7 +817,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) metaData.addProvider( calibratedPixelSpacingMetadataProvider.get.bind( @@ -839,7 +831,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -859,7 +851,7 @@ describe('renderingCore -- Stack', () => { const imageRenderedCallback = () => { element.removeEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, imageRenderedCallback ) @@ -870,7 +862,7 @@ describe('renderingCore -- Stack', () => { calibrateImageSpacing(imageId, this.renderingEngine, 1, 5) element.addEventListener( - EVENTS.IMAGE_RENDERED, + Events.IMAGE_RENDERED, secondImageRenderedCallback ) } @@ -879,9 +871,9 @@ describe('renderingCore -- Stack', () => { done() } - element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback) + element.addEventListener(Events.IMAGE_RENDERED, imageRenderedCallback) - element.addEventListener(EVENTS.IMAGE_SPACING_CALIBRATED, (evt) => { + element.addEventListener(Events.IMAGE_SPACING_CALIBRATED, (evt) => { expect(evt.detail).toBeDefined() expect(evt.detail.rowScale).toBe(1) expect(evt.detail.columnScale).toBe(5) @@ -903,7 +895,7 @@ describe('renderingCore -- Stack', () => { this.DOMElements = [] this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -911,7 +903,7 @@ describe('renderingCore -- Stack', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() this.DOMElements.forEach((el) => { if (el.parentNode) { el.parentNode.removeChild(el) @@ -927,7 +919,7 @@ describe('renderingCore -- Stack', () => { const imageId = 'fakeImageLoader:imageURI_64_64_5_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -940,7 +932,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { vp.setProperties({ - interpolationType: INTERPOLATION_TYPE.NEAREST, + interpolationType: InterpolationType.NEAREST, flipHorizontal: true, }) @@ -959,7 +951,7 @@ describe('renderingCore -- Stack', () => { const imageId = 'fakeImageLoader:imageURI_64_64_5_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -972,7 +964,7 @@ describe('renderingCore -- Stack', () => { try { vp.setStack([imageId], 0).then(() => { vp.setProperties({ - interpolationType: INTERPOLATION_TYPE.NEAREST, + interpolationType: InterpolationType.NEAREST, rotation: 90, flipHorizontal: true, }) diff --git a/packages/cornerstone-render/test/volumeViewport_gpu_render_test.js b/packages/cornerstone-render/test/volumeViewport_gpu_render_test.js index c5e1e2b2ee..ec8ecdfaba 100644 --- a/packages/cornerstone-render/test/volumeViewport_gpu_render_test.js +++ b/packages/cornerstone-render/test/volumeViewport_gpu_render_test.js @@ -16,22 +16,25 @@ import * as volumeURI_100_100_10_1_1_1_1_color_coronal_linear from './groundTrut const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + imageLoader, metaData, - EVENTS, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, - getVolumeViewportsContainingVolumeUID, + Enums, + volumeLoader, + utilities, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { ViewportType, Events } = Enums +const { ORIENTATION } = CONSTANTS + +const { registerVolumeLoader } = volumeLoader +const { unregisterAllImageLoaders } = imageLoader + const { fakeMetaDataProvider, compareImages, fakeVolumeLoader } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -49,7 +52,7 @@ function createViewport(renderingEngine, orientation) { renderingEngine.setViewports([ { viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -62,7 +65,7 @@ function createViewport(renderingEngine, orientation) { describe('Volume Viewport GPU -- ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Volume Viewport Axial Nearest Neighbor and Linear Interpolation --- ', function () { @@ -97,7 +100,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -111,9 +114,10 @@ describe('Volume Viewport GPU -- ', () => { volumeActor.getProperty().setInterpolationTypeToNearest() try { - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -133,7 +137,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -144,14 +148,16 @@ describe('Volume Viewport GPU -- ', () => { }) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( - this.renderingEngine, - [{ volumeUID: volumeId }], - [viewportUID] - ) - vp.render() - }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) + .then(() => { + setVolumesForViewports( + this.renderingEngine, + [{ volumeUID: volumeId }], + [viewportUID] + ) + vp.render() + }) } catch (e) { done.fail(e) } @@ -191,7 +197,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -205,9 +211,10 @@ describe('Volume Viewport GPU -- ', () => { volumeActor.getProperty().setInterpolationTypeToNearest() try { - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -227,7 +234,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -238,9 +245,10 @@ describe('Volume Viewport GPU -- ', () => { }) try { - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID] @@ -289,7 +297,7 @@ describe('Volume Viewport GPU -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -305,9 +313,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -327,7 +336,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -338,9 +347,10 @@ describe('Volume Viewport GPU -- ', () => { }) try { - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID] @@ -377,7 +387,7 @@ describe('Volume Viewport GPU -- ', () => { }) }) - it('should successfully use setVolumesOnViewports API to load image', function (done) { + it('should successfully use setVolumesForViewports API to load image', function (done) { const element = createViewport(this.renderingEngine, CORONAL) this.DOMElements.push(element) @@ -386,7 +396,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -402,9 +412,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -425,9 +436,9 @@ describe('Volume Viewport GPU -- ', () => { // volumeScheme:volumeURI_xSize_ySize_zSize_barStart_barWidth_xSpacing_ySpacing_zSpacing_rgbFlag const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const viewport = this.renderingEngine.getViewport(viewportUID) - const viewports = getVolumeViewportsContainingVolumeUID( + const viewports = utilities.getVolumeViewportsContainingVolumeUID( volumeId, this.renderingEngine.uid ) @@ -444,9 +455,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -470,7 +482,7 @@ describe('Volume Viewport GPU -- ', () => { // volumeScheme:volumeURI_xSize_ySize_zSize_barStart_barWidth_xSpacing_ySpacing_zSpacing_rgbFlag const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const image = canvas.toDataURL('image/png') compareImages( image, @@ -485,9 +497,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -509,7 +522,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -525,9 +538,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -549,7 +563,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') const offScreen = this.renderingEngine._debugRender() @@ -563,9 +577,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -587,7 +602,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -603,9 +618,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -655,7 +671,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_1' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -673,9 +689,10 @@ describe('Volume Viewport GPU -- ', () => { try { // we don't set imageIds as we are mocking the imageVolume to // return the volume immediately - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -695,7 +712,7 @@ describe('Volume Viewport GPU -- ', () => { const volumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_1' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') compareImages( @@ -711,9 +728,10 @@ describe('Volume Viewport GPU -- ', () => { } try { - createAndCacheVolume(volumeId, { imageIds: [] }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) .then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] diff --git a/packages/cornerstone-tools/examples/annotationSelectionAndLocking/index.ts b/packages/cornerstone-tools/examples/annotationSelectionAndLocking/index.ts index 0628af2d42..926c468de6 100644 --- a/packages/cornerstone-tools/examples/annotationSelectionAndLocking/index.ts +++ b/packages/cornerstone-tools/examples/annotationSelectionAndLocking/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, getRenderingEngine, } from '@precisionmetrics/cornerstone-render' import { @@ -17,14 +17,15 @@ const { LengthTool, BidirectionalTool, ToolGroupManager, - ToolBindings, - annotationLocking, - annotationSelection, - AnnotationState, + Enums: { MouseBindings }, + annotation, } = cornerstoneTools +const { locking, selection } = annotation +const { ViewportType } = Enums + const defaultFrameOfReferenceSpecificAnnotationManager = - AnnotationState.getDefaultAnnotationManager() + annotation.state.getDefaultAnnotationManager() // ======== Set up page ======== // setTitleAndDescription( @@ -70,7 +71,7 @@ addToggleButtonToToolbar( bidirectionalAnnotationUID ) - annotationLocking.setAnnotationLocked(annotation, toggle) + locking.setAnnotationLocked(annotation, toggle) } ) @@ -80,7 +81,7 @@ addButtonToToolbar('Select Length Annotation', () => { lengthAnnotationUID ) - annotationSelection.setAnnotationSelected(annotation, true) + selection.setAnnotationSelected(annotation, true) // Render the image to see it was selected const renderingEngine = getRenderingEngine(renderingEngineUID) @@ -111,7 +112,7 @@ async function run() { toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -134,7 +135,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/annotationToolModes/index.ts b/packages/cornerstone-tools/examples/annotationToolModes/index.ts index 95eaf6c3cb..82c4887564 100644 --- a/packages/cornerstone-tools/examples/annotationToolModes/index.ts +++ b/packages/cornerstone-tools/examples/annotationToolModes/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -11,8 +11,10 @@ import { } from '../../../../utils/demo/helpers' import * as cornerstoneTools from '@precisionmetrics/cornerstone-tools' -const { LengthTool, ToolGroupManager, ToolBindings, ToolModes } = - cornerstoneTools +const { LengthTool, ToolGroupManager, Enums: csToolsEnums } = cornerstoneTools + +const { MouseBindings, ToolModes } = csToolsEnums +const { ViewportType } = Enums // ======== Set up page ======== // setTitleAndDescription('Annotation Tool Modes', 'Annotation tools mode') @@ -62,7 +64,7 @@ addDropdownToToolbar( toolGroup[`setTool${newToolMode}`](LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click (only applies if active) + mouseButton: MouseBindings.Primary, // Left Click (only applies if active) }, ], }) @@ -93,7 +95,7 @@ async function run() { toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -116,7 +118,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/mipJumpToClick/index.ts b/packages/cornerstone-tools/examples/mipJumpToClick/index.ts index def76b0190..457c75e9e8 100644 --- a/packages/cornerstone-tools/examples/mipJumpToClick/index.ts +++ b/packages/cornerstone-tools/examples/mipJumpToClick/index.ts @@ -1,12 +1,12 @@ import vtkConstants from 'vtk.js/Sources/Rendering/Core/VolumeMapper/Constants' import { RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, - setVolumesOnViewports, + volumeLoader, + Enums, + setVolumesForViewports, Types, - Utilities, + utilities, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -18,12 +18,17 @@ import * as cornerstoneTools from '@precisionmetrics/cornerstone-tools' import '@precisionmetrics/cornerstone-image-loader-streaming-volume' // Registers volume loader const { BlendMode } = vtkConstants +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, VolumeRotateMouseWheelTool, MIPJumpToClickTool, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools + +const { MouseBindings } = csToolsEnums // Define a unique id for each volume const volumeLoaderProtocolName = 'cornerstoneStreamingImageVolume' // Loader id which defines which volume loader to use const ctVolumeName = 'CT_VOLUME_UID' // Id of the volume less loader prefix @@ -38,7 +43,7 @@ function setPetTransferFunction({ volumeActor }) { rgbTransferFunction.setRange(0, 5) - Utilities.invertRgbTransferFunction(rgbTransferFunction) + utilities.invertRgbTransferFunction(rgbTransferFunction) } // ======== Set up page ======== // @@ -101,7 +106,7 @@ async function run() { mipToolGroup.setToolActive('MIPJumpToClickTool', { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -144,7 +149,7 @@ async function run() { const viewportInputArray = [ { viewportUID: viewportUIDs[0], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -153,7 +158,7 @@ async function run() { }, { viewportUID: viewportUIDs[1], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -162,7 +167,7 @@ async function run() { }, { viewportUID: viewportUIDs[2], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element3, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -177,10 +182,10 @@ async function run() { mipToolGroup.addViewport(viewportUIDs[2], renderingEngineUID) // Define volumes in memory - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctImageIds, }) @@ -198,18 +203,18 @@ async function run() { ptVolumeDimensions[2] * ptVolumeDimensions[2] ) - setVolumesOnViewports( + setVolumesForViewports( renderingEngine, [{ volumeUID: ctVolumeUID }], [viewportUIDs[0]] ) - setVolumesOnViewports( + setVolumesForViewports( renderingEngine, [{ volumeUID: ptVolumeUID, callback: setPetTransferFunction }], [viewportUIDs[1]] ) - setVolumesOnViewports( + setVolumesForViewports( renderingEngine, [ { diff --git a/packages/cornerstone-tools/examples/modifierKeys/index.ts b/packages/cornerstone-tools/examples/modifierKeys/index.ts index 5186746a72..9537ae742f 100644 --- a/packages/cornerstone-tools/examples/modifierKeys/index.ts +++ b/packages/cornerstone-tools/examples/modifierKeys/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -16,9 +16,12 @@ const { RectangleRoiTool, BidirectionalTool, ToolGroupManager, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools +const { ViewportType } = Enums +const { MouseBindings, KeyboardBindings } = csToolsEnums + // ======== Set up page ======== // setTitleAndDescription( 'Tools on Modifier Keys', @@ -77,31 +80,31 @@ async function run() { toolGroup.setToolActive(WindowLevelTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Shift + Left Click - modifierKey: ToolBindings.Keyboard.Shift, + mouseButton: MouseBindings.Primary, // Shift + Left Click + modifierKey: KeyboardBindings.Shift, }, ], }) toolGroup.setToolActive(RectangleRoiTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Ctrl + Left Click - modifierKey: ToolBindings.Keyboard.Ctrl, + mouseButton: MouseBindings.Primary, // Ctrl + Left Click + modifierKey: KeyboardBindings.Ctrl, }, ], }) toolGroup.setToolActive(BidirectionalTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Alt/Meta + Left Click - modifierKey: ToolBindings.Keyboard.Alt, + mouseButton: MouseBindings.Primary, // Alt/Meta + Left Click + modifierKey: KeyboardBindings.Alt, }, ], }) @@ -124,7 +127,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/multipleToolGroups/index.ts b/packages/cornerstone-tools/examples/multipleToolGroups/index.ts index a9c5265fa8..81bf13b29d 100644 --- a/packages/cornerstone-tools/examples/multipleToolGroups/index.ts +++ b/packages/cornerstone-tools/examples/multipleToolGroups/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -15,9 +15,12 @@ const { WindowLevelTool, StackScrollMouseWheelTool, ToolGroupManager, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools +const { ViewportType } = Enums +const { MouseBindings } = csToolsEnums + // ======== Set up page ======== // setTitleAndDescription( 'Multiple Tool Groups', @@ -81,7 +84,7 @@ async function run() { toolGroup1.setToolActive(WindowLevelTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -98,7 +101,7 @@ async function run() { toolGroup2.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -139,7 +142,7 @@ async function run() { const viewportInputArray = [ { viewportUID: viewportUIDs[0], - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element1, defaultOptions: { background: [0.2, 0, 0.2], @@ -147,7 +150,7 @@ async function run() { }, { viewportUID: viewportUIDs[1], - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element2, defaultOptions: { background: [0.2, 0, 0.2], @@ -155,7 +158,7 @@ async function run() { }, { viewportUID: viewportUIDs[2], - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element3, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/sharedToolState/index.ts b/packages/cornerstone-tools/examples/sharedToolState/index.ts index c5eaed6893..dd6a84d26a 100644 --- a/packages/cornerstone-tools/examples/sharedToolState/index.ts +++ b/packages/cornerstone-tools/examples/sharedToolState/index.ts @@ -1,9 +1,9 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, + volumeLoader, + Enums, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -18,8 +18,13 @@ const { LengthTool, ToolGroupManager, StackScrollMouseWheelTool, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools + +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS +const { MouseBindings } = csToolsEnums + // Define a unique id for the volume const volumeName = 'CT_VOLUME_UID' // Id of the volume less loader prefix const volumeLoaderProtocolName = 'cornerstoneStreamingImageVolume' // Loader id which defines which volume loader to use @@ -84,7 +89,7 @@ async function run() { toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -124,7 +129,7 @@ async function run() { const viewportInputArray = [ { viewportUID: viewportUIDs[0], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -133,7 +138,7 @@ async function run() { }, { viewportUID: viewportUIDs[1], - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: element2, defaultOptions: { background: [0.2, 0, 0.2], @@ -149,7 +154,7 @@ async function run() { ) // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds: smallVolumeImageIds, }) diff --git a/packages/cornerstone-tools/examples/stackAnnotationTools/index.ts b/packages/cornerstone-tools/examples/stackAnnotationTools/index.ts index 25c3f199be..5241906d94 100644 --- a/packages/cornerstone-tools/examples/stackAnnotationTools/index.ts +++ b/packages/cornerstone-tools/examples/stackAnnotationTools/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -18,9 +18,12 @@ const { EllipticalRoiTool, BidirectionalTool, ToolGroupManager, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools +const { ViewportType } = Enums +const { MouseBindings } = csToolsEnums + // ======== Set up page ======== // setTitleAndDescription( 'Annotation Tools Stack', @@ -65,7 +68,7 @@ addDropdownToToolbar( toolGroup.setToolActive(newSelectedToolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -107,7 +110,7 @@ async function run() { toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -136,7 +139,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/stackManipulationTools/index.ts b/packages/cornerstone-tools/examples/stackManipulationTools/index.ts index 13244b277f..30c69b5c1c 100644 --- a/packages/cornerstone-tools/examples/stackManipulationTools/index.ts +++ b/packages/cornerstone-tools/examples/stackManipulationTools/index.ts @@ -1,7 +1,7 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, + Enums, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -16,9 +16,12 @@ const { StackScrollMouseWheelTool, ZoomTool, ToolGroupManager, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools +const { ViewportType } = Enums +const { MouseBindings } = csToolsEnums + // ======== Set up page ======== // setTitleAndDescription( 'Basic Stack Manipulation', @@ -74,21 +77,21 @@ async function run() { toolGroup.setToolActive(WindowLevelTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) toolGroup.setToolActive(PanTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Auxiliary, // Middle Click + mouseButton: MouseBindings.Auxiliary, // Middle Click }, ], }) toolGroup.setToolActive(ZoomTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Secondary, // Right Click + mouseButton: MouseBindings.Secondary, // Right Click }, ], }) @@ -114,7 +117,7 @@ async function run() { const viewportUID = 'CT_STACK' const viewportInput = { viewportUID, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element, defaultOptions: { background: [0.2, 0, 0.2], diff --git a/packages/cornerstone-tools/examples/volumeAnnotationTools/index.ts b/packages/cornerstone-tools/examples/volumeAnnotationTools/index.ts index cc56ab541e..79ff11e78f 100644 --- a/packages/cornerstone-tools/examples/volumeAnnotationTools/index.ts +++ b/packages/cornerstone-tools/examples/volumeAnnotationTools/index.ts @@ -1,10 +1,10 @@ import { RenderingEngine, Types, - VIEWPORT_TYPE, - ORIENTATION, - createAndCacheVolume, - setVolumesOnViewports, + Enums, + setVolumesForViewports, + volumeLoader, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -19,8 +19,13 @@ const { LengthTool, ToolGroupManager, StackScrollMouseWheelTool, - ToolBindings, + Enums: csToolsEnums, } = cornerstoneTools + +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS +const { MouseBindings } = csToolsEnums + // Define a unique id for the volume const volumeName = 'CT_VOLUME_UID' // Id of the volume less loader prefix const volumeLoaderProtocolName = 'cornerstoneStreamingImageVolume' // Loader id which defines which volume loader to use @@ -89,7 +94,7 @@ async function run() { toolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) @@ -121,7 +126,7 @@ async function run() { const viewportInputArray = [ { viewportUID: viewportUIDs[0], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -130,7 +135,7 @@ async function run() { }, { viewportUID: viewportUIDs[1], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -139,7 +144,7 @@ async function run() { }, { viewportUID: viewportUIDs[2], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element3, defaultOptions: { orientation: { @@ -164,14 +169,14 @@ async function run() { ) // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds, }) // Set the volume to load volume.load() - setVolumesOnViewports(renderingEngine, [{ volumeUID }], viewportUIDs) + setVolumesForViewports(renderingEngine, [{ volumeUID }], viewportUIDs) // // Set the volume on the viewport // viewport.setVolumes([{ volumeUID }]) diff --git a/packages/cornerstone-tools/examples/volumeViewportSynchronization/index.ts b/packages/cornerstone-tools/examples/volumeViewportSynchronization/index.ts index f2b03d91e6..a68b17415e 100644 --- a/packages/cornerstone-tools/examples/volumeViewportSynchronization/index.ts +++ b/packages/cornerstone-tools/examples/volumeViewportSynchronization/index.ts @@ -1,10 +1,10 @@ import { RenderingEngine, - VIEWPORT_TYPE, Types, - ORIENTATION, - createAndCacheVolume, - setVolumesOnViewports, + Enums, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import { initDemo, @@ -22,10 +22,15 @@ const { ZoomTool, ToolGroupManager, StackScrollMouseWheelTool, - ToolBindings, + Enums: csToolsEnums, synchronizers, SynchronizerManager, } = cornerstoneTools + +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS +const { MouseBindings } = csToolsEnums + const { createCameraPositionSynchronizer, createVOISynchronizer } = synchronizers @@ -162,21 +167,21 @@ async function run() { toolGroup.setToolActive(WindowLevelTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, // Left Click + mouseButton: MouseBindings.Primary, // Left Click }, ], }) toolGroup.setToolActive(PanTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Auxiliary, // Middle Click + mouseButton: MouseBindings.Auxiliary, // Middle Click }, ], }) toolGroup.setToolActive(ZoomTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Secondary, // Right Click + mouseButton: MouseBindings.Secondary, // Right Click }, ], }) @@ -206,7 +211,7 @@ async function run() { const viewportInputArray = [ { viewportUID: viewportUIDs[0], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -215,7 +220,7 @@ async function run() { }, { viewportUID: viewportUIDs[1], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -224,7 +229,7 @@ async function run() { }, { viewportUID: viewportUIDs[2], - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element3, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -241,14 +246,14 @@ async function run() { ) // Define a volume in memory - const volume = await createAndCacheVolume(volumeUID, { + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { imageIds, }) // Set the volume to load volume.load() - setVolumesOnViewports(renderingEngine, [{ volumeUID }], viewportUIDs) + setVolumesForViewports(renderingEngine, [{ volumeUID }], viewportUIDs) // Render the image renderingEngine.render() diff --git a/packages/cornerstone-tools/src/cursors/ImageMouseCursor.ts b/packages/cornerstone-tools/src/cursors/ImageMouseCursor.ts index 62e9938aaf..3484fc814d 100644 --- a/packages/cornerstone-tools/src/cursors/ImageMouseCursor.ts +++ b/packages/cornerstone-tools/src/cursors/ImageMouseCursor.ts @@ -1,4 +1,4 @@ -import { Utilities } from '@precisionmetrics/cornerstone-render' +import { utilities } from '@precisionmetrics/cornerstone-render' import MouseCursor from './MouseCursor' const DEFAULT_NAME = 'image-cursor' @@ -34,6 +34,6 @@ export default class ImageMouseCursor extends MouseCursor { } static getUniqueInstanceName(prefix: string): string { - return `${prefix}-${Utilities.getRuntimeId(ImageMouseCursor)}` + return `${prefix}-${utilities.getRuntimeId(ImageMouseCursor)}` } } diff --git a/packages/cornerstone-tools/src/cursors/SVGMouseCursor.ts b/packages/cornerstone-tools/src/cursors/SVGMouseCursor.ts index 746e99a597..484813d793 100644 --- a/packages/cornerstone-tools/src/cursors/SVGMouseCursor.ts +++ b/packages/cornerstone-tools/src/cursors/SVGMouseCursor.ts @@ -1,5 +1,5 @@ import { ToolModes, AnnotationStyleStates } from '../enums' -import { getDefaultStyleProperty } from '../stateManagement/annotation/annotationStyle' +import { getDefaultStyleProperty } from '../stateManagement/annotation/config/annotationStyle' import MouseCursor from './MouseCursor' import ImageMouseCursor from './ImageMouseCursor' import { getDefinedSVGCursorDescriptor } from './SVGCursorDescriptor' diff --git a/packages/cornerstone-tools/src/enums/CornerstoneTools3DEvents.ts b/packages/cornerstone-tools/src/enums/Events.ts similarity index 99% rename from packages/cornerstone-tools/src/enums/CornerstoneTools3DEvents.ts rename to packages/cornerstone-tools/src/enums/Events.ts index e2b83e8a2e..f1e933cfc3 100644 --- a/packages/cornerstone-tools/src/enums/CornerstoneTools3DEvents.ts +++ b/packages/cornerstone-tools/src/enums/Events.ts @@ -4,7 +4,7 @@ * allows us to handle events consistently across different browsers. * */ -enum CornerstoneTools3DEvents { +enum Events { /////////////////////////////////////// // Annotations /////////////////////////////////////// @@ -214,4 +214,4 @@ enum CornerstoneTools3DEvents { */ } -export default CornerstoneTools3DEvents +export default Events diff --git a/packages/cornerstone-tools/src/enums/ToolBindings.ts b/packages/cornerstone-tools/src/enums/ToolBindings.ts index 53f1c41325..a27b08d738 100644 --- a/packages/cornerstone-tools/src/enums/ToolBindings.ts +++ b/packages/cornerstone-tools/src/enums/ToolBindings.ts @@ -4,7 +4,7 @@ * * See also: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons */ -enum Mouse { +enum MouseBindings { Primary = 1, Secondary = 2, Primary_And_Secondary = 3, @@ -16,18 +16,10 @@ enum Mouse { Fifth_Button = 16, } -enum Keyboard { +enum KeyboardBindings { Shift = 16, Ctrl = 18, Alt = 17, } -enum Touch {} - -const enums = { - Mouse, - Keyboard, - Touch, -} - -export default enums +export { MouseBindings, KeyboardBindings } diff --git a/packages/cornerstone-tools/src/enums/index.js b/packages/cornerstone-tools/src/enums/index.js index 2a041fc967..d215ae950c 100644 --- a/packages/cornerstone-tools/src/enums/index.js +++ b/packages/cornerstone-tools/src/enums/index.js @@ -1,15 +1,14 @@ -import ToolBindings from './ToolBindings' +import { MouseBindings, KeyboardBindings } from './ToolBindings' import ToolModes from './ToolModes' import AnnotationStyleStates from './AnnotationStyleStates' -import CornerstoneTools3DEvents from './CornerstoneTools3DEvents' +import Events from './Events' import SegmentationRepresentations from './SegmentationRepresentations' -import BlendModes from './BlendModes' export { - ToolBindings, + MouseBindings, + KeyboardBindings, ToolModes, AnnotationStyleStates, - CornerstoneTools3DEvents, + Events, SegmentationRepresentations, - BlendModes, } diff --git a/packages/cornerstone-tools/src/eventDispatchers/annotationModifiedEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/annotationModifiedEventDispatcher.ts index 3c1c6c638e..2172fd4f21 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/annotationModifiedEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/annotationModifiedEventDispatcher.ts @@ -2,7 +2,7 @@ import { eventTarget, getRenderingEngine, } from '@precisionmetrics/cornerstone-render' -import EVENTS from '../enums/CornerstoneTools3DEvents' +import Events from '../enums/Events' import triggerAnnotationRenderForViewportUIDs from '../utilities/triggerAnnotationRenderForViewportUIDs' import { AnnotationModifiedEventType } from '../types/EventTypes' @@ -25,12 +25,12 @@ const onAnnotationModified = function (evt: AnnotationModifiedEventType) { } const enable = function () { - eventTarget.addEventListener(EVENTS.ANNOTATION_MODIFIED, onAnnotationModified) + eventTarget.addEventListener(Events.ANNOTATION_MODIFIED, onAnnotationModified) } const disable = function () { eventTarget.removeEventListener( - EVENTS.ANNOTATION_MODIFIED, + Events.ANNOTATION_MODIFIED, onAnnotationModified ) } diff --git a/packages/cornerstone-tools/src/eventDispatchers/cameraModifiedEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/cameraModifiedEventDispatcher.ts index ec22996c6c..a27b132baf 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/cameraModifiedEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/cameraModifiedEventDispatcher.ts @@ -1,4 +1,4 @@ -import { EVENTS, Types } from '@precisionmetrics/cornerstone-render' +import { Enums, Types } from '@precisionmetrics/cornerstone-render' import { ToolModes } from '../enums' import getToolsWithModesForMouseEvent from './shared/getToolsWithModesForMouseEvent' @@ -28,11 +28,11 @@ const onCameraModified = function (evt: Types.EventTypes.CameraModifiedEvent) { } const enable = function (element) { - element.addEventListener(EVENTS.CAMERA_MODIFIED, onCameraModified) + element.addEventListener(Enums.Events.CAMERA_MODIFIED, onCameraModified) } const disable = function (element) { - element.removeEventListener(EVENTS.CAMERA_MODIFIED, onCameraModified) + element.removeEventListener(Enums.Events.CAMERA_MODIFIED, onCameraModified) } export default { diff --git a/packages/cornerstone-tools/src/eventDispatchers/imageRenderedEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/imageRenderedEventDispatcher.ts index 05d29febbc..671f402b97 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/imageRenderedEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/imageRenderedEventDispatcher.ts @@ -1,7 +1,4 @@ -import { - EVENTS as RenderingEngineEvents, - Types, -} from '@precisionmetrics/cornerstone-render' +import { Enums, Types } from '@precisionmetrics/cornerstone-render' import triggerAnnotationRender from '../utilities/triggerAnnotationRender' /** @@ -21,17 +18,11 @@ const onImageRendered = function (evt: Types.EventTypes.ImageRenderedEvent) { } const enable = function (element: HTMLElement): void { - element.addEventListener( - RenderingEngineEvents.IMAGE_RENDERED, - onImageRendered - ) + element.addEventListener(Enums.Events.IMAGE_RENDERED, onImageRendered) } const disable = function (element: HTMLElement): void { - element.removeEventListener( - RenderingEngineEvents.IMAGE_RENDERED, - onImageRendered - ) + element.removeEventListener(Enums.Events.IMAGE_RENDERED, onImageRendered) } export default { diff --git a/packages/cornerstone-tools/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts index 3e13d44131..16e6f5af6e 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts @@ -1,7 +1,4 @@ -import { - EVENTS as RenderingEngineEvents, - Types, -} from '@precisionmetrics/cornerstone-render' +import { Enums, Types } from '@precisionmetrics/cornerstone-render' import { ToolModes } from '../enums' import getToolsWithModesForMouseEvent from './shared/getToolsWithModesForMouseEvent' @@ -35,14 +32,14 @@ const onImageSpacingCalibrated = function ( const enable = function (element: HTMLElement) { element.addEventListener( - RenderingEngineEvents.IMAGE_SPACING_CALIBRATED, + Enums.Events.IMAGE_SPACING_CALIBRATED, onImageSpacingCalibrated ) } const disable = function (element: HTMLElement) { element.removeEventListener( - RenderingEngineEvents.IMAGE_SPACING_CALIBRATED, + Enums.Events.IMAGE_SPACING_CALIBRATED, onImageSpacingCalibrated ) } diff --git a/packages/cornerstone-tools/src/eventDispatchers/keyboardToolEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/keyboardToolEventDispatcher.ts index de52ac33c7..d578f62fbf 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/keyboardToolEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/keyboardToolEventDispatcher.ts @@ -1,4 +1,4 @@ -import Events from '../enums/CornerstoneTools3DEvents' +import Events from '../enums/Events' import { keyDown, keyUp } from './keyboardEventHandlers' /** diff --git a/packages/cornerstone-tools/src/eventDispatchers/mouseToolEventDispatcher.ts b/packages/cornerstone-tools/src/eventDispatchers/mouseToolEventDispatcher.ts index 12052184f1..8edb54d0e8 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/mouseToolEventDispatcher.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/mouseToolEventDispatcher.ts @@ -1,4 +1,4 @@ -import Events from '../enums/CornerstoneTools3DEvents' +import Events from '../enums/Events' import { mouseClick, diff --git a/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts b/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts index 84a6bce087..46cb9d6d99 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts @@ -1,5 +1,5 @@ import { ToolGroupManager } from '../../store' -import { ToolModes, ToolBindings } from '../../enums' +import { ToolModes, MouseBindings } from '../../enums' import { keyEventListener } from '../../eventListeners' import { EventTypes } from '../../types' import { getMouseButton } from '../../eventListeners/mouse/mouseDownListener' @@ -47,7 +47,7 @@ export default function getActiveToolForKeyboardEvent( toolOptions.bindings.length && toolOptions.bindings.some( (binding) => - binding.mouseButton === (mouseButton ?? ToolBindings.Mouse.Primary) && + binding.mouseButton === (mouseButton ?? MouseBindings.Primary) && binding.modifierKey === modifierKey ) diff --git a/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts b/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts index 859d50ea05..a5e59a4209 100644 --- a/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +++ b/packages/cornerstone-tools/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts @@ -1,5 +1,5 @@ import { ToolGroupManager } from '../../store' -import { ToolBindings, ToolModes } from '../../enums' +import { MouseBindings, ToolModes } from '../../enums' import { keyEventListener } from '../../eventListeners' import { EventTypes } from '../../types' @@ -46,7 +46,7 @@ export default function getActiveToolForMouseEvent( toolOptions.bindings.some( (binding) => binding.mouseButton === - (mouseEvent ? mouseEvent.buttons : ToolBindings.Mouse.Primary) && + (mouseEvent ? mouseEvent.buttons : MouseBindings.Primary) && binding.modifierKey === modifierKey ) diff --git a/packages/cornerstone-tools/src/eventListeners/keyboard/keyDownListener.ts b/packages/cornerstone-tools/src/eventListeners/keyboard/keyDownListener.ts index 6ba5cad49e..46c90edded 100644 --- a/packages/cornerstone-tools/src/eventListeners/keyboard/keyDownListener.ts +++ b/packages/cornerstone-tools/src/eventListeners/keyboard/keyDownListener.ts @@ -3,7 +3,7 @@ import { getEnabledElement, triggerEvent, } from '@precisionmetrics/cornerstone-render' -import CornerstoneTools3DEvents from '../../enums/CornerstoneTools3DEvents' +import Events from '../../enums/Events' import { KeyDownEventDetail, KeyUpEventDetail } from '../../types/EventTypes' interface IKeyDownListenerState { @@ -64,11 +64,7 @@ function keyListener(evt: KeyboardEvent): void { // points: getMouseEventPoints(evt), } - triggerEvent( - eventDetail.element, - CornerstoneTools3DEvents.KEY_DOWN, - eventDetail - ) + triggerEvent(eventDetail.element, Events.KEY_DOWN, eventDetail) document.addEventListener('keyup', _onKeyUp) @@ -92,11 +88,7 @@ function _onKeyUp(evt: KeyboardEvent): void { // Restore `state` to `defaultState` state = _cloneDeep(defaultState) - triggerEvent( - eventDetail.element, - CornerstoneTools3DEvents.KEY_UP, - eventDetail - ) + triggerEvent(eventDetail.element, Events.KEY_UP, eventDetail) } export function getModifierKey(): number | undefined { diff --git a/packages/cornerstone-tools/src/eventListeners/mouse/mouseDoubleClickListener.ts b/packages/cornerstone-tools/src/eventListeners/mouse/mouseDoubleClickListener.ts index 2072297448..bddad3e235 100644 --- a/packages/cornerstone-tools/src/eventListeners/mouse/mouseDoubleClickListener.ts +++ b/packages/cornerstone-tools/src/eventListeners/mouse/mouseDoubleClickListener.ts @@ -2,7 +2,7 @@ import { getEnabledElement, triggerEvent, } from '@precisionmetrics/cornerstone-render' -import CornerstoneTools3DEvents from '../../enums/CornerstoneTools3DEvents' +import Events from '../../enums/Events' import getMouseEventPoints from './getMouseEventPoints' import { EventTypes, IPoints } from '../../types' @@ -27,7 +27,7 @@ function mouseDoubleClickListener(evt: MouseEvent): void { const eventDetail: EventTypes.MouseDoubleClickEventDetail = { event: evt, - eventName: CornerstoneTools3DEvents.MOUSE_DOUBLE_CLICK, + eventName: Events.MOUSE_DOUBLE_CLICK, viewportUID, renderingEngineUID, camera: {}, @@ -38,11 +38,7 @@ function mouseDoubleClickListener(evt: MouseEvent): void { deltaPoints, } - triggerEvent( - element, - CornerstoneTools3DEvents.MOUSE_DOUBLE_CLICK, - eventDetail - ) + triggerEvent(element, Events.MOUSE_DOUBLE_CLICK, eventDetail) } export default mouseDoubleClickListener diff --git a/packages/cornerstone-tools/src/eventListeners/mouse/mouseDownListener.ts b/packages/cornerstone-tools/src/eventListeners/mouse/mouseDownListener.ts index 028df6bc00..4a700e0d52 100644 --- a/packages/cornerstone-tools/src/eventListeners/mouse/mouseDownListener.ts +++ b/packages/cornerstone-tools/src/eventListeners/mouse/mouseDownListener.ts @@ -4,13 +4,13 @@ import { } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' -import CornerstoneTools3DEvents from '../../enums/CornerstoneTools3DEvents' +import Events from '../../enums/Events' import mouseMoveListener from './mouseMoveListener' import { EventTypes, IPoints } from '../../types' import getMouseEventPoints from './getMouseEventPoints' const { MOUSE_DOWN, MOUSE_DOWN_ACTIVATE, MOUSE_CLICK, MOUSE_UP, MOUSE_DRAG } = - CornerstoneTools3DEvents + Events interface IMouseDownListenerState { mouseButton: number diff --git a/packages/cornerstone-tools/src/eventListeners/mouse/mouseMoveListener.ts b/packages/cornerstone-tools/src/eventListeners/mouse/mouseMoveListener.ts index a1b132c7bc..29814e6b3a 100644 --- a/packages/cornerstone-tools/src/eventListeners/mouse/mouseMoveListener.ts +++ b/packages/cornerstone-tools/src/eventListeners/mouse/mouseMoveListener.ts @@ -2,11 +2,11 @@ import { getEnabledElement, triggerEvent, } from '@precisionmetrics/cornerstone-render' -import CornerstoneTools3DEvents from '../../enums/CornerstoneTools3DEvents' +import Events from '../../enums/Events' import getMouseEventPoints from './getMouseEventPoints' import { MouseMoveEventDetail } from '../../types/EventTypes' -const eventName = CornerstoneTools3DEvents.MOUSE_MOVE +const eventName = Events.MOUSE_MOVE /** * Captures and normalizes the mouse move event. Emits as a cornerstoneTools3D diff --git a/packages/cornerstone-tools/src/eventListeners/wheel/index.ts b/packages/cornerstone-tools/src/eventListeners/wheel/index.ts index 5b78803a2a..67684a4d8a 100644 --- a/packages/cornerstone-tools/src/eventListeners/wheel/index.ts +++ b/packages/cornerstone-tools/src/eventListeners/wheel/index.ts @@ -2,7 +2,7 @@ import wheelListener from './wheelListener' /** * Listens for the wheel event, and handles it. Handled event - * will be "normalized" and re-emitted as `EVENTS.MOUSE_WHEEL` + * will be "normalized" and re-emitted as `Events.MOUSE_WHEEL` * * @param element - The HTML element */ @@ -12,7 +12,7 @@ function enable(element: HTMLElement) { } /** - * Removes listener and handler for wheel event. `EVENTS.MOUSE_WHEEL` + * Removes listener and handler for wheel event. `Events.MOUSE_WHEEL` * will no longer be emitted. * * @param element - THe HTML element diff --git a/packages/cornerstone-tools/src/eventListeners/wheel/wheelListener.ts b/packages/cornerstone-tools/src/eventListeners/wheel/wheelListener.ts index a15c801f72..d6c43fe132 100644 --- a/packages/cornerstone-tools/src/eventListeners/wheel/wheelListener.ts +++ b/packages/cornerstone-tools/src/eventListeners/wheel/wheelListener.ts @@ -3,7 +3,7 @@ import { triggerEvent, } from '@precisionmetrics/cornerstone-render' import normalizeWheel from './normalizeWheel' -import CornerstoneTools3DEvents from '../../enums/CornerstoneTools3DEvents' +import Events from '../../enums/Events' // ~~ VIEWPORT LIBRARY import getMouseEventPoints from '../mouse/getMouseEventPoints' import { MouseWheelEventDetail } from '../../types/EventTypes' @@ -32,7 +32,7 @@ function wheelListener(evt: WheelEvent) { const eventDetail: MouseWheelEventDetail = { event: evt, - eventName: CornerstoneTools3DEvents.MOUSE_WHEEL, + eventName: Events.MOUSE_WHEEL, renderingEngineUID, viewportUID, element, @@ -48,7 +48,7 @@ function wheelListener(evt: WheelEvent) { points: getMouseEventPoints(evt), } - triggerEvent(element, CornerstoneTools3DEvents.MOUSE_WHEEL, eventDetail) + triggerEvent(element, Events.MOUSE_WHEEL, eventDetail) } export default wheelListener diff --git a/packages/cornerstone-tools/src/index.ts b/packages/cornerstone-tools/src/index.ts index ecabeb1767..25747fd481 100644 --- a/packages/cornerstone-tools/src/index.ts +++ b/packages/cornerstone-tools/src/index.ts @@ -1,17 +1,3 @@ -import { - FrameOfReferenceSpecificAnnotationManager, - annotationStyle, - annotationLocking, - annotationSelection, - getStyle, - setGlobalStyle, - setToolStyle, - // segmentations - addSegmentationsForToolGroup, - removeSegmentationsForToolGroup, - SegmentationState, -} from './stateManagement' - import { init, destroy } from './init' import { addTool, @@ -20,18 +6,16 @@ import { SynchronizerManager, Synchronizer, cancelActiveManipulations, - SegmentationModule, } from './store' -import ToolGroup from './store/ToolGroupManager/ToolGroup' - // Name spaces import * as synchronizers from './synchronizers' import * as drawing from './drawingSvg' -import * as Utilities from './utilities' +import * as utilities from './utilities' +import * as cursors from './cursors' import * as Types from './types' -import * as Cursors from './cursors' -import AnnotationState from './stateManagement/annotation' +import * as annotation from './stateManagement/annotation' +import * as segmentation from './stateManagement/segmentation' import { BaseTool, @@ -58,23 +42,32 @@ import { } from './tools' import { - ToolBindings, + MouseBindings, + KeyboardBindings, ToolModes, - CornerstoneTools3DEvents, + Events, SegmentationRepresentations, - BlendModes, } from './enums' +const Enums = { + MouseBindings, + KeyboardBindings, + ToolModes, + Events, + SegmentationRepresentations, +} + export { - // LifeCycle + // + init, + destroy, addTool, removeTool, cancelActiveManipulations, - init, - destroy, + // Base Tools BaseTool, AnnotationTool, - // Tools + // Manipulation Tools PanTool, WindowLevelTool, ZoomTool, @@ -89,46 +82,30 @@ export { RectangleRoiTool, EllipticalRoiTool, BidirectionalTool, - // Segmentation Tools + // Segmentation Display + SegmentationDisplayTool, + // Segmentation Editing Tools RectangleScissorsTool, CircleScissorsTool, SphereScissorsTool, RectangleRoiThresholdTool, RectangleRoiStartEndThresholdTool, - // PET annotation - SegmentationDisplayTool, // Synchronizers synchronizers, Synchronizer, - // Managers - ToolGroupManager, SynchronizerManager, - // - ToolGroup, + Types, + // ToolGroups + ToolGroupManager, // Enums - ToolBindings, - BlendModes, - ToolModes, - CornerstoneTools3DEvents, - SegmentationRepresentations, - FrameOfReferenceSpecificAnnotationManager, - AnnotationState, + Enums, // Drawing API drawing, - // State - annotationStyle, - annotationLocking, - annotationSelection, - getStyle, - setGlobalStyle, - setToolStyle, - // Utilities - Utilities, - Types, - Cursors, + // Annotation + annotation, // Segmentations - SegmentationState, - SegmentationModule, - addSegmentationsForToolGroup, - removeSegmentationsForToolGroup, + segmentation, + // Utilities + utilities, + cursors, } diff --git a/packages/cornerstone-tools/src/init.ts b/packages/cornerstone-tools/src/init.ts index 9782a629c3..26b9682e97 100644 --- a/packages/cornerstone-tools/src/init.ts +++ b/packages/cornerstone-tools/src/init.ts @@ -1,10 +1,7 @@ -import { - eventTarget, - EVENTS as RENDERING_EVENTS, -} from '@precisionmetrics/cornerstone-render' +import { eventTarget, Enums } from '@precisionmetrics/cornerstone-render' import { getDefaultAnnotationManager } from './stateManagement/annotation/annotationState' import { getDefaultSegmentationStateManager } from './stateManagement/segmentation/segmentationState' -import { CornerstoneTools3DEvents as TOOLS_EVENTS } from './enums' +import { Events as TOOLS_EVENTS } from './enums' import { addEnabledElement, removeEnabledElement } from './store' import { resetCornerstoneToolsState } from './store/state' import { @@ -70,8 +67,8 @@ function _addCornerstoneEventListeners(): void { // Clear any listeners that may already be set _removeCornerstoneEventListeners() - const elementEnabledEvent = RENDERING_EVENTS.ELEMENT_ENABLED - const elementDisabledEvent = RENDERING_EVENTS.ELEMENT_DISABLED + const elementEnabledEvent = Enums.Events.ELEMENT_ENABLED + const elementDisabledEvent = Enums.Events.ELEMENT_DISABLED eventTarget.addEventListener(elementEnabledEvent, addEnabledElement) eventTarget.addEventListener(elementDisabledEvent, removeEnabledElement) @@ -83,8 +80,8 @@ function _addCornerstoneEventListeners(): void { * */ function _removeCornerstoneEventListeners(): void { - const elementEnabledEvent = RENDERING_EVENTS.ELEMENT_ENABLED - const elementDisabledEvent = RENDERING_EVENTS.ELEMENT_DISABLED + const elementEnabledEvent = Enums.Events.ELEMENT_ENABLED + const elementDisabledEvent = Enums.Events.ELEMENT_DISABLED eventTarget.removeEventListener(elementEnabledEvent, addEnabledElement) eventTarget.removeEventListener(elementDisabledEvent, removeEnabledElement) diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts b/packages/cornerstone-tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts index be9f94719c..d70a2c6f14 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts @@ -7,10 +7,10 @@ import { import cloneDeep from 'lodash.clonedeep' import { - EVENTS as RENDERING_EVENTS, + Enums, eventTarget, Types, - Utilities, + utilities, } from '@precisionmetrics/cornerstone-render' import { checkAndDefineIsLockedProperty } from './annotationLocking' @@ -42,14 +42,14 @@ export default class FrameOfReferenceSpecificAnnotationManager { */ constructor(uid?: string) { if (!uid) { - uid = Utilities.uuidv4() + uid = utilities.uuidv4() } this.annotations = {} this.uid = uid // Listen to the IMAGE_VOLUME_MODIFIED event to invalidate data. eventTarget.addEventListener( - RENDERING_EVENTS.IMAGE_VOLUME_MODIFIED, + Enums.Events.IMAGE_VOLUME_MODIFIED, this._imageVolumeModifiedHandler ) } diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/annotationLocking.ts b/packages/cornerstone-tools/src/stateManagement/annotation/annotationLocking.ts index 9a1f0bb22b..ba51e51c95 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/annotationLocking.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/annotationLocking.ts @@ -1,5 +1,5 @@ import { eventTarget, triggerEvent } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents } from '../../enums' +import { Events } from '../../enums' import { Annotation } from '../../types' import { AnnotationLockChangeEventDetail } from '../../types/EventTypes' @@ -141,11 +141,7 @@ function publish( ) { if (detail.added.length > 0 || detail.removed.length > 0) { lockedAnnotationsSet.forEach((item) => void detail.locked.push(item)) - triggerEvent( - eventTarget, - CornerstoneTools3DEvents.ANNOTATION_LOCK_CHANGE, - detail - ) + triggerEvent(eventTarget, Events.ANNOTATION_LOCK_CHANGE, detail) } } diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/annotationSelection.ts b/packages/cornerstone-tools/src/stateManagement/annotation/annotationSelection.ts index d47c9dd700..f145bc971b 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/annotationSelection.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/annotationSelection.ts @@ -1,5 +1,5 @@ import { eventTarget, triggerEvent } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents } from '../../enums' +import { Events } from '../../enums' import { Annotation } from '../../types' import { AnnotationSelectionChangeEventDetail } from '../../types/EventTypes' @@ -156,11 +156,7 @@ function publish( ) { if (detail.added.length > 0 || detail.removed.length > 0) { selectionSet.forEach((item) => void detail.selection.push(item)) - triggerEvent( - eventTarget, - CornerstoneTools3DEvents.ANNOTATION_SELECTION_CHANGE, - detail - ) + triggerEvent(eventTarget, Events.ANNOTATION_SELECTION_CHANGE, detail) } } diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/annotationState.ts b/packages/cornerstone-tools/src/stateManagement/annotation/annotationState.ts index 92e2650fc7..8c2fdb2722 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/annotationState.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/annotationState.ts @@ -2,9 +2,9 @@ import { getEnabledElement, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { Types } from '@precisionmetrics/cornerstone-render' import { defaultFrameOfReferenceSpecificAnnotationManager } from './FrameOfReferenceSpecificAnnotationManager' import { Annotations, Annotation } from '../../types/AnnotationTypes' @@ -76,7 +76,7 @@ function addAnnotation(element: HTMLElement, annotation: Annotation): void { const { renderingEngine } = enabledElement const { viewportUID } = enabledElement - const eventType = EVENTS.ANNOTATION_ADDED + const eventType = Events.ANNOTATION_ADDED const eventDetail: AnnotationAddedEventDetail = { annotation, @@ -103,7 +103,7 @@ function removeAnnotation(element: HTMLElement, annotationUID: string): void { const { renderingEngine } = enabledElement const { viewportUID } = enabledElement - const eventType = EVENTS.ANNOTATION_REMOVED + const eventType = Events.ANNOTATION_REMOVED const eventDetail: AnnotationRemovedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/annotationStyle.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/annotationStyle.ts similarity index 60% rename from packages/cornerstone-tools/src/stateManagement/annotation/annotationStyle.ts rename to packages/cornerstone-tools/src/stateManagement/annotation/config/annotationStyle.ts index 5337f9344c..113fb3a5aa 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/annotationStyle.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/annotationStyle.ts @@ -1,12 +1,5 @@ import { Settings } from '@precisionmetrics/cornerstone-render' -import { ToolModes, AnnotationStyleStates } from '../../enums' -import { Annotation } from '../../types' -import { isAnnotationLocked } from './annotationLocking' -import { isAnnotationSelected } from './annotationSelection' -import state from '../../store/state' -/* - * Initialization - */ +import { ToolModes, AnnotationStyleStates } from '../../../enums' Settings.getDefaultSettings().set('tool.style', { color: 'rgb(255, 255, 0)', @@ -125,71 +118,4 @@ function getDefaultStyleProperty( return getStyleProperty(Settings.getRuntimeSettings(), property, state, mode) } -/** - * getFont - Returns a font string of the form "{fontSize}px fontName" used by `canvas`. - * @param settings - An optional Settings instance to read from. - * @param state - An optional state to determine the final property name - * @param mode - An optional mode to determine the final property name - * @returns The font string. - */ -function getFont( - settings?: Settings, - state?: AnnotationStyleStates, - mode?: ToolModes -): string { - const sty = Settings.assert(settings) - const fontSize = getStyleProperty(sty, 'textBox.fontSize', state, mode) - const fontFamily = getStyleProperty(sty, 'textBox.fontFamily', state, mode) - return `${fontSize}px ${fontFamily}` -} - -/** - * Given a Annotation object, return the annotationStyleStates that it - * should be in based on its data - * @param annotation - The annotation that we want to style. - * @returns The state of the annotation whether it is Default, Highlighted, Locked, or Selected. - */ -function getAnnotationStyle(annotation?: Annotation): AnnotationStyleStates { - if (annotation) { - if (annotation.data && annotation.highlighted) - return AnnotationStyleStates.Highlighted - if (isAnnotationSelected(annotation)) return AnnotationStyleStates.Selected - if (isAnnotationLocked(annotation)) return AnnotationStyleStates.Locked - } - - return AnnotationStyleStates.Default -} - -/** - * Set the style of an annotation object - * @param string - toolName - The name of the tool. - * @param annotation - The annotation object. - * @param style - The style object to set. - * @returns A boolean value indicating whether the style was set. - */ -function setAnnotationStyle( - toolName: string, - annotation: Record, - style: Record -): boolean { - const descriptor = state.tools[toolName] - if (descriptor) { - const { toolClass } = descriptor - return Settings.getObjectSettings(annotation, toolClass).set( - 'tool.style', - style - ) - } - return false -} - -export { - initializeDefaultStyleAlternatives, - getStyleAlternatives, - getStyleProperty, - getDefaultStyleProperty, - getFont, - // annotation style set/get - getAnnotationStyle, - setAnnotationStyle, -} +export { getStyleProperty, getDefaultStyleProperty } diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/config/getFont.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/getFont.ts new file mode 100644 index 0000000000..306e7783d9 --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/getFont.ts @@ -0,0 +1,23 @@ +import { Settings } from '@precisionmetrics/cornerstone-render' +import { ToolModes, AnnotationStyleStates } from '../../../enums' +import { getStyleProperty } from './annotationStyle' + +/** + * getFont - Returns a font string of the form "{fontSize}px fontName" used by `canvas`. + * @param settings - An optional Settings instance to read from. + * @param state - An optional state to determine the final property name + * @param mode - An optional mode to determine the final property name + * @returns The font string. + */ +function getFont( + settings?: Settings, + state?: AnnotationStyleStates, + mode?: ToolModes +): string { + const sty = Settings.assert(settings) + const fontSize = getStyleProperty(sty, 'textBox.fontSize', state, mode) + const fontFamily = getStyleProperty(sty, 'textBox.fontFamily', state, mode) + return `${fontSize}px ${fontFamily}` +} + +export default getFont diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/config/getState.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/getState.ts new file mode 100644 index 0000000000..4d207a171b --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/getState.ts @@ -0,0 +1,23 @@ +import { Annotation } from '../../../types' +import { isAnnotationLocked } from '../annotationLocking' +import { isAnnotationSelected } from '../annotationSelection' +import { AnnotationStyleStates } from '../../../enums' + +/** + * Given a Annotation object, return the annotationStyle State that it + * should be in based on its data + * @param annotation - The annotation that we want to style. + * @returns The state of the annotation whether it is Default, Highlighted, Locked, or Selected. + */ +function getState(annotation?: Annotation): AnnotationStyleStates { + if (annotation) { + if (annotation.data && annotation.highlighted) + return AnnotationStyleStates.Highlighted + if (isAnnotationSelected(annotation)) return AnnotationStyleStates.Selected + if (isAnnotationLocked(annotation)) return AnnotationStyleStates.Locked + } + + return AnnotationStyleStates.Default +} + +export default getState diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/getStyle.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/getStyle.ts similarity index 96% rename from packages/cornerstone-tools/src/stateManagement/annotation/getStyle.ts rename to packages/cornerstone-tools/src/stateManagement/annotation/config/getStyle.ts index 6e30fb003d..564f43dcfe 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/getStyle.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/getStyle.ts @@ -1,5 +1,5 @@ import { Settings } from '@precisionmetrics/cornerstone-render' -import state from '../../store/state' +import state from '../../../store/state' /** * Get the style for a tool based on provided information. diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/config/index.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/index.ts new file mode 100644 index 0000000000..91b1ec6019 --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/index.ts @@ -0,0 +1,15 @@ +import getState from './getState' +import getStyle from './getStyle' +import getFont from './getFont' +import setAnnotationStyle from './setAnnotationStyle' +import setGlobalStyle from './setGlobalStyle' +import setToolStyle from './setToolStyle' + +export { + getState, + getStyle, + getFont, + setAnnotationStyle, + setGlobalStyle, + setToolStyle, +} diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/config/setAnnotationStyle.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/setAnnotationStyle.ts new file mode 100644 index 0000000000..16b2d7b36f --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/setAnnotationStyle.ts @@ -0,0 +1,27 @@ +import { Settings } from '@precisionmetrics/cornerstone-render' +import state from '../../../store/state' + +/** + * Set the style of an annotation object + * @param string - toolName - The name of the tool. + * @param annotation - The annotation object. + * @param style - The style object to set. + * @returns A boolean value indicating whether the style was set. + */ +function setAnnotationStyle( + toolName: string, + annotation: Record, + style: Record +): boolean { + const descriptor = state.tools[toolName] + if (descriptor) { + const { toolClass } = descriptor + return Settings.getObjectSettings(annotation, toolClass).set( + 'tool.style', + style + ) + } + return false +} + +export default setAnnotationStyle diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/setGlobalStyle.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/setGlobalStyle.ts similarity index 100% rename from packages/cornerstone-tools/src/stateManagement/annotation/setGlobalStyle.ts rename to packages/cornerstone-tools/src/stateManagement/annotation/config/setGlobalStyle.ts diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/setToolStyle.ts b/packages/cornerstone-tools/src/stateManagement/annotation/config/setToolStyle.ts similarity index 93% rename from packages/cornerstone-tools/src/stateManagement/annotation/setToolStyle.ts rename to packages/cornerstone-tools/src/stateManagement/annotation/config/setToolStyle.ts index 51613da502..abe6efd527 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/setToolStyle.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/config/setToolStyle.ts @@ -1,5 +1,5 @@ import { Settings } from '@precisionmetrics/cornerstone-render' -import state from '../../store/state' +import state from '../../../store/state' /** * Set the style of a specific tool with the provided toolName diff --git a/packages/cornerstone-tools/src/stateManagement/annotation/index.ts b/packages/cornerstone-tools/src/stateManagement/annotation/index.ts index b29b16286a..604aae88bc 100644 --- a/packages/cornerstone-tools/src/stateManagement/annotation/index.ts +++ b/packages/cornerstone-tools/src/stateManagement/annotation/index.ts @@ -1,3 +1,6 @@ -import * as AnnotationState from './annotationState' +import * as config from './config' +import * as locking from './annotationLocking' +import * as selection from './annotationSelection' +import * as state from './annotationState' -export default AnnotationState +export { config, locking, selection, state } diff --git a/packages/cornerstone-tools/src/stateManagement/index.js b/packages/cornerstone-tools/src/stateManagement/index.js index 672fcdbc42..1679d28dcf 100644 --- a/packages/cornerstone-tools/src/stateManagement/index.js +++ b/packages/cornerstone-tools/src/stateManagement/index.js @@ -1,10 +1,9 @@ import FrameOfReferenceSpecificAnnotationManager, { defaultFrameOfReferenceSpecificAnnotationManager, } from './annotation/FrameOfReferenceSpecificAnnotationManager' -import * as annotationStyle from './annotation/annotationStyle' -import getStyle from './annotation/getStyle' -import setGlobalStyle from './annotation/setGlobalStyle' -import setToolStyle from './annotation/setToolStyle' +import getStyle from './annotation/config/getStyle' +import setGlobalStyle from './annotation/config/setGlobalStyle' +import setToolStyle from './annotation/config/setToolStyle' import * as annotationLocking from './annotation/annotationLocking' import * as annotationSelection from './annotation/annotationSelection' @@ -18,15 +17,8 @@ import { } from './annotation/annotationState' import { - getGlobalSegmentationDataByUID, - getSegmentationState, - getColorLut, addSegmentationsForToolGroup, - removeSegmentationsForToolGroup, - getGlobalSegmentationState, - getSegmentationDataByUID, - getToolGroupsWithSegmentation, - SegmentationState, + removeSegmentationsFromToolGroup, } from './segmentation' export { @@ -35,7 +27,6 @@ export { defaultFrameOfReferenceSpecificAnnotationManager, annotationLocking, annotationSelection, - annotationStyle, getAnnotations, addAnnotation, getStyle, @@ -47,12 +38,5 @@ export { getAnnotation, // segmentations addSegmentationsForToolGroup, - getGlobalSegmentationDataByUID, - getSegmentationState, - getColorLut, - removeSegmentationsForToolGroup, - getGlobalSegmentationState, - getToolGroupsWithSegmentation, - getSegmentationDataByUID, - SegmentationState, + removeSegmentationsFromToolGroup, } diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/SegmentationStateManager.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/SegmentationStateManager.ts index c15ed3b1fb..d2b6530f1a 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/SegmentationStateManager.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/SegmentationStateManager.ts @@ -1,8 +1,7 @@ import cloneDeep from 'lodash.clonedeep' +import { utilities as csUtils } from '@precisionmetrics/cornerstone-render' -import { Utilities as csUtils } from '@precisionmetrics/cornerstone-render' - -import { addColorLUT } from './colorLUT' +import CORNERSTONE_COLOR_LUT from './helpers/COLOR_LUT' import { SegmentationState, @@ -265,7 +264,7 @@ export default class SegmentationStateManager { * @param colorLut - ColorLUT * @param lutIndex - The index of the color LUT table to add. */ - addColorLut(colorLut: ColorLUT, lutIndex: number): void { + addColorLUT(colorLut: ColorLUT, lutIndex: number): void { if (this.state.colorLutTables[lutIndex]) { console.log('Color LUT table already exists, overwriting') } @@ -464,7 +463,7 @@ export default class SegmentationStateManager { this.state.colorLutTables.length === 0 || !this.state.colorLutTables[0] ) { - addColorLUT(0) + this.addColorLUT(CORNERSTONE_COLOR_LUT as ColorLUT, 0) } } } diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/activeSegmentationController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/activeSegmentation.ts similarity index 95% rename from packages/cornerstone-tools/src/store/SegmentationModule/activeSegmentationController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/activeSegmentation.ts index f0c1e898eb..e793c642f9 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/activeSegmentationController.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/activeSegmentation.ts @@ -2,7 +2,7 @@ import { getActiveSegmentationData, setActiveSegmentationData, getGlobalSegmentationDataByUID, -} from '../../stateManagement/segmentation/segmentationState' +} from './segmentationState' /** * Get the active segmentation info for the first viewport in the tool group with diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/addSegmentationsForToolGroup.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/addSegmentationsForToolGroup.ts index 0875055bf1..e2a71df618 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/addSegmentationsForToolGroup.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/addSegmentationsForToolGroup.ts @@ -1,11 +1,11 @@ -import { Utilities as csUtils } from '@precisionmetrics/cornerstone-render' +import { utilities as csUtils } from '@precisionmetrics/cornerstone-render' import _cloneDeep from 'lodash.clonedeep' import { SegmentationDataInput, SegmentationConfig, } from '../../types/SegmentationStateTypes' -import { checkSegmentationDataIsValid } from './utils' +import { checkSegmentationDataIsValid } from './helpers' import Representations from '../../enums/SegmentationRepresentations' import { getToolGroupByToolGroupUID } from '../../store/ToolGroupManager' diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/colorLUT.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/colorLUT.ts deleted file mode 100644 index 0448f63f6f..0000000000 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/colorLUT.ts +++ /dev/null @@ -1,141 +0,0 @@ -// import state, { Color, ColorLUT, getLabelmapStateForElement } from './state' -import { ColorLUT } from '../../types/SegmentationStateTypes' -import { addColorLut } from './segmentationState' - -const SEGMENTS_PER_SEGMENTATION = 65535 // Todo: max is bigger, but it seems cfun can go upto 255 anyway - -/** - * addColorLUT - Adds a new color LUT to the state at the given colorLUTIndex. - * If no colorLUT is provided, a new color LUT is generated. - * - * @param {number} colorLUTIndex the index of the colorLUT in the state - * @param {number[][]} [colorLUT] An array of The colorLUT to set. - * @returns {null} - */ -export function addColorLUT( - colorLUTIndex: number, - colorLUT: ColorLUT = [] -): void { - if (colorLUT) { - _checkColorLUTLength(colorLUT, SEGMENTS_PER_SEGMENTATION) - - if (colorLUT.length < SEGMENTS_PER_SEGMENTATION) { - colorLUT = [ - ...colorLUT, - ..._generateNewColorLUT(SEGMENTS_PER_SEGMENTATION - colorLUT.length), - ] - } - } else { - // Auto-generates colorLUT. - colorLUT = colorLUT || _generateNewColorLUT(SEGMENTS_PER_SEGMENTATION) - } - - // Append the "zero" (no label) color to the front of the LUT. - colorLUT.unshift([0, 0, 0, 0]) - - addColorLut(colorLUT, colorLUTIndex) -} - -/** - * Checks the length of `colorLUT` compared to `SEGMENTS_PER_SEGMENTATION` and flags up any warnings. - * @param {number[][]} colorLUT - * @param {number} SEGMENTS_PER_SEGMENTATION - * @returns {boolean} Whether the length is valid. - */ -function _checkColorLUTLength( - colorLUT: ColorLUT, - SEGMENTS_PER_SEGMENTATION: number -) { - if (colorLUT.length < SEGMENTS_PER_SEGMENTATION) { - console.warn( - `The provided colorLUT only provides ${colorLUT.length} labels, whereas SEGMENTS_PER_SEGMENTATION is set to ${SEGMENTS_PER_SEGMENTATION}. Autogenerating the rest.` - ) - } else if (colorLUT.length > SEGMENTS_PER_SEGMENTATION) { - console.warn( - `SEGMENTS_PER_SEGMENTATION is set to ${SEGMENTS_PER_SEGMENTATION}, and the provided colorLUT provides ${colorLUT.length}. Using the first ${SEGMENTS_PER_SEGMENTATION} colors from the LUT.` - ) - } -} - -let hueValue = 222.5 -let l = 0.6 -const goldenAngle = 137.5 -const maxL = 0.82 -const minL = 0.3 -const incL = 0.07 - -/** - * Generates a new color LUT (Look Up Table) of length `numberOfColors`, - * which returns an RGBA color for each segment index. - * - * @param {Number} numberOfColors = 255 The number of colors to generate - * @returns {Number[][]} The array of RGB values. - */ -function _generateNewColorLUT(numberOfColors = 255) { - const rgbArr = [] - - // reset every time we generate new colorLUT to be consistent between csTools initializations - hueValue = 222.5 - l = 0.6 - - for (let i = 0; i < numberOfColors; i++) { - rgbArr.push(getRGBAfromHSLA(getNextHue(), getNextL())) - } - - return rgbArr -} - -function getNextHue() { - hueValue += goldenAngle - - if (hueValue >= 360) { - hueValue -= 360 - } - - return hueValue -} - -function getNextL() { - l += incL - - if (l > maxL) { - const diff = l - maxL - - l = minL + diff - } - - return l -} - -/** - * GetRGBAfromHSL - Returns an RGBA color given H, S, L and A. - * - * @param {Number} hue The hue. - * @param {Number} s = 1 The saturation. - * @param {Number} l = 0.6 The lightness. - * @param {Number} alpha = 255 The alpha. - * @returns {Number[]} The RGBA formatted color. - */ -function getRGBAfromHSLA(hue, s = 1, l = 0.6, alpha = 255) { - const c = (1 - Math.abs(2 * l - 1)) * s - const x = c * (1 - Math.abs(((hue / 60) % 2) - 1)) - const m = l - c / 2 - - let r, g, b - - if (hue < 60) { - ;[r, g, b] = [c, x, 0] - } else if (hue < 120) { - ;[r, g, b] = [x, c, 0] - } else if (hue < 180) { - ;[r, g, b] = [0, c, x] - } else if (hue < 240) { - ;[r, g, b] = [0, x, c] - } else if (hue < 300) { - ;[r, g, b] = [x, 0, c] - } else if (hue < 360) { - ;[r, g, b] = [c, 0, x] - } - - return [(r + m) * 255, (g + m) * 255, (b + m) * 255, alpha] -} diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/createNewSegmentationForViewport.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/createNewSegmentationForToolGroup.ts similarity index 59% rename from packages/cornerstone-tools/src/store/SegmentationModule/createNewSegmentationForViewport.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/createNewSegmentationForToolGroup.ts index 2345445e7f..17c6cfe47a 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/createNewSegmentationForViewport.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/createNewSegmentationForToolGroup.ts @@ -1,24 +1,25 @@ import { _cloneDeep } from 'lodash.clonedeep' import { - getEnabledElement, - createAndCacheDerivedVolume, - createLocalVolume, + getEnabledElementByUIDs, + volumeLoader, VolumeViewport, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' +import { getToolGroupByToolGroupUID } from '../../store/ToolGroupManager' + /** - * Create a new 3D segmentation volume from the default imageData presented in the - * viewport. It looks at the metadata of the imageData to determine the volume - * dimensions and spacing if particular options are not provided. + * Create a new 3D segmentation volume from the default imageData presented in + * the first viewport of the toolGroup. It looks at the metadata of the imageData + * to determine the volume dimensions and spacing if particular options are not provided. * - * @param viewport - VolumeViewport + * @param toolGroupUID - The UID of the toolGroup * @param options - LabelmapOptions * @returns A promise that resolves to the UID of the new labelmap. */ -async function createNewSegmentationForViewport( - viewport: VolumeViewport, +async function createNewSegmentationForToolGroup( + toolGroupUID: string, options?: { volumeUID?: string scalarData?: Float32Array | Uint8Array @@ -32,13 +33,24 @@ async function createNewSegmentationForViewport( direction?: Float32Array } ): Promise { - const { element } = viewport - const enabledElement = getEnabledElement(element) + const toolGroup = getToolGroupByToolGroupUID(toolGroupUID) + + if (!toolGroup) { + throw new Error(`ToolGroup with UID ${toolGroupUID} not found`) + } + + const { viewportUID, renderingEngineUID } = toolGroup.viewportsInfo[0] + + const enabledElement = getEnabledElementByUIDs( + viewportUID, + renderingEngineUID + ) if (!enabledElement) { throw new Error('element disabled') } + const { viewport } = enabledElement if (!(viewport instanceof VolumeViewport)) { throw new Error('Segmentation not ready for stackViewport') } @@ -53,11 +65,11 @@ async function createNewSegmentationForViewport( // create a new labelmap with its own properties // This allows creation of a higher resolution labelmap vs reference volume const properties = _cloneDeep(options) - await createLocalVolume(properties, segmentationUID) + await volumeLoader.createLocalVolume(properties, segmentationUID) } else { // create a labelmap from a reference volume const { uid: volumeUID } = viewport.getDefaultActor() - await createAndCacheDerivedVolume(volumeUID, { + await volumeLoader.createAndCacheDerivedVolume(volumeUID, { uid: segmentationUID, }) } @@ -65,4 +77,4 @@ async function createNewSegmentationForViewport( return segmentationUID } -export default createNewSegmentationForViewport +export default createNewSegmentationForToolGroup diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/COLOR_LUT.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/COLOR_LUT.ts new file mode 100644 index 0000000000..d1c195009a --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/COLOR_LUT.ts @@ -0,0 +1,259 @@ +const CORNERSTONE_COLOR_LUT = [ + [0, 0, 0, 0], + [221, 84, 84, 255], + [77, 228, 121, 255], + [166, 70, 235, 255], + [189, 180, 116, 255], + [109, 182, 196, 255], + [204, 101, 157, 255], + [123, 211, 94, 255], + [93, 87, 218, 255], + [225, 128, 80, 255], + [73, 232, 172, 255], + [181, 119, 186, 255], + [176, 193, 112, 255], + [105, 153, 200, 255], + [208, 97, 120, 255], + [90, 215, 101, 255], + [135, 83, 222, 255], + [229, 178, 76, 255], + [122, 183, 181, 255], + [190, 115, 171, 255], + [149, 197, 108, 255], + [100, 118, 205, 255], + [212, 108, 93, 255], + [86, 219, 141, 255], + [183, 79, 226, 255], + [233, 233, 72, 255], + [118, 167, 187, 255], + [194, 111, 146, 255], + [116, 201, 104, 255], + [115, 96, 209, 255], + [216, 147, 89, 255], + [82, 223, 188, 255], + [230, 75, 224, 255], + [163, 184, 121, 255], + [114, 143, 191, 255], + [198, 107, 114, 255], + [99, 206, 122, 255], + [153, 92, 213, 255], + [220, 192, 85, 255], + [78, 215, 227, 255], + [234, 71, 173, 255], + [141, 188, 117, 255], + [110, 113, 195, 255], + [202, 128, 103, 255], + [95, 210, 157, 255], + [195, 88, 217, 255], + [206, 224, 81, 255], + [74, 166, 231, 255], + [185, 120, 139, 255], + [113, 192, 113, 255], + [133, 106, 199, 255], + [207, 162, 98, 255], + [91, 214, 198, 255], + [221, 84, 198, 255], + [159, 228, 77, 255], + [70, 111, 235, 255], + [189, 119, 116, 255], + [109, 196, 138, 255], + [165, 101, 204, 255], + [211, 201, 94, 255], + [87, 191, 218, 255], + [225, 80, 153, 255], + [106, 232, 73, 255], + [124, 119, 186, 255], + [193, 142, 112, 255], + [105, 200, 168, 255], + [203, 97, 208, 255], + [184, 215, 90, 255], + [83, 147, 222, 255], + [229, 76, 101, 255], + [122, 183, 130, 255], + [146, 115, 190, 255], + [197, 171, 108, 255], + [100, 205, 205, 255], + [212, 93, 177, 255], + [141, 219, 86, 255], + [79, 97, 226, 255], + [233, 99, 72, 255], + [118, 187, 150, 255], + [173, 111, 194, 255], + [197, 201, 104, 255], + [96, 171, 209, 255], + [216, 89, 137, 255], + [94, 223, 82, 255], + [107, 75, 230, 255], + [184, 153, 121, 255], + [114, 191, 175, 255], + [198, 107, 191, 255], + [166, 206, 99, 255], + [92, 132, 213, 255], + [220, 85, 91, 255], + [78, 227, 115, 255], + [159, 71, 234, 255], + [188, 176, 117, 255], + [110, 185, 195, 255], + [202, 103, 161, 255], + [129, 210, 95, 255], + [88, 88, 217, 255], + [224, 123, 81, 255], + [74, 231, 166, 255], + [177, 120, 185, 255], + [179, 192, 113, 255], + [106, 156, 199, 255], + [207, 98, 125, 255], + [91, 214, 96, 255], + [130, 84, 221, 255], + [228, 171, 77, 255], + [70, 235, 221, 255], + [189, 116, 174, 255], + [153, 196, 109, 255], + [101, 123, 204, 255], + [211, 104, 94, 255], + [87, 218, 136, 255], + [177, 80, 225, 255], + [232, 225, 73, 255], + [119, 169, 186, 255], + [193, 112, 149, 255], + [121, 200, 105, 255], + [111, 97, 208, 255], + [215, 142, 90, 255], + [83, 222, 181, 255], + [229, 76, 229, 255], + [165, 183, 122, 255], + [115, 146, 190, 255], + [197, 108, 119, 255], + [100, 205, 118, 255], + [148, 93, 212, 255], + [219, 186, 86, 255], + [79, 220, 226, 255], + [233, 72, 179, 255], + [144, 187, 118, 255], + [111, 118, 194, 255], + [201, 124, 104, 255], + [96, 209, 153, 255], + [189, 89, 216, 255], + [211, 223, 82, 255], + [75, 172, 230, 255], + [184, 121, 142, 255], + [117, 191, 114, 255], + [130, 107, 198, 255], + [206, 157, 99, 255], + [92, 213, 193, 255], + [220, 85, 203, 255], + [165, 227, 78, 255], + [71, 118, 234, 255], + [188, 117, 117, 255], + [110, 195, 135, 255], + [161, 103, 202, 255], + [210, 195, 95, 255], + [88, 195, 217, 255], + [224, 81, 158, 255], + [113, 231, 74, 255], + [123, 120, 185, 255], + [192, 139, 113, 255], + [106, 199, 164, 255], + [198, 98, 207, 255], + [188, 214, 91, 255], + [84, 153, 221, 255], + [228, 77, 108, 255], + [70, 235, 84, 255], + [143, 116, 189, 255], + [196, 167, 109, 255], + [101, 204, 199, 255], + [211, 94, 182, 255], + [147, 218, 87, 255], + [80, 104, 225, 255], + [232, 93, 73, 255], + [119, 186, 147, 255], + [170, 112, 193, 255], + [200, 200, 105, 255], + [97, 175, 208, 255], + [215, 90, 142, 255], + [100, 222, 83, 255], + [101, 76, 229, 255], + [183, 150, 122, 255], + [115, 190, 171, 255], + [197, 108, 194, 255], + [170, 205, 100, 255], + [93, 138, 212, 255], + [219, 86, 97, 255], + [79, 226, 110, 255], + [153, 72, 233, 255], + [187, 173, 118, 255], + [111, 187, 194, 255], + [201, 104, 165, 255], + [134, 209, 96, 255], + [89, 95, 216, 255], + [223, 117, 82, 255], + [75, 230, 159, 255], + [174, 121, 184, 255], + [182, 191, 114, 255], + [107, 160, 198, 255], + [206, 99, 130, 255], + [92, 213, 92, 255], + [124, 85, 220, 255], + [227, 165, 78, 255], + [71, 234, 214, 255], + [188, 117, 176, 255], + [156, 195, 110, 255], + [103, 128, 202, 255], + [210, 100, 95, 255], + [88, 217, 131, 255], + [170, 81, 224, 255], + [231, 218, 74, 255], + [120, 172, 185, 255], + [192, 113, 153, 255], + [125, 199, 106, 255], + [107, 98, 207, 255], + [214, 137, 91, 255], + [84, 221, 175, 255], + [222, 77, 228, 255], + [194, 235, 70, 255], + [116, 149, 189, 255], + [196, 109, 123, 255], + [101, 204, 114, 255], + [143, 94, 211, 255], + [218, 180, 87, 255], + [80, 225, 225, 255], + [232, 73, 186, 255], + [147, 186, 119, 255], + [112, 122, 193, 255], + [200, 121, 105, 255], + [97, 208, 148, 255], + [184, 90, 215, 255], + [216, 222, 83, 255], + [76, 178, 229, 255], + [183, 122, 145, 255], + [121, 190, 115, 255], + [126, 108, 197, 255], + [205, 153, 100, 255], + [93, 212, 187, 255], + [219, 86, 208, 255], + [171, 226, 79, 255], + [72, 126, 233, 255], + [187, 118, 121, 255], + [111, 194, 132, 255], + [157, 104, 201, 255], + [209, 190, 96, 255], + [89, 200, 216, 255], + [223, 82, 164, 255], + [120, 230, 75, 255], + [121, 121, 184, 255], + [191, 136, 114, 255], + [107, 198, 160, 255], + [192, 99, 206, 255], + [193, 213, 92, 255], + [85, 158, 220, 255], + [227, 78, 115, 255], + [71, 234, 78, 255], + [141, 117, 188, 255], + [195, 163, 110, 255], + [103, 202, 194, 255], + [210, 95, 186, 255], + [153, 217, 88, 255], + [81, 111, 224, 255], +] + +export default CORNERSTONE_COLOR_LUT diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/utils.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/checkSegmentationDataIsValid.ts similarity index 84% rename from packages/cornerstone-tools/src/stateManagement/segmentation/utils.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/helpers/checkSegmentationDataIsValid.ts index 67f6b95314..bc6bd76bed 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/utils.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/checkSegmentationDataIsValid.ts @@ -1,4 +1,4 @@ -import { SegmentationDataInput } from '../../types/SegmentationStateTypes' +import { SegmentationDataInput } from '../../../types/SegmentationStateTypes' /** * Checks if the segmentationDataArray is valid meaning it contains @@ -22,4 +22,4 @@ function checkSegmentationDataIsValid( }) } -export { checkSegmentationDataIsValid } +export default checkSegmentationDataIsValid diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/index.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/index.ts new file mode 100644 index 0000000000..206d1859f9 --- /dev/null +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/index.ts @@ -0,0 +1,9 @@ +import checkSegmentationDataIsValid from './checkSegmentationDataIsValid' +import internalAddSegmentationToElement from './internalAddSegmentationToElement' +import internalRemoveSegmentationFromElement from './internalRemoveSegmentationFromElement' + +export { + checkSegmentationDataIsValid, + internalAddSegmentationToElement, + internalRemoveSegmentationFromElement, +} diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/internalAddSegmentationToElement.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalAddSegmentationToElement.ts similarity index 88% rename from packages/cornerstone-tools/src/store/SegmentationModule/internalAddSegmentationToElement.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalAddSegmentationToElement.ts index 7c79701fd1..67c29c37fd 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/internalAddSegmentationToElement.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalAddSegmentationToElement.ts @@ -1,10 +1,10 @@ import { getEnabledElement, - addVolumesOnViewports, + addVolumesToViewports, } from '@precisionmetrics/cornerstone-render' -import SegmentationRepresentations from '../../enums/SegmentationRepresentations' -import { ToolGroupSpecificSegmentationData } from '../../types/SegmentationStateTypes' +import SegmentationRepresentations from '../../../enums/SegmentationRepresentations' +import { ToolGroupSpecificSegmentationData } from '../../../types/SegmentationStateTypes' /** * It adds a segmentation data to the viewport's HTML Element. NOTE: This function @@ -40,7 +40,7 @@ async function internalAddSegmentationToElement( if (representation.type === SegmentationRepresentations.Labelmap) { const { volumeUID } = segmentationData // Add labelmap volumes to the viewports to be be rendered, but not force the render - await addVolumesOnViewports( + await addVolumesToViewports( renderingEngine, [ { diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/internalRemoveSegmentationFromElement.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalRemoveSegmentationFromElement.ts similarity index 87% rename from packages/cornerstone-tools/src/store/SegmentationModule/internalRemoveSegmentationFromElement.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalRemoveSegmentationFromElement.ts index 321186f636..62dc8381e1 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/internalRemoveSegmentationFromElement.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/helpers/internalRemoveSegmentationFromElement.ts @@ -2,8 +2,8 @@ import { getEnabledElement, VolumeViewport, } from '@precisionmetrics/cornerstone-render' -import { ToolGroupSpecificSegmentationData } from '../../types/SegmentationStateTypes' -import SegmentationRepresentations from '../../enums/SegmentationRepresentations' +import { ToolGroupSpecificSegmentationData } from '../../../types/SegmentationStateTypes' +import SegmentationRepresentations from '../../../enums/SegmentationRepresentations' /** * Remove the segmentation from the viewport's HTML Element. diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/index.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/index.ts index 5d585aed44..bb1e4dee29 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/index.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/index.ts @@ -1,26 +1,26 @@ -import { - getGlobalSegmentationState, - getGlobalSegmentationDataByUID, - getSegmentationState, - getColorLut, - getToolGroupsWithSegmentation, - getSegmentationDataByUID, -} from './segmentationState' - -import * as SegmentationState from './segmentationState' - import addSegmentationsForToolGroup from './addSegmentationsForToolGroup' -import removeSegmentationsForToolGroup from './removeSegmentationsForToolGroup' +import removeSegmentationsFromToolGroup from './removeSegmentationsFromToolGroup' +import createNewSegmentationForToolGroup from './createNewSegmentationForToolGroup' + +import * as activeSegmentation from './activeSegmentation' +import * as segmentLocking from './segmentLocking' +import * as segmentationColor from './segmentationColor' +import * as segmentationConfig from './segmentationConfig' +import * as state from './segmentationState' +import * as segmentationVisibility from './segmentationVisibility' +import * as segmentIndex from './segmentIndex' +import * as triggerSegmentationEvents from './triggerSegmentationEvents' export { - getGlobalSegmentationState, - getGlobalSegmentationDataByUID, - getSegmentationState, - getColorLut, - getToolGroupsWithSegmentation, - getSegmentationDataByUID, - // + state, + activeSegmentation, addSegmentationsForToolGroup, - removeSegmentationsForToolGroup, - SegmentationState, + removeSegmentationsFromToolGroup, + createNewSegmentationForToolGroup, + segmentLocking, + segmentationColor, + segmentationConfig, + segmentationVisibility, + segmentIndex, + triggerSegmentationEvents, } diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsForToolGroup.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts similarity index 96% rename from packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsForToolGroup.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts index 7340ec7f9b..a1f2e5af8d 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsForToolGroup.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts @@ -13,7 +13,7 @@ import { * containing at least volumeUID. If no representation type is provided, it will * assume the default labelmap representation should be removed from the viewports. */ -function removeSegmentationsForToolGroup( +function removeSegmentationsFromToolGroup( toolGroupUID: string, segmentationDataUIDs?: string[] | undefined ): void { @@ -64,4 +64,4 @@ function _removeSegmentation( } } -export default removeSegmentationsForToolGroup +export default removeSegmentationsFromToolGroup diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/segmentIndexController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentIndex.ts similarity index 93% rename from packages/cornerstone-tools/src/store/SegmentationModule/segmentIndexController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/segmentIndex.ts index 382d33a039..75e049cd6a 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/segmentIndexController.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentIndex.ts @@ -1,6 +1,6 @@ -import { getActiveSegmentationInfo } from './activeSegmentationController' -import { getGlobalSegmentationDataByUID } from '../../stateManagement/segmentation/segmentationState' -import { triggerSegmentationGlobalStateModified } from '.' +import { getActiveSegmentationInfo } from './activeSegmentation' +import { getGlobalSegmentationDataByUID } from './segmentationState' +import { triggerSegmentationGlobalStateModified } from './triggerSegmentationEvents' /** * Returns the active segment index for the active segmentation in the tool group diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/lockedSegmentController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentLocking.ts similarity index 98% rename from packages/cornerstone-tools/src/store/SegmentationModule/lockedSegmentController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/segmentLocking.ts index 5d930c6768..96e2ad269a 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/lockedSegmentController.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentLocking.ts @@ -1,4 +1,4 @@ -import { getActiveSegmentationInfo } from './activeSegmentationController' +import { getActiveSegmentationInfo } from './activeSegmentation' import { getGlobalSegmentationDataByUID } from '../../stateManagement/segmentation/segmentationState' import { triggerSegmentationGlobalStateModified } from './triggerSegmentationEvents' diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/segmentationColorController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationColor.ts similarity index 53% rename from packages/cornerstone-tools/src/store/SegmentationModule/segmentationColorController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/segmentationColor.ts index 6152120f11..c2d5af38b2 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/segmentationColorController.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationColor.ts @@ -1,6 +1,31 @@ +import { utilities } from '@precisionmetrics/cornerstone-render' import * as SegmentationState from '../../stateManagement/segmentation/segmentationState' - import { Color } from '../../types/SegmentationStateTypes' +import { ColorLUT } from '../../types/SegmentationStateTypes' + +/** + * addColorLUT - Adds a new color LUT to the state at the given colorLUTIndex. + * If no colorLUT is provided, a new color LUT is generated. + * + * @param colorLUTIndex - the index of the colorLUT in the state + * @param colorLUT - An array of The colorLUT to set. + * @returns + */ +function addColorLUT(colorLUT: ColorLUT, colorLUTIndex: number): void { + if (!colorLUT) { + throw new Error('addColorLUT: colorLUT is required') + } + + // Append the "zero" (no label) color to the front of the LUT, if necessary. + if (!utilities.isEqual(colorLUT[0], [0, 0, 0, 0])) { + console.warn( + 'addColorLUT: [0, 0, 0, 0] color is not provided for the background color (segmentIndex =0), automatically adding it' + ) + colorLUT.unshift([0, 0, 0, 0]) + } + + SegmentationState.addColorLUT(colorLUT, colorLUTIndex) +} /** * Given a tool group UID, a segmentation data UID, and a segment index, return the @@ -35,15 +60,5 @@ function getColorForSegmentIndex( return colorLut[segmentIndex] } -/** - * Add a color LUT to the segmentation state to be used by the segmentations - * @param colorLUT - A list of colors to be added to the color lookup table. - * @param colorLUTIndex - The index of the color LUT in the state to be - * updated. - */ -function addColorLut(colorLUT: Color[], colorLUTIndex = 0): void { - SegmentationState.addColorLut(colorLUT, colorLUTIndex) -} - -export default { getColorForSegmentIndex, addColorLut } -export { getColorForSegmentIndex, addColorLut } +export default { getColorForSegmentIndex, addColorLUT } +export { getColorForSegmentIndex, addColorLUT } diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/segmentationConfigController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationConfig.ts similarity index 100% rename from packages/cornerstone-tools/src/store/SegmentationModule/segmentationConfigController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/segmentationConfig.ts diff --git a/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationState.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationState.ts index c5da11ba8b..5704615697 100644 --- a/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationState.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationState.ts @@ -2,7 +2,7 @@ import { defaultSegmentationStateManager } from './SegmentationStateManager' import { triggerSegmentationStateModified, triggerSegmentationGlobalStateModified, -} from '../../store/SegmentationModule' +} from './triggerSegmentationEvents' import { GlobalSegmentationState, GlobalSegmentationData, @@ -283,9 +283,9 @@ function getColorLut(index: number): ColorLUT | undefined { * @param colorLut - The color LUT array to add. * @param index - The index of the color LUT to add. */ -function addColorLut(colorLut: ColorLUT, index: number): void { +function addColorLUT(colorLut: ColorLUT, index: number): void { const segmentationStateManager = getDefaultSegmentationStateManager() - segmentationStateManager.addColorLut(colorLut, index) + segmentationStateManager.addColorLUT(colorLut, index) // Todo: trigger event color LUT added } @@ -433,7 +433,7 @@ export { setGlobalSegmentationConfig, setSegmentationConfig, // colorLUT - addColorLut, + addColorLUT, getColorLut, // get/set global state getGlobalSegmentationState, diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/segmentationVisibilityController.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/segmentationVisibility.ts similarity index 100% rename from packages/cornerstone-tools/src/store/SegmentationModule/segmentationVisibilityController.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/segmentationVisibility.ts diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/triggerSegmentationEvents.ts b/packages/cornerstone-tools/src/stateManagement/segmentation/triggerSegmentationEvents.ts similarity index 91% rename from packages/cornerstone-tools/src/store/SegmentationModule/triggerSegmentationEvents.ts rename to packages/cornerstone-tools/src/stateManagement/segmentation/triggerSegmentationEvents.ts index bb9db902be..061b2d9a18 100644 --- a/packages/cornerstone-tools/src/store/SegmentationModule/triggerSegmentationEvents.ts +++ b/packages/cornerstone-tools/src/stateManagement/segmentation/triggerSegmentationEvents.ts @@ -1,6 +1,6 @@ import { triggerEvent, eventTarget } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getToolGroupsWithSegmentation, getToolGroups, @@ -22,7 +22,7 @@ function triggerSegmentationStateModified(toolGroupUID: string): void { toolGroupUID, } - triggerEvent(eventTarget, EVENTS.SEGMENTATION_STATE_MODIFIED, eventDetail) + triggerEvent(eventTarget, Events.SEGMENTATION_STATE_MODIFIED, eventDetail) } /** @@ -57,7 +57,7 @@ function triggerSegmentationGlobalStateModified( } triggerEvent( eventTarget, - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, eventDetail ) }) @@ -83,7 +83,7 @@ function triggerSegmentationDataModified( segmentationDataUID, } - triggerEvent(eventTarget, EVENTS.SEGMENTATION_DATA_MODIFIED, eventDetail) + triggerEvent(eventTarget, Events.SEGMENTATION_DATA_MODIFIED, eventDetail) } export { diff --git a/packages/cornerstone-tools/src/store/SegmentationModule/index.ts b/packages/cornerstone-tools/src/store/SegmentationModule/index.ts deleted file mode 100644 index 0e2c0b98ad..0000000000 --- a/packages/cornerstone-tools/src/store/SegmentationModule/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -// name spaces -import * as lockedSegmentController from './lockedSegmentController' -import * as segmentIndexController from './segmentIndexController' -import * as activeSegmentationController from './activeSegmentationController' -import * as segmentationVisibilityController from './segmentationVisibilityController' -import * as segmentationColorController from './segmentationColorController' -import * as segmentationConfigController from './segmentationConfigController' -// -import createNewSegmentationForViewport from './createNewSegmentationForViewport' -import { - triggerSegmentationStateModified, - triggerSegmentationGlobalStateModified, - triggerSegmentationDataModified, -} from './triggerSegmentationEvents' - -export { - createNewSegmentationForViewport, - activeSegmentationController, - segmentationVisibilityController, - segmentationColorController, - segmentIndexController, - lockedSegmentController, - segmentationConfigController, - triggerSegmentationStateModified, - triggerSegmentationGlobalStateModified, - triggerSegmentationDataModified, -} diff --git a/packages/cornerstone-tools/src/store/SynchronizerManager/Synchronizer.ts b/packages/cornerstone-tools/src/store/SynchronizerManager/Synchronizer.ts index b76659cad9..c9218f6a25 100644 --- a/packages/cornerstone-tools/src/store/SynchronizerManager/Synchronizer.ts +++ b/packages/cornerstone-tools/src/store/SynchronizerManager/Synchronizer.ts @@ -1,7 +1,7 @@ import { getRenderingEngine, getEnabledElement, - EVENTS as RENDERING_EVENTS, + Enums, Types, } from '@precisionmetrics/cornerstone-render' @@ -253,14 +253,8 @@ class Synchronizer { vUid.renderingEngineUID ).getViewport(vUid.viewportUID) - element.removeEventListener( - RENDERING_EVENTS.ELEMENT_DISABLED, - disableHandler - ) - element.addEventListener( - RENDERING_EVENTS.ELEMENT_DISABLED, - disableHandler - ) + element.removeEventListener(Enums.Events.ELEMENT_DISABLED, disableHandler) + element.addEventListener(Enums.Events.ELEMENT_DISABLED, disableHandler) }) } } diff --git a/packages/cornerstone-tools/src/store/ToolGroupManager/ToolGroup.ts b/packages/cornerstone-tools/src/store/ToolGroupManager/ToolGroup.ts index da02ebc5ae..20a5986e27 100644 --- a/packages/cornerstone-tools/src/store/ToolGroupManager/ToolGroup.ts +++ b/packages/cornerstone-tools/src/store/ToolGroupManager/ToolGroup.ts @@ -1,4 +1,4 @@ -import { ToolBindings, ToolModes } from '../../enums' +import { MouseBindings, ToolModes } from '../../enums' import { getRenderingEngine, getRenderingEngines, @@ -251,7 +251,7 @@ export default class ToolGroup implements IToolGroup { // Remove the primary button bindings if they exist toolOptions.bindings = toolOptions.bindings.filter( - (binding) => binding.mouseButton !== ToolBindings.Mouse.Primary + (binding) => binding.mouseButton !== MouseBindings.Primary ) // If there are other bindings, set the tool to be active @@ -383,7 +383,7 @@ export default class ToolGroup implements IToolGroup { private _hasMousePrimaryButtonBinding(toolOptions) { return toolOptions?.bindings?.some( (binding) => - binding.mouseButton === ToolBindings.Mouse.Primary && + binding.mouseButton === MouseBindings.Primary && binding.modifierKey === undefined ) } diff --git a/packages/cornerstone-tools/src/store/ToolGroupManager/destroyToolGroupByToolGroupUID.ts b/packages/cornerstone-tools/src/store/ToolGroupManager/destroyToolGroupByToolGroupUID.ts index 5a04198630..90673814a0 100644 --- a/packages/cornerstone-tools/src/store/ToolGroupManager/destroyToolGroupByToolGroupUID.ts +++ b/packages/cornerstone-tools/src/store/ToolGroupManager/destroyToolGroupByToolGroupUID.ts @@ -1,5 +1,5 @@ import { state } from '../index' -import { removeSegmentationsForToolGroup } from '../../stateManagement/segmentation' +import { removeSegmentationsFromToolGroup } from '../../stateManagement/segmentation' // ToolGroups function entirely by their "state" being queried and leveraged // removing a ToolGroup from state is equivalent to killing it @@ -17,7 +17,7 @@ function destroyToolGroupByToolGroupUID(toolGroupUID: string): void { if (toolGroupIndex > -1) { // Todo: this should not happen here) - removeSegmentationsForToolGroup(toolGroupUID) + removeSegmentationsFromToolGroup(toolGroupUID) state.toolGroups.splice(toolGroupIndex, 1) } } diff --git a/packages/cornerstone-tools/src/store/cancelActiveManipulations.ts b/packages/cornerstone-tools/src/store/cancelActiveManipulations.ts index d7eeca8767..e00cc13cce 100644 --- a/packages/cornerstone-tools/src/store/cancelActiveManipulations.ts +++ b/packages/cornerstone-tools/src/store/cancelActiveManipulations.ts @@ -7,7 +7,7 @@ import filterToolsWithAnnotationsForElement from './filterToolsWithAnnotationsFo * element. It filters all the active and passive tools for the enabledElement * and calls cancel() method for all of them, and returns the tool that has executed its * cancellation (returned its annotationUID), since tools that are not being manipulated will - * short circuit early + * short circuit early. Note: not all tools currently implement a cancel method. * * @param element - canvas element * @returns annotationUID that is cancelled diff --git a/packages/cornerstone-tools/src/store/index.ts b/packages/cornerstone-tools/src/store/index.ts index 4674e72790..8559b6a717 100644 --- a/packages/cornerstone-tools/src/store/index.ts +++ b/packages/cornerstone-tools/src/store/index.ts @@ -11,7 +11,6 @@ import state from './state' import * as ToolGroupManager from './ToolGroupManager' import * as SynchronizerManager from './SynchronizerManager' -import * as SegmentationModule from './SegmentationModule' export { // Store @@ -25,7 +24,6 @@ export { // Managers ToolGroupManager, SynchronizerManager, - SegmentationModule, // Classes Synchronizer, } diff --git a/packages/cornerstone-tools/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts b/packages/cornerstone-tools/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts index 281932ca53..ef903769de 100644 --- a/packages/cornerstone-tools/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +++ b/packages/cornerstone-tools/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts @@ -1,9 +1,9 @@ import { createSynchronizer } from '../../store/SynchronizerManager' -import { EVENTS as RENDERING_EVENTS } from '@precisionmetrics/cornerstone-render' +import { Enums } from '@precisionmetrics/cornerstone-render' import cameraSyncCallback from '../callbacks/cameraSyncCallback' import Synchronizer from '../../store/SynchronizerManager/Synchronizer' -const { CAMERA_MODIFIED } = RENDERING_EVENTS +const { CAMERA_MODIFIED } = Enums.Events /** * A helper that creates a new `Synchronizer` which listens to the `CAMERA_MODIFIED` diff --git a/packages/cornerstone-tools/src/synchronizers/synchronizers/createVOISynchronizer.ts b/packages/cornerstone-tools/src/synchronizers/synchronizers/createVOISynchronizer.ts index 5a6a59141c..31ef517252 100644 --- a/packages/cornerstone-tools/src/synchronizers/synchronizers/createVOISynchronizer.ts +++ b/packages/cornerstone-tools/src/synchronizers/synchronizers/createVOISynchronizer.ts @@ -1,5 +1,5 @@ import { createSynchronizer } from '../../store/SynchronizerManager' -import { EVENTS } from '@precisionmetrics/cornerstone-render' +import { Enums } from '@precisionmetrics/cornerstone-render' import voiSyncCallback from '../callbacks/voiSyncCallback' import Synchronizer from '../../store/SynchronizerManager/Synchronizer' @@ -16,7 +16,7 @@ export default function createVOISynchronizer( ): Synchronizer { const VOISynchronizer = createSynchronizer( synchronizerName, - EVENTS.VOI_MODIFIED, + Enums.Events.VOI_MODIFIED, voiSyncCallback ) diff --git a/packages/cornerstone-tools/src/tools/CrosshairsTool.ts b/packages/cornerstone-tools/src/tools/CrosshairsTool.ts index a4ad3d8f80..e5ad294a3f 100644 --- a/packages/cornerstone-tools/src/tools/CrosshairsTool.ts +++ b/packages/cornerstone-tools/src/tools/CrosshairsTool.ts @@ -4,9 +4,8 @@ import { getEnabledElementByUIDs, getEnabledElement, RenderingEngine, - Utilities as csUtils, + utilities as csUtils, VolumeViewport, - getVolumeViewportsContainingSameVolumes, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -22,7 +21,7 @@ import { } from '../drawingSvg' import { vec2, vec3 } from 'gl-matrix' import { state } from '../store' -import { CornerstoneTools3DEvents as EVENTS } from '../enums' +import { Events } from '../enums' import { getViewportUIDsWithToolToRender } from '../utilities/viewportFilters' import { resetElementCursor, hideElementCursor } from '../cursors/elementCursor' import { math } from '../utilities' @@ -569,7 +568,7 @@ export default class CrosshairsTool extends AnnotationTool { // AutoPan modification if (this.configuration.autoPan.enabled) { - const viewports = getVolumeViewportsContainingSameVolumes( + const viewports = csUtils.getVolumeViewportsContainingSameVolumes( viewport, renderingEngine.uid ) @@ -1809,23 +1808,23 @@ export default class CrosshairsTool extends AnnotationTool { _activateModify = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _deactivateModify = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _mouseUpCallback = ( diff --git a/packages/cornerstone-tools/src/tools/WindowLevelTool.ts b/packages/cornerstone-tools/src/tools/WindowLevelTool.ts index 48f503814a..30cbde0044 100644 --- a/packages/cornerstone-tools/src/tools/WindowLevelTool.ts +++ b/packages/cornerstone-tools/src/tools/WindowLevelTool.ts @@ -1,15 +1,13 @@ import { BaseTool } from './base' import { getEnabledElement, - getVolume, - EVENTS, + Enums, triggerEvent, VolumeViewport, StackViewport, - Utilities, + utilities, cache, Types, - getVolumeViewportsContainingVolumeUID, } from '@precisionmetrics/cornerstone-render' // Todo: should move to configuration @@ -59,10 +57,11 @@ export default class WindowLevelTool extends BaseTool { volumeUID = this.getTargetUID(viewport as VolumeViewport) ;({ volumeActor } = viewport.getActor(volumeUID)) rgbTransferFunction = volumeActor.getProperty().getRGBTransferFunction(0) - viewportsContainingVolumeUID = getVolumeViewportsContainingVolumeUID( - volumeUID, - renderingEngine.uid - ) + viewportsContainingVolumeUID = + utilities.getVolumeViewportsContainingVolumeUID( + volumeUID, + renderingEngine.uid + ) ;[lower, upper] = rgbTransferFunction.getRange() modality = cache.getVolume(volumeUID).metadata.Modality useDynamicRange = true @@ -99,7 +98,7 @@ export default class WindowLevelTool extends BaseTool { range: newRange, } - triggerEvent(element, EVENTS.VOI_MODIFIED, eventDetail) + triggerEvent(element, Enums.Events.VOI_MODIFIED, eventDetail) if (viewport instanceof StackViewport) { viewport.setProperties({ @@ -137,7 +136,7 @@ export default class WindowLevelTool extends BaseTool { const wwDelta = deltaPointsCanvas[0] * multiplier const wcDelta = deltaPointsCanvas[1] * multiplier - let { windowWidth, windowCenter } = Utilities.windowLevel.toWindowLevel( + let { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel( lower, upper ) @@ -148,7 +147,7 @@ export default class WindowLevelTool extends BaseTool { windowWidth = Math.max(windowWidth, 1) // Convert back to range - return Utilities.windowLevel.toLowHighRange(windowWidth, windowCenter) + return utilities.windowLevel.toLowHighRange(windowWidth, windowCenter) } _getMultiplyerFromDynamicRange(volumeUID) { @@ -169,7 +168,7 @@ export default class WindowLevelTool extends BaseTool { } _getImageDynamicRange = (volumeUID: string) => { - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) const { dimensions, scalarData } = imageVolume const middleSliceIndex = Math.floor(dimensions[2] / 2) diff --git a/packages/cornerstone-tools/src/tools/annotation/BidirectionalTool.ts b/packages/cornerstone-tools/src/tools/annotation/BidirectionalTool.ts index ede2c4730e..197bf93ba5 100644 --- a/packages/cornerstone-tools/src/tools/annotation/BidirectionalTool.ts +++ b/packages/cornerstone-tools/src/tools/annotation/BidirectionalTool.ts @@ -2,11 +2,11 @@ import { vec2, vec3 } from 'gl-matrix' import { Settings, getEnabledElement, - getVolume, StackViewport, triggerEvent, eventTarget, - Utilities as csUtils, + cache, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -24,7 +24,7 @@ import { drawLinkedTextBox as drawLinkedTextBoxSvg, } from '../../drawingSvg' import { state } from '../../store' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getViewportUIDsWithToolToRender } from '../../utilities/viewportFilters' import lineSegment from '../../utilities/math/line' import { getTextBoxCoordsCanvas } from '../../utilities/drawing' @@ -101,7 +101,7 @@ interface BidirectionalAnnotation extends Annotation { * toolGroup.setToolActive(BidirectionalTool.toolName, { * bindings: [ * { - * mouseButton: ToolBindings.Mouse.Primary, // Left Click + * mouseButton: MouseBindings.Primary, // Left Click * }, * ], * }) @@ -174,7 +174,7 @@ export default class BidirectionalTool extends AnnotationTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -930,51 +930,51 @@ export default class BidirectionalTool extends AnnotationTool { _activateDraw = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragDrawCallback) - element.addEventListener(EVENTS.MOUSE_MOVE, this._mouseDragDrawCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragDrawCallback) + element.addEventListener(Events.MOUSE_MOVE, this._mouseDragDrawCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragDrawCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragDrawCallback) } _deactivateDraw = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragDrawCallback) - element.removeEventListener(EVENTS.MOUSE_MOVE, this._mouseDragDrawCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragDrawCallback) + element.removeEventListener(Events.MOUSE_MOVE, this._mouseDragDrawCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragDrawCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragDrawCallback) } _activateModify = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragModifyCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragModifyCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragModifyCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragModifyCallback) } _deactivateModify = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) element.removeEventListener( - EVENTS.MOUSE_DRAG, + Events.MOUSE_DRAG, this._mouseDragModifyCallback ) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) // element.removeEventListener( - // EVENTS.TOUCH_DRAG, + // Events.TOUCH_DRAG, // this._mouseDragModifyCallback // ) } @@ -1259,7 +1259,7 @@ export default class BidirectionalTool extends AnnotationTool { annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/annotation/EllipticalRoiTool.ts b/packages/cornerstone-tools/src/tools/annotation/EllipticalRoiTool.ts index 199c21882e..cfd6e9f124 100644 --- a/packages/cornerstone-tools/src/tools/annotation/EllipticalRoiTool.ts +++ b/packages/cornerstone-tools/src/tools/annotation/EllipticalRoiTool.ts @@ -3,12 +3,12 @@ import { AnnotationTool } from '../base' import { getEnabledElement, Settings, - getVolume, StackViewport, VolumeViewport, eventTarget, triggerEvent, - Utilities as csUtils, + cache, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -26,7 +26,7 @@ import { drawLinkedTextBox as drawLinkedTextBoxSvg, } from '../../drawingSvg' import { state } from '../../store' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getViewportUIDsWithToolToRender } from '../../utilities/viewportFilters' import { getTextBoxCoordsCanvas } from '../../utilities/drawing' import getWorldWidthAndHeightFromTwoPoints from '../../utilities/planar/getWorldWidthAndHeightFromTwoPoints' @@ -114,7 +114,7 @@ export interface EllipticalRoiAnnotation extends Annotation { * toolGroup.setToolActive(EllipticalRoiTool.toolName, { * bindings: [ * { - * mouseButton: ToolBindings.Mouse.Primary, // Left Click + * mouseButton: MouseBindings.Primary, // Left Click * }, * ], * }) @@ -191,7 +191,7 @@ export default class EllipticalRoiTool extends AnnotationTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -688,27 +688,27 @@ export default class EllipticalRoiTool extends AnnotationTool { _activateModify = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragModifyCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragModifyCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragModifyCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragModifyCallback) } _deactivateModify = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) element.removeEventListener( - EVENTS.MOUSE_DRAG, + Events.MOUSE_DRAG, this._mouseDragModifyCallback ) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) // element.removeEventListener( - // EVENTS.TOUCH_DRAG, + // Events.TOUCH_DRAG, // this._mouseDragModifyCallback // ) } @@ -716,25 +716,25 @@ export default class EllipticalRoiTool extends AnnotationTool { _activateDraw = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragDrawCallback) - element.addEventListener(EVENTS.MOUSE_MOVE, this._mouseDragDrawCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragDrawCallback) + element.addEventListener(Events.MOUSE_MOVE, this._mouseDragDrawCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragDrawCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragDrawCallback) } _deactivateDraw = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragDrawCallback) - element.removeEventListener(EVENTS.MOUSE_MOVE, this._mouseDragDrawCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragDrawCallback) + element.removeEventListener(Events.MOUSE_MOVE, this._mouseDragDrawCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragDrawCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragDrawCallback) } /** @@ -1118,7 +1118,7 @@ export default class EllipticalRoiTool extends AnnotationTool { annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/annotation/LengthTool.ts b/packages/cornerstone-tools/src/tools/annotation/LengthTool.ts index 5e5f327095..431ba23201 100644 --- a/packages/cornerstone-tools/src/tools/annotation/LengthTool.ts +++ b/packages/cornerstone-tools/src/tools/annotation/LengthTool.ts @@ -1,12 +1,12 @@ -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getEnabledElement, - getVolume, + cache, StackViewport, Settings, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -97,7 +97,7 @@ interface LengthAnnotation extends Annotation { * toolGroup.setToolActive(LengthTool.toolName, { * bindings: [ * { - * mouseButton: ToolBindings.Mouse.Primary, // Left Click + * mouseButton: MouseBindings.Primary, // Left Click * }, * ], * }) @@ -173,7 +173,7 @@ class LengthTool extends AnnotationTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -508,47 +508,47 @@ class LengthTool extends AnnotationTool { _activateModify = (element: HTMLElement) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _deactivateModify = (element: HTMLElement) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _activateDraw = (element: HTMLElement) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_MOVE, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_MOVE, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _deactivateDraw = (element: HTMLElement) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_MOVE, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_MOVE, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -766,7 +766,7 @@ class LengthTool extends AnnotationTool { annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/annotation/ProbeTool.ts b/packages/cornerstone-tools/src/tools/annotation/ProbeTool.ts index 35856de078..9e67a38ffb 100644 --- a/packages/cornerstone-tools/src/tools/annotation/ProbeTool.ts +++ b/packages/cornerstone-tools/src/tools/annotation/ProbeTool.ts @@ -4,12 +4,12 @@ import { vec2 } from 'gl-matrix' import { getEnabledElement, Settings, - getVolume, + cache, StackViewport, VolumeViewport, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -25,7 +25,7 @@ import { } from '../../drawingSvg' import { state } from '../../store' import transformPhysicalToIndex from '../../utilities/transformPhysicalToIndex' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getViewportUIDsWithToolToRender } from '../../utilities/viewportFilters' import { resetElementCursor, @@ -90,7 +90,7 @@ interface ProbeAnnotation extends Annotation { * toolGroup.setToolActive(ProbeTool.toolName, { * bindings: [ * { - * mouseButton: ToolBindings.Mouse.Primary, // Left Click + * mouseButton: MouseBindings.Primary, // Left Click * }, * ], * }) @@ -161,7 +161,7 @@ export default class ProbeTool extends AnnotationTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -380,23 +380,23 @@ export default class ProbeTool extends AnnotationTool { _activateModify = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } _deactivateModify = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -649,7 +649,7 @@ export default class ProbeTool extends AnnotationTool { annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/annotation/RectangleRoiTool.ts b/packages/cornerstone-tools/src/tools/annotation/RectangleRoiTool.ts index 54e54b1c61..214578718b 100644 --- a/packages/cornerstone-tools/src/tools/annotation/RectangleRoiTool.ts +++ b/packages/cornerstone-tools/src/tools/annotation/RectangleRoiTool.ts @@ -2,13 +2,13 @@ import { AnnotationTool } from '../base' import { getEnabledElement, - getVolume, + cache, Settings, StackViewport, VolumeViewport, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' @@ -27,7 +27,7 @@ import { drawRect as drawRectSvg, } from '../../drawingSvg' import { state } from '../../store' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { getViewportUIDsWithToolToRender } from '../../utilities/viewportFilters' import rectangle from '../../utilities/math/rectangle' import { getTextBoxCoordsCanvas } from '../../utilities/drawing' @@ -89,7 +89,7 @@ interface RectangleRoiCachedStats { * toolGroup.setToolActive(RectangleRoiAnnotation.toolName, { * bindings: [ * { - * mouseButton: ToolBindings.Mouse.Primary, // Left Click + * mouseButton: MouseBindings.Primary, // Left Click * }, * ], * }) @@ -186,7 +186,7 @@ export default class RectangleRoiTool extends AnnotationTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -586,13 +586,13 @@ export default class RectangleRoiTool extends AnnotationTool { _activateDraw = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_MOVE, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_MOVE, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -601,13 +601,13 @@ export default class RectangleRoiTool extends AnnotationTool { _deactivateDraw = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_MOVE, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_MOVE, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -616,12 +616,12 @@ export default class RectangleRoiTool extends AnnotationTool { _activateModify = (element) => { state.isInteractingWithTool = true - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -630,12 +630,12 @@ export default class RectangleRoiTool extends AnnotationTool { _deactivateModify = (element) => { state.isInteractingWithTool = false - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** @@ -1026,7 +1026,7 @@ export default class RectangleRoiTool extends AnnotationTool { annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/base/AnnotationTool.ts b/packages/cornerstone-tools/src/tools/base/AnnotationTool.ts index 050934b1ae..04e477363b 100644 --- a/packages/cornerstone-tools/src/tools/base/AnnotationTool.ts +++ b/packages/cornerstone-tools/src/tools/base/AnnotationTool.ts @@ -1,5 +1,5 @@ import { - Utilities, + utilities, getEnabledElement, VolumeViewport, Settings, @@ -20,8 +20,8 @@ import { } from '../../types' import triggerAnnotationRender from '../../utilities/triggerAnnotationRender' import filterAnnotationsForDisplay from '../../utilities/planar/filterAnnotationsForDisplay' -import { getStyleProperty } from '../../stateManagement/annotation/annotationStyle' -import { getAnnotationStyle } from '../../stateManagement/annotation/annotationStyle' +import { getStyleProperty } from '../../stateManagement/annotation/config/annotationStyle' +import { getState } from '../../stateManagement/annotation/config' /** * Abstract class for tools which create and display annotations on the @@ -222,7 +222,7 @@ abstract class AnnotationTool extends BaseTool { const calibratedIndexToWorld = calibratedImageData.getIndexToWorld() - const imageURI = Utilities.imageIdToURI(imageId) + const imageURI = utilities.imageIdToURI(imageId) const stateManager = getViewportSpecificAnnotationManager(element) const framesOfReference = stateManager.getFramesOfReference() @@ -364,12 +364,7 @@ abstract class AnnotationTool extends BaseTool { property: string, annotation?: Annotation ): unknown { - return getStyleProperty( - settings, - property, - getAnnotationStyle(annotation), - this.mode - ) + return getStyleProperty(settings, property, getState(annotation), this.mode) } /** diff --git a/packages/cornerstone-tools/src/tools/base/BaseTool.ts b/packages/cornerstone-tools/src/tools/base/BaseTool.ts index dca5b26121..e0f86acbbb 100644 --- a/packages/cornerstone-tools/src/tools/base/BaseTool.ts +++ b/packages/cornerstone-tools/src/tools/base/BaseTool.ts @@ -2,7 +2,7 @@ import { StackViewport, Types, VolumeViewport, - getVolume, + cache, } from '@precisionmetrics/cornerstone-render' import type { RenderingEngine } from '@precisionmetrics/cornerstone-render' import deepMerge from '../../utilities/deepMerge' @@ -111,7 +111,7 @@ abstract class BaseTool implements IBaseTool { * from the volumeUID if particularly specified in the tool configuration, or if * not, the first actorUID in the viewport is returned as the volumeUID. NOTE: for * segmentations, actorUID is not necessarily the volumeUID since the segmentation - * can have multiple representations, use SegmentationModule to get the volumeUID + * can have multiple representations, use segmentation helpers to get the volumeUID * based on the actorUID. * * @param viewport - Volume viewport @@ -162,7 +162,7 @@ abstract class BaseTool implements IBaseTool { viewport = renderingEngine.getViewport(viewportUID) image = viewport.getImageData() } else { - image = getVolume(targetUID) + image = cache.getVolume(targetUID) } return { image, viewport } diff --git a/packages/cornerstone-tools/src/tools/displayTools/Labelmap/LabelmapDisplay.ts b/packages/cornerstone-tools/src/tools/displayTools/Labelmap/LabelmapDisplay.ts index 01afe96f97..a44613d926 100644 --- a/packages/cornerstone-tools/src/tools/displayTools/Labelmap/LabelmapDisplay.ts +++ b/packages/cornerstone-tools/src/tools/displayTools/Labelmap/LabelmapDisplay.ts @@ -17,8 +17,10 @@ import { ToolGroupSpecificSegmentationData, } from '../../../types/SegmentationStateTypes' -import internalAddSegmentationToElement from '../../../store/SegmentationModule/internalAddSegmentationToElement' -import internalRemoveSegmentationFromElement from '../../../store/SegmentationModule/internalRemoveSegmentationFromElement' +import { + internalAddSegmentationToElement, + internalRemoveSegmentationFromElement, +} from '../../../stateManagement/segmentation/helpers' import { deepMerge } from '../../../utilities' import { IToolGroup } from '../../../types' @@ -297,7 +299,7 @@ function _removeLabelmapFromToolGroupViewports( const { viewportUID, renderingEngineUID } = viewportInfo const enabledElement = getEnabledElementByUIDs( viewportUID, - renderingEngineUID, + renderingEngineUID ) internalRemoveSegmentationFromElement( enabledElement.viewport.element, @@ -317,7 +319,7 @@ async function _addLabelmapToToolGroupViewports( const { viewportUID, renderingEngineUID } = viewportInfo const enabledElement = getEnabledElementByUIDs( viewportUID, - renderingEngineUID, + renderingEngineUID ) if (!enabledElement) { diff --git a/packages/cornerstone-tools/src/tools/displayTools/SegmentationDisplayTool.ts b/packages/cornerstone-tools/src/tools/displayTools/SegmentationDisplayTool.ts index 5c7e801dbb..e317da1949 100644 --- a/packages/cornerstone-tools/src/tools/displayTools/SegmentationDisplayTool.ts +++ b/packages/cornerstone-tools/src/tools/displayTools/SegmentationDisplayTool.ts @@ -3,10 +3,8 @@ import { getEnabledElementByUIDs } from '@precisionmetrics/cornerstone-render' import Representations from '../../enums/SegmentationRepresentations' import { getSegmentationState } from '../../stateManagement/segmentation/segmentationState' import { LabelmapDisplay } from './Labelmap' -import { - triggerSegmentationStateModified, - segmentationConfigController, -} from '../../store/SegmentationModule' +import { segmentationConfig } from '../../stateManagement/segmentation' +import { triggerSegmentationStateModified } from '../../stateManagement/segmentation/triggerSegmentationEvents' import { getToolGroupByToolGroupUID } from '../../store/ToolGroupManager' import { ToolGroupSpecificSegmentationData, @@ -114,7 +112,7 @@ export default class SegmentationDisplayTool extends BaseTool { ({ renderingEngineUID, viewportUID }) => { const enabledElement = getEnabledElementByUIDs( viewportUID, - renderingEngineUID, + renderingEngineUID ) if (enabledElement) { @@ -149,10 +147,9 @@ export default class SegmentationDisplayTool extends BaseTool { _getSegmentationConfig(toolGroupUID: string): SegmentationConfig { const toolGroupConfig = - segmentationConfigController.getSegmentationConfig(toolGroupUID) + segmentationConfig.getSegmentationConfig(toolGroupUID) - const globalConfig = - segmentationConfigController.getGlobalSegmentationConfig() + const globalConfig = segmentationConfig.getGlobalSegmentationConfig() // merge two configurations and override the global config const mergedConfig = deepMerge(globalConfig, toolGroupConfig) diff --git a/packages/cornerstone-tools/src/tools/segmentation/CircleScissorsTool.ts b/packages/cornerstone-tools/src/tools/segmentation/CircleScissorsTool.ts index 724b329bef..6d76f39323 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/CircleScissorsTool.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/CircleScissorsTool.ts @@ -9,7 +9,7 @@ import { BaseTool } from '../base' import { PublicToolProps, ToolProps, EventTypes } from '../../types' import { fillInsideCircle } from './strategies/fillCircle' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { drawCircle as drawCircleSvg } from '../../drawingSvg' import { resetElementCursor, @@ -18,11 +18,11 @@ import { import triggerAnnotationRenderForViewportUIDs from '../../utilities/triggerAnnotationRenderForViewportUIDs' import { - segmentationColorController, - lockedSegmentController, - segmentIndexController, - activeSegmentationController, -} from '../../store/SegmentationModule' + segmentLocking, + activeSegmentation, + segmentIndex as segmentIndexController, + segmentationColor, +} from '../../stateManagement/segmentation' /** * Tool for manipulating segmentation data by drawing a circle. It acts on the @@ -91,7 +91,7 @@ export default class CircleScissorsTool extends BaseTool { const toolGroupUID = this.toolGroupUID const activeSegmentationInfo = - activeSegmentationController.getActiveSegmentationInfo(toolGroupUID) + activeSegmentation.getActiveSegmentationInfo(toolGroupUID) if (!activeSegmentationInfo) { throw new Error( 'No active segmentation detected, create one before using scissors tool' @@ -102,8 +102,8 @@ export default class CircleScissorsTool extends BaseTool { const segmentIndex = segmentIndexController.getActiveSegmentIndex(toolGroupUID) const segmentsLocked = - lockedSegmentController.getSegmentsLockedForSegmentation(volumeUID) - const segmentColor = segmentationColorController.getColorForSegmentIndex( + segmentLocking.getSegmentsLockedForSegmentation(volumeUID) + const segmentColor = segmentationColor.getColorForSegmentIndex( toolGroupUID, activeSegmentationInfo.segmentationDataUID, segmentIndex @@ -267,24 +267,24 @@ export default class CircleScissorsTool extends BaseTool { * Add event handlers for the modify event loop, and prevent default event propagation. */ _activateDraw = (element) => { - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** * Add event handlers for the modify event loop, and prevent default event prapogation. */ _deactivateDraw = (element) => { - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** diff --git a/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiStartEndThresholdTool.ts b/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiStartEndThresholdTool.ts index 505b94e89b..627107fe4f 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiStartEndThresholdTool.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiStartEndThresholdTool.ts @@ -1,17 +1,17 @@ import { getEnabledElement, - getVolume, + cache, Settings, StackViewport, metaData, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' import { vec3 } from 'gl-matrix' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { addAnnotation, getAnnotations } from '../../stateManagement' import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking' import { @@ -124,7 +124,7 @@ export default class RectangleRoiStartEndThresholdTool extends RectangleRoiTool throw new Error('Stack Viewport Not implemented') } else { volumeUID = this.getTargetUID(viewport) - imageVolume = getVolume(volumeUID) + imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -300,7 +300,7 @@ export default class RectangleRoiStartEndThresholdTool extends RectangleRoiTool const { cachedStats } = data const volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) // Todo: this shouldn't be here, this is a performance issue // Since we are extending the RectangleRoi class, we need to @@ -310,7 +310,7 @@ export default class RectangleRoiStartEndThresholdTool extends RectangleRoiTool annotation.invalidated = false // Dispatching annotation modified - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiThresholdTool.ts b/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiThresholdTool.ts index fb5581bbb6..7ae51062c7 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiThresholdTool.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/RectangleRoiThresholdTool.ts @@ -1,17 +1,17 @@ import { getEnabledElement, - getVolume, + cache, Settings, StackViewport, triggerEvent, eventTarget, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' import { addAnnotation, getAnnotations } from '../../stateManagement' import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { drawHandles as drawHandlesSvg, @@ -107,7 +107,7 @@ export default class RectangleRoiThresholdTool extends RectangleRoiTool { viewport.getCurrentImageId && viewport.getCurrentImageId() } else { volumeUID = this.getTargetUID(viewport) - const imageVolume = getVolume(volumeUID) + const imageVolume = cache.getVolume(volumeUID) referencedImageId = csUtils.getClosestImageId( imageVolume, worldPos, @@ -242,7 +242,7 @@ export default class RectangleRoiThresholdTool extends RectangleRoiTool { // Todo: This is not correct way to add the event trigger, // this will trigger on all mouse hover too. Problem is that we don't // have a cached stats mechanism for this tool yet? - const eventType = EVENTS.ANNOTATION_MODIFIED + const eventType = Events.ANNOTATION_MODIFIED const eventDetail: AnnotationModifiedEventDetail = { annotation, diff --git a/packages/cornerstone-tools/src/tools/segmentation/RectangleScissorsTool.ts b/packages/cornerstone-tools/src/tools/segmentation/RectangleScissorsTool.ts index d594d82fbd..0d611b8f91 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/RectangleScissorsTool.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/RectangleScissorsTool.ts @@ -12,7 +12,7 @@ import { fillInsideRectangle } from './strategies/fillRectangle' import { eraseInsideRectangle } from './strategies/eraseRectangle' import { getViewportUIDsWithToolToRender } from '../../utilities/viewportFilters' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import RectangleRoiTool from '../annotation/RectangleRoiTool' import { drawRect as drawRectSvg } from '../../drawingSvg' import { @@ -22,11 +22,11 @@ import { import triggerAnnotationRenderForViewportUIDs from '../../utilities/triggerAnnotationRenderForViewportUIDs' import { - segmentationColorController, - lockedSegmentController, - segmentIndexController, - activeSegmentationController, -} from '../../store/SegmentationModule' + segmentationColor, + segmentLocking, + segmentIndex as segmentIndexController, + activeSegmentation, +} from '../../stateManagement/segmentation' /** * Tool for manipulating segmentation data by drawing a rectangle. It acts on the @@ -94,7 +94,7 @@ export default class RectangleScissorsTool extends BaseTool { const toolGroupUID = this.toolGroupUID const activeSegmentationInfo = - activeSegmentationController.getActiveSegmentationInfo(toolGroupUID) + activeSegmentation.getActiveSegmentationInfo(toolGroupUID) if (!activeSegmentationInfo) { throw new Error( 'No active segmentation detected, create one before using scissors tool' @@ -107,8 +107,8 @@ export default class RectangleScissorsTool extends BaseTool { const segmentIndex = segmentIndexController.getActiveSegmentIndex(toolGroupUID) const segmentsLocked = - lockedSegmentController.getSegmentsLockedForSegmentation(volumeUID) - const segmentColor = segmentationColorController.getColorForSegmentIndex( + segmentLocking.getSegmentsLockedForSegmentation(volumeUID) + const segmentColor = segmentationColor.getColorForSegmentIndex( toolGroupUID, activeSegmentationInfo.segmentationDataUID, segmentIndex @@ -309,24 +309,24 @@ export default class RectangleScissorsTool extends BaseTool { * Add event handlers for the modify event loop, and prevent default event propagation. */ _activateDraw = (element) => { - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** * Add event handlers for the modify event loop, and prevent default event prapogation. */ _deactivateDraw = (element) => { - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** diff --git a/packages/cornerstone-tools/src/tools/segmentation/SphereScissorsTool.ts b/packages/cornerstone-tools/src/tools/segmentation/SphereScissorsTool.ts index c64237ec5d..0a83ea0615 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/SphereScissorsTool.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/SphereScissorsTool.ts @@ -9,7 +9,7 @@ import { BaseTool } from '../base' import { PublicToolProps, ToolProps, EventTypes } from '../../types' import { fillInsideSphere } from './strategies/fillSphere' -import { CornerstoneTools3DEvents as EVENTS } from '../../enums' +import { Events } from '../../enums' import { drawCircle as drawCircleSvg } from '../../drawingSvg' import { resetElementCursor, @@ -18,11 +18,11 @@ import { import triggerAnnotationRenderForViewportUIDs from '../../utilities/triggerAnnotationRenderForViewportUIDs' import { - segmentationColorController, - lockedSegmentController, - segmentIndexController, - activeSegmentationController, -} from '../../store/SegmentationModule' + segmentationColor, + segmentLocking, + segmentIndex as segmentIndexController, + activeSegmentation, +} from '../../stateManagement/segmentation' /** * Tool for manipulating segmentation data by drawing a sphere in 3d space. It acts on the @@ -92,7 +92,7 @@ export default class SphereScissorsTool extends BaseTool { const toolGroupUID = this.toolGroupUID const activeSegmentationInfo = - activeSegmentationController.getActiveSegmentationInfo(toolGroupUID) + activeSegmentation.getActiveSegmentationInfo(toolGroupUID) if (!activeSegmentationInfo) { throw new Error( 'No active segmentation detected, create one before using scissors tool' @@ -103,8 +103,8 @@ export default class SphereScissorsTool extends BaseTool { const segmentIndex = segmentIndexController.getActiveSegmentIndex(toolGroupUID) const segmentsLocked = - lockedSegmentController.getSegmentsLockedForSegmentation(volumeUID) - const segmentColor = segmentationColorController.getColorForSegmentIndex( + segmentLocking.getSegmentsLockedForSegmentation(volumeUID) + const segmentColor = segmentationColor.getColorForSegmentIndex( toolGroupUID, activeSegmentationInfo.segmentationDataUID, segmentIndex @@ -267,24 +267,24 @@ export default class SphereScissorsTool extends BaseTool { * Add event handlers for the modify event loop, and prevent default event propagation. */ _activateDraw = (element) => { - element.addEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.addEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.addEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.addEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.addEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.addEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.addEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.addEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** * Add event handlers for the modify event loop, and prevent default event prapogation. */ _deactivateDraw = (element) => { - element.removeEventListener(EVENTS.MOUSE_UP, this._mouseUpCallback) - element.removeEventListener(EVENTS.MOUSE_DRAG, this._mouseDragCallback) - element.removeEventListener(EVENTS.MOUSE_CLICK, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_UP, this._mouseUpCallback) + element.removeEventListener(Events.MOUSE_DRAG, this._mouseDragCallback) + element.removeEventListener(Events.MOUSE_CLICK, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_END, this._mouseUpCallback) - // element.removeEventListener(EVENTS.TOUCH_DRAG, this._mouseDragCallback) + // element.removeEventListener(Events.TOUCH_END, this._mouseUpCallback) + // element.removeEventListener(Events.TOUCH_DRAG, this._mouseDragCallback) } /** diff --git a/packages/cornerstone-tools/src/tools/segmentation/strategies/eraseRectangle.ts b/packages/cornerstone-tools/src/tools/segmentation/strategies/eraseRectangle.ts index c99ee132f3..53f7d47d13 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/strategies/eraseRectangle.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/strategies/eraseRectangle.ts @@ -2,9 +2,9 @@ import { ImageVolume } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' import { getBoundingBoxAroundShape } from '../../../utilities/segmentation' -import { triggerSegmentationDataModified } from '../../../store/SegmentationModule/triggerSegmentationEvents' -import { pointInShapeCallback } from '../../../utilities/' import transformPhysicalToIndex from '../../../utilities/transformPhysicalToIndex' +import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents' +import { pointInShapeCallback } from '../../../utilities' type EraseOperationData = { toolGroupUID: string diff --git a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillCircle.ts b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillCircle.ts index 78ec9ffaed..40fd3c0c69 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillCircle.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillCircle.ts @@ -6,9 +6,9 @@ import { pointInEllipse, } from '../../../utilities/math/ellipse' import { getBoundingBoxAroundShape } from '../../../utilities/segmentation' -import { triggerSegmentationDataModified } from '../../../store/SegmentationModule/triggerSegmentationEvents' -import { pointInShapeCallback } from '../../../utilities/' import transformPhysicalToIndex from '../../../utilities/transformPhysicalToIndex' +import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents' +import { pointInShapeCallback } from '../../../utilities' type OperationData = { toolGroupUID: string diff --git a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillRectangle.ts b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillRectangle.ts index 2446a5ade7..d0835eab3c 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillRectangle.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillRectangle.ts @@ -4,7 +4,7 @@ import type { Types } from '@precisionmetrics/cornerstone-render' import { getBoundingBoxAroundShape } from '../../../utilities/segmentation' import { pointInShapeCallback } from '../../../utilities' import transformPhysicalToIndex from '../../../utilities/transformPhysicalToIndex' -import { triggerSegmentationDataModified } from '../../../store/SegmentationModule/triggerSegmentationEvents' +import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents' type OperationData = { toolGroupUID: string diff --git a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillSphere.ts b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillSphere.ts index 124a765b0d..fd365f3ada 100644 --- a/packages/cornerstone-tools/src/tools/segmentation/strategies/fillSphere.ts +++ b/packages/cornerstone-tools/src/tools/segmentation/strategies/fillSphere.ts @@ -3,7 +3,7 @@ import type { VolumeViewport, } from '@precisionmetrics/cornerstone-render' -import { triggerSegmentationDataModified } from '../../../store/SegmentationModule/triggerSegmentationEvents' +import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents' import { pointInSurroundingSphereCallback } from '../../../utilities' type OperationData = { diff --git a/packages/cornerstone-tools/src/types/ISetToolModeOptions.ts b/packages/cornerstone-tools/src/types/ISetToolModeOptions.ts index 02f5cf3fcd..66fd0ce59c 100644 --- a/packages/cornerstone-tools/src/types/ISetToolModeOptions.ts +++ b/packages/cornerstone-tools/src/types/ISetToolModeOptions.ts @@ -1,16 +1,14 @@ -import { ToolModes } from '../enums' -import ToolBindings from '../enums/ToolBindings' +import { ToolModes, MouseBindings, KeyboardBindings } from '../enums' -type ToolBindingMouseType = - typeof ToolBindings.Mouse[keyof typeof ToolBindings.Mouse] +type ToolBindingMouseType = typeof MouseBindings[keyof typeof MouseBindings] type ToolBindingKeyboardType = - typeof ToolBindings.Keyboard[keyof typeof ToolBindings.Keyboard] + typeof KeyboardBindings[keyof typeof KeyboardBindings] type IToolBinding = { - /** Mouse button bindings e.g., ToolBindings.Mouse.Primary/Secondary etc. */ + /** Mouse button bindings e.g., MouseBindings.Primary/Secondary etc. */ mouseButton: ToolBindingMouseType - /** Keyboard bindings e.g., ToolBindings.Keyboard.Shift/Ctrl etc. */ + /** Keyboard bindings e.g., KeyboardBindings.Shift/Ctrl etc. */ modifierKey?: ToolBindingKeyboardType } diff --git a/packages/cornerstone-tools/src/utilities/calibrateImageSpacing.ts b/packages/cornerstone-tools/src/utilities/calibrateImageSpacing.ts index 256b54d8c4..1cd10e6677 100644 --- a/packages/cornerstone-tools/src/utilities/calibrateImageSpacing.ts +++ b/packages/cornerstone-tools/src/utilities/calibrateImageSpacing.ts @@ -1,9 +1,9 @@ import { RenderingEngine, - Utilities, + utilities, } from '@precisionmetrics/cornerstone-render' -const { calibratedPixelSpacingMetadataProvider } = Utilities +const { calibratedPixelSpacingMetadataProvider } = utilities /** * It adds the provided spacing to the Cornerstone internal calibratedPixelSpacing diff --git a/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsForDisplay.ts b/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsForDisplay.ts index f84b0e3c5e..dfdc6e6809 100644 --- a/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsForDisplay.ts +++ b/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsForDisplay.ts @@ -2,7 +2,7 @@ import { StackViewport, VolumeViewport, Types, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import filterAnnotationsWithinSlice from './filterAnnotationsWithinSlice' diff --git a/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsWithinSlice.ts b/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsWithinSlice.ts index eb574bd6b0..8dade48287 100644 --- a/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsWithinSlice.ts +++ b/packages/cornerstone-tools/src/utilities/planar/filterAnnotationsWithinSlice.ts @@ -1,5 +1,5 @@ import { vec3 } from 'gl-matrix' -import { Utilities as csUtils } from '@precisionmetrics/cornerstone-render' +import { utilities as csUtils } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' import { Annotations, Annotation } from '../../types' diff --git a/packages/cornerstone-tools/src/utilities/planar/getPointInLineOfSightWithCriteria.ts b/packages/cornerstone-tools/src/utilities/planar/getPointInLineOfSightWithCriteria.ts index 0be1c31c70..bef2e27dd7 100644 --- a/packages/cornerstone-tools/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +++ b/packages/cornerstone-tools/src/utilities/planar/getPointInLineOfSightWithCriteria.ts @@ -1,7 +1,7 @@ import vtkMath from 'vtk.js/Sources/Common/Core/Math' import { VolumeViewport, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' diff --git a/packages/cornerstone-tools/src/utilities/segmentation/createMergedLabelmapForIndex.ts b/packages/cornerstone-tools/src/utilities/segmentation/createMergedLabelmapForIndex.ts index fafb5c2c18..48864875db 100644 --- a/packages/cornerstone-tools/src/utilities/segmentation/createMergedLabelmapForIndex.ts +++ b/packages/cornerstone-tools/src/utilities/segmentation/createMergedLabelmapForIndex.ts @@ -1,7 +1,7 @@ import { Types } from '@precisionmetrics/cornerstone-render' import { - createLocalVolume, - Utilities as csUtils, + volumeLoader, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' /** @@ -55,7 +55,12 @@ function createMergedLabelmapForIndex( } const preventCache = true - const mergedVolume = createLocalVolume(options, uid, preventCache) + // Todo: following should be async + const mergedVolume = volumeLoader.createLocalVolume( + options, + uid, + preventCache + ) return mergedVolume } diff --git a/packages/cornerstone-tools/src/utilities/segmentation/thresholdVolumeByRange.ts b/packages/cornerstone-tools/src/utilities/segmentation/thresholdVolumeByRange.ts index dfb7b3d6ec..2b10b70a5d 100644 --- a/packages/cornerstone-tools/src/utilities/segmentation/thresholdVolumeByRange.ts +++ b/packages/cornerstone-tools/src/utilities/segmentation/thresholdVolumeByRange.ts @@ -6,7 +6,7 @@ import { extend2DBoundingBoxInViewAxis, } from '../segmentation' import { pointInShapeCallback } from '../../utilities' -import { triggerSegmentationDataModified } from '../../store/SegmentationModule/triggerSegmentationEvents' +import { triggerSegmentationDataModified } from '../../stateManagement/segmentation/triggerSegmentationEvents' import { ToolGroupSpecificSegmentationData } from '../../types/SegmentationStateTypes' import transformPhysicalToIndex from '../transformPhysicalToIndex' import * as SegmentationState from '../../stateManagement/segmentation/segmentationState' diff --git a/packages/cornerstone-tools/src/utilities/stackScrollTool/getSliceRange.ts b/packages/cornerstone-tools/src/utilities/stackScrollTool/getSliceRange.ts index a2131d5ac3..0d01a4ce54 100644 --- a/packages/cornerstone-tools/src/utilities/stackScrollTool/getSliceRange.ts +++ b/packages/cornerstone-tools/src/utilities/stackScrollTool/getSliceRange.ts @@ -1,4 +1,4 @@ -import { Utilities as csUtils } from '@precisionmetrics/cornerstone-render' +import { utilities as csUtils } from '@precisionmetrics/cornerstone-render' import type { Types } from '@precisionmetrics/cornerstone-render' import vtkMatrixBuilder from 'vtk.js/Sources/Common/Core/MatrixBuilder' diff --git a/packages/cornerstone-tools/src/utilities/stackScrollTool/scrollThroughStack.ts b/packages/cornerstone-tools/src/utilities/stackScrollTool/scrollThroughStack.ts index 05276bf316..f4c4ace718 100644 --- a/packages/cornerstone-tools/src/utilities/stackScrollTool/scrollThroughStack.ts +++ b/packages/cornerstone-tools/src/utilities/stackScrollTool/scrollThroughStack.ts @@ -2,7 +2,7 @@ import { getEnabledElement, StackViewport, VolumeViewport, - Utilities as csUtils, + utilities as csUtils, } from '@precisionmetrics/cornerstone-render' import clip from '../clip' import getSliceRange from './getSliceRange' diff --git a/packages/cornerstone-tools/src/utilities/triggerAnnotationRender.ts b/packages/cornerstone-tools/src/utilities/triggerAnnotationRender.ts index de6d17a61e..a288408879 100644 --- a/packages/cornerstone-tools/src/utilities/triggerAnnotationRender.ts +++ b/packages/cornerstone-tools/src/utilities/triggerAnnotationRender.ts @@ -3,7 +3,7 @@ import { triggerEvent, getRenderingEngine, } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents as EVENTS, ToolModes } from '../enums' +import { Events, ToolModes } from '../enums' import { draw as drawSvg } from '../drawingSvg' import getToolsWithModesForElement from './getToolsWithModesForElement' import SegmentationDisplayTool from '../tools/displayTools/SegmentationDisplayTool' @@ -175,7 +175,7 @@ class AnnotationRenderingEngine { tool.renderAnnotation ) { tool.renderAnnotation(enabledElement, svgDrawingHelper) - triggerEvent(element, EVENTS.ANNOTATION_RENDERED, { ...eventDetail }) + triggerEvent(element, Events.ANNOTATION_RENDERED, { ...eventDetail }) } } diff --git a/packages/cornerstone-tools/src/utilities/triggerSegmentationRender.ts b/packages/cornerstone-tools/src/utilities/triggerSegmentationRender.ts index 494c622d3e..49b344d82f 100644 --- a/packages/cornerstone-tools/src/utilities/triggerSegmentationRender.ts +++ b/packages/cornerstone-tools/src/utilities/triggerSegmentationRender.ts @@ -2,10 +2,10 @@ import { triggerEvent, eventTarget, getRenderingEngine, - EVENTS as csRenderEvents, + Enums, Types, } from '@precisionmetrics/cornerstone-render' -import { CornerstoneTools3DEvents as csToolsEvents } from '../enums' +import { Events as csToolsEvents } from '../enums' import { getToolGroupByToolGroupUID, getToolGroup, @@ -126,7 +126,7 @@ class SegmentationRenderingEngine { const { element, viewportUID, renderingEngineUID } = evt.detail element.removeEventListener( - csRenderEvents.IMAGE_RENDERED, + Enums.Events.IMAGE_RENDERED, onSegmentationRender ) @@ -155,7 +155,7 @@ class SegmentationRenderingEngine { viewports.forEach(({ element }) => { element.addEventListener( - csRenderEvents.IMAGE_RENDERED, + Enums.Events.IMAGE_RENDERED, onSegmentationRender ) }) diff --git a/packages/cornerstone-tools/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts b/packages/cornerstone-tools/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts index 4fd91edf8a..c624c37599 100644 --- a/packages/cornerstone-tools/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +++ b/packages/cornerstone-tools/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts @@ -1,4 +1,4 @@ -import { Utilities as csUtils } from '@precisionmetrics/cornerstone-render' +import { utilities as csUtils } from '@precisionmetrics/cornerstone-render' export function filterViewportsWithSameOrientation(viewports, camera) { return viewports.filter((viewport) => { diff --git a/packages/cornerstone-tools/test/BidirectionalTool_test.js b/packages/cornerstone-tools/test/BidirectionalTool_test.js index b679b43473..9749e63792 100644 --- a/packages/cornerstone-tools/test/BidirectionalTool_test.js +++ b/packages/cornerstone-tools/test/BidirectionalTool_test.js @@ -4,35 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, + volumeLoader, metaData, - createAndCacheVolume, eventTarget, - registerVolumeLoader, - setVolumesOnViewports, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { BidirectionalTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -72,7 +74,7 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0` describe('Cornerstone Tools: ', () => { beforeAll(() => { // initialize the library - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -89,8 +91,8 @@ describe('Cornerstone Tools: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -100,7 +102,7 @@ describe('Cornerstone Tools: ', () => { eventTarget.reset() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -113,7 +115,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully create a Bidirectional tool on a canvas with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -126,39 +128,36 @@ describe('Cornerstone Tools: ', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -224,7 +223,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully create a bidirectional tool on a canvas with mouse drag Volume viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -235,39 +234,36 @@ describe('Cornerstone Tools: ', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 4] const index2 = [10, 1, 4] @@ -323,8 +319,8 @@ describe('Cornerstone Tools: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + volumeLoader.createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID] @@ -339,7 +335,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully create a bidirectional tool and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -351,42 +347,39 @@ describe('Cornerstone Tools: ', () => { let p2, p3 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Not not to move the handle too much since the length become width and it would fail const index1 = [50, 50, 0] const index2 = [5, 5, 0] @@ -487,7 +480,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully create a bidirectional tool and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -499,42 +492,39 @@ describe('Cornerstone Tools: ', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -625,7 +615,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully create a bidirectional tool and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -637,82 +627,76 @@ describe('Cornerstone Tools: ', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We don't expect the length to change on tool move - expect(data[targets[0]].length).toBeCloseTo( - calculateLength(p1, p2), - 6 - ) - - const handles = bidirectionalAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[1]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We don't expect the length to change on tool move + expect(data[targets[0]].length).toBeCloseTo(calculateLength(p1, p2), 6) + + const handles = bidirectionalAnnotation.data.handles.points + + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[1]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -826,7 +810,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully cancel drawing of a BidirectionalTool', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -837,7 +821,7 @@ describe('Cornerstone Tools: ', () => { let p1, p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 4] const index2 = [10, 1, 4] @@ -904,7 +888,7 @@ describe('Cornerstone Tools: ', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( + const bidirectionalAnnotations = annotation.state.getAnnotations( element, BidirectionalTool.toolName ) @@ -928,7 +912,7 @@ describe('Cornerstone Tools: ', () => { expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, bidirectionalAnnotation.annotationUID ) @@ -937,10 +921,7 @@ describe('Cornerstone Tools: ', () => { } this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/CrosshairsTool_test.js b/packages/cornerstone-tools/test/CrosshairsTool_test.js index 5839622221..6e48102661 100644 --- a/packages/cornerstone-tools/test/CrosshairsTool_test.js +++ b/packages/cornerstone-tools/test/CrosshairsTool_test.js @@ -4,29 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - Utilities, - unregisterAllImageLoaders, + utilities, metaData, - EVENTS, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + Enums, + volumeLoader, + setVolumesForViewports, + imageLoader, + CONSTANTS, } = cornerstone3D +const { utilities: toolsUtilities } = csTools3d +const { transformPhysicalToIndex } = toolsUtilities + +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader + const { CrosshairsTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, - Utilities: csTools3dTuils, + Enums: csToolsEnums, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeMetaDataProvider, fakeVolumeLoader, createNormalizedMouseEvent } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'VIEWPORT1' const viewportUID2 = 'VIEWPORT2' @@ -88,7 +96,7 @@ function createViewports(renderingEngine, viewportType, width, height) { describe('Cornerstone Tools: ', () => { beforeAll(() => { // initialize the library - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -126,7 +134,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully initialize the crosshairs to the middle of the image and canvas', function (done) { const [element1, element2, element3] = createViewports( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -157,7 +165,7 @@ describe('Cornerstone Tools: ', () => { const centerCanvas = [sWidth * 0.5, sHeight * 0.5] const canvasCenterWorld = vp.canvasToWorld(centerCanvas) - const crosshairAnnotations = AnnotationState.getAnnotations( + const crosshairAnnotations = annotation.state.getAnnotations( element1, CrosshairsTool.toolName ) @@ -175,7 +183,7 @@ describe('Cornerstone Tools: ', () => { expect(p).toBeCloseTo(canvasCenterWorld[i], 3) expect(p).toBeCloseTo(imageCenterWorld[i], 3) }) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element1, crosshairAnnotation.annotationUID ) @@ -192,15 +200,15 @@ describe('Cornerstone Tools: ', () => { } element1.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) element2.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) element3.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) @@ -209,9 +217,9 @@ describe('Cornerstone Tools: ', () => { }) } - element1.addEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) - element2.addEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) - element3.addEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) + element1.addEventListener(Events.IMAGE_RENDERED, renderEventHandler) + element2.addEventListener(Events.IMAGE_RENDERED, renderEventHandler) + element3.addEventListener(Events.IMAGE_RENDERED, renderEventHandler) this.testToolGroup.addViewport(viewportUID1, this.renderingEngine.uid) this.testToolGroup.addViewport(viewportUID2, this.renderingEngine.uid) @@ -219,7 +227,7 @@ describe('Cornerstone Tools: ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1, viewportUID2, viewportUID3] @@ -234,7 +242,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully jump to move the crosshairs', function (done) { const [element1, element2, element3] = createViewports( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -254,7 +262,7 @@ describe('Cornerstone Tools: ', () => { return } - const crosshairAnnotationsAfter = AnnotationState.getAnnotations( + const crosshairAnnotationsAfter = annotation.state.getAnnotations( element1, CrosshairsTool.toolName ) @@ -267,7 +275,7 @@ describe('Cornerstone Tools: ', () => { // Can successfully move the tool center in all viewports expect(p).toBeCloseTo(p1[i], 3) expect(p).toBeCloseTo(axialCanvasToolCenter[i], 3) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element1, crosshairAnnotation.annotationUID ) @@ -278,15 +286,15 @@ describe('Cornerstone Tools: ', () => { const attachCrosshairsHandler = () => { element1.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) element2.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) element3.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, + csToolsEvents.ANNOTATION_RENDERED, crosshairsEventHandler ) } @@ -305,7 +313,7 @@ describe('Cornerstone Tools: ', () => { const vp1 = this.renderingEngine.getViewport(viewportUID1) const { imageData } = vp1.getImageData() - const crosshairAnnotations = AnnotationState.getAnnotations( + const crosshairAnnotations = annotation.state.getAnnotations( element1, CrosshairsTool.toolName ) @@ -313,7 +321,7 @@ describe('Cornerstone Tools: ', () => { // First viewport is axial const currentWorldLocation = crosshairAnnotations[0].data.handles.toolCenter - const currentIndexLocation = csTools3dTuils.transformPhysicalToIndex( + const currentIndexLocation = transformPhysicalToIndex( imageData, currentWorldLocation ) @@ -356,9 +364,9 @@ describe('Cornerstone Tools: ', () => { document.dispatchEvent(evt) } - element1.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element2.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element3.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) + element1.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element2.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element3.addEventListener(Events.IMAGE_RENDERED, eventHandler) this.testToolGroup.addViewport(viewportUID1, this.renderingEngine.uid) this.testToolGroup.addViewport(viewportUID2, this.renderingEngine.uid) @@ -366,7 +374,7 @@ describe('Cornerstone Tools: ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1, viewportUID2, viewportUID3] @@ -381,7 +389,7 @@ describe('Cornerstone Tools: ', () => { it('Should successfully drag and move the crosshairs', function (done) { const [element1, element2, element3] = createViewports( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -406,7 +414,7 @@ describe('Cornerstone Tools: ', () => { const { imageData } = vp1.getImageData() setTimeout(() => { - const crosshairAnnotations = AnnotationState.getAnnotations( + const crosshairAnnotations = annotation.state.getAnnotations( element1, CrosshairsTool.toolName ) @@ -414,7 +422,7 @@ describe('Cornerstone Tools: ', () => { // First viewport is axial const currentWorldLocation = crosshairAnnotations[0].data.handles.toolCenter - const currentIndexLocation = csTools3dTuils.transformPhysicalToIndex( + const currentIndexLocation = transformPhysicalToIndex( imageData, currentWorldLocation ) @@ -480,7 +488,7 @@ describe('Cornerstone Tools: ', () => { // Moving Crosshairs setTimeout(() => { - const crosshairAnnotationsAfter = AnnotationState.getAnnotations( + const crosshairAnnotationsAfter = annotation.state.getAnnotations( element1, CrosshairsTool.toolName ) @@ -489,7 +497,7 @@ describe('Cornerstone Tools: ', () => { crosshairAnnotation.data.handles.toolCenter.forEach((p, i) => { // Can successfully move the tool center in all viewports expect(p).toBeCloseTo(worldCoord2[i], 3) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element1, crosshairAnnotation.annotationUID ) @@ -500,9 +508,9 @@ describe('Cornerstone Tools: ', () => { }, 50) } - element1.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element2.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element3.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) + element1.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element2.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element3.addEventListener(Events.IMAGE_RENDERED, eventHandler) this.testToolGroup.addViewport(viewportUID1, this.renderingEngine.uid) this.testToolGroup.addViewport(viewportUID2, this.renderingEngine.uid) @@ -510,7 +518,7 @@ describe('Cornerstone Tools: ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1, viewportUID2, viewportUID3] diff --git a/packages/cornerstone-tools/test/EllipseROI_test.js b/packages/cornerstone-tools/test/EllipseROI_test.js index 1798bec895..605e57fd05 100644 --- a/packages/cornerstone-tools/test/EllipseROI_test.js +++ b/packages/cornerstone-tools/test/EllipseROI_test.js @@ -4,36 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, metaData, - getEnabledElement, eventTarget, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { EllipticalRoiTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, cancelActiveManipulations, + annotation, + Enums: csToolsEnums, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -64,7 +65,7 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_4_1_1_1_0` describe('Ellipse Tool: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Ellipse Tool: ', () => { @@ -83,8 +84,8 @@ describe('Ellipse Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -95,7 +96,7 @@ describe('Ellipse Tool: ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { if (el.parentNode) { @@ -107,7 +108,7 @@ describe('Ellipse Tool: ', () => { it('Should successfully create a ellipse tool on a canvas with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -117,44 +118,41 @@ describe('Ellipse Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const ellipseAnnotations = AnnotationState.getAnnotations( - element, - EllipticalRoiTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(ellipseAnnotations).toBeDefined() - expect(ellipseAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const ellipseAnnotations = annotation.state.getAnnotations( + element, + EllipticalRoiTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(ellipseAnnotations).toBeDefined() + expect(ellipseAnnotations.length).toBe(1) - const ellipseAnnotation = ellipseAnnotations[0] - expect(ellipseAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) + const ellipseAnnotation = ellipseAnnotations[0] + expect(ellipseAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) - expect(ellipseAnnotation.metadata.toolName).toBe( - EllipticalRoiTool.toolName - ) - expect(ellipseAnnotation.invalidated).toBe(false) + expect(ellipseAnnotation.metadata.toolName).toBe( + EllipticalRoiTool.toolName + ) + expect(ellipseAnnotation.invalidated).toBe(false) - const data = ellipseAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = ellipseAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // the rectangle is drawn on the strip - expect(data[targets[0]].mean).toBe(255) + // the rectangle is drawn on the strip + expect(data[targets[0]].mean).toBe(255) - AnnotationState.removeAnnotation( - element, - ellipseAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + ellipseAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Since ellipse draws from center to out, we are picking a very center // point in the image (strip is 255 from 10-15 in X and from 0-64 in Y) const index1 = [12, 30, 0] @@ -220,7 +218,7 @@ describe('Ellipse Tool: ', () => { it('Should successfully create a ellipse tool on a canvas with mouse drag in a Volume viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -229,40 +227,37 @@ describe('Ellipse Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const ellipseAnnotations = AnnotationState.getAnnotations( - element, - EllipticalRoiTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(ellipseAnnotations).toBeDefined() - expect(ellipseAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const ellipseAnnotations = annotation.state.getAnnotations( + element, + EllipticalRoiTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(ellipseAnnotations).toBeDefined() + expect(ellipseAnnotations.length).toBe(1) - const ellipseAnnotation = ellipseAnnotations[0] - expect(ellipseAnnotation.metadata.toolName).toBe( - EllipticalRoiTool.toolName - ) - expect(ellipseAnnotation.invalidated).toBe(false) + const ellipseAnnotation = ellipseAnnotations[0] + expect(ellipseAnnotation.metadata.toolName).toBe( + EllipticalRoiTool.toolName + ) + expect(ellipseAnnotation.invalidated).toBe(false) - const data = ellipseAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = ellipseAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) - AnnotationState.removeAnnotation( - element, - ellipseAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + ellipseAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [60, 50, 2] const index2 = [65, 60, 2] @@ -315,14 +310,16 @@ describe('Ellipse Tool: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( - this.renderingEngine, - [{ volumeUID: volumeId }], - [viewportUID] - ) - vp.render() - }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) + .then(() => { + setVolumesForViewports( + this.renderingEngine, + [{ volumeUID: volumeId }], + [viewportUID] + ) + vp.render() + }) } catch (e) { done.fail(e) } @@ -345,8 +342,8 @@ describe('Ellipse Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -356,7 +353,7 @@ describe('Ellipse Tool: ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -369,7 +366,7 @@ describe('Ellipse Tool: ', () => { it('Should cancel drawing of a EllipseTool annotation', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -378,7 +375,7 @@ describe('Ellipse Tool: ', () => { const imageId1 = 'fakeImageLoader:imageURI_64_64_10_5_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Since ellipse draws from center to out, we are picking a very center // point in the image (strip is 255 from 10-15 in X and from 0-64 in Y) const index1 = [12, 30, 0] @@ -445,7 +442,7 @@ describe('Ellipse Tool: ', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const ellipseAnnotations = AnnotationState.getAnnotations( + const ellipseAnnotations = annotation.state.getAnnotations( element, EllipticalRoiTool.toolName ) @@ -471,7 +468,7 @@ describe('Ellipse Tool: ', () => { // the rectangle is drawn on the strip expect(data[targets[0]].mean).toBe(255) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, ellipseAnnotation.annotationUID ) @@ -481,10 +478,7 @@ describe('Ellipse Tool: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/FrameOfReferenceSpecificToolStateManager_test.js b/packages/cornerstone-tools/test/FrameOfReferenceSpecificToolStateManager_test.js index a6b8a7b1e5..4897360e13 100644 --- a/packages/cornerstone-tools/test/FrameOfReferenceSpecificToolStateManager_test.js +++ b/packages/cornerstone-tools/test/FrameOfReferenceSpecificToolStateManager_test.js @@ -1,7 +1,7 @@ import * as csTools from '../src/index' import * as cornerstone3D from '../../cornerstone-render/src/index' -const annotationManager = csTools.AnnotationState.getDefaultAnnotationManager() +const annotationManager = csTools.annotation.state.getDefaultAnnotationManager() const FrameOfReferenceUID = 'MY_FRAME_OF_REFERENCE_UID' @@ -59,7 +59,7 @@ function addAndReturnToolName1Annotation() { describe('FrameOfReferenceSpecificAnnotationManager:', () => { beforeAll(function () { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) csTools.init() }) diff --git a/packages/cornerstone-tools/test/LengthTool_test.js b/packages/cornerstone-tools/test/LengthTool_test.js index be1fe86918..aaac10ecf8 100644 --- a/packages/cornerstone-tools/test/LengthTool_test.js +++ b/packages/cornerstone-tools/test/LengthTool_test.js @@ -4,41 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, + Enums, eventTarget, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + utilities, + imageLoader, metaData, - getEnabledElement, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { LengthTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils - -const { - Utilities: { calibrateImageSpacing }, -} = csTools3d +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() -const { calibratedPixelSpacingMetadataProvider } = Utilities +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -77,7 +73,7 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0` describe('LengthTool:', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Cornerstone Tools: -- Length ', () => { @@ -96,8 +92,8 @@ describe('LengthTool:', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -108,7 +104,7 @@ describe('LengthTool:', () => { this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -121,7 +117,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool on a canvas with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -134,39 +130,36 @@ describe('LengthTool:', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -234,7 +227,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool on a canvas with mouse drag in a Volume viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -245,38 +238,35 @@ describe('LengthTool:', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - expect(lengthAnnotation.highlighted).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + expect(lengthAnnotation.highlighted).toBe(false) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 4] const index2 = [10, 1, 4] @@ -331,14 +321,16 @@ describe('LengthTool:', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( - this.renderingEngine, - [{ volumeUID: volumeId }], - [viewportUID] - ) - vp.render() - }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) + .then(() => { + setVolumesForViewports( + this.renderingEngine, + [{ volumeUID: volumeId }], + [viewportUID] + ) + vp.render() + }) } catch (e) { done.fail(e) } @@ -347,7 +339,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -359,40 +351,37 @@ describe('LengthTool:', () => { let p2, p3 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - expect(lengthAnnotation.highlighted).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + expect(lengthAnnotation.highlighted).toBe(false) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) + expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [50, 50, 0] const index2 = [5, 5, 0] const index3 = [33, 33, 0] @@ -493,7 +482,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -505,41 +494,38 @@ describe('LengthTool:', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - expect(lengthAnnotation.highlighted).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + expect(lengthAnnotation.highlighted).toBe(false) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -631,7 +617,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -643,80 +629,77 @@ describe('LengthTool:', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + // We don't expect the length to change on tool move + expect(data[targets[0]].length).toBeCloseTo( + calculateLength(p1, p2), + 6 + ) - // We don't expect the length to change on tool move - expect(data[targets[0]].length).toBeCloseTo( - calculateLength(p1, p2), - 6 - ) + const handles = lengthAnnotation.data.handles.points - const handles = lengthAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[1]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[1]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -831,7 +814,7 @@ describe('LengthTool:', () => { it('Should successfully create a length tool on a canvas and remove it after', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -844,47 +827,44 @@ describe('LengthTool:', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) - const annotationsAfterRemove = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) + const annotationsAfterRemove = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) - expect(annotationsAfterRemove).not.toBeDefined() + expect(annotationsAfterRemove).not.toBeDefined() - done() - } - ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -966,8 +946,8 @@ describe('LengthTool:', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -977,7 +957,7 @@ describe('LengthTool:', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -990,7 +970,7 @@ describe('LengthTool:', () => { it('Should cancel drawing of a LengthTool annotation', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -1001,7 +981,7 @@ describe('LengthTool:', () => { let p1, p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -1068,7 +1048,7 @@ describe('LengthTool:', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const lengthAnnotations = AnnotationState.getAnnotations( + const lengthAnnotations = annotation.state.getAnnotations( element, LengthTool.toolName ) @@ -1090,7 +1070,7 @@ describe('LengthTool:', () => { expect(targets.length).toBe(1) expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, lengthAnnotation.annotationUID ) @@ -1100,10 +1080,7 @@ describe('LengthTool:', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) @@ -1129,8 +1106,8 @@ describe('LengthTool:', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) metaData.addProvider( calibratedPixelSpacingMetadataProvider.get.bind( @@ -1146,7 +1123,7 @@ describe('LengthTool:', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') DOMElements.forEach((el) => { @@ -1159,7 +1136,7 @@ describe('LengthTool:', () => { it('Should be able to calibrate an image and update the tool', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -1169,7 +1146,7 @@ describe('LengthTool:', () => { const vp = this.renderingEngine.getViewport(viewportUID) const secondCallback = () => { - const lengthAnnotations = AnnotationState.getAnnotations(element, LengthTool.toolName) + const lengthAnnotations = annotation.state.getAnnotations(element, LengthTool.toolName) // Can successfully add Length tool to annotationManager expect(lengthAnnotations).toBeDefined() expect(lengthAnnotations.length).toBe(1) @@ -1185,13 +1162,13 @@ describe('LengthTool:', () => { expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation(element, lengthAnnotation.annotationUID) + annotation.state.removeAnnotation(element, lengthAnnotation.annotationUID) done() } const firstCallback = () => { - element.removeEventListener(EVENTS.IMAGE_RENDERED, firstCallback) - element.addEventListener(EVENTS.IMAGE_RENDERED, secondCallback) + element.removeEventListener(Events.IMAGE_RENDERED, firstCallback) + element.addEventListener(Events.IMAGE_RENDERED, secondCallback) const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -1245,7 +1222,7 @@ describe('LengthTool:', () => { calibrateImageSpacing(imageId, this.renderingEngine, 1, 5) } - element.addEventListener(EVENTS.IMAGE_RENDERED, firstCallback) + element.addEventListener(Events.IMAGE_RENDERED, firstCallback) this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) diff --git a/packages/cornerstone-tools/test/ProbeTool_test.js b/packages/cornerstone-tools/test/ProbeTool_test.js index 9fc7eb3ee8..704cb8491b 100644 --- a/packages/cornerstone-tools/test/ProbeTool_test.js +++ b/packages/cornerstone-tools/test/ProbeTool_test.js @@ -4,36 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - Utilities, + utilities, eventTarget, - registerImageLoader, - unregisterAllImageLoaders, + imageLoader, metaData, - EVENTS, - getEnabledElement, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + Enums, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ProbeTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeMetaDataProvider, fakeVolumeLoader, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -63,7 +64,7 @@ function createViewport(renderingEngine, viewportType, width, height) { } describe('Probe Tool: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Cornerstone Tools: ', () => { @@ -82,8 +83,8 @@ describe('Probe Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -93,7 +94,7 @@ describe('Probe Tool: ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -106,7 +107,7 @@ describe('Probe Tool: ', () => { it('Should successfully click to put a probe tool on a canvas - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -116,41 +117,38 @@ describe('Probe Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] const { imageData } = vp.getImageData() @@ -196,7 +194,7 @@ describe('Probe Tool: ', () => { it('Should successfully click to put two probe tools on a canvas - 256 x 256', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -206,63 +204,60 @@ describe('Probe Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(2) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(2) - const firstProbeAnnotation = probeAnnotations[0] - expect(firstProbeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(firstProbeAnnotation.metadata.toolName).toBe( - ProbeTool.toolName - ) - expect(firstProbeAnnotation.invalidated).toBe(false) + const firstProbeAnnotation = probeAnnotations[0] + expect(firstProbeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(firstProbeAnnotation.metadata.toolName).toBe( + ProbeTool.toolName + ) + expect(firstProbeAnnotation.invalidated).toBe(false) - let data = firstProbeAnnotation.data.cachedStats - let targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + let data = firstProbeAnnotation.data.cachedStats + let targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) - // Second click - const secondProbeAnnotation = probeAnnotations[1] - expect(secondProbeAnnotation.metadata.toolName).toBe( - ProbeTool.toolName - ) - expect(secondProbeAnnotation.invalidated).toBe(false) + // Second click + const secondProbeAnnotation = probeAnnotations[1] + expect(secondProbeAnnotation.metadata.toolName).toBe( + ProbeTool.toolName + ) + expect(secondProbeAnnotation.invalidated).toBe(false) - data = secondProbeAnnotation.data.cachedStats - targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + data = secondProbeAnnotation.data.cachedStats + targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(0) + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(0) - // - AnnotationState.removeAnnotation( - element, - firstProbeAnnotation.annotationUID - ) - AnnotationState.removeAnnotation( - element, - secondProbeAnnotation.annotationUID - ) + // + annotation.state.removeAnnotation( + element, + firstProbeAnnotation.annotationUID + ) + annotation.state.removeAnnotation( + element, + secondProbeAnnotation.annotationUID + ) - done() - } - ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [20, 20, 0] // 0 @@ -330,7 +325,7 @@ describe('Probe Tool: ', () => { it('Should successfully click to put a probe tool on a canvas - 256 x 512', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 512 ) @@ -340,41 +335,38 @@ describe('Probe Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [150, 100, 0] // 255 const { imageData } = vp.getImageData() @@ -418,7 +410,7 @@ describe('Probe Tool: ', () => { it('Should successfully click to put a probe tool on a canvas - 256 x 512', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 512 ) @@ -428,41 +420,38 @@ describe('Probe Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(0) + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(0) - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [35, 35, 0] // 0 const { imageData } = vp.getImageData() @@ -506,7 +495,7 @@ describe('Probe Tool: ', () => { it('Should successfully create a prob tool on a canvas with mouse drag in a Volume viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -515,37 +504,34 @@ describe('Probe Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].value).toBe(255) + expect(data[targets[0]].value).toBe(255) - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [50, 50, 4] const { imageData } = vp.getImageData() @@ -579,14 +565,16 @@ describe('Probe Tool: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( - this.renderingEngine, - [{ volumeUID: volumeId }], - [viewportUID] - ) - vp.render() - }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) + .then(() => { + setVolumesForViewports( + this.renderingEngine, + [{ volumeUID: volumeId }], + [viewportUID] + ) + vp.render() + }) } catch (e) { done.fail(e) } @@ -595,7 +583,7 @@ describe('Probe Tool: ', () => { it('Should successfully create a Probe tool and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -607,45 +595,42 @@ describe('Probe Tool: ', () => { let p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // We expect the probeTool which was original on 255 strip should be 0 now - expect(data[targets[0]].value).toBe(0) + // We expect the probeTool which was original on 255 strip should be 0 now + expect(data[targets[0]].value).toBe(0) - const handles = probeAnnotation.data.handles.points + const handles = probeAnnotation.data.handles.points - expect(handles[0]).toEqual(p2) + expect(handles[0]).toEqual(p2) - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [40, 40, 0] // 0 @@ -738,8 +723,8 @@ describe('Probe Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -749,7 +734,7 @@ describe('Probe Tool: ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -762,7 +747,7 @@ describe('Probe Tool: ', () => { it('Should successfully cancel drawing of a ProbeTool', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -773,7 +758,7 @@ describe('Probe Tool: ', () => { let p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [40, 40, 0] // 0 @@ -839,7 +824,7 @@ describe('Probe Tool: ', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const probeAnnotations = AnnotationState.getAnnotations( + const probeAnnotations = annotation.state.getAnnotations( element, ProbeTool.toolName ) @@ -866,7 +851,7 @@ describe('Probe Tool: ', () => { expect(handles[0]).toEqual(p2) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, probeAnnotation.annotationUID ) @@ -875,10 +860,7 @@ describe('Probe Tool: ', () => { } this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/RectangleROI_test.js b/packages/cornerstone-tools/test/RectangleROI_test.js index 88518040d1..aea9d22fd8 100644 --- a/packages/cornerstone-tools/test/RectangleROI_test.js +++ b/packages/cornerstone-tools/test/RectangleROI_test.js @@ -4,36 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, eventTarget, metaData, - getEnabledElement, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { RectangleRoiTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -63,7 +64,7 @@ function createViewport(renderingEngine, viewportType, width, height) { const volumeId = `fakeVolumeLoader:volumeURI_100_100_4_1_1_1_0` describe('Rectangle Roi Tool: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Cornerstone Tools: ', () => { @@ -82,8 +83,8 @@ describe('Rectangle Roi Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -93,7 +94,7 @@ describe('Rectangle Roi Tool: ', () => { eventTarget.reset() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -106,7 +107,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool on a canvas with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -116,44 +117,41 @@ describe('Rectangle Roi Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - // the rectangle is drawn on the strip - expect(data[targets[0]].mean).toBe(255) + // the rectangle is drawn on the strip + expect(data[targets[0]].mean).toBe(255) - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 10, 0] @@ -217,7 +215,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool on a canvas with mouse drag in a Volume viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -226,40 +224,37 @@ describe('Rectangle Roi Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Inside the strip which is from 50-75 in slice 2 // volumeURI_100_100_4_1_1_1_0 // The strip is from @@ -316,14 +311,16 @@ describe('Rectangle Roi Tool: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( - this.renderingEngine, - [{ volumeUID: volumeId }], - [viewportUID] - ) - vp.render() - }) + volumeLoader + .createAndCacheVolume(volumeId, { imageIds: [] }) + .then(() => { + setVolumesForViewports( + this.renderingEngine, + [{ volumeUID: volumeId }], + [viewportUID] + ) + vp.render() + }) } catch (e) { done.fail(e) } @@ -332,7 +329,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -342,43 +339,40 @@ describe('Rectangle Roi Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 10, 0] const index3 = [11, 30, 0] @@ -477,7 +471,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 256 ) @@ -487,43 +481,40 @@ describe('Rectangle Roi Tool: ', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -613,7 +604,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -625,80 +616,77 @@ describe('Rectangle Roi Tool: ', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) - - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We expect the mean to not be 255 as it has been moved - expect(data[targets[0]].mean).not.toBe(255) - expect(data[targets[0]].stdDev).not.toBe(0) - - const handles = rectangleAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[3]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) + + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We expect the mean to not be 255 as it has been moved + expect(data[targets[0]].mean).not.toBe(255) + expect(data[targets[0]].stdDev).not.toBe(0) + + const handles = rectangleAnnotation.data.handles.points + + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[3]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -828,8 +816,8 @@ describe('Rectangle Roi Tool: ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -839,7 +827,7 @@ describe('Rectangle Roi Tool: ', () => { eventTarget.reset() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -852,7 +840,7 @@ describe('Rectangle Roi Tool: ', () => { it('Should successfully create a rectangle tool and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -863,7 +851,7 @@ describe('Rectangle Roi Tool: ', () => { let p1, p2, p3, p4 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -981,7 +969,7 @@ describe('Rectangle Roi Tool: ', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const rectangleAnnotations = AnnotationState.getAnnotations( + const rectangleAnnotations = annotation.state.getAnnotations( element, RectangleRoiTool.toolName ) @@ -1042,7 +1030,7 @@ describe('Rectangle Roi Tool: ', () => { expect(handles[0]).toEqual(afterMoveFirstHandle) expect(handles[3]).toEqual(afterMoveSecondHandle) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, rectangleAnnotation.annotationUID ) @@ -1052,10 +1040,7 @@ describe('Rectangle Roi Tool: ', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/StackScrollToolMouseWheelTool_test.js b/packages/cornerstone-tools/test/StackScrollToolMouseWheelTool_test.js index 686179c418..4983c017be 100644 --- a/packages/cornerstone-tools/test/StackScrollToolMouseWheelTool_test.js +++ b/packages/cornerstone-tools/test/StackScrollToolMouseWheelTool_test.js @@ -7,19 +7,19 @@ import * as imageURI_64_64_0_20_1_1_0_scrolled from './groundTruth/imageURI_64_6 const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - INTERPOLATION_TYPE, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, metaData, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + volumeLoader, + setVolumesForViewports, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType, InterpolationType } = Enums +const { ORIENTATION } = CONSTANTS + +const { registerVolumeLoader } = volumeLoader const { StackScrollMouseWheelTool, ToolGroupManager, StackScrollTool } = csTools3d @@ -29,7 +29,7 @@ const { fakeVolumeLoader, createNormalizedMouseEvent, compareImages, -} = Utilities.testUtils +} = utilities.testUtils const renderingEngineUID = 'RENDERING_ENGINE_UID22' @@ -62,7 +62,7 @@ function createViewport(renderingEngine, viewportType, width, height) { describe('Cornerstone Tools Scroll Wheel: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -78,7 +78,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { this.stackToolGroup.setToolActive(StackScrollMouseWheelTool.toolName) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -88,7 +88,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID(StackScrollTool.toolName) this.DOMElements.forEach((el) => { @@ -101,7 +101,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { it('Should successfully scroll through a volume', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.ORTHOGRAPHIC, + ViewportType.ORTHOGRAPHIC, 512, 128 ) @@ -141,8 +141,8 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { const attachEventHandler = () => { const canvas = vp.getCanvas() - element.removeEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.removeEventListener(Events.IMAGE_RENDERED, renderEventHandler) + element.addEventListener(Events.IMAGE_RENDERED, () => { const image = canvas.toDataURL('image/png') compareImages( image, @@ -152,13 +152,13 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) + element.addEventListener(Events.IMAGE_RENDERED, renderEventHandler) this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { - createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + volumeLoader.createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID] @@ -173,7 +173,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { it('Should successfully scroll through stack of images', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -215,8 +215,8 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { const attachEventHandler = () => { const canvas = vp.getCanvas() - element.removeEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.removeEventListener(Events.IMAGE_RENDERED, renderEventHandler) + element.addEventListener(Events.IMAGE_RENDERED, () => { // Second render is as a result of scrolling const image = canvas.toDataURL('image/png') compareImages( @@ -227,13 +227,13 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, renderEventHandler) + element.addEventListener(Events.IMAGE_RENDERED, renderEventHandler) this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) try { vp.setStack([imageId1, imageId2], 0).then(() => { - vp.setProperties({ interpolationType: INTERPOLATION_TYPE.NEAREST }) + vp.setProperties({ interpolationType: InterpolationType.NEAREST }) vp.render() }) } catch (e) { diff --git a/packages/cornerstone-tools/test/ToolGroupManager_test.js b/packages/cornerstone-tools/test/ToolGroupManager_test.js index 31924e5390..09f3bbbe5d 100644 --- a/packages/cornerstone-tools/test/ToolGroupManager_test.js +++ b/packages/cornerstone-tools/test/ToolGroupManager_test.js @@ -4,19 +4,30 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - Utilities, - unregisterAllImageLoaders, + Enums, + utilities, metaData, - registerVolumeLoader, + volumeLoader, + imageLoader, + CONSTANTS, } = cornerstone3D -const { ProbeTool, LengthTool, ToolGroupManager, ToolBindings } = csTools3d +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS -const { fakeMetaDataProvider, fakeVolumeLoader } = Utilities.testUtils +const { + ProbeTool, + LengthTool, + ToolGroupManager, + Enums: csToolsEnums, +} = csTools3d + +const { fakeMetaDataProvider, fakeVolumeLoader } = utilities.testUtils +const { MouseBindings } = csToolsEnums -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'VIEWPORT1' const viewportUID2 = 'VIEWPORT2' @@ -39,7 +50,7 @@ function createViewports(width, height) { describe('ToolGroup Manager: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('ToolGroup Manager: ', () => { @@ -54,7 +65,7 @@ describe('ToolGroup Manager: ', () => { this.toolGroup.setToolActive(ProbeTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, + mouseButton: MouseBindings.Primary, }, ], }) @@ -87,7 +98,7 @@ describe('ToolGroup Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -96,7 +107,7 @@ describe('ToolGroup Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -124,7 +135,7 @@ describe('ToolGroup Manager: ', () => { this.toolGroup.setToolActive(ProbeTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, + mouseButton: MouseBindings.Primary, }, ], }) @@ -157,7 +168,7 @@ describe('ToolGroup Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -166,7 +177,7 @@ describe('ToolGroup Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -202,7 +213,7 @@ describe('ToolGroup Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -211,7 +222,7 @@ describe('ToolGroup Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -248,7 +259,7 @@ describe('ToolGroup Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -257,7 +268,7 @@ describe('ToolGroup Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -285,7 +296,7 @@ describe('ToolGroup Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -294,7 +305,7 @@ describe('ToolGroup Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background diff --git a/packages/cornerstone-tools/test/cpu_BidirectionalTool_test.js b/packages/cornerstone-tools/test/cpu_BidirectionalTool_test.js index 1bee9c936c..5103c808e0 100644 --- a/packages/cornerstone-tools/test/cpu_BidirectionalTool_test.js +++ b/packages/cornerstone-tools/test/cpu_BidirectionalTool_test.js @@ -4,36 +4,38 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, metaData, - getEnabledElement, eventTarget, - registerVolumeLoader, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + volumeLoader, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { BidirectionalTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' const AXIAL = 'AXIAL' @@ -71,11 +73,11 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0` describe('Bidirectional Tool (CPU): ', () => { beforeAll(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterAll(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) beforeEach(function () { @@ -93,8 +95,8 @@ describe('Bidirectional Tool (CPU): ', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -105,7 +107,7 @@ describe('Bidirectional Tool (CPU): ', () => { this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -118,7 +120,7 @@ describe('Bidirectional Tool (CPU): ', () => { it('Should successfully create a Bidirectional tool on a cpu stack viewport with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -130,39 +132,36 @@ describe('Bidirectional Tool (CPU): ', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 0] const index2 = [10, 1, 0] @@ -228,7 +227,7 @@ describe('Bidirectional Tool (CPU): ', () => { it('Should successfully create a bidirectional tool on a cpu stack viewport and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -240,42 +239,39 @@ describe('Bidirectional Tool (CPU): ', () => { let p2, p3 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Not not to move the handle too much since the length become width and it would fail const index1 = [50, 50, 0] const index2 = [5, 5, 0] @@ -376,7 +372,7 @@ describe('Bidirectional Tool (CPU): ', () => { it('Should successfully create a bidirectional tool on a cpu stack viewport and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -388,42 +384,39 @@ describe('Bidirectional Tool (CPU): ', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -514,7 +507,7 @@ describe('Bidirectional Tool (CPU): ', () => { it('Should successfully create a bidirectional tool on a cpu stack viewport and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -526,82 +519,76 @@ describe('Bidirectional Tool (CPU): ', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( - element, - BidirectionalTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(bidirectionalAnnotations).toBeDefined() - expect(bidirectionalAnnotations.length).toBe(1) - - const bidirectionalAnnotation = bidirectionalAnnotations[0] - expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(bidirectionalAnnotation.metadata.toolName).toBe( - BidirectionalTool.toolName - ) - expect(bidirectionalAnnotation.invalidated).toBe(false) - - const data = bidirectionalAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We don't expect the length to change on tool move - expect(data[targets[0]].length).toBeCloseTo( - calculateLength(p1, p2), - 6 - ) - - const handles = bidirectionalAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[1]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - bidirectionalAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const bidirectionalAnnotations = annotation.state.getAnnotations( + element, + BidirectionalTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(bidirectionalAnnotations).toBeDefined() + expect(bidirectionalAnnotations.length).toBe(1) + + const bidirectionalAnnotation = bidirectionalAnnotations[0] + expect(bidirectionalAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(bidirectionalAnnotation.metadata.toolName).toBe( + BidirectionalTool.toolName + ) + expect(bidirectionalAnnotation.invalidated).toBe(false) + + const data = bidirectionalAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We don't expect the length to change on tool move + expect(data[targets[0]].length).toBeCloseTo(calculateLength(p1, p2), 6) + + const handles = bidirectionalAnnotation.data.handles.points + + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[1]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + bidirectionalAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -715,7 +702,7 @@ describe('Bidirectional Tool (CPU): ', () => { it('Should successfully cancel drawing of a bidirectional on a cpu stack viewport', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -726,7 +713,7 @@ describe('Bidirectional Tool (CPU): ', () => { let p1, p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [32, 32, 4] const index2 = [10, 1, 4] @@ -793,7 +780,7 @@ describe('Bidirectional Tool (CPU): ', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const bidirectionalAnnotations = AnnotationState.getAnnotations( + const bidirectionalAnnotations = annotation.state.getAnnotations( element, BidirectionalTool.toolName ) @@ -817,7 +804,7 @@ describe('Bidirectional Tool (CPU): ', () => { expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, bidirectionalAnnotation.annotationUID ) @@ -826,10 +813,7 @@ describe('Bidirectional Tool (CPU): ', () => { } this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/cpu_EllipseROI_test.js b/packages/cornerstone-tools/test/cpu_EllipseROI_test.js index 2c1fc1edb2..f016f11730 100644 --- a/packages/cornerstone-tools/test/cpu_EllipseROI_test.js +++ b/packages/cornerstone-tools/test/cpu_EllipseROI_test.js @@ -4,36 +4,38 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, metaData, - getEnabledElement, eventTarget, - registerVolumeLoader, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + volumeLoader, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { EllipticalRoiTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + Enums: csToolsEnums, cancelActiveManipulations, + annotation, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -64,11 +66,11 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_4_1_1_1_0` describe('EllipticalRoiTool (CPU):', () => { beforeAll(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterAll(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) beforeEach(function () { @@ -86,8 +88,8 @@ describe('EllipticalRoiTool (CPU):', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -99,7 +101,7 @@ describe('EllipticalRoiTool (CPU):', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -112,7 +114,7 @@ describe('EllipticalRoiTool (CPU):', () => { it('Should successfully create a ellipse tool on a cpu stack viewport with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -122,44 +124,41 @@ describe('EllipticalRoiTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const ellipseAnnotations = AnnotationState.getAnnotations( - element, - EllipticalRoiTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(ellipseAnnotations).toBeDefined() - expect(ellipseAnnotations.length).toBe(1) - - const ellipseAnnotation = ellipseAnnotations[0] - expect(ellipseAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - - expect(ellipseAnnotation.metadata.toolName).toBe( - EllipticalRoiTool.toolName - ) - expect(ellipseAnnotation.invalidated).toBe(false) - - const data = ellipseAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // the rectangle is drawn on the strip - expect(data[targets[0]].mean).toBe(255) - - AnnotationState.removeAnnotation( - element, - ellipseAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const ellipseAnnotations = annotation.state.getAnnotations( + element, + EllipticalRoiTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(ellipseAnnotations).toBeDefined() + expect(ellipseAnnotations.length).toBe(1) + + const ellipseAnnotation = ellipseAnnotations[0] + expect(ellipseAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + + expect(ellipseAnnotation.metadata.toolName).toBe( + EllipticalRoiTool.toolName + ) + expect(ellipseAnnotation.invalidated).toBe(false) + + const data = ellipseAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // the rectangle is drawn on the strip + expect(data[targets[0]].mean).toBe(255) + + annotation.state.removeAnnotation( + element, + ellipseAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Since ellipse draws from center to out, we are picking a very center // point in the image (strip is 255 from 10-15 in X and from 0-64 in Y) const index1 = [12, 30, 0] @@ -225,7 +224,7 @@ describe('EllipticalRoiTool (CPU):', () => { it('Should cancel drawing of a EllipseTool annotation on a cpu stack viewport', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -236,7 +235,7 @@ describe('EllipticalRoiTool (CPU):', () => { let p1, p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { // Since ellipse draws from center to out, we are picking a very center // point in the image (strip is 255 from 10-15 in X and from 0-64 in Y) const index1 = [12, 30, 0] @@ -303,7 +302,7 @@ describe('EllipticalRoiTool (CPU):', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const ellipseAnnotations = AnnotationState.getAnnotations( + const ellipseAnnotations = annotation.state.getAnnotations( element, EllipticalRoiTool.toolName ) @@ -329,7 +328,7 @@ describe('EllipticalRoiTool (CPU):', () => { // the rectangle is drawn on the strip expect(data[targets[0]].mean).toBe(255) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, ellipseAnnotation.annotationUID ) @@ -339,10 +338,7 @@ describe('EllipticalRoiTool (CPU):', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/cpu_LengthTool_test.js b/packages/cornerstone-tools/test/cpu_LengthTool_test.js index 4f5cd43e8a..6c23d502f1 100644 --- a/packages/cornerstone-tools/test/cpu_LengthTool_test.js +++ b/packages/cornerstone-tools/test/cpu_LengthTool_test.js @@ -4,35 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, + Enums, eventTarget, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + utilities, + imageLoader, metaData, - getEnabledElement, - registerVolumeLoader, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + volumeLoader, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { LengthTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, + annotation, + Enums: csToolsEnums, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -71,11 +73,11 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0` describe('Length Tool (CPU):', () => { beforeAll(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterAll(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) beforeEach(function () { @@ -93,8 +95,8 @@ describe('Length Tool (CPU):', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -104,7 +106,7 @@ describe('Length Tool (CPU):', () => { cache.purgeCache() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -117,7 +119,7 @@ describe('Length Tool (CPU):', () => { it('Should successfully create a length tool on a cpu stack viewport with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -129,39 +131,36 @@ describe('Length Tool (CPU):', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) - - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) + + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [30, 30, 0] const index2 = [60, 60, 0] @@ -229,7 +228,7 @@ describe('Length Tool (CPU):', () => { it('Should successfully create a length tool on a cpu stack viewport and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -241,40 +240,37 @@ describe('Length Tool (CPU):', () => { let p2, p3 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) - - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - expect(lengthAnnotation.highlighted).toBe(false) - - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) - - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) + + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + expect(lengthAnnotation.highlighted).toBe(false) + + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p3, p2)) + + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [50, 50, 0] const index2 = [5, 5, 0] const index3 = [33, 33, 0] @@ -375,7 +371,7 @@ describe('Length Tool (CPU):', () => { it('Should successfully create a length tool on a cpu stack viewport and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -387,41 +383,38 @@ describe('Length Tool (CPU):', () => { let p1, p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) - - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - expect(lengthAnnotation.highlighted).toBe(false) - - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) - - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) + + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + expect(lengthAnnotation.highlighted).toBe(false) + + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].length).toBe(calculateLength(p1, p2)) + + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] @@ -513,7 +506,7 @@ describe('Length Tool (CPU):', () => { it('Should successfully create a length tool on a cpu stack viewport and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -525,80 +518,74 @@ describe('Length Tool (CPU):', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const lengthAnnotations = AnnotationState.getAnnotations( - element, - LengthTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(lengthAnnotations).toBeDefined() - expect(lengthAnnotations.length).toBe(1) - - const lengthAnnotation = lengthAnnotations[0] - expect(lengthAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) - expect(lengthAnnotation.invalidated).toBe(false) - - const data = lengthAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We don't expect the length to change on tool move - expect(data[targets[0]].length).toBeCloseTo( - calculateLength(p1, p2), - 6 - ) - - const handles = lengthAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[1]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - lengthAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const lengthAnnotations = annotation.state.getAnnotations( + element, + LengthTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(lengthAnnotations).toBeDefined() + expect(lengthAnnotations.length).toBe(1) + + const lengthAnnotation = lengthAnnotations[0] + expect(lengthAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(lengthAnnotation.metadata.toolName).toBe(LengthTool.toolName) + expect(lengthAnnotation.invalidated).toBe(false) + + const data = lengthAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We don't expect the length to change on tool move + expect(data[targets[0]].length).toBeCloseTo(calculateLength(p1, p2), 6) + + const handles = lengthAnnotation.data.handles.points + + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[1]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + lengthAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [20, 20, 0] const index2 = [20, 30, 0] diff --git a/packages/cornerstone-tools/test/cpu_ProbeTool_test.js b/packages/cornerstone-tools/test/cpu_ProbeTool_test.js index 2a8c230dd4..d0cb73849c 100644 --- a/packages/cornerstone-tools/test/cpu_ProbeTool_test.js +++ b/packages/cornerstone-tools/test/cpu_ProbeTool_test.js @@ -4,36 +4,38 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - Utilities, + utilities, eventTarget, - registerImageLoader, - unregisterAllImageLoaders, + imageLoader, metaData, - EVENTS, - getEnabledElement, - registerVolumeLoader, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + Enums, + volumeLoader, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ProbeTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, cancelActiveManipulations, + annotation, + Enums: csToolsEnums, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeMetaDataProvider, fakeVolumeLoader, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -64,11 +66,11 @@ function createViewport(renderingEngine, viewportType, width, height) { describe('ProbeTool (CPU):', () => { beforeAll(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterAll(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) beforeEach(function () { @@ -86,8 +88,8 @@ describe('ProbeTool (CPU):', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -98,7 +100,7 @@ describe('ProbeTool (CPU):', () => { this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -111,7 +113,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully click to put a probe tool on a cpu stack viewport - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -121,41 +123,38 @@ describe('ProbeTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) - - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) - - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) - - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) + + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) + + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) + + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] const { imageData } = vp.getImageData() @@ -201,7 +200,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully click to put two probe tools on a cpu stack viewport - 256 x 256', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -211,63 +210,56 @@ describe('ProbeTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(2) - - const firstProbeAnnotation = probeAnnotations[0] - expect(firstProbeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(firstProbeAnnotation.metadata.toolName).toBe( - ProbeTool.toolName - ) - expect(firstProbeAnnotation.invalidated).toBe(false) - - let data = firstProbeAnnotation.data.cachedStats - let targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) - - // Second click - const secondProbeAnnotation = probeAnnotations[1] - expect(secondProbeAnnotation.metadata.toolName).toBe( - ProbeTool.toolName - ) - expect(secondProbeAnnotation.invalidated).toBe(false) - - data = secondProbeAnnotation.data.cachedStats - targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(0) - - // - AnnotationState.removeAnnotation( - element, - firstProbeAnnotation.annotationUID - ) - AnnotationState.removeAnnotation( - element, - secondProbeAnnotation.annotationUID - ) - - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(2) + + const firstProbeAnnotation = probeAnnotations[0] + expect(firstProbeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(firstProbeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(firstProbeAnnotation.invalidated).toBe(false) + + let data = firstProbeAnnotation.data.cachedStats + let targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) + + // Second click + const secondProbeAnnotation = probeAnnotations[1] + expect(secondProbeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(secondProbeAnnotation.invalidated).toBe(false) + + data = secondProbeAnnotation.data.cachedStats + targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(0) + + // + annotation.state.removeAnnotation( + element, + firstProbeAnnotation.annotationUID + ) + annotation.state.removeAnnotation( + element, + secondProbeAnnotation.annotationUID + ) + + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [20, 20, 0] // 0 @@ -335,7 +327,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully click to put a probe tool on a cpu stack viewport - 256 x 512', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 512 ) @@ -345,41 +337,38 @@ describe('ProbeTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) - - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) - - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(255) - - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) + + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) + + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(255) + + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [150, 100, 0] // 255 const { imageData } = vp.getImageData() @@ -423,7 +412,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully click to put a probe tool on a cpu stack viewport - 256 x 512', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 512 ) @@ -433,41 +422,38 @@ describe('ProbeTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - // Can successfully add probe tool to annotationManager - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) - - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) - - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // The world coordinate is on the white bar so value is 255 - expect(data[targets[0]].value).toBe(0) - - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + // Can successfully add probe tool to annotationManager + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) + + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) + + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // The world coordinate is on the white bar so value is 255 + expect(data[targets[0]].value).toBe(0) + + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [35, 35, 0] // 0 const { imageData } = vp.getImageData() @@ -511,7 +497,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully create a Probe tool on a cpu stack viewport and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -523,47 +509,44 @@ describe('ProbeTool (CPU):', () => { let p2 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const probeAnnotations = AnnotationState.getAnnotations( - element, - ProbeTool.toolName - ) - // Can successfully add Length tool to annotationManager - expect(probeAnnotations).toBeDefined() - expect(probeAnnotations.length).toBe(1) - - const probeAnnotation = probeAnnotations[0] - expect(probeAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) - expect(probeAnnotation.invalidated).toBe(false) - - const data = probeAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We expect the probeTool which was original on 255 strip should be 0 now - expect(data[targets[0]].value).toBe(0) - - const handles = probeAnnotation.data.handles.points - - expect(handles[0][0]).toEqual(p2[0]) - expect(handles[0][1]).toEqual(p2[1]) - expect(handles[0][2]).toEqual(p2[2]) - - AnnotationState.removeAnnotation( - element, - probeAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const probeAnnotations = annotation.state.getAnnotations( + element, + ProbeTool.toolName + ) + // Can successfully add Length tool to annotationManager + expect(probeAnnotations).toBeDefined() + expect(probeAnnotations.length).toBe(1) + + const probeAnnotation = probeAnnotations[0] + expect(probeAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(probeAnnotation.metadata.toolName).toBe(ProbeTool.toolName) + expect(probeAnnotation.invalidated).toBe(false) + + const data = probeAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We expect the probeTool which was original on 255 strip should be 0 now + expect(data[targets[0]].value).toBe(0) + + const handles = probeAnnotation.data.handles.points + + expect(handles[0][0]).toEqual(p2[0]) + expect(handles[0][1]).toEqual(p2[1]) + expect(handles[0][2]).toEqual(p2[2]) + + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [40, 40, 0] // 0 @@ -642,7 +625,7 @@ describe('ProbeTool (CPU):', () => { it('Should successfully cancel drawing of a ProbeTool on a cpu stack viewport', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -653,7 +636,7 @@ describe('ProbeTool (CPU):', () => { let p2 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 20, 0] // 255 const index2 = [40, 40, 0] // 0 @@ -719,7 +702,7 @@ describe('ProbeTool (CPU):', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const probeAnnotations = AnnotationState.getAnnotations( + const probeAnnotations = annotation.state.getAnnotations( element, ProbeTool.toolName ) @@ -748,16 +731,16 @@ describe('ProbeTool (CPU):', () => { expect(handles[0][1]).toEqual(p2[1]) expect(handles[0][2]).toEqual(p2[2]) - AnnotationState.removeAnnotation(element, probeAnnotation.annotationUID) + annotation.state.removeAnnotation( + element, + probeAnnotation.annotationUID + ) done() }, 100) } this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/cpu_RectangleROI_test.js b/packages/cornerstone-tools/test/cpu_RectangleROI_test.js index ace44a01de..b48a0b7ec6 100644 --- a/packages/cornerstone-tools/test/cpu_RectangleROI_test.js +++ b/packages/cornerstone-tools/test/cpu_RectangleROI_test.js @@ -4,36 +4,38 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - EVENTS, - Utilities, - registerImageLoader, - unregisterAllImageLoaders, + Enums, + utilities, + imageLoader, eventTarget, metaData, - getEnabledElement, - registerVolumeLoader, - setUseCPURenderingOnlyForDebugOrTests, - resetCPURenderingOnlyForDebugOrTests, + volumeLoader, + setUseCPURendering, + resetUseCPURendering, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { RectangleRoiTool, ToolGroupManager, - AnnotationState, - CornerstoneTools3DEvents, cancelActiveManipulations, + annotation, + Enums: csToolsEnums, } = csTools3d +const { Events: csToolsEvents } = csToolsEnums + const { fakeImageLoader, fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -64,11 +66,11 @@ const volumeId = `fakeVolumeLoader:volumeURI_100_100_4_1_1_1_0` describe('RectangleRoiTool (CPU):', () => { beforeAll(() => { - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) }) afterAll(() => { - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() }) beforeEach(function () { @@ -86,8 +88,8 @@ describe('RectangleRoiTool (CPU):', () => { }) this.renderingEngine = new RenderingEngine(renderingEngineUID) - registerImageLoader('fakeImageLoader', fakeImageLoader) - registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) + imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader) + volumeLoader.registerVolumeLoader('fakeVolumeLoader', fakeVolumeLoader) metaData.addProvider(fakeMetaDataProvider, 10000) }) @@ -97,7 +99,7 @@ describe('RectangleRoiTool (CPU):', () => { eventTarget.reset() this.renderingEngine.destroy() metaData.removeProvider(fakeMetaDataProvider) - unregisterAllImageLoaders() + imageLoader.unregisterAllImageLoaders() ToolGroupManager.destroyToolGroupByToolGroupUID('stack') this.DOMElements.forEach((el) => { @@ -110,7 +112,7 @@ describe('RectangleRoiTool (CPU):', () => { it('Should successfully create a rectangle tool on a cpu stack viewport with mouse drag - 512 x 128', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -120,44 +122,41 @@ describe('RectangleRoiTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) - - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) - - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // the rectangle is drawn on the strip - expect(data[targets[0]].mean).toBe(255) - - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) + + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) + + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // the rectangle is drawn on the strip + expect(data[targets[0]].mean).toBe(255) + + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 10, 0] @@ -221,7 +220,7 @@ describe('RectangleRoiTool (CPU):', () => { it('Should successfully create a rectangle tool on a cpu stack viewport and modify its handle', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 256, 256 ) @@ -231,43 +230,40 @@ describe('RectangleRoiTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) - - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) - - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) - - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) + + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) + + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) + + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 10, 0] const index3 = [11, 30, 0] @@ -366,7 +362,7 @@ describe('RectangleRoiTool (CPU):', () => { it('Should successfully create a rectangle tool on a cpu stack viewport and select but not move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 256 ) @@ -376,43 +372,40 @@ describe('RectangleRoiTool (CPU):', () => { const vp = this.renderingEngine.getViewport(viewportUID) const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) - - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) - - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - expect(data[targets[0]].mean).toBe(255) - expect(data[targets[0]].stdDev).toBe(0) - - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) + + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) + + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + expect(data[targets[0]].mean).toBe(255) + expect(data[targets[0]].stdDev).toBe(0) + + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -502,7 +495,7 @@ describe('RectangleRoiTool (CPU):', () => { it('Should successfully create a rectangle tool on a cpu stack viewport and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -514,80 +507,77 @@ describe('RectangleRoiTool (CPU):', () => { let p1, p2, p3, p4 const addEventListenerForAnnotationRendered = () => { - element.addEventListener( - CornerstoneTools3DEvents.ANNOTATION_RENDERED, - () => { - const rectangleAnnotations = AnnotationState.getAnnotations( - element, - RectangleRoiTool.toolName - ) - // Can successfully add rectangleROI to annotationManager - expect(rectangleAnnotations).toBeDefined() - expect(rectangleAnnotations.length).toBe(1) - - const rectangleAnnotation = rectangleAnnotations[0] - expect(rectangleAnnotation.metadata.referencedImageId).toBe( - imageId1.split(':')[1] - ) - expect(rectangleAnnotation.metadata.toolName).toBe( - RectangleRoiTool.toolName - ) - expect(rectangleAnnotation.invalidated).toBe(false) - - const data = rectangleAnnotation.data.cachedStats - const targets = Array.from(Object.keys(data)) - expect(targets.length).toBe(1) - - // We expect the mean to not be 255 as it has been moved - expect(data[targets[0]].mean).not.toBe(255) - expect(data[targets[0]].stdDev).not.toBe(0) - - const handles = rectangleAnnotation.data.handles.points - - const preMoveFirstHandle = p1 - const preMoveSecondHandle = p2 - const preMoveCenter = p3 - - const centerToHandle1 = [ - preMoveCenter[0] - preMoveFirstHandle[0], - preMoveCenter[1] - preMoveFirstHandle[1], - preMoveCenter[2] - preMoveFirstHandle[2], - ] - - const centerToHandle2 = [ - preMoveCenter[0] - preMoveSecondHandle[0], - preMoveCenter[1] - preMoveSecondHandle[1], - preMoveCenter[2] - preMoveSecondHandle[2], - ] - - const afterMoveCenter = p4 - - const afterMoveFirstHandle = [ - afterMoveCenter[0] - centerToHandle1[0], - afterMoveCenter[1] - centerToHandle1[1], - afterMoveCenter[2] - centerToHandle1[2], - ] - - const afterMoveSecondHandle = [ - afterMoveCenter[0] - centerToHandle2[0], - afterMoveCenter[1] - centerToHandle2[1], - afterMoveCenter[2] - centerToHandle2[2], - ] - - // Expect handles are moved accordingly - expect(handles[0]).toEqual(afterMoveFirstHandle) - expect(handles[3]).toEqual(afterMoveSecondHandle) - - AnnotationState.removeAnnotation( - element, - rectangleAnnotation.annotationUID - ) - done() - } - ) + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + element, + RectangleRoiTool.toolName + ) + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined() + expect(rectangleAnnotations.length).toBe(1) + + const rectangleAnnotation = rectangleAnnotations[0] + expect(rectangleAnnotation.metadata.referencedImageId).toBe( + imageId1.split(':')[1] + ) + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleRoiTool.toolName + ) + expect(rectangleAnnotation.invalidated).toBe(false) + + const data = rectangleAnnotation.data.cachedStats + const targets = Array.from(Object.keys(data)) + expect(targets.length).toBe(1) + + // We expect the mean to not be 255 as it has been moved + expect(data[targets[0]].mean).not.toBe(255) + expect(data[targets[0]].stdDev).not.toBe(0) + + const handles = rectangleAnnotation.data.handles.points + + const preMoveFirstHandle = p1 + const preMoveSecondHandle = p2 + const preMoveCenter = p3 + + const centerToHandle1 = [ + preMoveCenter[0] - preMoveFirstHandle[0], + preMoveCenter[1] - preMoveFirstHandle[1], + preMoveCenter[2] - preMoveFirstHandle[2], + ] + + const centerToHandle2 = [ + preMoveCenter[0] - preMoveSecondHandle[0], + preMoveCenter[1] - preMoveSecondHandle[1], + preMoveCenter[2] - preMoveSecondHandle[2], + ] + + const afterMoveCenter = p4 + + const afterMoveFirstHandle = [ + afterMoveCenter[0] - centerToHandle1[0], + afterMoveCenter[1] - centerToHandle1[1], + afterMoveCenter[2] - centerToHandle1[2], + ] + + const afterMoveSecondHandle = [ + afterMoveCenter[0] - centerToHandle2[0], + afterMoveCenter[1] - centerToHandle2[1], + afterMoveCenter[2] - centerToHandle2[2], + ] + + // Expect handles are moved accordingly + expect(handles[0]).toEqual(afterMoveFirstHandle) + expect(handles[3]).toEqual(afterMoveSecondHandle) + + annotation.state.removeAnnotation( + element, + rectangleAnnotation.annotationUID + ) + done() + }) } - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -703,7 +693,7 @@ describe('RectangleRoiTool (CPU):', () => { it('Should successfully create a rectangle tool on a cpu stack viewport and select AND move it', function (done) { const element = createViewport( this.renderingEngine, - VIEWPORT_TYPE.STACK, + ViewportType.STACK, 512, 128 ) @@ -714,7 +704,7 @@ describe('RectangleRoiTool (CPU):', () => { let p1, p2, p3, p4 - element.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element.addEventListener(Events.IMAGE_RENDERED, () => { const index1 = [11, 5, 0] const index2 = [14, 30, 0] @@ -832,7 +822,7 @@ describe('RectangleRoiTool (CPU):', () => { expect(canceledDataUID).toBeDefined() setTimeout(() => { - const rectangleAnnotations = AnnotationState.getAnnotations( + const rectangleAnnotations = annotation.state.getAnnotations( element, RectangleRoiTool.toolName ) @@ -893,7 +883,7 @@ describe('RectangleRoiTool (CPU):', () => { expect(handles[0]).toEqual(afterMoveFirstHandle) expect(handles[3]).toEqual(afterMoveSecondHandle) - AnnotationState.removeAnnotation( + annotation.state.removeAnnotation( element, rectangleAnnotation.annotationUID ) @@ -903,10 +893,7 @@ describe('RectangleRoiTool (CPU):', () => { this.stackToolGroup.addViewport(vp.uid, this.renderingEngine.uid) - element.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, - cancelToolDrawing - ) + element.addEventListener(csToolsEvents.KEY_DOWN, cancelToolDrawing) try { vp.setStack([imageId1], 0) diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_2SEGs_AX.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_2SEGs_AX.png index a1c638504d..92a2c2f941 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_2SEGs_AX.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_2SEGs_AX.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX.png index e98dc960f7..b77c01fc2f 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX_Custom.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX_Custom.png index 02ea77b751..6d59d3d700 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX_Custom.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_AX_Custom.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_COR.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_COR.png index 11b560aabe..2fa4476655 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_COR.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_COR.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_GlobalConfig.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_GlobalConfig.png index 12fe8267b3..781b455c3a 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_GlobalConfig.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_GlobalConfig.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_RectangleScissor.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_RectangleScissor.png index a6a55918f3..7fa04a3cb2 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_RectangleScissor.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_RectangleScissor.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG.png index e0b68cb85a..ccde3a6940 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG_RectangleScissor.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG_RectangleScissor.png index 596182b1f8..dca5972a85 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG_RectangleScissor.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SAG_RectangleScissor.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_AX.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_AX.png index 4f55baf8ac..ae22abbe4d 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_AX.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_AX.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_COR.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_COR.png index 13c3339ab2..a9c2b6f180 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_COR.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_COR.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_SAG.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_SAG.png index c908c06785..1e8e85f54f 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_SAG.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_SAG.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_ToolGroupPrioritize.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_ToolGroupPrioritize.png index 2d3707136e..4a4d26b4a3 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_ToolGroupPrioritize.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_ToolGroupPrioritize.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_activeInactive.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_activeInactive.png index 65dd87817d..ba301262fd 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_activeInactive.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_activeInactive.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_controller_1.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_controller_1.png index aeb3cc3888..324e649fa9 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_controller_1.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_controller_1.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_customColorLUT.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_customColorLUT.png index f03e9657d5..0fa6a0139d 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_customColorLUT.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_customColorLUT.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexController.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexController.png index 1f523a29a3..cb999ba7a1 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexController.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexController.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexLocked.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexLocked.png index a75d8dc335..446358251d 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexLocked.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_indexLocked.png differ diff --git a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_initialConfig.png b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_initialConfig.png index 44d8fd068e..d69ef8999a 100644 Binary files a/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_initialConfig.png and b/packages/cornerstone-tools/test/groundTruth/volumeURI_100_100_10_1_1_1_0_SEG_initialConfig.png differ diff --git a/packages/cornerstone-tools/test/segmentationConfigController_test.js b/packages/cornerstone-tools/test/segmentationConfigController_test.js index b779016fed..a9e84c18cb 100644 --- a/packages/cornerstone-tools/test/segmentationConfigController_test.js +++ b/packages/cornerstone-tools/test/segmentationConfigController_test.js @@ -8,31 +8,38 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_ToolGroupPrioritize from './groundT const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, + imageLoader, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + utilities, + setVolumesForViewports, eventTarget, + volumeLoader, + CONSTANTS, } = cornerstone3D +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { unregisterAllImageLoaders } = imageLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationRepresentations, - SegmentationModule, + segmentation, + Enums: csToolsEnums, RectangleScissorsTool, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation +const { SegmentationRepresentations } = csToolsEnums + const { fakeVolumeLoader, fakeMetaDataProvider, compareImages } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' const AXIAL = 'AXIAL' @@ -52,7 +59,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -67,7 +74,7 @@ function createViewport( describe('Segmentation Controller --', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Config Controller', function () { @@ -140,15 +147,13 @@ describe('Segmentation Controller --', () => { ) const representationConfig = - SegmentationModule.segmentationConfigController.getRepresentationConfig( + segmentation.segmentationConfig.getRepresentationConfig( TOOL_GROUP_UID, SegmentationRepresentations.Labelmap ) const segmentationConfig = - SegmentationModule.segmentationConfigController.getSegmentationConfig( - TOOL_GROUP_UID - ) + segmentation.segmentationConfig.getSegmentationConfig(TOOL_GROUP_UID) const representationConfigFromSegmentationConfig = segmentationConfig.representations[ @@ -162,12 +167,12 @@ describe('Segmentation Controller --', () => { ).toEqual(representationConfig.renderOutline) const globalRepresentationConfig = - SegmentationModule.segmentationConfigController.getGlobalRepresentationConfig( + segmentation.segmentationConfig.getGlobalRepresentationConfig( SegmentationRepresentations.Labelmap ) const globalSegmentationConfig = - SegmentationModule.segmentationConfigController.getGlobalSegmentationConfig() + segmentation.segmentationConfig.getGlobalSegmentationConfig() expect(globalRepresentationConfig).toBeDefined() expect(globalRepresentationConfig.renderOutline).toBe(true) @@ -185,7 +190,7 @@ describe('Segmentation Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -194,7 +199,7 @@ describe('Segmentation Controller --', () => { try { createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] @@ -246,7 +251,7 @@ describe('Segmentation Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -255,19 +260,19 @@ describe('Segmentation Controller --', () => { try { createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp1.render() - SegmentationModule.segmentationConfigController.setGlobalRepresentationConfig( + segmentation.segmentationConfig.setGlobalRepresentationConfig( SegmentationRepresentations.Labelmap, globalRepresentationConfig ) const colorLUTIndex = 1 - SegmentationModule.segmentationColorController.addColorLut( + segmentation.segmentationColor.addColorLUT( [ [0, 0, 0, 0], [0, 0, 255, 255], @@ -326,7 +331,7 @@ describe('Segmentation Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -335,19 +340,19 @@ describe('Segmentation Controller --', () => { try { createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp1.render() - SegmentationModule.segmentationConfigController.setGlobalRepresentationConfig( + segmentation.segmentationConfig.setGlobalRepresentationConfig( SegmentationRepresentations.Labelmap, globalRepresentationConfig ) const colorLUTIndex = 1 - SegmentationModule.segmentationColorController.addColorLut( + segmentation.segmentationColor.addColorLUT( [ [0, 0, 0, 0], [0, 255, 255, 255], diff --git a/packages/cornerstone-tools/test/segmentationRectangleScissor_test.js b/packages/cornerstone-tools/test/segmentationRectangleScissor_test.js index af3dfb29b5..577daa553b 100644 --- a/packages/cornerstone-tools/test/segmentationRectangleScissor_test.js +++ b/packages/cornerstone-tools/test/segmentationRectangleScissor_test.js @@ -7,34 +7,41 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_SAG_RectangleScissor from './ground const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + volumeLoader, + imageLoader, + utilities, + setVolumesForViewports, eventTarget, + CONSTANTS, } = cornerstone3D +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { unregisterAllImageLoaders } = imageLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationModule, + segmentation, + Enums: csToolsEnums, RectangleScissorsTool, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation + const { fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, compareImages, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' const viewportUID2 = 'SAGITTAL' @@ -55,7 +62,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -67,7 +74,7 @@ function createViewport( describe('Segmentation Tools --', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Rectangle Scissor:', function () { @@ -119,7 +126,7 @@ describe('Segmentation Tools --', () => { const vp = this.renderingEngine.getViewport(viewportUID1) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -127,7 +134,7 @@ describe('Segmentation Tools --', () => { ) // wait until the render loop is done before we say done - eventTarget.addEventListener(EVENTS.SEGMENTATION_RENDERED, (evt) => { + eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { done() }) @@ -135,20 +142,20 @@ describe('Segmentation Tools --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp.render() - SegmentationModule.createNewSegmentationForViewport(vp).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { @@ -166,7 +173,7 @@ describe('Segmentation Tools --', () => { const drawRectangle = () => { eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -221,7 +228,7 @@ describe('Segmentation Tools --', () => { const newSegRenderedCallback = () => { eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -244,12 +251,12 @@ describe('Segmentation Tools --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -260,20 +267,20 @@ describe('Segmentation Tools --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp.render() - SegmentationModule.createNewSegmentationForViewport(vp).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { @@ -298,11 +305,11 @@ describe('Segmentation Tools --', () => { const drawRectangle = () => { eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, drawRectangle ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -364,7 +371,7 @@ describe('Segmentation Tools --', () => { } eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -411,12 +418,12 @@ describe('Segmentation Tools --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -428,7 +435,7 @@ describe('Segmentation Tools --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1, viewportUID2] @@ -436,13 +443,13 @@ describe('Segmentation Tools --', () => { vp1.render() vp2.render() - SegmentationModule.createNewSegmentationForViewport(vp1).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { diff --git a/packages/cornerstone-tools/test/segmentationRender_test.js b/packages/cornerstone-tools/test/segmentationRender_test.js index 4b704bcded..e63255d221 100644 --- a/packages/cornerstone-tools/test/segmentationRender_test.js +++ b/packages/cornerstone-tools/test/segmentationRender_test.js @@ -10,31 +10,37 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_AX_Custom from './groundTruth/volum const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + imageLoader, + volumeLoader, + utilities, + setVolumesForViewports, eventTarget, + CONSTANTS, } = cornerstone3D +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationRepresentations, - SegmentationState, - SegmentationModule, + segmentation, + Enums: csToolsEnums, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation +const { SegmentationRepresentations } = csToolsEnums + const { fakeMetaDataProvider, compareImages, fakeVolumeLoader } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' const viewportUID2 = 'SAGITTAL' @@ -59,7 +65,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -71,7 +77,7 @@ function createViewport( describe('Segmentation Render -- ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Rendering', function () { @@ -118,7 +124,7 @@ describe('Segmentation Render -- ', () => { const segVolumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp = this.renderingEngine.getViewport(viewportUID1) - eventTarget.addEventListener(EVENTS.SEGMENTATION_RENDERED, (evt) => { + eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { const canvas = vp.getCanvas() const image = canvas.toDataURL('image/png') @@ -137,7 +143,7 @@ describe('Segmentation Render -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID1] @@ -171,7 +177,7 @@ describe('Segmentation Render -- ', () => { const vp3 = this.renderingEngine.getViewport(viewportUID3) let renderedViewportCounts = 0 - eventTarget.addEventListener(EVENTS.SEGMENTATION_RENDERED, (evt) => { + eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { renderedViewportCounts++ if (renderedViewportCounts !== 3) { @@ -214,7 +220,7 @@ describe('Segmentation Render -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID1, viewportUID2, viewportUID3] @@ -243,7 +249,7 @@ describe('Segmentation Render -- ', () => { 'fakeVolumeLoader:volumeURIExact_100_100_10_1_1_1_0_60_60_2_80_80_7' const vp1 = this.renderingEngine.getViewport(viewportUID1) - eventTarget.addEventListener(EVENTS.SEGMENTATION_RENDERED, (evt) => { + eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { const canvas1 = vp1.getCanvas() const image1 = canvas1.toDataURL('image/png') @@ -262,7 +268,7 @@ describe('Segmentation Render -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID1] @@ -300,7 +306,7 @@ describe('Segmentation Render -- ', () => { const segVolumeId = 'fakeVolumeLoader:volumeURI_100_100_10_1_1_1_0' const vp1 = this.renderingEngine.getViewport(viewportUID1) - eventTarget.addEventListener(EVENTS.SEGMENTATION_RENDERED, (evt) => { + eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { const canvas1 = vp1.getCanvas() const image1 = canvas1.toDataURL('image/png') expect(evt.detail.toolGroupUID).toBe('segToolGroup') @@ -313,16 +319,16 @@ describe('Segmentation Render -- ', () => { }) eventTarget.addEventListener( - EVENTS.SEGMENTATION_STATE_MODIFIED, + Events.SEGMENTATION_STATE_MODIFIED, (evt) => { - const toolGroupState = SegmentationState.getSegmentationState( + const toolGroupState = segmentation.state.getSegmentationState( this.segToolGroup.uid ) expect(toolGroupState).toBeDefined() const toolGroupConfig = - SegmentationModule.segmentationConfigController.getSegmentationConfig( + segmentation.segmentationConfig.getSegmentationConfig( this.segToolGroup.uid ) @@ -341,7 +347,7 @@ describe('Segmentation Render -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID1] diff --git a/packages/cornerstone-tools/test/segmentationSegmentIndexController_test.js b/packages/cornerstone-tools/test/segmentationSegmentIndexController_test.js index 705c50a34e..3397968bed 100644 --- a/packages/cornerstone-tools/test/segmentationSegmentIndexController_test.js +++ b/packages/cornerstone-tools/test/segmentationSegmentIndexController_test.js @@ -8,35 +8,41 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_indexLocked from './groundTruth/vol const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + imageLoader, + volumeLoader, + utilities, + setVolumesForViewports, eventTarget, + CONSTANTS, } = cornerstone3D +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationRepresentations, - SegmentationModule, + segmentation, + Enums: csToolsEnums, RectangleScissorsTool, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation + const { fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, compareImages, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' @@ -57,7 +63,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -69,7 +75,7 @@ function createViewport( describe('Segmentation Index Controller --', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Index/Lock Controller', function () { @@ -169,7 +175,7 @@ describe('Segmentation Index Controller --', () => { const newSegRenderedCallback = () => { eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -179,7 +185,7 @@ describe('Segmentation Index Controller --', () => { drawRectangle([20, 20, 0], [40, 40, 0]) eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) drawRectangle([30, 30, 0], [50, 50, 0]) @@ -198,12 +204,12 @@ describe('Segmentation Index Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -214,20 +220,20 @@ describe('Segmentation Index Controller --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp1.render() - SegmentationModule.createNewSegmentationForViewport(vp1).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { @@ -292,7 +298,7 @@ describe('Segmentation Index Controller --', () => { const newSegRenderedCallback = () => { eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -301,13 +307,10 @@ describe('Segmentation Index Controller --', () => { setTimeout(() => { drawRectangle([20, 20, 0], [40, 40, 0]) - SegmentationModule.segmentIndexController.setActiveSegmentIndex( - TOOL_GROUP_UID, - 2 - ) + segmentation.segmentIndex.setActiveSegmentIndex(TOOL_GROUP_UID, 2) eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) drawRectangle([30, 30, 0], [50, 50, 0]) @@ -319,15 +322,13 @@ describe('Segmentation Index Controller --', () => { const image1 = canvas1.toDataURL('image/png') const activeSegmentIndex = - SegmentationModule.segmentIndexController.getActiveSegmentIndex( - TOOL_GROUP_UID - ) + segmentation.segmentIndex.getActiveSegmentIndex(TOOL_GROUP_UID) expect(activeSegmentIndex).toBe(2) // active segmentation const segmentationInfo = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( + segmentation.activeSegmentation.getActiveSegmentationInfo( TOOL_GROUP_UID ) @@ -335,7 +336,7 @@ describe('Segmentation Index Controller --', () => { expect(segmentationInfo.volumeUID).toBeDefined() const anotherWayActiveSegmentIndex = - SegmentationModule.segmentIndexController.getActiveSegmentIndexForSegmentation( + segmentation.segmentIndex.getActiveSegmentIndexForSegmentation( segmentationInfo.volumeUID ) @@ -349,12 +350,12 @@ describe('Segmentation Index Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -365,20 +366,20 @@ describe('Segmentation Index Controller --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp1.render() - SegmentationModule.createNewSegmentationForViewport(vp1).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { @@ -443,7 +444,7 @@ describe('Segmentation Index Controller --', () => { const newSegRenderedCallback = () => { eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -452,19 +453,16 @@ describe('Segmentation Index Controller --', () => { setTimeout(() => { drawRectangle([20, 20, 0], [40, 40, 0]) - SegmentationModule.segmentIndexController.setActiveSegmentIndex( - TOOL_GROUP_UID, - 2 - ) + segmentation.segmentIndex.setActiveSegmentIndex(TOOL_GROUP_UID, 2) - SegmentationModule.lockedSegmentController.setSegmentIndexLocked( + segmentation.segmentLocking.setSegmentIndexLocked( TOOL_GROUP_UID, 1, true ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) drawRectangle([30, 30, 0], [50, 50, 0]) @@ -476,15 +474,13 @@ describe('Segmentation Index Controller --', () => { const image1 = canvas1.toDataURL('image/png') const activeSegmentIndex = - SegmentationModule.segmentIndexController.getActiveSegmentIndex( - TOOL_GROUP_UID - ) + segmentation.segmentIndex.getActiveSegmentIndex(TOOL_GROUP_UID) expect(activeSegmentIndex).toBe(2) // active segmentation const segmentationInfo = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( + segmentation.activeSegmentation.getActiveSegmentationInfo( TOOL_GROUP_UID ) @@ -492,30 +488,29 @@ describe('Segmentation Index Controller --', () => { expect(segmentationInfo.volumeUID).toBeDefined() const anotherWayActiveSegmentIndex = - SegmentationModule.segmentIndexController.getActiveSegmentIndexForSegmentation( + segmentation.segmentIndex.getActiveSegmentIndexForSegmentation( segmentationInfo.volumeUID ) expect(anotherWayActiveSegmentIndex).toBe(2) const locked1 = - SegmentationModule.lockedSegmentController.getSegmentsLockedForSegmentation( + segmentation.segmentLocking.getSegmentsLockedForSegmentation( segmentationInfo.volumeUID ) expect(locked1.length).toBe(1) expect(locked1[0]).toBe(1) - const lockedStatus1 = - SegmentationModule.lockedSegmentController.getSegmentIndexLocked( - TOOL_GROUP_UID, - 1 - ) + const lockedStatus1 = segmentation.segmentLocking.getSegmentIndexLocked( + TOOL_GROUP_UID, + 1 + ) expect(lockedStatus1).toBe(true) const lockedStatus2 = - SegmentationModule.lockedSegmentController.getSegmentIndexLockedForSegmentation( + segmentation.segmentLocking.getSegmentIndexLockedForSegmentation( segmentationInfo.volumeUID, 2 ) @@ -529,12 +524,12 @@ describe('Segmentation Index Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -545,20 +540,20 @@ describe('Segmentation Index Controller --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] ).then(() => { vp1.render() - SegmentationModule.createNewSegmentationForViewport(vp1).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { diff --git a/packages/cornerstone-tools/test/segmentationSphereScissor_test.js b/packages/cornerstone-tools/test/segmentationSphereScissor_test.js index 71c3858948..076e8fc881 100644 --- a/packages/cornerstone-tools/test/segmentationSphereScissor_test.js +++ b/packages/cornerstone-tools/test/segmentationSphereScissor_test.js @@ -7,35 +7,41 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_SphereScissor_COR from './groundTru const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + imageLoader, + volumeLoader, + utilities, + setVolumesForViewports, eventTarget, + CONSTANTS, } = cornerstone3D +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationRepresentations, - SegmentationModule, + segmentation, + Enums: csToolsEnums, SphereScissorsTool, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation + const { fakeVolumeLoader, fakeMetaDataProvider, createNormalizedMouseEvent, compareImages, -} = Utilities.testUtils +} = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' const viewportUID2 = 'SAGITTAL' @@ -58,7 +64,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -70,7 +76,7 @@ function createViewport( describe('Segmentation Tools --', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Sphere Scissor', function () { @@ -137,7 +143,7 @@ describe('Segmentation Tools --', () => { const drawSphere = () => { eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -199,7 +205,7 @@ describe('Segmentation Tools --', () => { } eventTarget.removeEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) @@ -251,12 +257,12 @@ describe('Segmentation Tools --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, newSegRenderedCallback ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const { segmentationUID } = evt.detail expect(segmentationUID.includes(volumeId)).toBe(true) @@ -269,7 +275,7 @@ describe('Segmentation Tools --', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1, viewportUID2, viewportUID3] @@ -278,13 +284,13 @@ describe('Segmentation Tools --', () => { vp2.render() vp3.render() - SegmentationModule.createNewSegmentationForViewport(vp1).then( - (segmentationUID) => { + segmentation + .createNewSegmentationForToolGroup(this.segToolGroup.uid) + .then((segmentationUID) => { addSegmentationsForToolGroup(this.segToolGroup.uid, [ { volumeUID: segmentationUID }, ]) - } - ) + }) }) }) } catch (e) { diff --git a/packages/cornerstone-tools/test/segmentationState_test.js b/packages/cornerstone-tools/test/segmentationState_test.js index ad197d341c..6c079479b2 100644 --- a/packages/cornerstone-tools/test/segmentationState_test.js +++ b/packages/cornerstone-tools/test/segmentationState_test.js @@ -4,30 +4,37 @@ import * as csTools3d from '../src/index' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, + Enums, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + volumeLoader, + utilities, + setVolumesForViewports, eventTarget, + imageLoader, + CONSTANTS, } = cornerstone3D +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationState, - Utilities: { segmentation: segUtils }, - SegmentationRepresentations, + Enums: csToolsEnums, + segmentation, + utilities: { segmentation: segUtils }, } = csTools3d -const { fakeMetaDataProvider, fakeVolumeLoader } = Utilities.testUtils +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation +const { SegmentationRepresentations } = csToolsEnums + +const { fakeMetaDataProvider, fakeVolumeLoader } = utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID = 'VIEWPORT' @@ -45,7 +52,7 @@ function createViewport(renderingEngine, orientation) { renderingEngine.setViewports([ { viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -58,7 +65,7 @@ function createViewport(renderingEngine, orientation) { describe('Segmentation State -- ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('State', function () { @@ -106,10 +113,10 @@ describe('Segmentation State -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { const globalState = - SegmentationState.getGlobalSegmentationDataByUID(segVolumeId) + segmentation.state.getGlobalSegmentationDataByUID(segVolumeId) expect(evt.detail.segmentationUID.includes(segVolumeId)).toBe(true) @@ -121,10 +128,10 @@ describe('Segmentation State -- ', () => { } ) eventTarget.addEventListener( - EVENTS.SEGMENTATION_STATE_MODIFIED, + Events.SEGMENTATION_STATE_MODIFIED, (evt) => { const stateManager = - SegmentationState.getDefaultSegmentationStateManager(segVolumeId) + segmentation.state.getDefaultSegmentationStateManager(segVolumeId) const state = stateManager.getState() @@ -138,7 +145,7 @@ describe('Segmentation State -- ', () => { expect(toolGroupSegmentationState).toBeDefined() expect(toolGroupSegmentationState.segmentations.length).toBe(1) - const segState = SegmentationState.getSegmentationState( + const segState = segmentation.state.getSegmentationState( this.segToolGroup.uid ) @@ -165,7 +172,7 @@ describe('Segmentation State -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] @@ -192,9 +199,9 @@ describe('Segmentation State -- ', () => { const vp = this.renderingEngine.getViewport(viewportUID) eventTarget.addEventListener( - EVENTS.SEGMENTATION_GLOBAL_STATE_MODIFIED, + Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, (evt) => { - const globalConfig = SegmentationState.getGlobalSegmentationConfig() + const globalConfig = segmentation.state.getGlobalSegmentationConfig() expect(globalConfig.renderInactiveSegmentations).toBe(true) expect(globalConfig.representations).toBeDefined() @@ -224,7 +231,7 @@ describe('Segmentation State -- ', () => { try { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId, callback }], [viewportUID] diff --git a/packages/cornerstone-tools/test/segmentationVisibilityController_test.js b/packages/cornerstone-tools/test/segmentationVisibilityController_test.js index 6add84fe65..22bc17fec6 100644 --- a/packages/cornerstone-tools/test/segmentationVisibilityController_test.js +++ b/packages/cornerstone-tools/test/segmentationVisibilityController_test.js @@ -8,31 +8,37 @@ import * as volumeURI_100_100_10_1_1_1_0_SEG_visiblity from './groundTruth/volum const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - unregisterAllImageLoaders, metaData, - registerVolumeLoader, - createAndCacheVolume, - Utilities, - setVolumesOnViewports, + volumeLoader, + Enums, + utilities, + setVolumesForViewports, eventTarget, + imageLoader, + CONSTANTS, } = cornerstone3D +const { unregisterAllImageLoaders } = imageLoader +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const { ToolGroupManager, + Enums: csToolsEnums, SegmentationDisplayTool, - addSegmentationsForToolGroup, - CornerstoneTools3DEvents: EVENTS, - SegmentationRepresentations, - SegmentationModule, + segmentation, RectangleScissorsTool, } = csTools3d +const { Events } = csToolsEnums + +const { addSegmentationsForToolGroup } = segmentation + const { fakeVolumeLoader, fakeMetaDataProvider, compareImages } = - Utilities.testUtils + utilities.testUtils -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'AXIAL' @@ -53,7 +59,7 @@ function createViewport( renderingEngine.enableElement({ viewportUID: viewportUID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element, defaultOptions: { orientation: ORIENTATION[orientation], @@ -65,7 +71,7 @@ function createViewport( describe('Segmentation Controller --', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) describe('Visibility/Color Controller', function () { @@ -132,7 +138,7 @@ describe('Segmentation Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -142,7 +148,7 @@ describe('Segmentation Controller --', () => { createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(seg2VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] @@ -191,7 +197,7 @@ describe('Segmentation Controller --', () => { } eventTarget.addEventListener( - EVENTS.SEGMENTATION_RENDERED, + Events.SEGMENTATION_RENDERED, compareImageCallback ) @@ -201,7 +207,7 @@ describe('Segmentation Controller --', () => { createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(seg2VolumeID, { imageIds: [] }).then(() => { createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: volumeId }], [viewportUID1] @@ -209,11 +215,8 @@ describe('Segmentation Controller --', () => { vp1.render() const colorLUTIndex = 1 - SegmentationModule.segmentationColorController.addColorLut( - [ - [0, 0, 0, 0], - [245, 209, 145, 255], - ], + segmentation.segmentationColor.addColorLUT( + [[245, 209, 145, 255]], colorLUTIndex ) @@ -259,7 +262,7 @@ describe('Segmentation Controller --', () => { // ) // const segmentationState = - // csTools3d.SegmentationState.getSegmentationState(TOOL_GROUP_UID) + // csTools3d.segmentation.state.getSegmentationState(TOOL_GROUP_UID) // // expect(segmentationState.length).toBe(2) // // expect(segmentationState[0].visibility).toBe(true) @@ -271,7 +274,7 @@ describe('Segmentation Controller --', () => { // } // eventTarget.addEventListener( - // EVENTS.SEGMENTATION_RENDERED, + // Events.SEGMENTATION_RENDERED, // compareImageCallback // ) @@ -281,7 +284,7 @@ describe('Segmentation Controller --', () => { // createAndCacheVolume(seg1VolumeID, { imageIds: [] }).then(() => { // createAndCacheVolume(seg2VolumeID, { imageIds: [] }).then(() => { // createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { - // setVolumesOnViewports( + // setVolumesForViewports( // this.renderingEngine, // [{ volumeUID: volumeId }], // [viewportUID1] @@ -298,11 +301,11 @@ describe('Segmentation Controller --', () => { // }, // ]).then(() => { // const segmentationData = - // SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( + // segmentation.activeSegmentation.getActiveSegmentationInfo( // TOOL_GROUP_UID // ) - // SegmentationModule.segmentationVisibilityController.setSegmentationVisibility( + // segmentation.segmentationVisibility.setSegmentationVisibility( // TOOL_GROUP_UID, // segmentationData.segmentationDataUID, // false diff --git a/packages/cornerstone-tools/test/synchronizerManager_test.js b/packages/cornerstone-tools/test/synchronizerManager_test.js index bf2e228772..ab066a424b 100644 --- a/packages/cornerstone-tools/test/synchronizerManager_test.js +++ b/packages/cornerstone-tools/test/synchronizerManager_test.js @@ -6,33 +6,39 @@ import * as windowLevel_canvas2 from './groundTruth/windowLevel_canvas2.png' const { cache, RenderingEngine, - VIEWPORT_TYPE, - ORIENTATION, - Utilities, - unregisterAllImageLoaders, + utilities, metaData, - EVENTS, - createAndCacheVolume, - registerVolumeLoader, - setVolumesOnViewports, + Enums, + setVolumesForViewports, + volumeLoader, + imageLoader, + CONSTANTS, } = cornerstone3D +const { Events, ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + +const { unregisterAllImageLoaders } = imageLoader +const { createAndCacheVolume, registerVolumeLoader } = volumeLoader + const { StackScrollMouseWheelTool, WindowLevelTool, ToolGroupManager, synchronizers, SynchronizerManager, - ToolBindings, + Enums: csToolsEnums, } = csTools3d +const { MouseBindings } = csToolsEnums + const { fakeMetaDataProvider, fakeVolumeLoader, compareImages } = - Utilities.testUtils + utilities.testUtils const { createCameraPositionSynchronizer, createVOISynchronizer } = synchronizers -const renderingEngineUID = Utilities.uuidv4() +const renderingEngineUID = utilities.uuidv4() const viewportUID1 = 'VIEWPORT1' const viewportUID2 = 'VIEWPORT2' @@ -60,7 +66,7 @@ function createViewports(width, height) { describe('Synchronizer Manager: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -103,7 +109,7 @@ describe('Synchronizer Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -112,7 +118,7 @@ describe('Synchronizer Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -155,8 +161,8 @@ describe('Synchronizer Manager: ', () => { done() } - element1.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element2.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) + element1.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element2.addEventListener(Events.IMAGE_RENDERED, eventHandler) this.firstToolGroup.addViewport(viewportUID1, this.renderingEngine.uid) this.firstToolGroup.addViewport(viewportUID2, this.renderingEngine.uid) @@ -175,14 +181,14 @@ describe('Synchronizer Manager: ', () => { }) createAndCacheVolume(ctVolumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: ctVolumeId }], [viewportUID1] ) }) createAndCacheVolume(ptVolumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: ptVolumeId }], [viewportUID2] @@ -196,7 +202,7 @@ describe('Synchronizer Manager: ', () => { describe('Synchronizer Manager: ', () => { beforeAll(() => { - cornerstone3D.setUseCPURenderingOnlyForDebugOrTests(false) + cornerstone3D.setUseCPURendering(false) }) beforeEach(function () { @@ -212,7 +218,7 @@ describe('Synchronizer Manager: ', () => { this.firstToolGroup.setToolActive(WindowLevelTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, + mouseButton: MouseBindings.Primary, }, ], }) @@ -247,7 +253,7 @@ describe('Synchronizer Manager: ', () => { this.renderingEngine.setViewports([ { viewportUID: viewportUID1, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element1, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -256,7 +262,7 @@ describe('Synchronizer Manager: ', () => { }, { viewportUID: viewportUID2, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: element2, defaultOptions: { background: [1, 0, 1], // pinkish background @@ -270,7 +276,7 @@ describe('Synchronizer Manager: ', () => { const [pageX2, pageY2] = [211, 20] const addEventListenerForVOI = () => { - element2.addEventListener(EVENTS.IMAGE_RENDERED, () => { + element2.addEventListener(Events.IMAGE_RENDERED, () => { const vp2 = this.renderingEngine.getViewport(viewportUID2) const canvas2 = vp2.getCanvas() const image2 = canvas2.toDataURL('image/png') @@ -322,8 +328,8 @@ describe('Synchronizer Manager: ', () => { document.dispatchEvent(evt3) } - element1.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) - element2.addEventListener(EVENTS.IMAGE_RENDERED, eventHandler) + element1.addEventListener(Events.IMAGE_RENDERED, eventHandler) + element2.addEventListener(Events.IMAGE_RENDERED, eventHandler) this.firstToolGroup.addViewport(viewportUID1, this.renderingEngine.uid) this.firstToolGroup.addViewport(viewportUID2, this.renderingEngine.uid) @@ -341,7 +347,7 @@ describe('Synchronizer Manager: ', () => { }) createAndCacheVolume(ctVolumeId, { imageIds: [] }).then(() => { - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: ctVolumeId }], [viewportUID1, viewportUID2] diff --git a/packages/demo/public/head.zip b/packages/demo/public/head.zip new file mode 100644 index 0000000000..d5183fac50 Binary files /dev/null and b/packages/demo/public/head.zip differ diff --git a/packages/demo/src/App.tsx b/packages/demo/src/App.tsx index 1519f60818..387b8a35d4 100644 --- a/packages/demo/src/App.tsx +++ b/packages/demo/src/App.tsx @@ -20,7 +20,7 @@ import ModifierKeysExample from './ExampleModifierKeys' import TestUtils from './ExampleTestUtils' import TestUtilsVolume from './ExampleTestUtilsVolume' import CalibrationExample from './ExampleCalibration' -import { resetCPURenderingOnlyForDebugOrTests } from '@precisionmetrics/cornerstone-render' +import { resetUseCPURendering } from '@precisionmetrics/cornerstone-render' import SegmentationRender from './ExampleSegmentationRender' import RenderToCanvasExample from './ExampleRenderToCanvas' import CrosshairsExample from './ExampleCrosshairs' @@ -60,7 +60,7 @@ function Index() { // Reset the CPU rendering to whatever it should be (might've navigated from // A CPU demo). - resetCPURenderingOnlyForDebugOrTests() + resetUseCPURendering() const examples = [ { diff --git a/packages/demo/src/ExampleApplyPreset.tsx b/packages/demo/src/ExampleApplyPreset.tsx index b7fe170eb3..9b63e09507 100644 --- a/packages/demo/src/ExampleApplyPreset.tsx +++ b/packages/demo/src/ExampleApplyPreset.tsx @@ -2,15 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - ORIENTATION, - VIEWPORT_TYPE, + volumeLoader, + Enums, + CONSTANTS, init, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' import { - ToolBindings, - BlendModes, + Enums as csToolsEnums, WindowLevelTool, PanTool, CrosshairsTool, @@ -34,6 +33,8 @@ import { } from './constants' const VOLUME = 'volume' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS window.cache = cache @@ -111,7 +112,7 @@ class ApplyPresetExample extends Component { // CT volume axial { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -120,7 +121,7 @@ class ApplyPresetExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -129,7 +130,7 @@ class ApplyPresetExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -151,7 +152,7 @@ class ApplyPresetExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: volumeImageIds, }) @@ -167,13 +168,13 @@ class ApplyPresetExample extends Component { ctVolume.load(onLoad) - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [ { volumeUID: ctVolumeUID, callback: setCTWWWC, - blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + blendMode: Enums.BlendModes.MAXIMUM_INTENSITY_BLEND, }, ], viewportInput.map(({ viewportUID }) => viewportUID) @@ -226,13 +227,13 @@ class ApplyPresetExample extends Component { toolGroup.setToolPassive(toolName) }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -249,7 +250,8 @@ class ApplyPresetExample extends Component { mode === 'Active' && bindings.length && bindings.some( - (binding) => binding.mouseButton === ToolBindings.Mouse.Primary + (binding) => + binding.mouseButton === csToolsEnums.MouseBindings.Primary ) ) @@ -261,7 +263,7 @@ class ApplyPresetExample extends Component { ctSceneToolGroup.setToolActive(toolName, { bindings: [ ...currentBindings, - { mouseButton: ToolBindings.Mouse.Primary }, + { mouseButton: csToolsEnums.MouseBindings.Primary }, ], }) diff --git a/packages/demo/src/ExampleCacheDecache.tsx b/packages/demo/src/ExampleCacheDecache.tsx index 0e996e92ba..90bca0fd7d 100644 --- a/packages/demo/src/ExampleCacheDecache.tsx +++ b/packages/demo/src/ExampleCacheDecache.tsx @@ -2,14 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - loadAndCacheImages, - ORIENTATION, - VIEWPORT_TYPE, + volumeLoader, + Enums, + CONSTANTS, init as csRenderInit, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' import * as csTools3d from '@precisionmetrics/cornerstone-tools' +import { WindowLevelTool } from '@precisionmetrics/cornerstone-tools' import getImageIds from './helpers/getImageIds' import ViewportGrid from './components/ViewportGrid' @@ -28,6 +28,8 @@ import { registerWebImageLoader } from '@precisionmetrics/cornerstone-image-load const VOLUME = 'volume' const STACK = 'stack' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS window.cache = cache @@ -102,7 +104,7 @@ class CacheDecacheExample extends Component { // CT volume axial { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -110,7 +112,7 @@ class CacheDecacheExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -118,7 +120,7 @@ class CacheDecacheExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -127,7 +129,7 @@ class CacheDecacheExample extends Component { // stack CT { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(3), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -144,8 +146,8 @@ class CacheDecacheExample extends Component { // stack ct stackCTViewportToolGroup.addViewport( - renderingEngineUID, - VIEWPORT_IDS.STACK.CT + VIEWPORT_IDS.STACK.CT, + renderingEngineUID ) addToolsToToolGroups({ ctSceneToolGroup, stackCTViewportToolGroup }) @@ -182,7 +184,7 @@ class CacheDecacheExample extends Component { const ctVolumeImageIds = await this.ctVolumeImageIdsPromise // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctVolumeImageIds, }) @@ -196,7 +198,7 @@ class CacheDecacheExample extends Component { const onLoad = () => this.setState({ progressText: 'Loaded.' }) - setVolumesOnViewports( + setVolumesForViewports( this.renderingEngine, [{ volumeUID: ctVolumeUID }], [VIEWPORT_IDS.CT.AXIAL, VIEWPORT_IDS.CT.SAGITTAL, VIEWPORT_IDS.CT.CORONAL] @@ -248,7 +250,7 @@ class CacheDecacheExample extends Component { loadStack = async () => { const ctStackImageIds = await this.ctStackImageIdsPromise - loadAndCacheImages(ctStackImageIds) + volumeLoader.loadAndCacheImages(ctStackImageIds) } getImageCacheForDisplay = () => { diff --git a/packages/demo/src/ExampleCalibration.tsx b/packages/demo/src/ExampleCalibration.tsx index f5af2114ff..1189c5d1a3 100644 --- a/packages/demo/src/ExampleCalibration.tsx +++ b/packages/demo/src/ExampleCalibration.tsx @@ -2,12 +2,12 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - VIEWPORT_TYPE, + Enums, init as csRenderInit, } from '@precisionmetrics/cornerstone-render' import { - ToolBindings, - Utilities, + Enums as csToolsEnums, + utilities, WindowLevelTool, PanTool, CrosshairsTool, @@ -26,10 +26,11 @@ import { renderingEngineUID, VIEWPORT_IDS, ANNOTATION_TOOLS } from './constants' const STACK = 'stack' window.cache = cache +const { ViewportType } = Enums let stackDXViewportToolGroup -const { calibrateImageSpacing } = Utilities +const { calibrateImageSpacing } = utilities const toolsToUse = ANNOTATION_TOOLS.filter( (tool) => tool !== CrosshairsTool.toolName @@ -99,7 +100,7 @@ class CalibrationExample extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.DX, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { background: [0, 0, 0], @@ -163,13 +164,13 @@ class CalibrationExample extends Component { toolGroup.setToolPassive(toolName) }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -186,7 +187,7 @@ class CalibrationExample extends Component { mode === 'Active' && bindings.some( (binding) => - binding.mouseButton === ToolBindings.Mouse.Primary && + binding.mouseButton === csToolsEnums.MouseBindings.Primary && binding.modifierKey === undefined ) ) @@ -200,7 +201,7 @@ class CalibrationExample extends Component { bindings: [ ...currentBindings, { - mouseButton: ToolBindings.Mouse.Primary, + mouseButton: csToolsEnums.MouseBindings.Primary, }, ], }) diff --git a/packages/demo/src/ExampleCanvasResize.tsx b/packages/demo/src/ExampleCanvasResize.tsx index c704fb8c91..7b0fa888a5 100644 --- a/packages/demo/src/ExampleCanvasResize.tsx +++ b/packages/demo/src/ExampleCanvasResize.tsx @@ -2,11 +2,14 @@ import React, { Component } from 'react' // ~~ import { RenderingEngine, - ORIENTATION, - VIEWPORT_TYPE, + Enums, + CONSTANTS, init as csRenderInit, } from '@precisionmetrics/cornerstone-render' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + class CanvasResizeExample extends Component { state = { viewportSizes: [ @@ -72,7 +75,7 @@ class CanvasResizeExample extends Component { renderingEngine.setViewports([ { viewportUID: axialCTViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.axialCTContainer.current, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -81,7 +84,7 @@ class CanvasResizeExample extends Component { }, { viewportUID: sagittalCTViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.sagittalCTContainer.current, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -90,7 +93,7 @@ class CanvasResizeExample extends Component { }, { viewportUID: coronalCTViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.coronalCTContainer.current, defaultOptions: { orientation: ORIENTATION.CORONAL, diff --git a/packages/demo/src/ExampleColor.tsx b/packages/demo/src/ExampleColor.tsx index c774d495a0..7302b653d0 100644 --- a/packages/demo/src/ExampleColor.tsx +++ b/packages/demo/src/ExampleColor.tsx @@ -3,21 +3,24 @@ import React, { Component } from 'react' import * as cs from '@precisionmetrics/cornerstone-render' import { RenderingEngine, - ORIENTATION, - VIEWPORT_TYPE, + Enums, metaData, - createAndCacheVolume, + volumeLoader, init as csRenderInit, - setVolumesOnViewports, + setVolumesForViewports, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' -import { ToolBindings } from '@precisionmetrics/cornerstone-tools' +import { Enums as csToolsEnums } from '@precisionmetrics/cornerstone-tools' import * as csTools3d from '@precisionmetrics/cornerstone-tools' -import { registerWebImageLoader } from '@precisionmetrics/cornerstone-image-loader-streaming-volume' +import { registerWebImageLoader } from './helpers/registerWebImageLoader' import config from './config/default' import { hardcodedMetaDataProvider } from './helpers/initCornerstone' import { initToolGroups } from './initToolGroups' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + const axialViewportID = 'AXIAL' const sagittalViewportID = 'SAGITTAL' const coronalViewportID = 'CORONAL' @@ -61,7 +64,9 @@ class ColorExample extends Component { const volumeUID = 'VOLUME' - const volume = await createAndCacheVolume(volumeUID, { imageIds }) + const volume = await volumeLoader.createAndCacheVolume(volumeUID, { + imageIds, + }) volume.load() @@ -76,7 +81,7 @@ class ColorExample extends Component { renderingEngine.setViewports([ { viewportUID: axialViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.axialContainer.current, defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -84,7 +89,7 @@ class ColorExample extends Component { }, { viewportUID: sagittalViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.sagittalContainer.current, defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -92,7 +97,7 @@ class ColorExample extends Component { }, { viewportUID: coronalViewportID, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this.coronalContainer.current, defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -115,16 +120,16 @@ class ColorExample extends Component { colorSceneToolGroup.setToolActive(StackScrollMouseWheelTool.toolName) colorSceneToolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) colorSceneToolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) colorSceneToolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) - await setVolumesOnViewports( + await setVolumesForViewports( this.renderingEngine, [ { diff --git a/packages/demo/src/ExampleCrosshairs.tsx b/packages/demo/src/ExampleCrosshairs.tsx index 0048c6de4d..5da92c10df 100644 --- a/packages/demo/src/ExampleCrosshairs.tsx +++ b/packages/demo/src/ExampleCrosshairs.tsx @@ -2,16 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - ORIENTATION, - VIEWPORT_TYPE, + volumeLoader, + Enums, + CONSTANTS, init as cs3dInit, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' import { - ToolBindings, - ToolModes, - BlendModes, + Enums as csToolsEnums, WindowLevelTool, PanTool, CrosshairsTool, @@ -40,6 +38,8 @@ import { const VOLUME = 'volume' window.cache = cache +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS let ctSceneToolGroup, prostateSceneToolGroup @@ -115,7 +115,7 @@ class CrosshairsExample extends Component { // CT volume axial { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -124,7 +124,7 @@ class CrosshairsExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -133,7 +133,7 @@ class CrosshairsExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -142,7 +142,7 @@ class CrosshairsExample extends Component { }, { viewportUID: VIEWPORT_IDS.PROSTATE.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(3), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -151,7 +151,7 @@ class CrosshairsExample extends Component { }, { viewportUID: VIEWPORT_IDS.PROSTATE.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(4), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -192,33 +192,36 @@ class CrosshairsExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctImageIds, }) - const prostateVolume = await createAndCacheVolume(prostateVolumeUID, { - imageIds: prostateImageIds, - }) + const prostateVolume = await volumeLoader.createAndCacheVolume( + prostateVolumeUID, + { + imageIds: prostateImageIds, + } + ) ctVolume.load() prostateVolume.load() - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [ { volumeUID: ctVolumeUID, callback: setCTWWWC, - blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + blendMode: Enums.BlendModes.MAXIMUM_INTENSITY_BLEND, }, ], [VIEWPORT_IDS.CT.AXIAL, VIEWPORT_IDS.CT.SAGITTAL, VIEWPORT_IDS.CT.CORONAL] ) - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [ { volumeUID: prostateVolumeUID, - blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + blendMode: Enums.BlendModes.MAXIMUM_INTENSITY_BLEND, }, ], [VIEWPORT_IDS.PROSTATE.AXIAL, VIEWPORT_IDS.PROSTATE.SAGITTAL] @@ -251,20 +254,20 @@ class CrosshairsExample extends Component { setToolMode = (toolMode) => { const toolGroup = this.state.toolGroups[this.state.toolGroupName] - if (toolMode === ToolModes.Active) { + if (toolMode === csToolsEnums.ToolModes.Active) { const activeTool = toolGroup.getActivePrimaryMouseButtonTool() if (activeTool) { toolGroup.setToolPassive(activeTool) } toolGroup.setToolActive(this.state.leftClickTool, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) - } else if (toolMode === ToolModes.Passive) { + } else if (toolMode === csToolsEnums.ToolModes.Passive) { toolGroup.setToolPassive(this.state.leftClickTool) - } else if (toolMode === ToolModes.Enabled) { + } else if (toolMode === csToolsEnums.ToolModes.Enabled) { toolGroup.setToolEnabled(this.state.leftClickTool) - } else if (toolMode === ToolModes.Disabled) { + } else if (toolMode === csToolsEnums.ToolModes.Disabled) { toolGroup.setToolDisabled(this.state.leftClickTool) } } @@ -335,25 +338,25 @@ class CrosshairsExample extends Component { diff --git a/packages/demo/src/ExampleCursor.tsx b/packages/demo/src/ExampleCursor.tsx index 922fb56df3..706464e8a7 100644 --- a/packages/demo/src/ExampleCursor.tsx +++ b/packages/demo/src/ExampleCursor.tsx @@ -2,14 +2,15 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - VIEWPORT_TYPE, + Enums, + CONSTANTS, init as csRenderInit, getShouldUseCPURendering, metaData, } from '@precisionmetrics/cornerstone-render' import * as cs from '@precisionmetrics/cornerstone-render' import { - Cursors, + cursors, WindowLevelTool, PanTool, CrosshairsTool, @@ -28,6 +29,8 @@ import { renderingEngineUID, VIEWPORT_IDS, ANNOTATION_TOOLS } from './constants' const STACK = 'stack' window.cache = cache +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS let stackCTViewportToolGroup @@ -87,7 +90,7 @@ class CursorExample extends Component { csTools3d.init() registerWebImageLoader(cs) - this.setState({ cursorNames: Cursors.cursorNames }) + this.setState({ cursorNames: cursors.CursorNames }) ;({ stackCTViewportToolGroup } = initToolGroups()) const ctStackImageIds = await this.ctStackImageIdsPromise @@ -109,7 +112,7 @@ class CursorExample extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { background: [0.2, 0, 0.2], @@ -213,7 +216,7 @@ class CursorExample extends Component { const element = this._elementNodes.get(0) const cursorName = evt.target.value this.setState({ cursorName }) - Cursors.setCursorForElement(element, cursorName) + cursors.setCursorForElement(element, cursorName) }} > {this.state.cursorNames.map((cursorName) => ( diff --git a/packages/demo/src/ExampleEnableDisableAPI.tsx b/packages/demo/src/ExampleEnableDisableAPI.tsx index d7aae067d6..fd589fb137 100644 --- a/packages/demo/src/ExampleEnableDisableAPI.tsx +++ b/packages/demo/src/ExampleEnableDisableAPI.tsx @@ -2,14 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, + volumeLoader, metaData, - ORIENTATION, - VIEWPORT_TYPE, + Enums, + CONSTANTS, init as csRenderInit, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' -import { ToolBindings } from '@precisionmetrics/cornerstone-tools' +import { Enums as csToolsEnums } from '@precisionmetrics/cornerstone-tools' import * as cs from '@precisionmetrics/cornerstone-render' import * as csTools3d from '@precisionmetrics/cornerstone-tools' @@ -34,6 +34,8 @@ import sortImageIdsByIPP from './helpers/sortImageIdsByIPP' const VOLUME = 'volume' window.cache = cache +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS let ctSceneToolGroup, stackCTViewportToolGroup, @@ -138,7 +140,7 @@ class EnableDisableViewportExample extends Component { { // CT volume axial viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), toolGroup: ctSceneToolGroup, defaultOptions: { @@ -148,7 +150,7 @@ class EnableDisableViewportExample extends Component { { // stack CT viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(1), toolGroup: stackCTViewportToolGroup, defaultOptions: { @@ -158,7 +160,7 @@ class EnableDisableViewportExample extends Component { { // dx viewportUID: VIEWPORT_IDS.STACK.DX, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(2), toolGroup: stackDXViewportToolGroup, defaultOptions: { @@ -168,7 +170,7 @@ class EnableDisableViewportExample extends Component { { // CT volume Coronal viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(3), toolGroup: ctSceneToolGroup, defaultOptions: { @@ -177,7 +179,7 @@ class EnableDisableViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(4), toolGroup: ctSceneToolGroup, defaultOptions: { @@ -206,6 +208,8 @@ class EnableDisableViewportExample extends Component { // volume ct ctSceneToolGroup.addViewport(VIEWPORT_IDS.CT.SAGITTAL, renderingEngineUID) + ctSceneToolGroup.addViewport(VIEWPORT_IDS.CT.AXIAL, renderingEngineUID) + ctSceneToolGroup.addViewport(VIEWPORT_IDS.CT.CORONAL, renderingEngineUID) // stack ct stackCTViewportToolGroup.addViewport( @@ -254,7 +258,7 @@ class EnableDisableViewportExample extends Component { const CTVolumeLoad = async () => { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctVolumeImageIds, }) @@ -273,7 +277,7 @@ class EnableDisableViewportExample extends Component { ctVolume.load(onLoad) - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [{ volumeUID: ctVolumeUID }], [ @@ -294,13 +298,13 @@ class EnableDisableViewportExample extends Component { const PETVolumeLoad = async () => { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ctVolumeImageIds2, }) ptVolume.load() - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [{ volumeUID: ptVolumeUID }], [ @@ -370,7 +374,7 @@ class EnableDisableViewportExample extends Component { const { toolGroup, viewportUID, type, canvas } = viewportInput - toolGroup.addViewport(renderingEngineUID, viewportUID) + toolGroup.addViewport(viewportUID, renderingEngineUID) // load if (viewportUID === VIEWPORT_IDS.STACK.CT) { @@ -397,7 +401,7 @@ class EnableDisableViewportExample extends Component { const isAnnotationToolOn = toolName !== 'Levels' ? true : false const options = { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], } if (isAnnotationToolOn) { // Set tool active diff --git a/packages/demo/src/ExampleFlipViewport.tsx b/packages/demo/src/ExampleFlipViewport.tsx index ff17daf5e5..6e43d775cd 100644 --- a/packages/demo/src/ExampleFlipViewport.tsx +++ b/packages/demo/src/ExampleFlipViewport.tsx @@ -2,16 +2,16 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - ORIENTATION, - VIEWPORT_TYPE, + volumeLoader, + Enums, + CONSTANTS, init as csRenderInit, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' import { synchronizers, - ToolBindings, - BlendModes, + Enums as csToolsEnums, + WindowLevelTool, } from '@precisionmetrics/cornerstone-tools' import * as csTools3d from '@precisionmetrics/cornerstone-tools' @@ -34,6 +34,9 @@ import { setCTWWWC } from './helpers/transferFunctionHelpers' const VOLUME = 'volume' const STACK = 'stack' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS + window.cache = cache let ctSceneToolGroup, stackCTViewportToolGroup @@ -118,7 +121,7 @@ class FlipViewportExample extends Component { // CT volume axial { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -126,7 +129,7 @@ class FlipViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -134,7 +137,7 @@ class FlipViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -143,7 +146,7 @@ class FlipViewportExample extends Component { // stack CT { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(3), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -160,8 +163,8 @@ class FlipViewportExample extends Component { // stack ct, stack pet, and stack DX stackCTViewportToolGroup.addViewport( - renderingEngineUID, - VIEWPORT_IDS.STACK.CT + VIEWPORT_IDS.STACK.CT, + renderingEngineUID ) addToolsToToolGroups({ @@ -208,7 +211,7 @@ class FlipViewportExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctVolumeImageIds, }) @@ -224,13 +227,13 @@ class FlipViewportExample extends Component { ctVolume.load(onLoad) - setVolumesOnViewports( + setVolumesForViewports( renderingEngine, [ { volumeUID: ctVolumeUID, callback: setCTWWWC, - blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + blendMode: Enums.BlendModes.MAXIMUM_INTENSITY_BLEND, }, ], [VIEWPORT_IDS.CT.AXIAL, VIEWPORT_IDS.CT.SAGITTAL, VIEWPORT_IDS.CT.CORONAL] @@ -284,7 +287,7 @@ class FlipViewportExample extends Component { const isAnnotationToolOn = toolName !== 'Levels' ? true : false const options = { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], } if (isAnnotationToolOn) { // Set tool active diff --git a/packages/demo/src/ExampleModifierKeys.tsx b/packages/demo/src/ExampleModifierKeys.tsx index e60ff1d610..34259bfa71 100644 --- a/packages/demo/src/ExampleModifierKeys.tsx +++ b/packages/demo/src/ExampleModifierKeys.tsx @@ -2,15 +2,12 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - ORIENTATION, eventTarget, - VIEWPORT_TYPE, + Enums, init as csRenderInit, } from '@precisionmetrics/cornerstone-render' import { - ToolBindings, - CornerstoneTools3DEvents, + Enums as csToolsEnums, cancelActiveManipulations, removeAnnotation, WindowLevelTool, @@ -36,6 +33,7 @@ const VOLUME = 'volume' const STACK = 'stack' window.cache = cache +const { ViewportType } = Enums let stackCTViewportToolGroup @@ -110,7 +108,7 @@ class ModifierKeysExample extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { background: [0.2, 0, 0.2], @@ -131,8 +129,8 @@ class ModifierKeysExample extends Component { stackCTViewportToolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, - modifierKey: ToolBindings.Keyboard.Shift, + mouseButton: csToolsEnums.MouseBindings.Primary, + modifierKey: csToolsEnums.KeyboardBindings.Shift, }, ], }) @@ -162,7 +160,7 @@ class ModifierKeysExample extends Component { ctStackViewport.setProperties({ voiRange: { lower: -160, upper: 240 } }) eventTarget.addEventListener( - CornerstoneTools3DEvents.KEY_DOWN, + csToolsEnums.Events.KEY_DOWN, this.cancelToolDrawing ) // Start listening for resize @@ -216,13 +214,13 @@ class ModifierKeysExample extends Component { toolGroup.setToolPassive(toolName) }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -239,7 +237,7 @@ class ModifierKeysExample extends Component { mode === 'Active' && bindings.some( (binding) => - binding.mouseButton === ToolBindings.Mouse.Primary && + binding.mouseButton === csToolsEnums.MouseBindings.Primary && binding.modifierKey === undefined ) ) @@ -249,8 +247,8 @@ class ModifierKeysExample extends Component { stackCTViewportToolGroup.setToolActive(LengthTool.toolName, { bindings: [ { - mouseButton: ToolBindings.Mouse.Primary, - modifierKey: ToolBindings.Keyboard.Shift, + mouseButton: csToolsEnums.MouseBindings.Primary, + modifierKey: csToolsEnums.KeyboardBindings.Shift, }, ], }) @@ -263,7 +261,7 @@ class ModifierKeysExample extends Component { bindings: [ ...currentBindings, { - mouseButton: ToolBindings.Mouse.Primary, + mouseButton: csToolsEnums.MouseBindings.Primary, }, ], }) diff --git a/packages/demo/src/ExampleNineStackViewport.tsx b/packages/demo/src/ExampleNineStackViewport.tsx index 02ddfda842..02461e7b94 100644 --- a/packages/demo/src/ExampleNineStackViewport.tsx +++ b/packages/demo/src/ExampleNineStackViewport.tsx @@ -2,8 +2,8 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - ORIENTATION, - VIEWPORT_TYPE, + Enums, + CONSTANTS, init as csRenderInit, } from '@precisionmetrics/cornerstone-render' import sortImageIdsByIPP from './helpers/sortImageIdsByIPP' @@ -16,6 +16,8 @@ import { ctStackUID, VIEWPORT_IDS } from './constants' import * as csTools3d from '@precisionmetrics/cornerstone-tools' const renderingEngineUID = 'renderingEngineUID' +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS window.cache = cache @@ -93,7 +95,7 @@ class NineStackViewportExample extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.CT + '--0', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -101,7 +103,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--1', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -109,7 +111,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--2', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -117,7 +119,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--3', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(3), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -125,7 +127,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--4', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(4), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -133,7 +135,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--5', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(5), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -141,7 +143,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--6', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(6), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -149,7 +151,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--7', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(7), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -157,7 +159,7 @@ class NineStackViewportExample extends Component { }, { viewportUID: VIEWPORT_IDS.STACK.CT + '--8', - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(8), defaultOptions: { orientation: ORIENTATION.AXIAL, diff --git a/packages/demo/src/ExampleOneStack.tsx b/packages/demo/src/ExampleOneStack.tsx index 21713df27f..606aace6bc 100644 --- a/packages/demo/src/ExampleOneStack.tsx +++ b/packages/demo/src/ExampleOneStack.tsx @@ -2,15 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - VIEWPORT_TYPE, + Enums, init as csRenderInit, getShouldUseCPURendering, metaData, - cpuColormaps, } from '@precisionmetrics/cornerstone-render' import * as cs from '@precisionmetrics/cornerstone-render' import { - ToolBindings, + Enums as csToolsEnums, WindowLevelTool, PanTool, CrosshairsTool, @@ -31,6 +30,7 @@ import sortImageIdsByIPP from './helpers/sortImageIdsByIPP' const STACK = 'stack' window.cache = cache +const { ViewportType } = Enums let stackCTViewportToolGroup @@ -110,7 +110,7 @@ class OneStackExample extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { background: [0.2, 0, 0.2], @@ -190,13 +190,13 @@ class OneStackExample extends Component { toolGroup.setToolPassive(toolName) }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -213,7 +213,8 @@ class OneStackExample extends Component { mode === 'Active' && bindings.length && bindings.some( - (binding) => binding.mouseButton === ToolBindings.Mouse.Primary + (binding) => + binding.mouseButton === csToolsEnums.MouseBindings.Primary ) ) @@ -226,7 +227,7 @@ class OneStackExample extends Component { stackCTViewportToolGroup.setToolActive(toolName, { bindings: [ ...currentBindings, - { mouseButton: ToolBindings.Mouse.Primary }, + { mouseButton: csToolsEnums.MouseBindings.Primary }, ], }) diff --git a/packages/demo/src/ExampleOneStackCPU.tsx b/packages/demo/src/ExampleOneStackCPU.tsx index 08dec14029..c20d582f75 100644 --- a/packages/demo/src/ExampleOneStackCPU.tsx +++ b/packages/demo/src/ExampleOneStackCPU.tsx @@ -2,16 +2,15 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - VIEWPORT_TYPE, - setUseCPURenderingOnlyForDebugOrTests, + Enums, + setUseCPURendering, init as csRenderInit, metaData, - cpuColormaps, - INTERPOLATION_TYPE, + CONSTANTS, } from '@precisionmetrics/cornerstone-render' import * as cs from '@precisionmetrics/cornerstone-render' import { - ToolBindings, + Enums as csToolsEnums, WindowLevelTool, PanTool, CrosshairsTool, @@ -30,6 +29,7 @@ import { renderingEngineUID, VIEWPORT_IDS, ANNOTATION_TOOLS } from './constants' const STACK = 'stack' window.cache = cache +const { ViewportType } = Enums let stackCTViewportToolGroup, stackPTViewportToolGroup @@ -64,7 +64,7 @@ class OneStackExampleCPU extends Component { constructor(props) { super(props) - setUseCPURenderingOnlyForDebugOrTests(true) + setUseCPURendering(true) this._elementNodes = new Map() this._offScreenRef = React.createRef() @@ -119,7 +119,7 @@ class OneStackExampleCPU extends Component { const viewportInput = [ { viewportUID: VIEWPORT_IDS.STACK.CT, - type: VIEWPORT_TYPE.STACK, + type: ViewportType.STACK, element: this._elementNodes.get(0), defaultOptions: { background: [0.2, 0, 0.2], @@ -176,7 +176,7 @@ class OneStackExampleCPU extends Component { await ctStackViewport.setStack(stacks.ct, 0) ctStackViewport.setProperties({ voiRange: { lower: -160, upper: 240 }, - // interpolationType: INTERPOLATION_TYPE.NEAREST, + // interpolationType: InterpolationType.NEAREST, }) // Start listening for resize @@ -217,13 +217,13 @@ class OneStackExampleCPU extends Component { }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -241,7 +241,8 @@ class OneStackExampleCPU extends Component { mode === 'Active' && bindings.length && bindings.some( - (binding) => binding.mouseButton === ToolBindings.Mouse.Primary + (binding) => + binding.mouseButton === csToolsEnums.MouseBindings.Primary ) ) @@ -253,7 +254,7 @@ class OneStackExampleCPU extends Component { activeToolGroup.setToolActive(toolName, { bindings: [ ...currentBindings, - { mouseButton: ToolBindings.Mouse.Primary }, + { mouseButton: csToolsEnums.MouseBindings.Primary }, ], }) @@ -361,7 +362,7 @@ class OneStackExampleCPU extends Component { const vp = this.renderingEngine.getViewport(VIEWPORT_IDS.STACK.CT) if (falseColor) { - vp.setColormap(cpuColormaps.hotIron) + vp.setColormap(CONSTANTS.CPU_COLORMAPS.hotIron) } else { vp.unsetColormap() } diff --git a/packages/demo/src/ExampleOneVolume.tsx b/packages/demo/src/ExampleOneVolume.tsx index 9054e6b366..ad41b1be86 100644 --- a/packages/demo/src/ExampleOneVolume.tsx +++ b/packages/demo/src/ExampleOneVolume.tsx @@ -2,15 +2,14 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, - ORIENTATION, - VIEWPORT_TYPE, + volumeLoader, + Enums, + CONSTANTS, init as csRenderInit, - setVolumesOnViewports, + setVolumesForViewports, } from '@precisionmetrics/cornerstone-render' import { - ToolBindings, - BlendModes, + Enums as csToolsEnums, WindowLevelTool, PanTool, ZoomTool, @@ -34,6 +33,8 @@ import { const VOLUME = 'volume' window.cache = cache +const { ViewportType } = Enums +const { ORIENTATION } = CONSTANTS let ctSceneToolGroup @@ -107,7 +108,7 @@ class OneVolumeExample extends Component { // CT volume axial { viewportUID: VIEWPORT_IDS.CT.AXIAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(0), defaultOptions: { orientation: ORIENTATION.AXIAL, @@ -116,7 +117,7 @@ class OneVolumeExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.SAGITTAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(1), defaultOptions: { orientation: ORIENTATION.SAGITTAL, @@ -125,7 +126,7 @@ class OneVolumeExample extends Component { }, { viewportUID: VIEWPORT_IDS.CT.CORONAL, - type: VIEWPORT_TYPE.ORTHOGRAPHIC, + type: ViewportType.ORTHOGRAPHIC, element: this._elementNodes.get(2), defaultOptions: { orientation: ORIENTATION.CORONAL, @@ -147,7 +148,7 @@ class OneVolumeExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: volumeImageIds, }) @@ -163,13 +164,13 @@ class OneVolumeExample extends Component { ctVolume.load(onLoad) - await setVolumesOnViewports( + await setVolumesForViewports( renderingEngine, [ { volumeUID: ctVolumeUID, callback: setCTWWWC, - blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + blendMode: Enums.BlendModes.MAXIMUM_INTENSITY_BLEND, }, ], [VIEWPORT_IDS.CT.AXIAL, VIEWPORT_IDS.CT.SAGITTAL, VIEWPORT_IDS.CT.CORONAL] @@ -222,13 +223,13 @@ class OneVolumeExample extends Component { toolGroup.setToolPassive(toolName) }) toolGroup.setToolActive(WindowLevelTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) toolGroup.setToolActive(PanTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Auxiliary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Auxiliary }], }) toolGroup.setToolActive(ZoomTool.toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Secondary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Secondary }], }) } @@ -245,7 +246,8 @@ class OneVolumeExample extends Component { mode === 'Active' && bindings.length && bindings.some( - (binding) => binding.mouseButton === ToolBindings.Mouse.Primary + (binding) => + binding.mouseButton === csToolsEnums.MouseBindings.Primary ) ) @@ -258,7 +260,7 @@ class OneVolumeExample extends Component { ctSceneToolGroup.setToolActive(toolName, { bindings: [ ...currentBindings, - { mouseButton: ToolBindings.Mouse.Primary }, + { mouseButton: csToolsEnums.MouseBindings.Primary }, ], }) diff --git a/packages/demo/src/ExamplePriorityLoad.tsx b/packages/demo/src/ExamplePriorityLoad.tsx index febb11b6d1..55935e8aa4 100644 --- a/packages/demo/src/ExamplePriorityLoad.tsx +++ b/packages/demo/src/ExamplePriorityLoad.tsx @@ -2,7 +2,7 @@ import React, { Component } from 'react' import { cache, RenderingEngine, - createAndCacheVolume, + volumeLoader, init as csRenderInit, imageLoadPoolManager, } from '@precisionmetrics/cornerstone-render' @@ -172,10 +172,10 @@ class PriorityLoadExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctVolumeImageIds, }) diff --git a/packages/demo/src/ExampleRenderToCanvas.tsx b/packages/demo/src/ExampleRenderToCanvas.tsx index 255c328980..5a526ffb31 100644 --- a/packages/demo/src/ExampleRenderToCanvas.tsx +++ b/packages/demo/src/ExampleRenderToCanvas.tsx @@ -6,6 +6,7 @@ import { init as cs3dInit, } from '@precisionmetrics/cornerstone-render' import * as csTools3d from '@precisionmetrics/cornerstone-tools' +import { WindowLevelTool } from '@precisionmetrics/cornerstone-tools' import getImageIds from './helpers/getImageIds' import { renderingEngineUID } from './constants' diff --git a/packages/demo/src/ExampleSegmentationRender.tsx b/packages/demo/src/ExampleSegmentationRender.tsx index f736e74bfe..b8926480e4 100644 --- a/packages/demo/src/ExampleSegmentationRender.tsx +++ b/packages/demo/src/ExampleSegmentationRender.tsx @@ -5,31 +5,21 @@ import { vec3 } from 'gl-matrix' import { cache, RenderingEngine, - createAndCacheVolume, - createAndCacheDerivedVolume, + volumeLoader, init as cs3dInit, eventTarget, } from '@precisionmetrics/cornerstone-render' import { // Segmentation synchronizers, - ToolBindings, - ToolModes, - CornerstoneTools3DEvents, - annotationSelection, - Utilities as csToolsUtils, - // segs - SegmentationModule, - SegmentationState, - SegmentationRepresentations, - addSegmentationsForToolGroup, - removeSegmentationsForToolGroup, + Enums as csToolsEnums, + annotation, + utilities as csToolsUtils, + segmentation, WindowLevelTool, PanTool, - CrosshairsTool, ZoomTool, RectangleRoiTool, - RectangleRoiStartEndThresholdTool, } from '@precisionmetrics/cornerstone-tools' import * as csTools3d from '@precisionmetrics/cornerstone-tools' @@ -69,6 +59,8 @@ let ctSceneToolGroup, const { createCameraPositionSynchronizer, createVOISynchronizer } = synchronizers +const { selection } = annotation + const toolsToUse = [ WindowLevelTool.toolName, PanTool.toolName, @@ -251,10 +243,10 @@ class SegmentationExample extends Component { // This only creates the volumes, it does not actually load all // of the pixel data (yet) - const ptVolume = await createAndCacheVolume(ptVolumeUID, { + const ptVolume = await volumeLoader.createAndCacheVolume(ptVolumeUID, { imageIds: ptImageIds, }) - const ctVolume = await createAndCacheVolume(ctVolumeUID, { + const ctVolume = await volumeLoader.createAndCacheVolume(ctVolumeUID, { imageIds: ctVolumeImageIds, }) @@ -309,34 +301,34 @@ class SegmentationExample extends Component { _removeEventListeners() { eventTarget.removeEventListener( - CornerstoneTools3DEvents.SEGMENTATION_STATE_MODIFIED, + csToolsEnums.Events.SEGMENTATION_STATE_MODIFIED, this.onSegmentationStateModified ) eventTarget.removeEventListener( - CornerstoneTools3DEvents.SEGMENTATION_GLOBAL_STATE_MODIFIED, + csToolsEnums.Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, this.onGlobalSegmentationStateUpdated ) eventTarget.removeEventListener( - CornerstoneTools3DEvents.SEGMENTATION_REMOVED, + csToolsEnums.Events.SEGMENTATION_REMOVED, this.onSegmentationRemoved ) } _addEventListeners() { eventTarget.addEventListener( - CornerstoneTools3DEvents.SEGMENTATION_STATE_MODIFIED, + csToolsEnums.Events.SEGMENTATION_STATE_MODIFIED, this.onSegmentationStateModified ) eventTarget.addEventListener( - CornerstoneTools3DEvents.SEGMENTATION_GLOBAL_STATE_MODIFIED, + csToolsEnums.Events.SEGMENTATION_GLOBAL_STATE_MODIFIED, this.onGlobalSegmentationStateUpdated ) eventTarget.addEventListener( - CornerstoneTools3DEvents.SEGMENTATION_REMOVED, + csToolsEnums.Events.SEGMENTATION_REMOVED, this.onSegmentationRemoved ) } @@ -354,10 +346,9 @@ class SegmentationExample extends Component { onGlobalSegmentationStateUpdated = (evt) => { const { segmentationUID } = evt.detail - const allSegmentationUIDs = - SegmentationState.getGlobalSegmentationState().map( - ({ volumeUID }) => volumeUID - ) + const allSegmentationUIDs = segmentation.state + .getGlobalSegmentationState() + .map(({ volumeUID }) => volumeUID) let newSelectedSegmentationUID = this.state.selectedSegmentationUIDFromAll if (newSelectedSegmentationUID === '') { @@ -378,9 +369,7 @@ class SegmentationExample extends Component { } const activeSegmentationInfo = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( - toolGroupUID - ) + segmentation.activeSegmentation.getActiveSegmentationInfo(toolGroupUID) let selectedsegmentationUID, segmentLocked, activeSegmentIndex @@ -389,14 +378,14 @@ class SegmentationExample extends Component { selectedsegmentationUID = activeSegmentationInfo.segmentationDataUID segmentLocked = - SegmentationModule.lockedSegmentController.getSegmentIndexLockedForSegmentation( + segmentation.segmentLocking.getSegmentIndexLockedForSegmentation( activeSegmentationInfo.volumeUID, activeSegmentIndex ) } const toolGroupSegmentations = - SegmentationState.getSegmentationState(toolGroupUID) + segmentation.state.getSegmentationState(toolGroupUID) let segmentationDataUIDs @@ -418,11 +407,9 @@ class SegmentationExample extends Component { const { element } = evt.detail const segmentationUIDs = - SegmentationModule.getsegmentationUIDsForElement(element) + segmentation.state.getsegmentationUIDsForElement(element) const activesegmentationUID = - SegmentationModule.activeSegmentationController.getActivesegmentationUID( - element - ) + segmentation.activeSegmentation.getActivesegmentationUID(element) this.setState({ availableSegmentations: segmentationUIDs, selectedsegmentationUID: activesegmentationUID, @@ -436,16 +423,19 @@ class SegmentationExample extends Component { const { viewportUID, renderingEngineUID } = viewportsInfo[0] const viewport = this.renderingEngine.getViewport(viewportUID) - SegmentationModule.createNewSegmentationForViewport(viewport).then( - (segmentationUID) => { - addSegmentationsForToolGroup(this.state.selectedToolGroupName, [ - { - volumeUID: segmentationUID, - // default representation which is labelmap - }, - ]) - } - ) + segmentation + .createNewSegmentationForToolGroup(this.state.selectedToolGroupName) + .then((segmentationUID) => { + segmentation.addSegmentationsForToolGroup( + this.state.selectedToolGroupName, + [ + { + volumeUID: segmentationUID, + // default representation which is labelmap + }, + ] + ) + }) } setToolMode = (toolMode) => { @@ -457,20 +447,20 @@ class SegmentationExample extends Component { this.setState({ segmentationToolActive: true }) } const toolGroup = toolGroups[this.state.selectedToolGroupName] - if (toolMode === ToolModes.Active) { + if (toolMode === csToolsEnums.ToolModes.Active) { const activeTool = toolGroup.getActivePrimaryMouseButtonTool() if (activeTool) { toolGroup.setToolPassive(activeTool) } toolGroup.setToolActive(toolName, { - bindings: [{ mouseButton: ToolBindings.Mouse.Primary }], + bindings: [{ mouseButton: csToolsEnums.MouseBindings.Primary }], }) - } else if (toolMode === ToolModes.Passive) { + } else if (toolMode === csToolsEnums.ToolModes.Passive) { toolGroup.setToolPassive(toolName) - } else if (toolMode === ToolModes.Enabled) { + } else if (toolMode === csToolsEnums.ToolModes.Enabled) { toolGroup.setToolEnabled(toolName) - } else if (toolMode === ToolModes.Disabled) { + } else if (toolMode === csToolsEnums.ToolModes.Disabled) { toolGroup.setToolDisabled(toolName) } } @@ -531,8 +521,12 @@ class SegmentationExample extends Component { const ctViewport = this.renderingEngine.getViewport('ctAxial') const { imageData: backgroundImageData } = ctViewport.getImageData() - await createAndCacheDerivedVolume(ctVolumeUID, { uid: labelmap1UID }) - await createAndCacheDerivedVolume(ctVolumeUID, { uid: labelmap2UID }) + await volumeLoader.createAndCacheDerivedVolume(ctVolumeUID, { + uid: labelmap1UID, + }) + await volumeLoader.createAndCacheDerivedVolume(ctVolumeUID, { + uid: labelmap2UID, + }) const boneSoftVolume = cache.getVolume(labelmap1UID) const fatVolume = cache.getVolume(labelmap2UID) @@ -555,30 +549,30 @@ class SegmentationExample extends Component { const toolGroupUID = this.state.selectedToolGroupName if (!initialConfig) { - await addSegmentationsForToolGroup(toolGroupUID, [ + await segmentation.addSegmentationsForToolGroup(toolGroupUID, [ { volumeUID: segmentationUID, active: true, representation: { - type: SegmentationRepresentations.Labelmap, + type: csToolsEnums.SegmentationRepresentations.Labelmap, }, }, ]) } else { - await addSegmentationsForToolGroup( + await segmentation.addSegmentationsForToolGroup( toolGroupUID, [ { volumeUID: segmentationUID, active: true, representation: { - type: SegmentationRepresentations.Labelmap, + type: csToolsEnums.SegmentationRepresentations.Labelmap, }, }, ], { representations: { - [SegmentationRepresentations.Labelmap]: { + [csToolsEnums.SegmentationRepresentations.Labelmap]: { renderOutline: false, }, }, @@ -595,19 +589,19 @@ class SegmentationExample extends Component { const checked = evt.target.checked const activesegmentationInfo = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( + segmentation.activeSegmentation.getActiveSegmentationInfo( this.state.selectedToolGroupName ) const { volumeUID, activeSegmentIndex } = activesegmentationInfo const activeSegmentLockedStatus = - SegmentationModule.lockedSegmentController.getSegmentIndexLockedForSegmentation( + segmentation.segmentLocking.getSegmentIndexLockedForSegmentation( volumeUID, activeSegmentIndex ) - SegmentationModule.lockedSegmentController.setSegmentIndexLockedForSegmentation( + segmentation.segmentLocking.setSegmentIndexLockedForSegmentation( volumeUID, activeSegmentIndex, !activeSegmentLockedStatus @@ -619,9 +613,7 @@ class SegmentationExample extends Component { changeActiveSegmentIndex = (direction) => { const toolGroupUID = this.state.selectedToolGroupName const activeSegmentationInfo = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( - toolGroupUID - ) + segmentation.activeSegmentation.getActiveSegmentationInfo(toolGroupUID) const { activeSegmentIndex } = activeSegmentationInfo let newIndex = activeSegmentIndex + direction @@ -630,17 +622,13 @@ class SegmentationExample extends Component { newIndex = 0 } - SegmentationModule.segmentIndexController.setActiveSegmentIndex( + segmentation.segmentIndex.setActiveSegmentIndex(toolGroupUID, newIndex) + + const segmentIsLocked = segmentation.segmentLocking.getSegmentIndexLocked( toolGroupUID, newIndex ) - const segmentIsLocked = - SegmentationModule.lockedSegmentController.getSegmentIndexLocked( - toolGroupUID, - newIndex - ) - this.setState({ selectedViewportActiveSegmentIndex: newIndex, segmentLocked: segmentIsLocked, @@ -650,8 +638,7 @@ class SegmentationExample extends Component { calculateTMTV = () => { const viewportUID = this.state.selectedToolGroupName const { element } = this.renderingEngine.getViewport(viewportUID) - const segmentationUIDs = - SegmentationModule.getsegmentationUIDsForElement(element) + const segmentationUIDs = segmentation.getsegmentationUIDsForElement(element) const labelmaps = segmentationUIDs.map((uid) => cache.getVolume(uid)) const segmentationIndex = 1 @@ -672,7 +659,7 @@ class SegmentationExample extends Component { const { uid } = viewport.getDefaultActor() const referenceVolume = cache.getVolume(uid) - const segmentationUIDs = SegmentationModule.getsegmentationUIDsForElement( + const segmentationUIDs = segmentation.getsegmentationUIDsForElement( viewport.element ) @@ -691,7 +678,7 @@ class SegmentationExample extends Component { throw new Error('cannot apply start slice') } - let annotation = annotationSelection.getAnnotationsSelectedByToolName( + let annotation = selection.getAnnotationsSelectedByToolName( this.state.ptCtLeftClickTool ) @@ -716,7 +703,7 @@ class SegmentationExample extends Component { this.state.selectedToolGroupName, this.state.selectedsegmentationUID ) - const globalState = SegmentationState.getGlobalSegmentationDataByUID( + const globalState = segmentation.state.getGlobalSegmentationDataByUID( segmentationData.volumeUID ) @@ -737,7 +724,7 @@ class SegmentationExample extends Component { throw new Error('cannot apply start slice') } - let annotation = annotationSelection.getAnnotationsSelectedByToolName( + let annotation = selection.getAnnotationsSelectedByToolName( this.state.ptCtLeftClickTool ) @@ -755,10 +742,9 @@ class SegmentationExample extends Component { const { focalPoint, viewPlaneNormal } = viewport.getCamera() - const selectedAnnotations = - annotationSelection.getAnnotationsSelectedByToolName( - this.state.ptCtLeftClickTool - ) + const selectedAnnotations = selection.getAnnotationsSelectedByToolName( + this.state.ptCtLeftClickTool + ) const { handles } = annotation.data const { points } = handles @@ -787,7 +773,7 @@ class SegmentationExample extends Component { } executeThresholding = (mode) => { - let annotation = annotationSelection.getAnnotationsSelectedByToolName( + let annotation = selection.getAnnotationsSelectedByToolName( this.state.ptCtLeftClickTool ) @@ -815,10 +801,9 @@ class SegmentationExample extends Component { ) const numSlices = this.state.numSlicesForThreshold - const selectedAnnotations = - annotationSelection.getAnnotationsSelectedByToolName( - this.state.ptCtLeftClickTool - ) + const selectedAnnotations = selection.getAnnotationsSelectedByToolName( + this.state.ptCtLeftClickTool + ) if (mode === 'max') { csToolsUtils.segmentation.thresholdVolumeByRoiStats( @@ -968,19 +953,20 @@ class SegmentationExample extends Component { deleteSegmentation = () => { const segmentationDataUID = this.state.selectedsegmentationUID - removeSegmentationsForToolGroup(this.state.selectedToolGroupName, [ - segmentationDataUID, - ]) + segmentation.removeSegmentationsFromToolGroup( + this.state.selectedToolGroupName, + [segmentationDataUID] + ) } toggleSegmentationVisibility = (segmentDataUID) => { const visibilityStatus = - SegmentationModule.segmentationVisibilityController.getSegmentationVisibility( + segmentation.segmentationVisibility.getSegmentationVisibility( this.state.selectedToolGroupName, segmentDataUID ) - SegmentationModule.segmentationVisibilityController.setSegmentationVisibility( + segmentation.segmentationVisibility.setSegmentationVisibility( this.state.selectedToolGroupName, segmentDataUID, !visibilityStatus @@ -1070,15 +1056,15 @@ class SegmentationExample extends Component { onChange={(evt) => { const toolGroupName = evt.target.value const toolGroupSegmentations = - SegmentationState.getSegmentationState(toolGroupName) + segmentation.state.getSegmentationState(toolGroupName) const activeSegmentationData = - SegmentationModule.activeSegmentationController.getActiveSegmentationInfo( + segmentation.activeSegmentation.getActiveSegmentationInfo( toolGroupName ) const toolGroupSegmentationConfig = - SegmentationModule.segmentationConfigController.getSegmentationConfig( + segmentation.segmentationConfig.getSegmentationConfig( toolGroupName ) @@ -1108,25 +1094,25 @@ class SegmentationExample extends Component { @@ -1179,28 +1165,30 @@ class SegmentationExample extends Component {