You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
2.9 KiB

<template>
<v-line
:config="{
id: polygon.id,
points: polygon.flattenedPoints,
closed: closed,
draggable: true,
opacity: 0.6,
stroke: strokeColor,
strokeWidth,
fill: color,
dragBoundFunc
}"
@click="click"
@dragstart="onDragStart"
@dragend="onDragEnd"
@mouseenter="mouseEnter"
@mouseleave="mouseLeave"
/>
</template>
<script lang="ts">
import Vue from 'vue'
import Konva from 'konva'
import Polygon from '@/domain/models/tasks/segmentation/Polygon'
import { transform, inverseTransform } from '@/domain/models/tasks/shared/Scaler'
export default Vue.extend({
props: {
polygon: {
type: Polygon,
required: true
},
color: {
type: String,
default: '#00FF00'
},
closed: {
type: Boolean,
default: false
},
draggable: {
type: Boolean,
default: false
},
opacity: {
type: Number,
default: 0.6
},
scale: {
type: Number,
default: 1
},
maxWidth: {
type: Number,
default: 0
},
maxHeight: {
type: Number,
default: 0
},
highlightId: {
type: String,
required: false,
default: 'uuid'
}
},
data() {
return {
stageX: 0,
stageY: 0,
originX: 0,
originY: 0
}
},
computed: {
strokeColor() {
return this.polygon.id === this.highlightId ? '#ff0000' : `${this.color}CC`
},
strokeWidth() {
return this.polygon.id === this.highlightId ? 5 : 1
}
},
methods: {
onDragStart(e: Konva.KonvaEventObject<DragEvent>) {
this.originX = e.target.x()
this.originY = e.target.y()
const { x = 0, y = 0 } = e.target.getStage()!.attrs
this.stageX = x
this.stageY = y
this.$emit('dragstart')
},
dragBoundFunc(pos: { x: number; y: number }) {
let x = transform(pos.x, this.stageX, this.scale)
let y = transform(pos.y, this.stageY, this.scale)
const [minX, minY, maxX, maxY] = this.polygon.minMaxPoints()
if (minY + y < 0) y = -1 * minY
if (minX + x < 0) x = -1 * minX
if (maxY + y > this.maxHeight) y = this.maxHeight - maxY
if (maxX + x > this.maxWidth) x = this.maxWidth - maxX
x = inverseTransform(x, this.stageX, this.scale)
y = inverseTransform(y, this.stageY, this.scale)
return { x, y }
},
onDragEnd(e: Konva.KonvaEventObject<DragEvent>) {
const dx = e.target.x() - this.originX
const dy = e.target.y() - this.originY
e.target.move({ x: -dx, y: -dy })
this.$emit('dragend', this.polygon, dx, dy)
},
click(id: string) {
this.$emit('click', id)
},
mouseEnter(e: Konva.KonvaEventObject<MouseEvent>) {
e.target.getStage()!.container().style.cursor = 'pointer'
},
mouseLeave(e: Konva.KonvaEventObject<MouseEvent>) {
e.target.getStage()!.container().style.cursor = 'default'
}
}
})
</script>