mirror of https://github.com/doccano/doccano.git
pythondatasetnatural-language-processingdata-labelingmachine-learningannotation-tooldatasetsactive-learningtext-annotation
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.
117 lines
2.6 KiB
117 lines
2.6 KiB
<template>
|
|
<v-rect
|
|
:config="{
|
|
id: rect.id,
|
|
x: rect.x,
|
|
y: rect.y,
|
|
width: rect.width,
|
|
height: rect.height,
|
|
opacity: 0.6,
|
|
stroke: strokeColor,
|
|
fill: color,
|
|
strokeWidth,
|
|
draggable: true,
|
|
dragBoundFunc
|
|
}"
|
|
@dragstart="onDragStart"
|
|
@dragend="onDragEnd"
|
|
@transformend="$emit('transformend', $event)"
|
|
/>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Konva from 'konva'
|
|
import type { PropType } from 'vue'
|
|
import Vue from 'vue'
|
|
import { inverseTransform, transform } from '@/domain/models/tasks/shared/Scaler'
|
|
import Rectangle from '@/domain/models/tasks/boundingbox/Rectangle'
|
|
|
|
export default Vue.extend({
|
|
props: {
|
|
rect: {
|
|
type: Object as PropType<Rectangle>,
|
|
required: true
|
|
},
|
|
color: {
|
|
type: String,
|
|
default: '#00FF00'
|
|
},
|
|
draggable: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
highlightId: {
|
|
type: String,
|
|
default: 'uuid'
|
|
},
|
|
opacity: {
|
|
type: Number,
|
|
default: 0.6
|
|
},
|
|
scale: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
maxWidth: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
maxHeight: {
|
|
type: Number,
|
|
required: true
|
|
}
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
stageX: 0,
|
|
stageY: 0,
|
|
originX: 0,
|
|
originY: 0
|
|
}
|
|
},
|
|
|
|
computed: {
|
|
strokeColor() {
|
|
return this.rect.id === this.highlightId ? '#ff0000' : `${this.color}CC`
|
|
},
|
|
|
|
strokeWidth() {
|
|
return this.rect.id === this.highlightId ? 5 : 1
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
dragBoundFunc(pos: { x: number; y: number }) {
|
|
const [minX, minY, maxX, maxY] = this.rect.minMaxPoints()
|
|
let x = transform(pos.x, this.stageX, this.scale)
|
|
let y = transform(pos.y, this.stageY, this.scale)
|
|
x -= this.originX
|
|
y -= this.originY
|
|
if (minY + y < 0) y = -minY
|
|
if (minX + x < 0) x = -minX
|
|
if (maxY + y > this.maxHeight) y = this.maxHeight - maxY
|
|
if (maxX + x > this.maxWidth) x = this.maxWidth - maxX
|
|
x += this.originX
|
|
y += this.originY
|
|
x = inverseTransform(x, this.stageX, this.scale)
|
|
y = inverseTransform(y, this.stageY, this.scale)
|
|
return { x, y }
|
|
},
|
|
|
|
onDragStart(e: Konva.KonvaEventObject<DragEvent>) {
|
|
this.originX = e.target.attrs.x
|
|
this.originY = e.target.attrs.y
|
|
const { x = 0, y = 0 } = e.target.getStage()!.attrs
|
|
this.stageX = x
|
|
this.stageY = y
|
|
},
|
|
|
|
onDragEnd(e: Konva.KonvaEventObject<DragEvent>) {
|
|
const { x, y } = e.target.attrs
|
|
const newRect = this.rect.transform(x, y, this.rect.width, this.rect.height)
|
|
this.$emit('dragend', newRect)
|
|
}
|
|
}
|
|
})
|
|
</script>
|