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 | 35x 35x | import { DisplaySetService, ViewportGridService } from '@ohif/core'; const VOI_SYNC_NAME = 'VOI_SYNC'; const getSyncId = modality => `${VOI_SYNC_NAME}_${modality}`; export default function toggleVOISliceSync({ servicesManager, viewports: providedViewports, syncId, }: withAppTypes) { const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = servicesManager.services; const viewports = providedViewports || groupViewportsByModality(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 // we can apply voi sync within each modality group for (const [modality, modalityViewports] of Object.entries(viewports)) { const syncIdToUse = syncId || getSyncId(modality); const someViewportHasSync = modalityViewports.some(viewport => { const syncStates = syncGroupService.getSynchronizersForViewport( viewport.viewportOptions.viewportId ); const imageSync = syncStates.find(syncState => syncState.id === syncIdToUse); return !!imageSync; }); Iif (someViewportHasSync) { return disableSync(modalityViewports, syncIdToUse, servicesManager); } // create synchronization group and add the modalityViewports to it. modalityViewports.forEach(gridViewport => { const { viewportId } = gridViewport.viewportOptions; const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); Iif (!viewport) { return; } syncGroupService.addViewportToSyncGroup(viewportId, viewport.getRenderingEngine().id, { type: 'voi', id: syncIdToUse, source: true, target: true, }); }); } } function disableSync(modalityViewports, syncId, servicesManager: AppTypes.ServicesManager) { const { syncGroupService, cornerstoneViewportService } = servicesManager.services; const viewports = modalityViewports; viewports.forEach(gridViewport => { const { viewportId } = gridViewport.viewportOptions; const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); Iif (!viewport) { return; } syncGroupService.removeViewportFromSyncGroup( viewport.id, viewport.getRenderingEngine().id, syncId ); }); } function groupViewportsByModality( viewportGridService: ViewportGridService, displaySetService: DisplaySetService ) { let { viewports } = viewportGridService.getState(); viewports = [...viewports.values()]; // group the viewports by modality return viewports.reduce((acc, viewport) => { const { displaySetInstanceUIDs } = viewport; // Todo: add proper fusion support const displaySetInstanceUID = displaySetInstanceUIDs[0]; const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); const modality = displaySet.Modality; Iif (!acc[modality]) { acc[modality] = []; } acc[modality].push(viewport); return acc; }, {}); } |