【cornerstoneTools】【vue】使用cornerstoneTools搭建标注系统相关代码

即使是Google上搜到的博客也是GitHub的issues,相关资料较少,文档也近似没有。
文档(太写意了,形散神也散)


cornerstoneTools引入

import * as cornerstone from 'cornerstone-core'
// import * as cornerstoneWebImageLoader from 'cornerstone-web-image-loader'

import * as cornerstoneTools from 'cornerstone-tools';
import Hammer from 'hammerjs';
import * as cornerstoneMath from 'cornerstone-math';

cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.Hammer = Hammer;

cornerstoneTools.init(
    {
      showSVGCursors: true,
    }
);

注册cornerstoneTools工具

放在vue的mounted

	const element = document.getElementById('dicomimage');
	
    cornerstone.enable(element);
    cornerstone.registerImageLoader('example', this.getExampleImage);

    this.img_show_element = element;
    this.img_show_element.tabIndex = 0;
    this.img_show_element.focus();
	
	// 多边形标注
	const FreehandRoiTool = cornerstoneTools.FreehandRoiTool;
    cornerstoneTools.addTool(FreehandRoiTool)
    // cornerstoneTools.setToolActive('FreehandRoi', { mouseButtonMask: 1 })
    // 滑轮放大
    const ZoomMouseWheelTool = cornerstoneTools.ZoomMouseWheelTool;
    cornerstoneTools.addTool(ZoomMouseWheelTool)
    cornerstoneTools.setToolActive('ZoomMouseWheel', { mouseButtonMask: 1 })
    
    // 平移工具
    // const PanTool = cornerstoneTools.PanTool;
    // cornerstoneTools.addTool(PanTool)
    // cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 })
    
    // 橡皮擦工具
    const EraserTool = cornerstoneTools.EraserTool;
    cornerstoneTools.addTool(EraserTool)

cornerstone 右键平移

放在vue的mounted

element.addEventListener('mousedown', function (e) {
      let lastX = e.pageX;
      let lastY = e.pageY;
      const mouseButton = e.which;

      function mouseMoveHandler(e) {
        const deltaX = e.pageX - lastX;
        const deltaY = e.pageY - lastY;
        lastX = e.pageX;
        lastY = e.pageY;
        if (mouseButton === 3) {
          // 鼠标右键
          let viewport = cornerstone.getViewport(element);
          viewport.translation.x += (deltaX / viewport.scale);
          viewport.translation.y += (deltaY / viewport.scale);
          cornerstone.setViewport(element, viewport);
        }
      }
      function mouseUpHandler() {
        document.removeEventListener('mouseup', mouseUpHandler);
        document.removeEventListener('mousemove', mouseMoveHandler);
      }

      document.addEventListener('mousemove', mouseMoveHandler);
      document.addEventListener('mouseup', mouseUpHandler);
    });

标注工具的切换

由对应button的click调用

	FreehandRoi_activate(){
      cornerstoneTools.setToolDisabled('Eraser');
      cornerstoneTools.setToolActive('FreehandRoi', { mouseButtonMask: 1 });
    },
    Eraser_activate(){
      cornerstoneTools.setToolDisabled('FreehandRoi');
      cornerstoneTools.setToolActive('Eraser', { mouseButtonMask: 1 });
    },

初始化标注

FreehandRoi为例:

firstLoadData为列表,可通过console.log复制ToolState来模拟:

const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager;
ToolStateManager.restoreImageIdToolState(imageId, {
  FreehandRoi: { data: firstLoadData }
});
cornerstoneTools.addTool(cornerstoneTools.FreehandRoiTool);
cornerstoneTools.setToolPassive("FreehandRoi");

获取标注数据toolState

let markings = cornerstoneTools.getToolState(this.img_show_element, 'FreehandRoi');

注意获取的markings是内存中的浅拷贝,也就是说直接修改就会影响对应的标注

使用橡皮擦Eraser后其他标注会暂时消失(remove事件)

监测MEASUREMENT_REMOVED事件,执行setToolEnabled

放在vue的mounted中:

element.addEventListener(cornerstoneTools.EVENTS.MEASUREMENT_REMOVED, function(evt){
      cornerstoneTools.setToolEnabled('FreehandRoi', { mouseButtonMask: 1 });
    });

cornerstone支持的所有events事件可参考cornerstoneTools/src/events.js

检测创建标注结束事件、修改标注事件

注意:每次创建标注完成会调用MEASUREMENT_COMPLETED其中每次点击也会调用MEASUREMENT_MODIFIED,而每次修改时两者都会被调用。(本人通过判断ToolState中data的length是否发生变动来判断)。

