feat(data overlay): add foreground background control plus orientation change in the UI and add RTDOSE support (#5007)

This commit is contained in:
Alireza authored and GitHub committed 2025-05-05 16:35:05 -04:00
1 parent c1fced0573
commit cd4e6408bc
105 files changed
+3117 -788

No files matched your search

@@ -0,0 +1,157 @@
export const DERIVED_OVERLAY_MODALITIES = ['SEG', 'RTSTRUCT'];
export const DEFAULT_COLORMAP = 'hsv';
export const DEFAULT_OPACITY = 0.9;
export const DEFAULT_OPACITY_PERCENT = DEFAULT_OPACITY * 100;
/**
* Get modality-specific color and opacity settings from the customization service
*/
export function getModalityOverlayColormap(customizationService, modality) {
const modalityOverlayDefaultColorMaps = customizationService?.getCustomization(
'cornerstone.modalityOverlayDefaultColorMaps'
) || { defaultSettings: {} };
return (
modalityOverlayDefaultColorMaps.defaultSettings[modality] || {
colormap: DEFAULT_COLORMAP,
opacity: DEFAULT_OPACITY,
}
);
}
/**
* Create display set options based on modality and opacity settings
*/
export function createColormapOverlayDisplaySetOptions(displaySet, opacity, customizationService) {
if (displaySet.Modality === 'SEG') {
return {};
}
const modalitySettings = getModalityOverlayColormap(customizationService, displaySet.Modality);
return {
colormap: {
name: modalitySettings.colormap || DEFAULT_COLORMAP,
opacity: opacity / 100, // Convert from percentage to 0-1 range
},
};
}
/**
* Configure viewport for adding a display set layer
*/
export function configureViewportForLayerAddition(params: {
viewport: any;
displaySetInstanceUID: string;
currentDisplaySetUIDs: string[];
servicesManager: AppTypes.ServicesManager;
}): any {
const { viewport, displaySetInstanceUID, currentDisplaySetUIDs, servicesManager } = params;
const { cornerstoneViewportService, displaySetService, customizationService } =
servicesManager.services;
const { viewportId } = viewport;
// Set the display set UIDs for the viewport
const allDisplaySetInstanceUIDs = [...currentDisplaySetUIDs, displaySetInstanceUID];
viewport.displaySetInstanceUIDs = allDisplaySetInstanceUIDs;
if (!viewport.viewportOptions) {
viewport.viewportOptions = {};
}
const requestedLayerDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (!viewport.viewportOptions.orientation) {
viewport.viewportOptions.orientation = cornerstoneViewportService.getOrientation(viewportId);
}
// Do not force volume for SEG and RTSTRUCT if there is only one display set
if (requestedLayerDisplaySet.isOverlayDisplaySet && currentDisplaySetUIDs.length === 1) {
viewport.viewportOptions.viewportType = 'stack';
} else {
viewport.viewportOptions.viewportType = 'volume';
}
// create same amount of display set options as the number of display set UIDs
const displaySetOptions = allDisplaySetInstanceUIDs.map((uid, index) => {
if (index === 0) {
// no colormap for background
return {};
}
const displaySet = displaySetService.getDisplaySetByUID(uid);
return createColormapOverlayDisplaySetOptions(displaySet, 90, customizationService);
});
viewport.displaySetOptions = displaySetOptions;
return viewport;
}
/**
* Configure viewport for removing a display set layer
*/
export function configureViewportForLayerRemoval(params: {
viewport: any;
displaySetInstanceUID: string;
currentDisplaySetUIDs: string[];
servicesManager: AppTypes.ServicesManager;
}): any {
const { viewport, displaySetInstanceUID, currentDisplaySetUIDs, servicesManager } = params;
const { cornerstoneViewportService, displaySetService } = servicesManager.services;
const { viewportId } = viewport;
// Filter out the display set to remove
viewport.displaySetInstanceUIDs = currentDisplaySetUIDs.filter(
uid => uid !== displaySetInstanceUID
);
if (!viewport.viewportOptions) {
viewport.viewportOptions = {};
}
viewport.viewportOptions.viewportType = 'volume';
// orientation
if (!viewport.viewportOptions.orientation) {
viewport.viewportOptions.orientation = cornerstoneViewportService.getOrientation(viewportId);
}
// Recreate the display set options
viewport.displaySetOptions = viewport.displaySetInstanceUIDs.map(() => {
// For simplicity, we're returning empty options for now
// In a more complete implementation, we would need to preserve existing display set options
return {};
});
return viewport;
}
/**
* Check if a display set can be added as a layer to the specified viewport
*/
export function canAddDisplaySetToViewport(params: {
viewportId: string;
displaySetInstanceUID: string;
servicesManager: AppTypes.ServicesManager;
}): boolean {
const { viewportId, displaySetInstanceUID, servicesManager } = params;
const { displaySetService, viewportGridService } = servicesManager.services;
// Check if the display set exists
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (!displaySet) {
return false;
}
// Get current display sets in the viewport
const currentDisplaySetUIDs = viewportGridService.getDisplaySetsUIDsForViewport(viewportId);
// Check if the display set is already in the viewport
if (currentDisplaySetUIDs.includes(displaySetInstanceUID)) {
return false;
}
return true;
}