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

发布于:2025-09-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

先看效果

实现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>
  <div
    class="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>


网站公告

今日签到

点亮在社区的每一天
去签到