放在vue的mounted中:

	element.addEventListener(cornerstoneTools.EVENTS.MEASUREMENT_COMPLETED, function(evt){
      const eventData = evt.detail;
      // measurementData 即为刚刚完成的标注
      const measurementData = eventData.measurementData;
    });
    element.addEventListener(cornerstoneTools.EVENTS.MEASUREMENT_MODIFIED, function(){
      
    });

本人才疏学浅,若有错误请见谅

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Vue3 是一个用于构建用户界面的框架,它可以帮助你快速的搭建BI框架。下面是一个简单的BI框架的例子:<template> <div id="app"> <bi-container> <bi-header> <h1>BI 框架</h1> </bi-header> <bi-body> <bi-dashboard> <bi-chart :data="chartData"/> </bi-dashboard> </bi-body> </bi-container> </div> </template><script> import { BiContainer, BiHeader, BiBody, BiDashboard, BiChart } from 'vue3-bi-framework';export default { name: 'App', components: { BiContainer, BiHeader, BiBody, BiDashboard, BiChart, }, data: () => ({ chartData: [], }), }; </script> ### 回答2: 使用Vue 3搭建一个BI(商业智能)框架可以通过以下步骤实现: 1. 创建一个基于Vue 3的项目: 使用以下命令创建一个新的Vue项目: ```bash vue create bi-framework ``` 2. 添加需要的依赖项: 安装一些常用的依赖项,例如vue-router、axios和element-plus(用于UI组件): ```bash cd bi-framework npm install vue-router axios element-plus ``` 3. 设置路由: 在src目录下创建一个router.js文件,并配置路由: ```javascript import { createRouter, createWebHistory } from 'vue-router'; import Dashboard from '@/views/Dashboard.vue'; const routes = [ { path: '/', name: 'Dashboard', component: Dashboard, }, // 添加其他路由路径和对应的组件 ]; const router = createRouter({ history: createWebHistory(), routes, }); export default router; ``` 4. 创建Dashboard页面: 在src/views目录下创建Dashboard.vue文件,并添加以下代码: ```vue <template> <div> <h1>BI框架 - 仪表盘</h1> <!-- 添加其他组件和布局 --> </div> </template> <script> export default { name: 'Dashboard', // 添加其他逻辑代码 } </script> ``` 5. 在main.js中引入路由和创建Vue实例: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; createApp(App) .use(router) .mount('#app'); ``` 6. 创建其他组件和页面: 通过创建其他Vue组件和页面文件来构建BI框架的其他功能和视图。 7. 运行项目: 最后,通过以下命令运行项目: ```bash npm run serve ``` 以上是使用Vue 3搭建一个简单的BI框架的基本步骤。根据具体需求,可以根据需要进行进一步开发和调整。 ### 回答3: 要使用Vue 3搭建一个BI框架,首先你需要创建一个Vue项目,并安装相关的依赖项。 1. 首先,使用Vue CLI工具创建一个Vue项目: ``` vue create bi-framework ``` 2. 进入项目目录并安装相关依赖项: ``` cd bi-framework npm install --save vue-router axios vuex ``` 3. 创建一个主组件,例如App.vue,用于展示BI框架的主要内容: ```html <template> <div> <Header /> <Sidebar /> <Content /> </div> </template> <script> import Header from './components/Header.vue'; import Sidebar from './components/Sidebar.vue'; import Content from './components/Content.vue'; export default { name: 'App', components: { Header, Sidebar, Content } } </script> ``` 4. 创建Header.vue、Sidebar.vue和Content.vue组件,并在主组件中引入它们: ```html <!-- Header.vue --> <template> <header> <!-- 头部内容 --> </header> </template> <script> export default { name: 'Header' } </script> <!-- Sidebar.vue --> <template> <aside> <!-- 侧边栏内容 --> </aside> </template> <script> export default { name: 'Sidebar' } </script> <!-- Content.vue --> <template> <main> <!-- 内容区域 --> </main> </template> <script> export default { name: 'Content' } </script> ``` 5. 创建路由文件,并配置路由信息: ```javascript // router.js import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', component: Home }, // 其他路由配置 ] }); export default router; ``` 6. 在主组件中使用router-view来展示具体的页面内容: ```html <template> <div> <Header /> <Sidebar /> <router-view /> </div> </template> <script> import Header from './components/Header.vue'; import Sidebar from './components/Sidebar.vue'; export default { name: 'App', components: { Header, Sidebar } } </script> ``` 7. 在入口文件main.js中引入路由和Vuex,并创建Vue实例: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; import store from './store'; createApp(App) .use(router) .use(store) .mount('#app'); ``` 8. 最后,在项目的根目录下创建store.js文件,用于管理状态: ```javascript // store.js import { createStore } from 'vuex'; const store = createStore({ state() { return { // 状态 } }, mutations: { // 修改状态的方法 }, actions: { // 异步操作 } }); export default store; ``` 以上是使用Vue 3搭建一个简单的BI框架的相关代码,具体根据实际需求可以进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值