|
@@ -3,188 +3,362 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import Konva from 'konva'
|
|
|
|
|
|
|
+import Konva from "konva";
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
- name: 'KonvaExample',
|
|
|
|
|
|
|
+ name: "KonvaExample",
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
stage: null,
|
|
stage: null,
|
|
|
layer: null,
|
|
layer: null,
|
|
|
selectedStates: [], // 用于存储每个元素的选中状态
|
|
selectedStates: [], // 用于存储每个元素的选中状态
|
|
|
- selectedText: [] // 用于存储未选中的元素文本
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ selectedText: [], // 用于存储未选中的元素文本
|
|
|
|
|
+ };
|
|
|
},
|
|
},
|
|
|
mounted() {
|
|
mounted() {
|
|
|
- this.initKonva()
|
|
|
|
|
|
|
+ this.initKonva();
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ // initKonva() {
|
|
|
|
|
+ // // 创建舞台
|
|
|
|
|
+ // this.stage = new Konva.Stage({
|
|
|
|
|
+ // container: this.$refs.container, // 容器元素
|
|
|
|
|
+ // width: 1250,
|
|
|
|
|
+ // height: 830,
|
|
|
|
|
+ // fill: 'black'
|
|
|
|
|
+ // })
|
|
|
|
|
+
|
|
|
|
|
+ // // 创建图层
|
|
|
|
|
+ // this.layer = new Konva.Layer()
|
|
|
|
|
+
|
|
|
|
|
+ // // 创建底图
|
|
|
|
|
+ // const bgImage = new Image()
|
|
|
|
|
+ // bgImage.src = require('@/assets/images/table.png')
|
|
|
|
|
+ // bgImage.onload = () => {
|
|
|
|
|
+ // const KnovaImage = new Konva.Image({
|
|
|
|
|
+ // x: 350,
|
|
|
|
|
+ // y: 10,
|
|
|
|
|
+ // image: bgImage,
|
|
|
|
|
+ // width: 500,
|
|
|
|
|
+ // height: 790,
|
|
|
|
|
+ // draggable: false
|
|
|
|
|
+ // })
|
|
|
|
|
+ // this.layer.add(KnovaImage)
|
|
|
|
|
+
|
|
|
|
|
+ // this.layer.draw()
|
|
|
|
|
+ // }
|
|
|
|
|
+ // // 调用函数
|
|
|
|
|
+ // const imageSrc = require('@/assets/images/localSetIcon.jpg'); // 图片路径
|
|
|
|
|
+
|
|
|
|
|
+ // this.renderGrid( imageSrc, 6, 3, 450, 100, 120, 100, 50, 50, 60, 25);
|
|
|
|
|
+ // // 将图层添加到舞台
|
|
|
|
|
+ // this.stage.add(this.layer)
|
|
|
|
|
+ // this.layer.draw()
|
|
|
|
|
+
|
|
|
|
|
+ // // 添加鼠标滚轮缩放功能
|
|
|
|
|
+ // this.stage.on('wheel', (e) => {
|
|
|
|
|
+ // e.evt.preventDefault()
|
|
|
|
|
+
|
|
|
|
|
+ // const scaleBy = 1.05 // 缩放因子
|
|
|
|
|
+ // const oldScale = this.stage.scaleX() // 获取当前缩放比例
|
|
|
|
|
+ // const pointer = this.stage.getPointerPosition() // 获取鼠标位置
|
|
|
|
|
+
|
|
|
|
|
+ // const mousePointTo = {
|
|
|
|
|
+ // x: (pointer.x - this.stage.x()) / oldScale,
|
|
|
|
|
+ // y: (pointer.y - this.stage.y()) / oldScale
|
|
|
|
|
+ // }
|
|
|
|
|
+
|
|
|
|
|
+ // // 根据滚轮滚动的方向决定缩放
|
|
|
|
|
+ // const newScale = e.evt.deltaY > 0 ? oldScale / scaleBy : oldScale * scaleBy
|
|
|
|
|
+
|
|
|
|
|
+ // this.stage.scale({ x: newScale, y: newScale })
|
|
|
|
|
+
|
|
|
|
|
+ // const newPos = {
|
|
|
|
|
+ // x: pointer.x - mousePointTo.x * newScale,
|
|
|
|
|
+ // y: pointer.y - mousePointTo.y * newScale
|
|
|
|
|
+ // }
|
|
|
|
|
+ // this.stage.position(newPos)
|
|
|
|
|
+ // this.stage.batchDraw()
|
|
|
|
|
+ // })
|
|
|
|
|
+
|
|
|
|
|
+ // this.stage.on('mousedown', function() {
|
|
|
|
|
+ // this.stage.container().style.cursor = 'move'
|
|
|
|
|
+ // }.bind(this))
|
|
|
|
|
+
|
|
|
|
|
+ // this.stage.on('mouseup', function() {
|
|
|
|
|
+ // this.stage.container().style.cursor = 'default'
|
|
|
|
|
+ // }.bind(this))
|
|
|
|
|
+ // this.stage.draggable(true)
|
|
|
|
|
+ // },
|
|
|
|
|
+
|
|
|
initKonva() {
|
|
initKonva() {
|
|
|
// 创建舞台
|
|
// 创建舞台
|
|
|
this.stage = new Konva.Stage({
|
|
this.stage = new Konva.Stage({
|
|
|
container: this.$refs.container, // 容器元素
|
|
container: this.$refs.container, // 容器元素
|
|
|
- width: 1250,
|
|
|
|
|
|
|
+ width: 1270,
|
|
|
height: 830,
|
|
height: 830,
|
|
|
- fill: 'black'
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
// 创建图层
|
|
// 创建图层
|
|
|
- this.layer = new Konva.Layer()
|
|
|
|
|
|
|
+ this.layer = new Konva.Layer();
|
|
|
|
|
|
|
|
// 创建底图
|
|
// 创建底图
|
|
|
- const bgImage = new Image()
|
|
|
|
|
- bgImage.src = require('@/assets/images/table.png')
|
|
|
|
|
|
|
+ const bgImage = new Image();
|
|
|
|
|
+ bgImage.src = require("@/assets/images/table.png");
|
|
|
bgImage.onload = () => {
|
|
bgImage.onload = () => {
|
|
|
- const KnovaImage = new Konva.Image({
|
|
|
|
|
- x: 350,
|
|
|
|
|
|
|
+ const knovaImage = new Konva.Image({
|
|
|
|
|
+ x: 330,
|
|
|
y: 10,
|
|
y: 10,
|
|
|
image: bgImage,
|
|
image: bgImage,
|
|
|
width: 500,
|
|
width: 500,
|
|
|
height: 790,
|
|
height: 790,
|
|
|
- draggable: false
|
|
|
|
|
- })
|
|
|
|
|
- this.layer.add(KnovaImage)
|
|
|
|
|
|
|
+ draggable: false,
|
|
|
|
|
+ });
|
|
|
|
|
+ this.layer.add(knovaImage);
|
|
|
|
|
+ this.layer.draw();
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- this.layer.draw()
|
|
|
|
|
- }
|
|
|
|
|
- // 调用函数
|
|
|
|
|
- const imageSrc = require('@/assets/images/localSetIcon.jpg'); // 图片路径
|
|
|
|
|
|
|
+ // 绘制无限网格
|
|
|
|
|
+ this.drawGrid(50, 50, "#e0e0e0"); // 每个单元格50x50,浅灰色网格
|
|
|
|
|
+
|
|
|
|
|
+ // 渲染数据
|
|
|
|
|
+ const imageSrc = require("@/assets/images/localSetIcon.jpg"); // 图片路径
|
|
|
|
|
+ this.renderGrid(imageSrc, 6, 3, 450, 100, 120, 100, 50, 50, 60, 25);
|
|
|
|
|
|
|
|
- this.renderGrid( imageSrc, 6, 3, 450, 100, 120, 100, 50, 50, 60, 25);
|
|
|
|
|
// 将图层添加到舞台
|
|
// 将图层添加到舞台
|
|
|
- this.stage.add(this.layer)
|
|
|
|
|
- this.layer.draw()
|
|
|
|
|
-
|
|
|
|
|
- // 添加鼠标滚轮缩放功能
|
|
|
|
|
- this.stage.on('wheel', (e) => {
|
|
|
|
|
- e.evt.preventDefault()
|
|
|
|
|
-
|
|
|
|
|
- const scaleBy = 1.05 // 缩放因子
|
|
|
|
|
- const oldScale = this.stage.scaleX() // 获取当前缩放比例
|
|
|
|
|
- const pointer = this.stage.getPointerPosition() // 获取鼠标位置
|
|
|
|
|
-
|
|
|
|
|
- const mousePointTo = {
|
|
|
|
|
- x: (pointer.x - this.stage.x()) / oldScale,
|
|
|
|
|
- y: (pointer.y - this.stage.y()) / oldScale
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 根据滚轮滚动的方向决定缩放
|
|
|
|
|
- const newScale = e.evt.deltaY > 0 ? oldScale / scaleBy : oldScale * scaleBy
|
|
|
|
|
-
|
|
|
|
|
- this.stage.scale({ x: newScale, y: newScale })
|
|
|
|
|
-
|
|
|
|
|
- const newPos = {
|
|
|
|
|
- x: pointer.x - mousePointTo.x * newScale,
|
|
|
|
|
- y: pointer.y - mousePointTo.y * newScale
|
|
|
|
|
- }
|
|
|
|
|
- this.stage.position(newPos)
|
|
|
|
|
- this.stage.batchDraw()
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- this.stage.on('mousedown', function() {
|
|
|
|
|
- this.stage.container().style.cursor = 'move'
|
|
|
|
|
- }.bind(this))
|
|
|
|
|
-
|
|
|
|
|
- this.stage.on('mouseup', function() {
|
|
|
|
|
- this.stage.container().style.cursor = 'default'
|
|
|
|
|
- }.bind(this))
|
|
|
|
|
- this.stage.draggable(true)
|
|
|
|
|
|
|
+ this.stage.add(this.layer);
|
|
|
|
|
+ this.layer.draw();
|
|
|
|
|
+
|
|
|
|
|
+ // 禁止舞台拖拽
|
|
|
|
|
+ this.stage.draggable(false);
|
|
|
},
|
|
},
|
|
|
- renderGrid(imageSrc, rows, cols, startX, startY, xOffset, yOffset, imageWidth, imageHeight, rectWidth, rectHeight) {
|
|
|
|
|
- // 初始化状态数组
|
|
|
|
|
- this.selectedStates = new Array(rows * cols).fill(false);
|
|
|
|
|
-
|
|
|
|
|
- for (let row = 0; row < rows; row++) {
|
|
|
|
|
- for (let col = 0; col < cols; col++) {
|
|
|
|
|
- const x = startX + col * xOffset;
|
|
|
|
|
- const y = startY + row * yOffset;
|
|
|
|
|
- const index = row * cols + col;
|
|
|
|
|
-
|
|
|
|
|
- const point = new Image();
|
|
|
|
|
- point.src = imageSrc;
|
|
|
|
|
- point.onload = () => {
|
|
|
|
|
- const knovaImage = new Konva.Image({
|
|
|
|
|
- x: x,
|
|
|
|
|
- y: y,
|
|
|
|
|
- image: point,
|
|
|
|
|
- width: imageWidth,
|
|
|
|
|
- height: imageHeight,
|
|
|
|
|
- draggable: false,
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- knovaImage.on('click', () => {
|
|
|
|
|
- // 切换选中状态
|
|
|
|
|
- this.selectedStates[index] = !this.selectedStates[index];
|
|
|
|
|
-
|
|
|
|
|
- // 更新 selectedText 数组
|
|
|
|
|
- if (this.selectedStates[index]) {
|
|
|
|
|
- // 元素被选中,替换成选中的图片
|
|
|
|
|
- point.src = require('@/assets/images/localSetSelect.jpg');
|
|
|
|
|
-
|
|
|
|
|
- // 检查是否已经在 selectedText 数组中
|
|
|
|
|
- if (!this.selectedText.some(item => item.value === index + 1)) {
|
|
|
|
|
- // 元素被选中,添加到 selectedText 数组
|
|
|
|
|
- this.selectedText.push({
|
|
|
|
|
- label: `E-${index + 1}`,
|
|
|
|
|
- value: index + 1
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- // 元素未选中,恢复原图片
|
|
|
|
|
- point.src = imageSrc;
|
|
|
|
|
-
|
|
|
|
|
- // 元素未选中,从 selectedText 数组中移除
|
|
|
|
|
- const textIndex = this.selectedText.findIndex(item => item.value === index + 1);
|
|
|
|
|
- if (textIndex !== -1) {
|
|
|
|
|
- this.selectedText.splice(textIndex, 1); // 如果元素在 selectedText 中,移除它
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- knovaImage.image(point); // 更新图片
|
|
|
|
|
- this.layer.draw(); // 重绘图层
|
|
|
|
|
-
|
|
|
|
|
- // console.log(this.selectedText, '子组件选中的隔离点');
|
|
|
|
|
-
|
|
|
|
|
- // 传递选中的元素文本到父组件
|
|
|
|
|
- this.$emit('selection-changed', this.selectedText);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- this.layer.add(knovaImage);
|
|
|
|
|
-
|
|
|
|
|
- const rect = new Konva.Rect({
|
|
|
|
|
- x: x - 3,
|
|
|
|
|
- y: y + imageHeight + 10,
|
|
|
|
|
- width: rectWidth,
|
|
|
|
|
- height: rectHeight,
|
|
|
|
|
- cornerRadius: 10,
|
|
|
|
|
- stroke: 'red',
|
|
|
|
|
- strokeWidth: 2,
|
|
|
|
|
- fill: 'white',
|
|
|
|
|
- });
|
|
|
|
|
- this.layer.add(rect);
|
|
|
|
|
-
|
|
|
|
|
- const text = new Konva.Text({
|
|
|
|
|
- x: x + 12,
|
|
|
|
|
- y: y + imageHeight + 15,
|
|
|
|
|
- fontSize: 20,
|
|
|
|
|
- text: `E-${index + 1}`,
|
|
|
|
|
- fontFamily: 'Calibri',
|
|
|
|
|
- fill: 'red',
|
|
|
|
|
- });
|
|
|
|
|
- this.layer.add(text);
|
|
|
|
|
|
|
|
|
|
- this.layer.draw();
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 绘制无限网格
|
|
|
|
|
+ drawGrid(cellWidth, cellHeight, gridColor) {
|
|
|
|
|
+ const width = 1270;
|
|
|
|
|
+ const height = 830;
|
|
|
|
|
+
|
|
|
|
|
+ // 绘制竖线
|
|
|
|
|
+ for (let i = 0; i <= width; i += cellWidth) {
|
|
|
|
|
+ const verticalLine = new Konva.Line({
|
|
|
|
|
+ points: [i, 0, i, height],
|
|
|
|
|
+ stroke: gridColor,
|
|
|
|
|
+ strokeWidth: 1,
|
|
|
|
|
+ });
|
|
|
|
|
+ this.layer.add(verticalLine);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- // methods结束
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 绘制横线
|
|
|
|
|
+ for (let j = 0; j <= height; j += cellHeight) {
|
|
|
|
|
+ const horizontalLine = new Konva.Line({
|
|
|
|
|
+ points: [0, j, width, j],
|
|
|
|
|
+ stroke: gridColor,
|
|
|
|
|
+ strokeWidth: 1,
|
|
|
|
|
+ });
|
|
|
|
|
+ this.layer.add(horizontalLine);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ this.layer.draw();
|
|
|
|
|
+ },
|
|
|
|
|
+ // renderGrid(
|
|
|
|
|
+ // imageSrc,
|
|
|
|
|
+ // rows,
|
|
|
|
|
+ // cols,
|
|
|
|
|
+ // startX,
|
|
|
|
|
+ // startY,
|
|
|
|
|
+ // xOffset,
|
|
|
|
|
+ // yOffset,
|
|
|
|
|
+ // imageWidth,
|
|
|
|
|
+ // imageHeight,
|
|
|
|
|
+ // rectWidth,
|
|
|
|
|
+ // rectHeight
|
|
|
|
|
+ // ) {
|
|
|
|
|
+ // // 初始化状态数组
|
|
|
|
|
+ // this.selectedStates = new Array(rows * cols).fill(false);
|
|
|
|
|
+
|
|
|
|
|
+ // for (let row = 0; row < rows; row++) {
|
|
|
|
|
+ // for (let col = 0; col < cols; col++) {
|
|
|
|
|
+ // const x = startX + col * xOffset;
|
|
|
|
|
+ // const y = startY + row * yOffset;
|
|
|
|
|
+ // const index = row * cols + col;
|
|
|
|
|
+
|
|
|
|
|
+ // const point = new Image();
|
|
|
|
|
+ // point.src = imageSrc;
|
|
|
|
|
+ // point.onload = () => {
|
|
|
|
|
+ // const knovaImage = new Konva.Image({
|
|
|
|
|
+ // x: x,
|
|
|
|
|
+ // y: y,
|
|
|
|
|
+ // image: point,
|
|
|
|
|
+ // width: imageWidth,
|
|
|
|
|
+ // height: imageHeight,
|
|
|
|
|
+ // draggable: false,
|
|
|
|
|
+ // });
|
|
|
|
|
+
|
|
|
|
|
+ // knovaImage.on("click", () => {
|
|
|
|
|
+ // // 切换选中状态
|
|
|
|
|
+ // this.selectedStates[index] = !this.selectedStates[index];
|
|
|
|
|
+
|
|
|
|
|
+ // // 更新 selectedText 数组
|
|
|
|
|
+ // if (this.selectedStates[index]) {
|
|
|
|
|
+ // // 元素被选中,替换成选中的图片
|
|
|
|
|
+ // point.src = require("@/assets/images/localSetSelect.jpg");
|
|
|
|
|
+
|
|
|
|
|
+ // // 检查是否已经在 selectedText 数组中
|
|
|
|
|
+ // if (
|
|
|
|
|
+ // !this.selectedText.some((item) => item.value === index + 1)
|
|
|
|
|
+ // ) {
|
|
|
|
|
+ // // 元素被选中,添加到 selectedText 数组
|
|
|
|
|
+ // this.selectedText.push({
|
|
|
|
|
+ // label: `E-${index + 1}`,
|
|
|
|
|
+ // value: index + 1,
|
|
|
|
|
+ // });
|
|
|
|
|
+ // }
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // // 元素未选中,恢复原图片
|
|
|
|
|
+ // point.src = imageSrc;
|
|
|
|
|
+
|
|
|
|
|
+ // // 元素未选中,从 selectedText 数组中移除
|
|
|
|
|
+ // const textIndex = this.selectedText.findIndex(
|
|
|
|
|
+ // (item) => item.value === index + 1
|
|
|
|
|
+ // );
|
|
|
|
|
+ // if (textIndex !== -1) {
|
|
|
|
|
+ // this.selectedText.splice(textIndex, 1); // 如果元素在 selectedText 中,移除它
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+
|
|
|
|
|
+ // knovaImage.image(point); // 更新图片
|
|
|
|
|
+ // this.layer.draw(); // 重绘图层
|
|
|
|
|
+
|
|
|
|
|
+ // // console.log(this.selectedText, '子组件选中的隔离点');
|
|
|
|
|
+
|
|
|
|
|
+ // // 传递选中的元素文本到父组件
|
|
|
|
|
+ // this.$emit("selection-changed", this.selectedText);
|
|
|
|
|
+ // });
|
|
|
|
|
+
|
|
|
|
|
+ // this.layer.add(knovaImage);
|
|
|
|
|
+
|
|
|
|
|
+ // const rect = new Konva.Rect({
|
|
|
|
|
+ // x: x - 3,
|
|
|
|
|
+ // y: y + imageHeight + 10,
|
|
|
|
|
+ // width: rectWidth,
|
|
|
|
|
+ // height: rectHeight,
|
|
|
|
|
+ // cornerRadius: 10,
|
|
|
|
|
+ // stroke: "red",
|
|
|
|
|
+ // strokeWidth: 2,
|
|
|
|
|
+ // fill: "white",
|
|
|
|
|
+ // });
|
|
|
|
|
+ // this.layer.add(rect);
|
|
|
|
|
+
|
|
|
|
|
+ // const text = new Konva.Text({
|
|
|
|
|
+ // x: x + 12,
|
|
|
|
|
+ // y: y + imageHeight + 15,
|
|
|
|
|
+ // fontSize: 20,
|
|
|
|
|
+ // text: `E-${index + 1}`,
|
|
|
|
|
+ // fontFamily: "Calibri",
|
|
|
|
|
+ // fill: "red",
|
|
|
|
|
+ // });
|
|
|
|
|
+ // this.layer.add(text);
|
|
|
|
|
+
|
|
|
|
|
+ // this.layer.draw();
|
|
|
|
|
+ // };
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ // },
|
|
|
|
|
+
|
|
|
|
|
+ renderGrid(imageSrc) {
|
|
|
|
|
+ this.selectedStates = [];
|
|
|
|
|
+
|
|
|
|
|
+ const positions = [
|
|
|
|
|
+ { row: 2, col: 9 }, // E-1
|
|
|
|
|
+ { row: 2, col: 11 }, // E-2
|
|
|
|
|
+ { row: 2, col: 13 }, // E-3
|
|
|
|
|
+ { row: 4, col: 9 }, // E-4
|
|
|
|
|
+ { row: 4, col: 11 }, // E-5
|
|
|
|
|
+ { row: 4, col: 13 }, // E-6
|
|
|
|
|
+ { row: 6, col: 9 }, // E-7
|
|
|
|
|
+ { row: 6, col: 11 }, // E-8
|
|
|
|
|
+ { row: 6, col: 13 }, // E-9
|
|
|
|
|
+ { row: 8, col: 9 }, // E-10
|
|
|
|
|
+ { row: 8, col: 11 }, // E-11
|
|
|
|
|
+ { row: 8, col: 13 }, // E-12
|
|
|
|
|
+ { row: 10, col: 9 }, // E-13
|
|
|
|
|
+ { row: 10, col: 11 }, // E-14
|
|
|
|
|
+ { row: 10, col: 13 }, // E-15
|
|
|
|
|
+ { row: 12, col: 9 }, // E-16
|
|
|
|
|
+ { row: 12, col: 11 }, // E-17
|
|
|
|
|
+ { row: 12, col: 13 }, // E-18
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ positions.forEach((pos, index) => {
|
|
|
|
|
+ const x = pos.col * 50; // 每个单元格宽度为50
|
|
|
|
|
+ const y = pos.row * 50; // 每个单元格高度为50
|
|
|
|
|
+
|
|
|
|
|
+ const point = new Image();
|
|
|
|
|
+ point.src = imageSrc;
|
|
|
|
|
+ point.onload = () => {
|
|
|
|
|
+ const knovaImage = new Konva.Image({
|
|
|
|
|
+ x: x,
|
|
|
|
|
+ y: y,
|
|
|
|
|
+ image: point,
|
|
|
|
|
+ width: 50,
|
|
|
|
|
+ height: 50,
|
|
|
|
|
+ draggable: false,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ knovaImage.on("click", () => {
|
|
|
|
|
+ this.selectedStates[index] = !this.selectedStates[index];
|
|
|
|
|
+
|
|
|
|
|
+ if (this.selectedStates[index]) {
|
|
|
|
|
+ point.src = require("@/assets/images/localSetSelect.jpg");
|
|
|
|
|
+ this.selectedText.push({
|
|
|
|
|
+ label: `E-${index + 1}`,
|
|
|
|
|
+ value: index + 1,
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ point.src = imageSrc;
|
|
|
|
|
+ this.selectedText = this.selectedText.filter(
|
|
|
|
|
+ (item) => item.value !== index + 1
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ knovaImage.image(point);
|
|
|
|
|
+ this.layer.draw();
|
|
|
|
|
+
|
|
|
|
|
+ // 传递选中的元素文本到父组件
|
|
|
|
|
+ this.$emit("selection-changed", this.selectedText);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ this.layer.add(knovaImage);
|
|
|
|
|
+
|
|
|
|
|
+ const rect = new Konva.Rect({
|
|
|
|
|
+ x: x - 3,
|
|
|
|
|
+ y: y + 55,
|
|
|
|
|
+ width: 60,
|
|
|
|
|
+ height: 25,
|
|
|
|
|
+ cornerRadius: 10,
|
|
|
|
|
+ stroke: "red",
|
|
|
|
|
+ strokeWidth: 2,
|
|
|
|
|
+ fill: "white",
|
|
|
|
|
+ });
|
|
|
|
|
+ this.layer.add(rect);
|
|
|
|
|
+
|
|
|
|
|
+ const text = new Konva.Text({
|
|
|
|
|
+ x: x + 12,
|
|
|
|
|
+ y: y + 60,
|
|
|
|
|
+ fontSize: 20,
|
|
|
|
|
+ text: `E-${index + 1}`,
|
|
|
|
|
+ fontFamily: "Calibri",
|
|
|
|
|
+ fill: "red",
|
|
|
|
|
+ });
|
|
|
|
|
+ this.layer.add(text);
|
|
|
|
|
+ this.layer.draw();
|
|
|
|
|
+ };
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // methods结束
|
|
|
|
|
+ },
|
|
|
|
|
+};
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|