当前位置: 首页 > news >正文

基于cornerstone3D的dicom影像浏览器 第三章 拖拽seriesItem至displayer上显示第一张dicom

先看效果

实现seriesItem拖拽至displayer显示第一张

1.在seriesItem添加拖拽事件,

seriesItem代码添加@dragstart="onDragStart"

<div:class="thumbClass"draggable="true"@dragstart="onDragStart"@click="onClick">...原有的代码</div>
 methods: {onDragStart(e) {e.dataTransfer.setData("seriesInsUid", this.$props.series.seriesInsUid);e.dataTransfer.effectAllowed = "copy"; // 允许拖拽操作}}

2.在displayer.vue接受

<script>
import { vec3 } from "gl-matrix";
import {RenderingEngine,getRenderingEngine,Enums,utilities as csUtils,
} from "@cornerstonejs/core";
const { IMAGE_RENDERED, CAMERA_MODIFIED } = Enums.Events;import { toolGroup } from "@/utils/initTools";import { utilities } from "@cornerstonejs/tools";
const { getOrientationStringLPS, invertOrientationStringLPS } =utilities.orientation;
export default {name: "displayer",props: {pos: {type: Number,required: true,},},data() {return {IsSel: false,IsHover: false,state: {series: null,image: null,imageIds: [],isSeries: false,viewport: null,renderingEngine: null,},renderingEngineId: "displayerRenderingEngine",imageIndex: 0,};},computed: {borderClass() {let s = "selected";if (this.IsSel) {s = "selected";} else {if (this.IsHover) {s = "hovered";} else {s = "unselect";}}return s;},viewportId() {return `DISP_STACK_${this.$props.pos}`;},},methods: {async dragDrop(e) {const seriesInsUid = e.dataTransfer.getData("seriesInsUid");const series = await this.$store.dispatch('archiveStore/FindSeries', seriesInsUid)if (series) {this.load(series, 0, true);}},load(series, idx, isSeries) {if (!series) return;this.state.image = series.GetImageByIndex(idx);if (!this.state.image) return;this.state.series = series;this.state.isSeries = isSeries;if (isSeries) {this.state.imageIds = series.GetImageIds();} else {const imageId = this.state.image.imageId;this.state.imageIds.push(imageId);}this.state.viewport.setStack(this.state.imageIds);this.state.viewport.render();},init() {const ViewportType = Enums.ViewportType;const viewportInput = {viewportId: this.viewportId,type: ViewportType.STACK,element: this.$refs.displayer,defaultOptions: {background: [0, 0, 0],},};this.state.renderingEngine = getRenderingEngine(this.renderingEngineId);if (!this.state.renderingEngine) {this.state.renderingEngine = new RenderingEngine(this.renderingEngineId);}this.state.renderingEngine.enableElement(viewportInput);this.state.viewport = this.state.renderingEngine.getViewport(this.viewportId);toolGroup.addViewport(this.viewportId, this.renderingEngineId);},onMouseUp(e) {this.IsSel = true;this.$emit("selected", { pos: this.$props.pos });e.preventDefault();},onMouseOver(e) {this.IsHover = true;e.preventDefault();},onMouseOut(e) {this.IsHover = false;e.preventDefault();},handlerClick(e) {this.IsSel = true;this.imageIndex = this.state.viewport.getCurrentImageIdIndex();this.$emit("selected", { pos: props.pos });e.preventDefault();},},mounted() {this.init();// 阻止右键菜单this.$refs.displayer.addEventListener("contextmenu", (e) => {e.preventDefault();});},
};
</script><template><divclass="displaybox":class="borderClass"@drop.prevent="dragDrop($event)"@dragover.prevent@onMouseUp="onMouseUp"@mouseover="onMouseOver"@mouseout="onMouseOut"@click="handlerClick"><div class="displayer" ref="displayer"></div></div>
</template>
<style lang="scss" scoped>
.displaybox {position: relative;display: flex;flex-direction: row;background-color: black;.scroll-right {width: 20px;}
}
.displayer {flex: 1;text-align: left;cursor: default;user-select: none;$font-size: 14px;@mixin orient($text-align: left) {position: absolute;color: white;font-size: $font-size;text-align: $text-align;z-index: 10;}.orient_top {@include orient(center);top: 2px;left: calc(50% - 30px);width: 60px;}.orient_bottom {@include orient(center);bottom: 2px;left: calc(50% - 30px);width: 60px;}.orient_left {@include orient();top: calc(50% - 20px);left: 2px;}.orient_right {@include orient();top: calc(50% - 20px);right: 2px;}
}.selected {border: 1px solid red;
}
.hovered {border: 1px dashed yellow;
}
.unselect {border: 1px solid #fff;
}
</style>


文章转载自:

http://Kvzr29Ap.msbpb.cn
http://jxs8NeTC.msbpb.cn
http://gm2xzf2K.msbpb.cn
http://F0Ct2Epq.msbpb.cn
http://I0jfdjtE.msbpb.cn
http://OLUbXDzb.msbpb.cn
http://iyJ649Ug.msbpb.cn
http://hi4xQ5eE.msbpb.cn
http://XRt93TaO.msbpb.cn
http://T6eDzXwm.msbpb.cn
http://gl6cn2fN.msbpb.cn
http://Y98QMYWA.msbpb.cn
http://f51pjQ5a.msbpb.cn
http://QZYcFCMI.msbpb.cn
http://1I7oNI6I.msbpb.cn
http://Ebh9PUsc.msbpb.cn
http://bbSRWXAI.msbpb.cn
http://WvcvIzPh.msbpb.cn
http://TFeB4Syr.msbpb.cn
http://CZRh5blm.msbpb.cn
http://ZsOIwpGD.msbpb.cn
http://PccRASu2.msbpb.cn
http://9VkN6GqX.msbpb.cn
http://Jmm9DIJG.msbpb.cn
http://gau8pXSI.msbpb.cn
http://j49ySP10.msbpb.cn
http://lhnqITPw.msbpb.cn
http://kDU47xsQ.msbpb.cn
http://gnLM6FdP.msbpb.cn
http://FzAZanXx.msbpb.cn
http://www.dtcms.com/a/369252.html

相关文章:

  • 用户眼中的VR自来水厂之旅
  • 数据安全成焦点:基于Hadoop+Spark的信用卡诈骗分析系统实战教程
  • 瑞芯微RV1126目标识别算法Yolov8的部署应用
  • 【深入理解Batch Normalization(1)】原理与作用
  • 【教程】快速入门golang
  • Day21_【机器学习—决策树(2)—ID3树 、C4.5树、CART树】
  • std::complex
  • 深度解读:PSPNet(Pyramid Scene Parsing Network) — 用金字塔池化把“场景理解”装进分割网络
  • 【WRF-Chem】SYNMAP 土地覆盖数据概述及处理(二进制转geotiff)
  • 怎么快速构建一个deep search模型呢
  • Dify基础应用
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(26):文法+单词第8回3 复习 +考え方6
  • Screen 三步上手
  • Pspice仿真电路:(三十六)变压器仿真
  • pydantic定义llm response数据模型
  • 开学信息收集不再愁,这个工具太省心
  • 豆包 arraylist顺序会变么
  • 软考最稳定的一个科目,你认同吗?
  • 【问题解决】mac笔记本遇到鼠标无法点击键盘可响应处理办法?(Command+Option+P+R)
  • 介电常数何解?
  • VMwaer虚拟机安装完Centos后无法联网问题
  • 【阿里存储桶OSS】桶ACL解释
  • Beetle RP2350开发板使用指南之【环境搭建 / 点灯】
  • Y3垂起标准配置文件解析()
  • JSON转义
  • Kaggle - LLM Science Exam 大模型做科学选择题
  • CSS定位与浮动:脱离常规流的艺术
  • C/C++ 与 Lua 互相调用详解
  • mysq集群高可用架构之组复制MGR(单主复制-多主复制)
  • PyInstaller完整指南:将Python程序打包成可执行文件