Skip to content

Commit

Permalink
feat: make stack viewport work
Browse files Browse the repository at this point in the history
  • Loading branch information
pedrokohler committed Feb 12, 2025
1 parent 4b6a761 commit 3113419
Show file tree
Hide file tree
Showing 12 changed files with 352 additions and 187 deletions.
20 changes: 7 additions & 13 deletions packages/adapters/examples/segmentationStack/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ console.warn(
"Click on index.ts to open source code for this example --------->"
);

const { Enums: csEnums, RenderingEngine, utilities: csUtilities } = cornerstone;
const { segmentation: csToolsSegmentation } = cornerstoneTools;
import {
readDicom,
Expand All @@ -32,14 +31,11 @@ import {
loadSegmentation,
exportSegmentation,
restart,
getSegmentationIds,
handleFileSelect,
handleDragOver,
createSegmentation
createEmptySegmentation
} from "../segmentationVolume/utils";

const referenceImageIds: string[] = [];
const segImageIds: string[] = [];
// ======== Set up page ======== //

setTitleAndDescription(
Expand Down Expand Up @@ -104,7 +100,7 @@ const state = {
toolGroup: null,
toolGroupId: "MY_TOOL_GROUP_ID",
viewportIds: ["CT_AXIAL"],
segmentationIds: [],
segmentationId: "LOAD_SEG_ID:" + cornerstone.utilities.uuidv4(),
referenceImageIds: [],
segImageIds: [],
skipOverlapping: false,
Expand Down Expand Up @@ -135,12 +131,10 @@ function loadDicom() {
}

function createSegmentationRepresentation() {
for (const segmentationId of state.segmentationIds) {
csToolsSegmentation.addLabelmapRepresentationToViewport(
state.viewportIds[0],
[{ segmentationId }]
);
}
csToolsSegmentation.addLabelmapRepresentationToViewport(
state.viewportIds[0],
[{ segmentationId: state.segmentationId }]
);
}

// ============================= //
Expand Down Expand Up @@ -196,7 +190,7 @@ addButtonToToolbar({
id: "CREATE_SEGMENTATION",
title: "Create Empty SEG",
onClick: async () => {
await createSegmentation(state);
await createEmptySegmentation(state);
createSegmentationRepresentation();
},
container: group2
Expand Down
22 changes: 10 additions & 12 deletions packages/adapters/examples/segmentationVolume/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {
handleFileSelect,
handleDragOver,
restart,
createSegmentation
createEmptySegmentation
} from "../segmentationVolume/utils";

setTitleAndDescription(
Expand Down Expand Up @@ -116,7 +116,7 @@ const state = {
toolGroupId: "MY_TOOL_GROUP_ID",
viewportIds: ["CT_AXIAL", "CT_SAGITTAL", "CT_CORONAL"],
volumeId: "",
segmentationIds: [],
segmentationId: "LOAD_SEG_ID:" + cornerstone.utilities.uuidv4(),
referenceImageIds: [],
skipOverlapping: false,
segImageIds: [],
Expand Down Expand Up @@ -161,15 +161,13 @@ async function loadDicom() {
}

function createSegmentationRepresentation() {
for (const segmentationId of state.segmentationIds) {
const segMap = {
[state.viewportIds[0]]: [{ segmentationId }],
[state.viewportIds[1]]: [{ segmentationId }],
[state.viewportIds[2]]: [{ segmentationId }]
};

csToolsSegmentation.addLabelmapRepresentationToViewportMap(segMap);
}
const segMap = {
[state.viewportIds[0]]: [{ segmentationId: state.segmentationId }],
[state.viewportIds[1]]: [{ segmentationId: state.segmentationId }],
[state.viewportIds[2]]: [{ segmentationId: state.segmentationId }]
};

csToolsSegmentation.addLabelmapRepresentationToViewportMap(segMap);
}
// ============================= //
addButtonToToolbar({
Expand Down Expand Up @@ -223,7 +221,7 @@ addButtonToToolbar({
id: "CREATE_SEGMENTATION",
title: "Create Empty SEG",
onClick: async () => {
await createSegmentation(state);
await createEmptySegmentation(state);
createSegmentationRepresentation();
},
container: group2
Expand Down
69 changes: 43 additions & 26 deletions packages/adapters/examples/segmentationVolume/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export async function readDicom(files: FileList, state) {
}
}

export async function createSegmentation(state) {
export async function createEmptySegmentation(state) {
const { referenceImageIds, segmentationId } = state;

const derivedSegmentationImages =
Expand All @@ -44,6 +44,25 @@ export async function createSegmentation(state) {
]);
}

export async function createSegmentation({ state, labelMapImages }) {
const { segmentationId } = state;

const imageIds = labelMapImages?.flat().map(image => image.imageId);

csToolsSegmentation.addSegmentations([
{
segmentationId,
representation: {
type: cornerstoneTools.Enums.SegmentationRepresentations
.Labelmap,
data: {
imageIds
}
}
}
]);
}

export async function readSegmentation(file: File, state) {
const imageId = wadouri.fileManager.add(file);
const image = await imageLoader.loadAndCacheImage(imageId);
Expand All @@ -65,9 +84,9 @@ export async function readSegmentation(file: File, state) {
}

export async function loadSegmentation(arrayBuffer: ArrayBuffer, state) {
const { referenceImageIds, skipOverlapping, segmentationIds } = state;
const { referenceImageIds, skipOverlapping, segmentationId } = state;

const generateToolState =
const { labelMapImages } =
await Cornerstone3D.Segmentation.createFromDICOMSegBuffer(
referenceImageIds,
arrayBuffer,
Expand All @@ -77,29 +96,27 @@ export async function loadSegmentation(arrayBuffer: ArrayBuffer, state) {
}
);

for (let i = 0; i < generateToolState.labelMapImages.length; i++) {
const segmentationId = "LOAD_SEG_ID:" + cornerstone.utilities.uuidv4();
segmentationIds.push(segmentationId);
await createSegmentation({ ...state, segmentationId });

const segmentation =
csToolsSegmentation.state.getSegmentation(segmentationId);

const { imageIds } = segmentation.representationData.Labelmap;
const derivedSegmentationImages = imageIds.map(imageId =>
cache.getImage(imageId)
);

const labelmapImagesNonOverlapping =
generateToolState.labelMapImages[i];

for (let j = 0; j < derivedSegmentationImages.length; j++) {
const voxelManager = derivedSegmentationImages[j].voxelManager;
const scalarData = voxelManager.getScalarData();
scalarData.set(labelmapImagesNonOverlapping[j].getPixelData());
voxelManager.setScalarData(scalarData);
}
}
await createSegmentation({ state, labelMapImages });
// for (let i = 0; i < labelMapImages.length; i++) {
// const segmentation =
// csToolsSegmentation.state.getSegmentation(segmentationId);

// const { imageIds } = segmentation.representationData.Labelmap;
// console.log("🚀 ~ loadSegmentation ~ imageIds:", imageIds);
// const derivedSegmentationImages = imageIds.map(imageId =>
// cache.getImage(imageId)
// );

// const labelmapImagesNonOverlapping = labelMapImages[i];

// for (let j = 0; j < derivedSegmentationImages.length; j++) {
// const voxelManager = derivedSegmentationImages[j].voxelManager;
// const scalarData = voxelManager.getScalarData();
// const derivedImage = labelmapImagesNonOverlapping[j];
// scalarData.set(labelmapImagesNonOverlapping[j].getPixelData());
// voxelManager.setScalarData(scalarData);
// }
// }
}

export async function exportSegmentation(state) {
Expand Down
Loading

0 comments on commit 3113419

Please sign in to comment.