All files / extensions/cornerstone/src/utils toggleVOISliceSync.ts

5.12% Statements 2/39
0% Branches 0/8
0% Functions 0/9
5.4% Lines 2/37

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;
  }, {});
}