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.
 
 
 
 
 
 

223 lines
5.8 KiB

<template>
<v-main>
<v-container fluid>
<v-row justify="center">
<v-col cols="12" md="9">
<v-card>
<v-card-title>
<v-chip-group v-model="selectedLabelIndex" column>
<v-chip
v-for="item in labels"
:key="item.id"
:color="item.backgroundColor"
filter
:text-color="$contrastColor(item.backgroundColor)"
>
{{ item.text }}
<v-avatar
v-if="item.suffixKey"
right
color="white"
class="black--text font-weight-bold"
>
{{ item.suffixKey }}
</v-avatar>
</v-chip>
</v-chip-group>
</v-card-title>
<v-divider />
<v-bounding-box
:rectangles="filteredRectangles"
:highlight-id="highlightId"
:image-url="imageUrl"
:labels="bboxLabels"
:selected-label="selectedLabel"
:scale="scale"
@add-rectangle="addRectangle"
@update-rectangle="updateRectangle"
@delete-rectangle="deleteRectangle"
@update-scale="updateScale"
@select-rectangle="selectRectangle"
/>
</v-card>
</v-col>
<v-col cols="12" md="3">
<list-metadata :metadata="meta" />
<region-list
class="mt-4"
:regions="regionList"
@change-visibility="changeVisibility"
@delete-region="deleteRectangle"
@hover-region="hoverRegion"
@unhover-region="unhoverRegion"
/>
</v-col>
</v-row>
</v-container>
</v-main>
</template>
<script>
import VBoundingBox from '@/components/tasks/boundingBox/VBoundingBox.vue'
import ListMetadata from '@/components/tasks/metadata/ListMetadata'
import RegionList from '@/components/tasks/image/RegionList.vue'
export default {
components: {
ListMetadata,
VBoundingBox,
RegionList
},
layout: 'demo',
data() {
return {
imageUrl: require('~/assets/images/demo/cat.jpeg'),
rectangles: [
{
id: 'uuid',
label: 1,
x: 10,
y: 10,
width: 100,
height: 100
}
],
labels: [
{
id: 1,
text: 'Cat',
prefixKey: null,
suffixKey: 'c',
backgroundColor: '#7c20e0',
textColor: '#ffffff'
},
{
id: 2,
text: 'Dog',
prefixKey: null,
suffixKey: 'd',
backgroundColor: '#fbb028',
textColor: '#000000'
}
],
meta: { wikiPageId: 2 },
selectedLabelIndex: undefined,
selectedRectangle: undefined,
scale: 1,
visibilities: {},
highlightId: null
}
},
computed: {
bboxLabels() {
return this.labels.map((label) => {
return {
id: label.id,
name: label.text,
color: label.backgroundColor
}
})
},
selectedLabel() {
if (this.selectedLabelIndex !== undefined) {
return this.labels[this.selectedLabelIndex]
} else {
return undefined
}
},
regionList() {
return this.rectangles.map((rectangle) => {
return {
id: rectangle.id,
category: this.labels.find((label) => rectangle.label === label.id).text,
color: this.labels.find((label) => rectangle.label === label.id).backgroundColor,
visibility: rectangle.id in this.visibilities ? this.visibilities[rectangle.id] : true
}
})
},
filteredRectangles() {
return this.rectangles.filter((rectangle) => this.visibilities[rectangle.id] !== false)
}
},
watch: {
selectedLabel(newLabel) {
if (newLabel !== undefined && !!this.selectedRectangle) {
const rect = this.rectangles.find((r) => r.id === this.selectedRectangle.id)
rect.label = newLabel.id
this.updateRectangle(rect)
}
}
},
methods: {
addRectangle(rectangle) {
console.log('addRectangle', rectangle)
this.rectangles.push(rectangle)
this.visibilities[rectangle.id] = true
this.selectedLabelIndex = undefined
},
updateRectangle(rectangle) {
console.log('updateRectangle', rectangle)
const index = this.rectangles.findIndex((r) => r.id === rectangle.id)
if (index !== -1) {
this.$set(this.rectangles, index, rectangle)
}
},
deleteRectangle(rectangleId) {
console.log('deleteRectangle', rectangleId)
this.rectangles = this.rectangles.filter((r) => r.id !== rectangleId)
delete this.visibilities[rectangleId]
},
changeVisibility(regionId, visibility) {
console.log('changeVisibility', regionId, visibility)
this.$set(this.visibilities, regionId, visibility)
this.visibilities = Object.assign({}, this.visibilities)
},
hoverRegion(regionId) {
console.log('hoverRegion', regionId)
this.highlightId = regionId
},
unhoverRegion(regionId) {
console.log('unhoverRegion', regionId)
this.highlightId = null
},
selectRectangle(rectangleId) {
console.log('selectRectangle', rectangleId)
if (rectangleId) {
this.selectedRectangle = this.rectangles.find((r) => r.id === rectangleId)
this.selectedLabelIndex = this.labels.findIndex(
(l) => l.id === this.selectedRectangle.label
)
} else {
this.selectedRectangle = undefined
this.selectedLabelIndex = undefined
}
},
zoomOut() {
this.scale -= 0.1
},
zoomIn() {
this.scale += 0.1
},
updateScale(scale) {
this.scale = scale
}
}
}
</script>