cornerstonejs 有顯示切割範圍功能

https://www.cornerstonejs.org/live-examples/labelmaprendering

但是只有 example

沒有程式可以看
你只能自己看他打包後的程式來拆解...
雖然是真的能用
但確實有點麻煩


這個範例的應用方式為

 

// 載入需要套件
import {
  init as coreInit,
  RenderingEngine,
  Enums,
  volumeLoader,
  setVolumesForViewports,
  cache,
} from '@cornerstonejs/core';

import {
  init as cornerstoneToolsInit,
  ToolGroupManager,
  WindowLevelTool,
  ZoomTool,
  Enums as csToolsEnums,
  addTool,
  StackScrollTool,
  PanTool,
  segmentation,
//   ProbeTool,
//   CrosshairsTool,
} from '@cornerstonejs/tools';



// 初始化 segment
// ct_volumeId 要注意-這個跟 volume 綁再一起
var segmentationId = 'MY_SEGMENTATION_ID';
volumeLoader.createAndCacheDerivedLabelmapVolume(ct_volumeId, {
    volumeId: segmentationId
});

// 取得一個空的切割範圍
const segmentationVolume = cache.getVolume(segmentationId);

// 取得切割範圍寬度
const { dimensions, voxelManager } = segmentationVolume;

// 這邊計算DEMO的範圍-實際應用要自己設定範圍-可以從座標指定
var innerRadius = dimensions[0] / 8;
var outerRadius = dimensions[0] / 4;
var centerOffset = [0, 0, 0];
var scale = [1, 1, 1];
const center = [
    dimensions[0] / 2 + centerOffset[0],
    dimensions[1] / 2 + centerOffset[1],
    dimensions[2] / 2 + centerOffset[2],
];

let voxelIndex = 0;

// 設定範圍
for (let z = 0; z < dimensions[2]; z++) {
    for (let y = 0; y < dimensions[1]; y++) {
    for (let x = 0; x < dimensions[0]; x++) {
        const distanceFromCenter = Math.sqrt(
        (x - center[0]) * scale[0] * ((x - center[0]) * scale[0]) +
            (y - center[1]) * scale[1] * ((y - center[1]) * scale[1]) +
            (z - center[2]) * scale[2] * ((z - center[2]) * scale[2])
        );
        if (distanceFromCenter < innerRadius) {
        // 範圍是從這邊設定的 所以傳進來的應該是範圍的座標
        voxelManager.setAtIndex(voxelIndex, 1);
        } else if (distanceFromCenter < outerRadius) {
        voxelManager.setAtIndex(voxelIndex, 2);
        }
        voxelIndex++;
    }
    }
}



const values = voxelManager.getCompleteScalarDataArray();
// values 是分類數組-範圍要由 voxelManager.setAtIndex 決定
const scalarArray = vtkDataArray.newInstance({
    name: `Pixels`,
    values,
});
segmentationVolume.imageData.getPointData().setScalars(scalarArray);

// 加入切割範圍
segmentation.addSegmentations([
    {
        segmentationId,
        representation: {
            type: csToolsEnums.SegmentationRepresentations.Labelmap,
            data: {
                volumeId: segmentationId
            }
        }
    }
]);
var segmentationRepresentation = {
    segmentationId
};
// 加入到 view port
segmentation.addLabelmapRepresentationToViewportMap({
    [viewportId_axial]: [
        segmentationRepresentation
    ],
    [viewportId_sagittal]: [
        segmentationRepresentation
    ],
    [viewportId_coronal]: [
        segmentationRepresentation
    ]
});

 

覺得 cornerstonejs 確實很好用
功能完整
但就是沒有文檔
只能靠自己解析除錯
確實不容易