在 React 功能组件中使用 Cornerstone.js 中的堆栈滚动工具时,如何访问“currentImageIdIndex”?

IT技术 reactjs cornerstonejs
2022-07-20 02:05:04

我目前在 React 组件中成功地显示了一堆图像,但不确定在哪里放置事件侦听器以便currentImageIdIndex在滚动时访问。

import React, { useEffect, useRef, useCallback } from "react";
import cornerstone from "cornerstone-core";
import cornerstoneMath from "cornerstone-math";
import cornerstoneTools from "cornerstone-tools";
import cornerstoneFileImageLoader from "cornerstone-file-image-loader";
import Hammer from "hammerjs";

function StackImageViewport(props) {
  const viewerRef = useRef(null);

  const base64StringToArrayBuffer = useCallback((base64) => {
    var binary_string = window.atob(base64);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
      bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes.buffer;
  }, []);

  const initializeCornerstone = () => {
    // Initialise cornerstone and link to DOM element
    cornerstoneTools.external.cornerstone = cornerstone;
    cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
    cornerstoneFileImageLoader.external.cornerstone = cornerstone;
    cornerstoneTools.external.Hammer = Hammer;
    cornerstoneTools.init();
    cornerstone.enable(viewerRef.current);
  };

  const setCornerstoneTools = () => {
    // define Cornerstone Tools
    const StackScrollTool = cornerstoneTools.StackScrollTool;
    const StackScrollMouseWheelTool =
      cornerstoneTools.StackScrollMouseWheelTool;
    const WindowingTool = cornerstoneTools.WwwcTool;

    // Add tools

    cornerstoneTools.addTool(StackScrollTool);
    cornerstoneTools.addTool(StackScrollMouseWheelTool);
    cornerstoneTools.addTool(WindowingTool);

    // set tools to Active state
    cornerstoneTools.setToolActive("StackScroll", { mouseButtonMask: 1 });
    cornerstoneTools.setToolActive("StackScrollMouseWheel", {});
    cornerstoneTools.setToolActive("Wwwc", { mouseButtonMask: 2 });
  };

  const displayStack = (stackMediaArray) => {
    let mediaArray = [];


    // 'stackMediaArray' is an array of images, each containing a buffer of the image
    Promise.all(
      stackMediaArray.map((mediaObject) => {
        return new Promise((resolve, reject) => {
          let imageBuffer = base64StringToArrayBuffer(mediaObject.buffer);
          const imageId =
            cornerstoneFileImageLoader.fileManager.addBuffer(imageBuffer);
          mediaArray.push(imageId);

          resolve(mediaObject);
        }).catch(console.error);
      })
    );

    //define the stack
    const stack = {
      currentImageIdIndex: 0,
      imageIds: mediaArray,
    };

    // load images and set the stack
    cornerstone.loadAndCacheImage(mediaArray[0]).then((image) => {
      cornerstone.displayImage(viewerRef.current, image);
      cornerstoneTools.addStackStateManager(viewerRef.current, ["stack"]);
      cornerstoneTools.addToolState(viewerRef.current, "stack", stack);
    });

    setCornerstoneTools();
  };

  useEffect(() => {
    if (!viewerRef.current) {
      return;
    }
    initializeCornerstone();
    displayStack(props.stackMediaArray);
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [viewerRef]);

  return (
    <>
      <div ref={viewerRef} id="viewer" className="flex h-1/2-screen"></div>
    </>
  );
}

export default StackImageViewport;

这试图回答这个问题:

https://github.com/cornerstonejs/cornerstoneTools/issues/1121

但是,我不想访问 DOM 元素来添加事件侦听器。

同样清楚的是,在 Cornertsone.js 中可以访问事件:

https://github.com/cornerstonejs/cornerstoneTools/blob/master/src/events.js

...但我仍然不确定在哪里放置事件监听器?

任何帮助将非常感激。

谢谢。

1个回答

在使用诸如CornerstoneJS [3, 4] 之类的新工具进行医学成像[1, 2]时,在ReactJS中监听事件可能会让新手感到困惑,甚至更多。但是,您可以使用该方法创建事件侦听器,就像在Vanilla JavaScript [5] 中一样。请注意,这可能会从浏览器环境更改为移动环境 [4, 5]。此外,你也可以是一个挑战window.addEventListenercornerstoneFileImageLoader

为此,您可以遵循以下结构:

window.addEventListener('keydown', (event) => {
    ...
});

但是现在,我们需要了解放置它的“位置”。想象一下,你所有的页面都只是组件,因为ReactJS是一个基于组件的系统这意味着事件侦听器需要在组件内部发生。

例如,您可以这样做:

import React from 'react';

const App = (props) => {
  window.addEventListener('keydown', (event) => {
      ...
  });
  return (
    <div className='container'>
      <h1>Welcome to the Keydown Listening Component</h1>
    </div>
  );
};

参考

[1] 弗朗西斯科·玛丽亚·卡利斯托、卡洛斯·圣地亚哥、努诺·努内斯和 Jacinto C. Nascimento。2022. BreastScreening-AI:评估用于人机交互的医学智能代理。医学中的人工智能 127, 102285. https://doi.org/10.1016/j.artmed.2022.102285

[2] 弗朗西斯科·玛丽亚·卡利斯托、卡洛斯·圣地亚哥、努诺·努内斯和 Jacinto C. Nascimento。2021. 引入以人为中心的人工智能助手,以帮助放射科医生进行多模态乳房图像分类。国际人机研究杂志 150, 102607. https://doi.org/10.1016/j.ijhcs.2021.102607

[3] 弗朗西斯科·玛丽亚·卡利斯托、努诺·努内斯和 Jacinto C. Nascimento。2020. 乳房筛查。高级视觉界面国际会议论文集。https://doi.org/10.1145/3399715.3399744

[4] Francisco M. Calisto、Alfredo Ferreira、Jacinto C. Nascimento 和 Daniel Gonçalves。2017. 迈向基于触摸的医学图像诊断注释。2017 年 ACM 交互式表面和空间国际会议论文集。https://doi.org/10.1145/3132272.3134111

[5] 弗朗西斯科·玛丽亚·卡利斯托。2017. 医学影像多模态乳腺癌诊断用户界面。硕士论文。https://doi.org/10.13140/RG.2.2.15187.02084