Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 34x | import { DisplaySetService, ViewportGridService } from '@ohif/core'; const IMAGE_SLICE_SYNC_NAME = 'IMAGE_SLICE_SYNC'; export default function toggleImageSliceSync({ servicesManager, viewports: providedViewports, syncId, }: withAppTypes) { const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = servicesManager.services; syncId ||= IMAGE_SLICE_SYNC_NAME; const viewports = providedViewports || getReconstructableStackViewports(viewportGridService, displaySetService); // Todo: right now we don't have a proper way to define specific // viewports to add to synchronizers, and right now it is global or not // after we do that, we should do fine grained control of the synchronizers const someViewportHasSync = viewports.some(viewport => { const syncStates = syncGroupService.getSynchronizersForViewport( viewport.viewportOptions.viewportId ); const imageSync = syncStates.find(syncState => syncState.id === syncId); return !!imageSync; }); Iif (someViewportHasSync) { return disableSync(syncId, servicesManager); } // create synchronization group and add the viewports to it. viewports.forEach(gridViewport => { const { viewportId } = gridViewport.viewportOptions; const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); Iif (!viewport) { return; } syncGroupService.addViewportToSyncGroup(viewportId, viewport.getRenderingEngine().id, { type: 'imageSlice', id: syncId, source: true, target: true, }); }); } function disableSync(syncName, servicesManager: AppTypes.ServicesManager) { const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = servicesManager.services; const viewports = getReconstructableStackViewports(viewportGridService, displaySetService); viewports.forEach(gridViewport => { const { viewportId } = gridViewport.viewportOptions; const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); Iif (!viewport) { return; } syncGroupService.removeViewportFromSyncGroup( viewport.id, viewport.getRenderingEngine().id, syncName ); }); } /** * Gets the consistent spacing stack viewport types, which are the ones which * can be navigated using the stack image sync right now. */ function getReconstructableStackViewports( viewportGridService: ViewportGridService, displaySetService: DisplaySetService ) { let { viewports } = viewportGridService.getState(); viewports = [...viewports.values()]; // filter empty viewports viewports = viewports.filter( viewport => viewport.displaySetInstanceUIDs && viewport.displaySetInstanceUIDs.length ); // filter reconstructable viewports viewports = viewports.filter(viewport => { const { displaySetInstanceUIDs } = viewport; for (const displaySetInstanceUID of displaySetInstanceUIDs) { const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); // TODO - add a better test than isReconstructable Iif (displaySet && displaySet.isReconstructable) { return true; } return false; } }); return viewports; } |