268 lines
8.1 KiB
TypeScript
268 lines
8.1 KiB
TypeScript
import { MIN_SEGMENTATION_DRAWING_RADIUS, MAX_SEGMENTATION_DRAWING_RADIUS } from './constants';
|
|
|
|
const colours = {
|
|
'viewport-0': 'rgb(200, 0, 0)',
|
|
'viewport-1': 'rgb(200, 200, 0)',
|
|
'viewport-2': 'rgb(0, 200, 0)',
|
|
};
|
|
|
|
const colorsByOrientation = {
|
|
axial: 'rgb(200, 0, 0)',
|
|
sagittal: 'rgb(200, 200, 0)',
|
|
coronal: 'rgb(0, 200, 0)',
|
|
};
|
|
|
|
function createTools({ utilityModule, commandsManager }) {
|
|
const { toolNames, Enums } = utilityModule.exports;
|
|
|
|
const tools = {
|
|
active: [
|
|
{ toolName: toolNames.WindowLevel, bindings: [{ mouseButton: Enums.MouseBindings.Primary }] },
|
|
{ toolName: toolNames.Pan, bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }] },
|
|
{
|
|
toolName: toolNames.Zoom,
|
|
bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }],
|
|
},
|
|
{
|
|
toolName: toolNames.StackScroll,
|
|
bindings: [{ mouseButton: Enums.MouseBindings.Wheel }, { numTouchPoints: 3 }],
|
|
},
|
|
],
|
|
passive: [
|
|
{
|
|
toolName: 'CircularBrush',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'FILL_INSIDE_CIRCLE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: toolNames.LabelmapSlicePropagation,
|
|
},
|
|
{
|
|
toolName: toolNames.MarkerLabelmap,
|
|
},
|
|
{
|
|
toolName: toolNames.RegionSegmentPlus,
|
|
},
|
|
{
|
|
toolName: 'CircularEraser',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'ERASE_INSIDE_CIRCLE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: 'SphereBrush',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'FILL_INSIDE_SPHERE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: 'SphereEraser',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'ERASE_INSIDE_SPHERE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: 'ThresholdCircularBrush',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'THRESHOLD_INSIDE_CIRCLE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: 'ThresholdSphereBrush',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'THRESHOLD_INSIDE_SPHERE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
},
|
|
},
|
|
{
|
|
toolName: 'ThresholdCircularBrushDynamic',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'THRESHOLD_INSIDE_CIRCLE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
threshold: {
|
|
isDynamic: true,
|
|
dynamicRadius: 3,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
toolName: toolNames.SegmentBidirectional,
|
|
},
|
|
{
|
|
toolName: toolNames.SegmentSelect,
|
|
},
|
|
{
|
|
toolName: 'ThresholdSphereBrushDynamic',
|
|
parentTool: 'Brush',
|
|
configuration: {
|
|
activeStrategy: 'THRESHOLD_INSIDE_SPHERE',
|
|
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
threshold: {
|
|
isDynamic: true,
|
|
dynamicRadius: 3,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
toolName: toolNames.LabelMapEditWithContourTool,
|
|
},
|
|
{ toolName: toolNames.CircleScissors },
|
|
{ toolName: toolNames.RectangleScissors },
|
|
{ toolName: toolNames.SphereScissors },
|
|
{ toolName: toolNames.StackScroll },
|
|
{ toolName: toolNames.Magnify },
|
|
{ toolName: toolNames.WindowLevelRegion },
|
|
|
|
{ toolName: toolNames.UltrasoundDirectional },
|
|
{
|
|
toolName: toolNames.PlanarFreehandContourSegmentation,
|
|
},
|
|
{ toolName: toolNames.LivewireContourSegmentation },
|
|
{ toolName: toolNames.SculptorTool },
|
|
{ toolName: toolNames.PlanarFreehandROI },
|
|
{
|
|
toolName: 'CatmullRomSplineROI',
|
|
parentTool: toolNames.SplineContourSegmentation,
|
|
configuration: {
|
|
spline: {
|
|
type: 'CATMULLROM',
|
|
enableTwoPointPreview: true,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
toolName: 'LinearSplineROI',
|
|
parentTool: toolNames.SplineContourSegmentation,
|
|
configuration: {
|
|
spline: {
|
|
type: 'LINEAR',
|
|
enableTwoPointPreview: true,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
toolName: 'BSplineROI',
|
|
parentTool: toolNames.SplineContourSegmentation,
|
|
configuration: {
|
|
spline: {
|
|
type: 'BSPLINE',
|
|
enableTwoPointPreview: true,
|
|
},
|
|
},
|
|
},
|
|
],
|
|
disabled: [{ toolName: toolNames.ReferenceLines }, { toolName: toolNames.AdvancedMagnify }],
|
|
};
|
|
|
|
const updatedTools = commandsManager.run('initializeSegmentLabelTool', { tools });
|
|
|
|
return updatedTools;
|
|
}
|
|
|
|
function initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, toolGroupId) {
|
|
const utilityModule = extensionManager.getModuleEntry(
|
|
'@ohif/extension-cornerstone.utilityModule.tools'
|
|
);
|
|
const tools = createTools({ commandsManager, utilityModule });
|
|
toolGroupService.createToolGroupAndAddTools(toolGroupId, tools);
|
|
}
|
|
|
|
function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) {
|
|
const utilityModule = extensionManager.getModuleEntry(
|
|
'@ohif/extension-cornerstone.utilityModule.tools'
|
|
);
|
|
const servicesManager = extensionManager._servicesManager;
|
|
const { cornerstoneViewportService } = servicesManager.services;
|
|
const tools = createTools({ commandsManager, utilityModule });
|
|
tools.disabled.push(
|
|
{
|
|
toolName: utilityModule.exports.toolNames.Crosshairs,
|
|
configuration: {
|
|
viewportIndicators: true,
|
|
viewportIndicatorsConfig: {
|
|
circleRadius: 5,
|
|
xOffset: 0.95,
|
|
yOffset: 0.05,
|
|
},
|
|
disableOnPassive: true,
|
|
autoPan: {
|
|
enabled: false,
|
|
panSize: 10,
|
|
},
|
|
getReferenceLineColor: viewportId => {
|
|
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
const viewportOptions = viewportInfo?.viewportOptions;
|
|
if (viewportOptions) {
|
|
return (
|
|
colours[viewportOptions.id] ||
|
|
colorsByOrientation[viewportOptions.orientation] ||
|
|
'#0c0'
|
|
);
|
|
} else {
|
|
console.warn('missing viewport?', viewportId);
|
|
return '#0c0';
|
|
}
|
|
},
|
|
},
|
|
},
|
|
{ toolName: utilityModule.exports.toolNames.ReferenceLines }
|
|
);
|
|
toolGroupService.createToolGroupAndAddTools('mpr', tools);
|
|
}
|
|
|
|
function initVolume3DToolGroup(extensionManager, toolGroupService) {
|
|
const utilityModule = extensionManager.getModuleEntry(
|
|
'@ohif/extension-cornerstone.utilityModule.tools'
|
|
);
|
|
|
|
const { toolNames, Enums } = utilityModule.exports;
|
|
|
|
const tools = {
|
|
active: [
|
|
{
|
|
toolName: toolNames.TrackballRotateTool,
|
|
bindings: [{ mouseButton: Enums.MouseBindings.Primary }],
|
|
},
|
|
{
|
|
toolName: toolNames.Zoom,
|
|
bindings: [{ mouseButton: Enums.MouseBindings.Secondary }, { numTouchPoints: 2 }],
|
|
},
|
|
{
|
|
toolName: toolNames.Pan,
|
|
bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],
|
|
},
|
|
],
|
|
};
|
|
|
|
toolGroupService.createToolGroupAndAddTools('volume3d', tools);
|
|
}
|
|
|
|
function initToolGroups(extensionManager, toolGroupService, commandsManager) {
|
|
initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, 'default');
|
|
initMPRToolGroup(extensionManager, toolGroupService, commandsManager);
|
|
initVolume3DToolGroup(extensionManager, toolGroupService);
|
|
}
|
|
|
|
export default initToolGroups;
|