a lot of fixes

This commit is contained in:
Ross
2025-06-09 13:31:56 +01:00
parent 7d8caebf8c
commit 28569a1c94
2 changed files with 187 additions and 169 deletions
+22 -11
View File
@@ -1161,7 +1161,10 @@ useEffect(() => {
const viewport = renderingEngine.getViewport(`CT_${viewportIdx}`); const viewport = renderingEngine.getViewport(`CT_${viewportIdx}`);
if (!viewport || typeof viewport.getImageIds !== "function") return; if (!viewport || typeof viewport.getImageIds !== "function") return;
const imageIds = viewport.getImageIds(); const imageIds = viewport.getImageIds();
const idx = imageIds.indexOf(imageId); // Some stacks may have imageIds with or without "wadouri:" prefix, so normalize for comparison
const normImageIds = imageIds.map(id => id.replace(/^wadouri:/, ""));
const normTarget = imageId.replace(/^wadouri:/, "");
const idx = normImageIds.indexOf(normTarget);
if (idx !== -1 && typeof viewport.setImageIdIndex === "function") { if (idx !== -1 && typeof viewport.setImageIdIndex === "function") {
csUtilities.jumpToSlice(viewport.element, { imageIndex: idx }); csUtilities.jumpToSlice(viewport.element, { imageIndex: idx });
updateOverlay(viewportIdx, viewport); updateOverlay(viewportIdx, viewport);
@@ -1351,6 +1354,11 @@ useEffect(() => {
}; };
window[`importLegacyAnnotations_${apiKey}`] = (json: string) => { window[`importLegacyAnnotations_${apiKey}`] = (json: string) => {
// Remove all existing annotations
if (cornerstoneTools.annotation.state.removeAllAnnotations) {
cornerstoneTools.annotation.state.removeAllAnnotations();
}
let legacyData: any; let legacyData: any;
try { try {
legacyData = typeof json === "string" ? JSON.parse(json) : json; legacyData = typeof json === "string" ? JSON.parse(json) : json;
@@ -1359,17 +1367,13 @@ useEffect(() => {
return; return;
} }
// Remove all existing annotations
if (cornerstoneTools.annotation.state.removeAllAnnotations) {
cornerstoneTools.annotation.state.removeAllAnnotations();
}
const toolNameMap: Record<string, string> = { const toolNameMap: Record<string, string> = {
ArrowAnnotate: "ArrowAnnotate", ArrowAnnotate: "ArrowAnnotate",
// Add more mappings if needed // Add more mappings if needed
}; };
Object.entries(legacyData).forEach(([imageId, tools]) => { Object.entries(legacyData).forEach(([imageId, tools]) => {
console.log("Importing legacy annotations for imageId:", imageId);
Object.entries(tools as any).forEach(([legacyTool, toolData]: [string, any]) => { Object.entries(tools as any).forEach(([legacyTool, toolData]: [string, any]) => {
const cs3Tool = toolNameMap[legacyTool] || legacyTool; const cs3Tool = toolNameMap[legacyTool] || legacyTool;
if (toolData.data && Array.isArray(toolData.data)) { if (toolData.data && Array.isArray(toolData.data)) {
@@ -1410,8 +1414,11 @@ useEffect(() => {
} }
// --- Add rotation if present in legacy annotation ---
// Does this actually exist?
if (typeof ann.rotation === "number") {
metadata.rotation = ann.rotation;
}
const annotation = { const annotation = {
annotationUID: ann.uuid, // || cornerstoneTools.utilities.uuidv4(), annotationUID: ann.uuid, // || cornerstoneTools.utilities.uuidv4(),
@@ -1471,7 +1478,6 @@ useEffect(() => {
} }
if (typeof legacy.invert === "boolean") props.invert = legacy.invert; if (typeof legacy.invert === "boolean") props.invert = legacy.invert;
if (typeof legacy.pixelReplication === "boolean") props.interpolationType = legacy.pixelReplication ? 0 : 1; if (typeof legacy.pixelReplication === "boolean") props.interpolationType = legacy.pixelReplication ? 0 : 1;
if (typeof legacy.rotation === "number") props.rotation = legacy.rotation;
if (typeof legacy.hflip === "boolean") props.hflip = legacy.hflip; if (typeof legacy.hflip === "boolean") props.hflip = legacy.hflip;
if (typeof legacy.vflip === "boolean") props.vflip = legacy.vflip; if (typeof legacy.vflip === "boolean") props.vflip = legacy.vflip;
@@ -1493,6 +1499,10 @@ useEffect(() => {
viewport.setCamera(camera); viewport.setCamera(camera);
} }
} }
// --- Fix: Import rotation from legacy viewport ---
if (typeof legacy.rotation === "number") {
viewport.setRotation(legacy.rotation);
}
viewport.render(); viewport.render();
updateOverlay(activeViewport ?? 0, viewport); updateOverlay(activeViewport ?? 0, viewport);
@@ -1732,7 +1742,8 @@ useEffect(() => {
ann => ann =>
ann.metadata && ann.metadata &&
ann.metadata.referencedImageId && ann.metadata.referencedImageId &&
imageIds.includes(ann.metadata.referencedImageId) imageIds.includes(ann.metadata.referencedImageId) &&
ann.metadata.toolName !== ReferenceCursors.toolName // Exclude ReferenceCursors
); );
if (!stackAnnotations.length) return null; if (!stackAnnotations.length) return null;
// Find the annotation(s) on the current image // Find the annotation(s) on the current image
@@ -2123,7 +2134,7 @@ onClick={() => {
</div> </div>
</div> </div>
)} )}
{isVisible && ( {isVisible && availableStacks.length > 1 && (
<div <div
style={{ style={{
position: "absolute", position: "absolute",
+14 -7
View File
@@ -6,6 +6,12 @@ import Nifti from './Nifti.tsx'
import './index.css' import './index.css'
import { createImageIds, availableImageIds } from "./lib/createImageIds.ts" import { createImageIds, availableImageIds } from "./lib/createImageIds.ts"
// Helper to convert URLs to wadouri
const toWadouri = (arr: string[]) =>
arr.map(url => url.startsWith("wadouri:") ? url : `wadouri:${url}`);
export function mountDicomViewers() {
// Test containers
const test_containers = document.querySelectorAll(".dicom-viewer-test-root"); const test_containers = document.querySelectorAll(".dicom-viewer-test-root");
test_containers.forEach((container) => { test_containers.forEach((container) => {
const id = container.id || ''; const id = container.id || '';
@@ -18,16 +24,12 @@ test_containers.forEach((container) => {
); );
}); });
// Main containers
const containers = document.querySelectorAll(".dicom-viewer-root"); const containers = document.querySelectorAll(".dicom-viewer-root");
containers.forEach((container) => { containers.forEach((container) => {
const id = container.id || ''; const id = container.id || '';
let imageStacks; let imageStacks;
// Helper to convert URLs to wadouri
const toWadouri = (arr: string[]) =>
arr.map(url => url.startsWith("wadouri:") ? url : `wadouri:${url}`);
// Check for data-images attribute
const dataImages = container.getAttribute('data-images'); const dataImages = container.getAttribute('data-images');
if (dataImages) { if (dataImages) {
let parsed; let parsed;
@@ -37,7 +39,6 @@ containers.forEach((container) => {
console.error("Invalid data-images JSON:", e); console.error("Invalid data-images JSON:", e);
parsed = []; parsed = [];
} }
// If it's a flat list, wrap in an array to make it a stack list and convert to wadouri
if (Array.isArray(parsed) && parsed.length > 0 && typeof parsed[0] === "string") { if (Array.isArray(parsed) && parsed.length > 0 && typeof parsed[0] === "string") {
imageStacks = () => Promise.resolve([toWadouri(parsed)]); imageStacks = () => Promise.resolve([toWadouri(parsed)]);
} else if (Array.isArray(parsed)) { } else if (Array.isArray(parsed)) {
@@ -51,7 +52,6 @@ containers.forEach((container) => {
imageStacks = () => Promise.resolve([[]]); imageStacks = () => Promise.resolve([[]]);
} }
// Read autoCacheStack from data-auto-cache-stack attribute
const autoCacheStackAttr = container.getAttribute('data-auto-cache-stack'); const autoCacheStackAttr = container.getAttribute('data-auto-cache-stack');
const autoCacheStack = autoCacheStackAttr === "true" || autoCacheStackAttr === "1"; const autoCacheStack = autoCacheStackAttr === "true" || autoCacheStackAttr === "1";
@@ -63,3 +63,10 @@ containers.forEach((container) => {
/> />
); );
}); });
}
// Optionally, call it immediately for static containers:
mountDicomViewers();
// Optionally, expose globally for dynamic use:
(window as any).mountDicomViewers = mountDicomViewers;