Other Changes
addOrUpdateSegmentation​
This was a public method but there is a good chance you were not using it
Before (OHIF 3.8)
// Before
addOrUpdateSegmentation(
  segmentation: Segmentation,
  suppressEvents = false,
  notYetUpdatedAtSource = false
): string
After
addOrUpdateSegmentation(
  segmentationInput: SegmentationPublicInput | Partial<Segmentation>
)
Data Structure Changes​
The segmentation object that was used previously was a custom segmentation object that was used internally by the SegmentationService. But we have moved to the cornerstone public segmentation input type.
Before:
const segmentation = {
  id: 'segmentation1',
  type: SegmentationRepresentations.Labelmap,
  isActive: true,
  activeSegmentIndex: 1,
  segments: [
    {
      segmentIndex: 1,
      color: [255, 0, 0],
      isVisible: true,
      isLocked: false,
      opacity: 255
    }
  ],
  label: 'Segmentation 1',
  cachedStats: {},
  representationData: {
    LABELMAP: {
      volumeId: 'volume1',
      referencedVolumeId: 'reference1'
    }
  }
};
After:
This matches the cornerstone public segmentation input type.
const segmentationInput = {
  segmentationId: 'segmentation1',
  representation: {
    type: SegmentationRepresentations.Labelmap,
    data: {
      imageIds: segmentationImageIds,
      referencedVolumeId: 'reference1'
    }
  },
  config: {
    label: 'Segmentation 1',
    segments: {
      1: {
        label: 'Segment 1',
        active: true,
        locked: false
      }
    }
  }
};
Migration Examples
// Before
const newSegmentation = {
  id: 'seg1',
  type: SegmentationRepresentations.Labelmap,
  segments: [...],
  representationData: {
    LABELMAP: {
      volumeId: 'volume1',
      referencedVolumeId: 'reference1'
    }
  }
};
segmentationService.addOrUpdateSegmentation(newSegmentation);
// After
segmentationService.addOrUpdateSegmentation({
  segmentationId: 'seg1',
  representation: {
    type: SegmentationRepresentations.Labelmap,
    data: {
      imageIds: segmentationImageIds,
      referencedVolumeId: 'reference1'
    }
  },
  config: {
    segments: {
      1: {
        label: 'Segment 1',
        active: true
      }
    }
  }
});
Updating Existing Segmentation
// Before
const updatedSegmentation = {
  ...existingSegmentation,
  segments: [...modifiedSegments],
  activeSegmentIndex: 2
};
segmentationService.addOrUpdateSegmentation(updatedSegmentation);
// After
segmentationService.addOrUpdateSegmentation({
  segmentationId: 'seg1',
  config: {
    segments: {
      2: { active: true },
    }
  }
});
loadSegmentationsForViewport​
same as addOrUpdateSegmentation, you should pass in the new segmentation data structure.
For instance
Before
const segmentations = [
  {
    id: '1',
    label: 'Segmentations',
    segments: labels.map((label, index) => ({
      segmentIndex: index + 1,
      label
    })),
    isActive: true,
    activeSegmentIndex: 1,
  },
];
commandsManager.runCommand('loadSegmentationsForViewport', {
  segmentations,
});
After
const labels = ['Segment 1', 'Segment 2', 'Segment 3'];
const segmentations = [
  {
    segmentationId: '1',
    representation: {
      type: Enums.SegmentationRepresentations.Labelmap,
    },
    config: {
      label: 'Segmentations',
      segments: labels.reduce((acc, label, index) => {
        acc[index + 1] = {
          label,
          active: index === 0, // First segment is active
          locked: false,
        };
        return acc;
      }, {}),
    },
  },
];
commandsManager.runCommand('loadSegmentationsForViewport', {
  segmentations,
});
highlightSegment​
Before (OHIF 3.8)
// Before (v1.x)
highlightSegment(
  segmentationId: string,
  segmentIndex: number,
  toolGroupId?: string,
  alpha = 0.9,
  animationLength = 750,
  hideOthers = true,
  highlightFunctionType = 'ease-in-out'
)
After (OHIF 3.9)
highlightSegment(
  segmentationId: string,
  segmentIndex: number,
  viewportId?: string, // notice viewportId instead of toolGroupId
  alpha = 0.9,
  animationLength = 750,
  hideOthers = true,
  highlightFunctionType = 'ease-in-out'
)
Key Changes
- Removed 
toolGroupIdin favor ofviewportId - If no viewportId is provided, highlights in all relevant viewports
 
Migration Examples
Basic Usage
// Before
segmentationService.highlightSegment(
  'seg1',
  1,
  'toolGroup1',
  0.9,
  750,
  true,
);
// After
segmentationService.highlightSegment(
  'seg1',
  1,
  'viewport1',
  0.9,
  750,
  true
);
Highlighting in Multiple Views
// Before
const toolGroupIds = ['toolGroup1', 'toolGroup2'];
toolGroupIds.forEach(toolGroupId => {
  segmentationService.highlightSegment(
    'seg1',
    1,
    toolGroupId
  );
});
// After - Method 1: Let service handle multiple viewports
segmentationService.highlightSegment('seg1', 1);
// After - Method 2: Explicitly specify viewports
const viewportIds = ['viewport1', 'viewport2'];
viewportIds.forEach(viewportId => {
  segmentationService.highlightSegment(
    'seg1',
    1,
    viewportId
  );
});
jumpToSegmentCenter​
Before (OHIF 3.8)
jumpToSegmentCenter(
  segmentationId: string,
  segmentIndex: number,
  toolGroupId?: string,
  highlightAlpha = 0.9,
  highlightSegment = true,
  animationLength = 750,
  highlightHideOthers = false,
  highlightFunctionType = 'ease-in-out'
)
After (OHIF 3.9)
jumpToSegmentCenter(
  segmentationId: string,
  segmentIndex: number,
  viewportId? string, // notice viewportId instead of toolGroupId
  highlightAlpha = 0.9,
  highlightSegment = true,
  animationLength = 750,
  highlightHideOthers = false,
  highlightFunctionType = 'ease-in-out'
)
Key Changes
- Removed 
toolGroupIdparameter infavor of viewportId - Automatically handles relevant viewports if 
viewportIdnot provided 
// Before
segmentationService.jumpToSegmentCenter(
  'seg1',
  1,
  'toolGroup1'
);
// After
segmentationService.jumpToSegmentCenter(
  'seg1',
  1,
  'viewportId1'
);