lost-sia 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/index.es.js +109 -52
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +109 -52
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -9,13 +9,13 @@ var _ = _interopDefault(require('lodash'));
|
|
|
9
9
|
|
|
10
10
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
11
11
|
|
|
12
|
-
function toSia(data, image, type) {
|
|
12
|
+
function toSia(data, image, type, imgOffset) {
|
|
13
13
|
switch (type) {
|
|
14
14
|
case 'bBox':
|
|
15
15
|
var w = image.width * data.w;
|
|
16
16
|
var h = image.height * data.h;
|
|
17
|
-
var x0 = image.width * data.x - w / 2.0;
|
|
18
|
-
var y0 = image.height * data.y - h / 2.0;
|
|
17
|
+
var x0 = imgOffset.x + image.width * data.x - w / 2.0;
|
|
18
|
+
var y0 = imgOffset.y + image.height * data.y - h / 2.0;
|
|
19
19
|
return [{
|
|
20
20
|
x: x0,
|
|
21
21
|
y: y0
|
|
@@ -31,15 +31,15 @@ function toSia(data, image, type) {
|
|
|
31
31
|
}];
|
|
32
32
|
case 'point':
|
|
33
33
|
return [{
|
|
34
|
-
x: image.width * data.x,
|
|
35
|
-
y: image.height * data.y
|
|
34
|
+
x: imgOffset.x + image.width * data.x,
|
|
35
|
+
y: imgOffset.y + image.height * data.y
|
|
36
36
|
}];
|
|
37
37
|
case 'line':
|
|
38
38
|
case 'polygon':
|
|
39
39
|
return data.map(function (e) {
|
|
40
40
|
return {
|
|
41
|
-
x: image.width * e.x,
|
|
42
|
-
y: image.height * e.y
|
|
41
|
+
x: imgOffset.x + image.width * e.x,
|
|
42
|
+
y: imgOffset.y + image.height * e.y
|
|
43
43
|
};
|
|
44
44
|
});
|
|
45
45
|
default:
|
|
@@ -51,17 +51,21 @@ function toSia(data, image, type) {
|
|
|
51
51
|
* Transform a sia annotation to backend format.
|
|
52
52
|
*
|
|
53
53
|
* @param {Array} data Annotation data
|
|
54
|
-
* @param {*}
|
|
54
|
+
* @param {*} svg Image object {width, height}
|
|
55
55
|
* @param {String} type Type of the annotation bBox, point, line, polygon
|
|
56
56
|
* @returns Annotation data in backend style (relative, centered)
|
|
57
57
|
*/
|
|
58
|
-
function toBackend(data,
|
|
58
|
+
function toBackend(data, svg, type) {
|
|
59
|
+
var imgOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { x: 0, y: 0 };
|
|
60
|
+
|
|
61
|
+
var imgWidth = svg.width - 2 * imgOffset.x;
|
|
62
|
+
var imgHeight = svg.height - 2 * imgOffset.y;
|
|
59
63
|
switch (type) {
|
|
60
64
|
case 'bBox':
|
|
61
|
-
// const w =
|
|
62
|
-
// const h =
|
|
63
|
-
// const x0 =
|
|
64
|
-
// const y0 =
|
|
65
|
+
// const w = svg.width * data.w
|
|
66
|
+
// const h = svg.height * data.h
|
|
67
|
+
// const x0 = svg.width * data.x - w/2.0
|
|
68
|
+
// const y0 = svg.height * data.y - h/2.0
|
|
65
69
|
|
|
66
70
|
// console.error('GO On Here! w = max_x - min_x; h = max_y - min_y')
|
|
67
71
|
var xList = data.map(function (e) {
|
|
@@ -70,30 +74,30 @@ function toBackend(data, image, type) {
|
|
|
70
74
|
var yList = data.map(function (e) {
|
|
71
75
|
return e.y;
|
|
72
76
|
});
|
|
73
|
-
var minX = Math.min.apply(Math, _toConsumableArray(xList));
|
|
74
|
-
var maxX = Math.max.apply(Math, _toConsumableArray(xList));
|
|
75
|
-
var minY = Math.min.apply(Math, _toConsumableArray(yList));
|
|
76
|
-
var maxY = Math.max.apply(Math, _toConsumableArray(yList));
|
|
77
|
+
var minX = Math.min.apply(Math, _toConsumableArray(xList)) - imgOffset.x;
|
|
78
|
+
var maxX = Math.max.apply(Math, _toConsumableArray(xList)) - imgOffset.x;
|
|
79
|
+
var minY = Math.min.apply(Math, _toConsumableArray(yList)) - imgOffset.y;
|
|
80
|
+
var maxY = Math.max.apply(Math, _toConsumableArray(yList)) - imgOffset.y;
|
|
77
81
|
var w = maxX - minX;
|
|
78
82
|
var h = maxY - minY;
|
|
79
83
|
var x = minX + w / 2.0;
|
|
80
84
|
var y = minY + h / 2.0;
|
|
81
85
|
return {
|
|
82
|
-
x: x /
|
|
83
|
-
y: y /
|
|
84
|
-
w: w /
|
|
85
|
-
h: h /
|
|
86
|
+
x: x / imgWidth,
|
|
87
|
+
y: y / imgHeight,
|
|
88
|
+
w: w / imgWidth,
|
|
89
|
+
h: h / imgHeight };
|
|
86
90
|
case 'point':
|
|
87
91
|
return {
|
|
88
|
-
x: data[0].x /
|
|
89
|
-
y: data[0].y /
|
|
92
|
+
x: (data[0].x - imgOffset.x) / imgWidth,
|
|
93
|
+
y: (data[0].y - imgOffset.y) / imgHeight
|
|
90
94
|
};
|
|
91
95
|
case 'line':
|
|
92
96
|
case 'polygon':
|
|
93
97
|
return data.map(function (e) {
|
|
94
98
|
return {
|
|
95
|
-
x: e.x /
|
|
96
|
-
y: e.y /
|
|
99
|
+
x: (e.x - imgOffset.x) / imgWidth,
|
|
100
|
+
y: (e.y - imgOffset.y) / imgHeight
|
|
97
101
|
};
|
|
98
102
|
});
|
|
99
103
|
default:
|
|
@@ -3158,6 +3162,19 @@ var ImgBar = function (_Component) {
|
|
|
3158
3162
|
return null;
|
|
3159
3163
|
}
|
|
3160
3164
|
}
|
|
3165
|
+
}, {
|
|
3166
|
+
key: 'renderImgDescription',
|
|
3167
|
+
value: function renderImgDescription() {
|
|
3168
|
+
if (this.props.annos.image.description) {
|
|
3169
|
+
return React__default.createElement(
|
|
3170
|
+
semanticUiReact.Menu.Item,
|
|
3171
|
+
null,
|
|
3172
|
+
this.props.annos.image.description
|
|
3173
|
+
);
|
|
3174
|
+
} else {
|
|
3175
|
+
return null;
|
|
3176
|
+
}
|
|
3177
|
+
}
|
|
3161
3178
|
}, {
|
|
3162
3179
|
key: 'render',
|
|
3163
3180
|
value: function render() {
|
|
@@ -3165,7 +3182,7 @@ var ImgBar = function (_Component) {
|
|
|
3165
3182
|
|
|
3166
3183
|
if (!this.props.visible) return null;
|
|
3167
3184
|
if (!this.props.annos.image) return null;
|
|
3168
|
-
if (!this.props.annos.image.url) return null
|
|
3185
|
+
// if (!this.props.annos.image.url) return null
|
|
3169
3186
|
return React__default.createElement(
|
|
3170
3187
|
'div',
|
|
3171
3188
|
{ style: {
|
|
@@ -3182,10 +3199,11 @@ var ImgBar = function (_Component) {
|
|
|
3182
3199
|
React__default.createElement(
|
|
3183
3200
|
semanticUiReact.Menu,
|
|
3184
3201
|
{ inverted: true, style: { opacity: 0.9, justifyContent: 'center', alignItems: 'center' } },
|
|
3202
|
+
this.renderImgDescription(),
|
|
3185
3203
|
React__default.createElement(
|
|
3186
3204
|
semanticUiReact.Menu.Item,
|
|
3187
3205
|
null,
|
|
3188
|
-
|
|
3206
|
+
"ID: " + this.props.annos.image.id
|
|
3189
3207
|
),
|
|
3190
3208
|
React__default.createElement(
|
|
3191
3209
|
semanticUiReact.Menu.Item,
|
|
@@ -3437,7 +3455,7 @@ function fixBackendAnnos(backendAnnos) {
|
|
|
3437
3455
|
return annos;
|
|
3438
3456
|
}
|
|
3439
3457
|
|
|
3440
|
-
function backendAnnosToCanvas(backendAnnos, imgSize) {
|
|
3458
|
+
function backendAnnosToCanvas(backendAnnos, imgSize, imgOffset) {
|
|
3441
3459
|
var annos = [].concat(_toConsumableArray$3(backendAnnos.bBoxes.map(function (element) {
|
|
3442
3460
|
return _extends$8({}, element, { type: 'bBox',
|
|
3443
3461
|
mode: element.mode ? element.mode : VIEW,
|
|
@@ -3458,7 +3476,7 @@ function backendAnnosToCanvas(backendAnnos, imgSize) {
|
|
|
3458
3476
|
})));
|
|
3459
3477
|
annos = annos.map(function (el) {
|
|
3460
3478
|
return _extends$8({}, el, {
|
|
3461
|
-
data: toSia(el.data, imgSize, el.type) });
|
|
3479
|
+
data: toSia(el.data, imgSize, el.type, imgOffset) });
|
|
3462
3480
|
});
|
|
3463
3481
|
// this.setState({annos: [...annos]})
|
|
3464
3482
|
return annos;
|
|
@@ -3466,6 +3484,7 @@ function backendAnnosToCanvas(backendAnnos, imgSize) {
|
|
|
3466
3484
|
|
|
3467
3485
|
function canvasToBackendAnnos(annos, imgSize) {
|
|
3468
3486
|
var forBackendPost = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
3487
|
+
var imgOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { x: 0, y: 0 };
|
|
3469
3488
|
|
|
3470
3489
|
var myAnnos = annos;
|
|
3471
3490
|
var bAnnos = myAnnos.map(function (el) {
|
|
@@ -3481,7 +3500,7 @@ function canvasToBackendAnnos(annos, imgSize) {
|
|
|
3481
3500
|
return _extends$8({}, el, {
|
|
3482
3501
|
id: annoId,
|
|
3483
3502
|
mode: VIEW,
|
|
3484
|
-
data: toBackend(el.data, imgSize, el.type)
|
|
3503
|
+
data: toBackend(el.data, imgSize, el.type, imgOffset)
|
|
3485
3504
|
});
|
|
3486
3505
|
});
|
|
3487
3506
|
|
|
@@ -3521,6 +3540,7 @@ var CAM_MOVE_STOP = 'camMoveStop';
|
|
|
3521
3540
|
var COPY_ANNOTATION = 'copyAnnotation';
|
|
3522
3541
|
var PASTE_ANNOTATION = 'pasteAnnotation';
|
|
3523
3542
|
var RECREATE_ANNO = 'recreateAnnotation';
|
|
3543
|
+
var DELETE_ANNO_IN_CREATION = 'deleteAnnoInCreation';
|
|
3524
3544
|
|
|
3525
3545
|
var KeyMapper = function () {
|
|
3526
3546
|
function KeyMapper() {
|
|
@@ -3587,6 +3607,9 @@ var KeyMapper = function () {
|
|
|
3587
3607
|
this.triggerKeyAction(PASTE_ANNOTATION);
|
|
3588
3608
|
}
|
|
3589
3609
|
break;
|
|
3610
|
+
case 'Escape':
|
|
3611
|
+
this.triggerKeyAction(DELETE_ANNO_IN_CREATION);
|
|
3612
|
+
break;
|
|
3590
3613
|
default:
|
|
3591
3614
|
break;
|
|
3592
3615
|
}
|
|
@@ -3765,11 +3788,11 @@ function _inherits$e(subClass, superClass) { if (typeof superClass !== "function
|
|
|
3765
3788
|
* {
|
|
3766
3789
|
* image : {
|
|
3767
3790
|
* id: int,
|
|
3768
|
-
* url: string,
|
|
3769
3791
|
* number: int,
|
|
3770
3792
|
* amount: int,
|
|
3771
3793
|
* isFirst: bool,
|
|
3772
|
-
* isLast: bool
|
|
3794
|
+
* isLast: bool,
|
|
3795
|
+
* description: string, // -> optional
|
|
3773
3796
|
* },
|
|
3774
3797
|
* annotations: {
|
|
3775
3798
|
* bBoxes: [{
|
|
@@ -3831,6 +3854,7 @@ function _inherits$e(subClass, superClass) { if (typeof superClass !== "function
|
|
|
3831
3854
|
* {left:int, top:int, right:int, bottom:int} values in pixels.
|
|
3832
3855
|
* @param {bool} centerCanvasInContainer - Center the canvas in the
|
|
3833
3856
|
* middle of the container.
|
|
3857
|
+
* @param {bool} maxCanvas - Maximize Canvas Size. Do not fit canvas to image size
|
|
3834
3858
|
* @param {str or int} defaultLabel (optional) - Name or ID of the default label that is used
|
|
3835
3859
|
* when no label was selected by the annotator. If not set "no label" will be used.
|
|
3836
3860
|
* If ID is used, it needs to be one of the possible label ids.
|
|
@@ -3874,6 +3898,10 @@ var Canvas = function (_Component) {
|
|
|
3874
3898
|
width: undefined,
|
|
3875
3899
|
height: undefined
|
|
3876
3900
|
},
|
|
3901
|
+
imageOffset: {
|
|
3902
|
+
x: 0,
|
|
3903
|
+
y: 0
|
|
3904
|
+
},
|
|
3877
3905
|
annos: [],
|
|
3878
3906
|
mode: VIEW,
|
|
3879
3907
|
// selectedAnnoId: {id:undefined},
|
|
@@ -3986,7 +4014,8 @@ var Canvas = function (_Component) {
|
|
|
3986
4014
|
if (prevProps.layoutUpdate !== this.props.layoutUpdate) {
|
|
3987
4015
|
this.selectAnnotation(undefined);
|
|
3988
4016
|
// this.updateCanvasView(this.getAnnoBackendFormat())
|
|
3989
|
-
this.
|
|
4017
|
+
// const {imageOffset} = this.updateImageSize()
|
|
4018
|
+
this.updateCanvasView(canvasToBackendAnnos(this.state.annos, this.state.svg, false, this.state.imageOffset));
|
|
3990
4019
|
}
|
|
3991
4020
|
}
|
|
3992
4021
|
}
|
|
@@ -4112,6 +4141,9 @@ var Canvas = function (_Component) {
|
|
|
4112
4141
|
case DELETE_ANNO:
|
|
4113
4142
|
this.deleteAnnotation(anno);
|
|
4114
4143
|
break;
|
|
4144
|
+
case DELETE_ANNO_IN_CREATION:
|
|
4145
|
+
this.deleteAnnoInCreationMode(anno);
|
|
4146
|
+
break;
|
|
4115
4147
|
case ENTER_ANNO_ADD_MODE:
|
|
4116
4148
|
if (anno) {
|
|
4117
4149
|
this.updateSelectedAnno(anno, ADD);
|
|
@@ -4440,11 +4472,13 @@ var Canvas = function (_Component) {
|
|
|
4440
4472
|
if (!this.props.possibleLabels) return;
|
|
4441
4473
|
if (this.props.possibleLabels.length <= 0) return;
|
|
4442
4474
|
var lbls = this.props.possibleLabels;
|
|
4443
|
-
|
|
4444
|
-
|
|
4475
|
+
lbls = lbls.map(function (e) {
|
|
4476
|
+
if (!('color' in e)) {
|
|
4445
4477
|
return _extends$9({}, e, { color: getColor(e.id) });
|
|
4446
|
-
}
|
|
4447
|
-
|
|
4478
|
+
} else {
|
|
4479
|
+
return _extends$9({}, e);
|
|
4480
|
+
}
|
|
4481
|
+
});
|
|
4448
4482
|
this.setState({
|
|
4449
4483
|
possibleLabels: [].concat(_toConsumableArray$4(lbls))
|
|
4450
4484
|
});
|
|
@@ -4535,6 +4569,17 @@ var Canvas = function (_Component) {
|
|
|
4535
4569
|
}
|
|
4536
4570
|
}
|
|
4537
4571
|
}
|
|
4572
|
+
}, {
|
|
4573
|
+
key: 'deleteAnnoInCreationMode',
|
|
4574
|
+
value: function deleteAnnoInCreationMode(anno) {
|
|
4575
|
+
if (anno) {
|
|
4576
|
+
if (anno.mode === CREATE) {
|
|
4577
|
+
// const ar = this.findAnnoRef(this.state.selectedAnnoId)
|
|
4578
|
+
// if (ar !== undefined) ar.current.myAnno.current.removeLastNode()
|
|
4579
|
+
this.onAnnoPerformedAction(anno, ANNO_DELETED);
|
|
4580
|
+
}
|
|
4581
|
+
}
|
|
4582
|
+
}
|
|
4538
4583
|
}, {
|
|
4539
4584
|
key: 'deleteAllAnnos',
|
|
4540
4585
|
value: function deleteAllAnnos() {
|
|
@@ -4653,7 +4698,7 @@ var Canvas = function (_Component) {
|
|
|
4653
4698
|
|
|
4654
4699
|
var myAnnos = annos ? annos : this.state.annos;
|
|
4655
4700
|
// const backendFormat = this.getAnnoBackendFormat(removeFrontedIds, myAnnos)
|
|
4656
|
-
var backendFormat = canvasToBackendAnnos(myAnnos, this.state.svg, removeFrontedIds);
|
|
4701
|
+
var backendFormat = canvasToBackendAnnos(myAnnos, this.state.svg, removeFrontedIds, this.state.imageOffset);
|
|
4657
4702
|
var finalData = {
|
|
4658
4703
|
imgId: this.props.annos.image.id,
|
|
4659
4704
|
imgLabelIds: this.state.imgLabelIds,
|
|
@@ -5004,28 +5049,40 @@ var Canvas = function (_Component) {
|
|
|
5004
5049
|
imgWidth = maxImgHeight * ratio;
|
|
5005
5050
|
imgHeight = maxImgHeight;
|
|
5006
5051
|
}
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5052
|
+
var svg;
|
|
5053
|
+
var imgOffset = { x: 0, y: 0 };
|
|
5054
|
+
if (this.props.maxCanvas) {
|
|
5055
|
+
imgOffset.x = (maxImgWidth - imgWidth) / 2;
|
|
5056
|
+
imgOffset.y = (maxImgHeight - imgHeight) / 2;
|
|
5057
|
+
console.log('imgOffset: ', imgOffset);
|
|
5058
|
+
svg = _extends$9({}, this.state.svg, { width: maxImgWidth, height: maxImgHeight,
|
|
5059
|
+
left: canvasLeft, top: canvasTop
|
|
5060
|
+
});
|
|
5061
|
+
} else {
|
|
5062
|
+
if (this.props.centerCanvasInContainer) {
|
|
5063
|
+
var resSpaceX = maxImgWidth - imgWidth;
|
|
5064
|
+
if (resSpaceX > 2) {
|
|
5065
|
+
canvasLeft = canvasLeft + resSpaceX / 2;
|
|
5066
|
+
}
|
|
5067
|
+
var resSpaceY = maxImgHeight - imgHeight;
|
|
5068
|
+
if (resSpaceY > 2) {
|
|
5069
|
+
canvasTop = canvasTop + resSpaceY / 2;
|
|
5070
|
+
}
|
|
5015
5071
|
}
|
|
5072
|
+
svg = _extends$9({}, this.state.svg, { width: imgWidth, height: imgHeight,
|
|
5073
|
+
left: canvasLeft, top: canvasTop
|
|
5074
|
+
});
|
|
5016
5075
|
}
|
|
5017
|
-
var svg = _extends$9({}, this.state.svg, { width: imgWidth, height: imgHeight,
|
|
5018
|
-
left: canvasLeft, top: canvasTop
|
|
5019
|
-
});
|
|
5020
5076
|
this.setState({
|
|
5021
5077
|
svg: svg,
|
|
5022
5078
|
image: {
|
|
5023
5079
|
width: this.img.current.naturalWidth,
|
|
5024
5080
|
height: this.img.current.naturalHeight
|
|
5025
|
-
}
|
|
5081
|
+
},
|
|
5082
|
+
imageOffset: imgOffset
|
|
5026
5083
|
});
|
|
5027
5084
|
this.svgUpdate(svg);
|
|
5028
|
-
return { imgWidth: imgWidth, imgHeight: imgHeight };
|
|
5085
|
+
return { imgWidth: imgWidth, imgHeight: imgHeight, imgOffset: imgOffset };
|
|
5029
5086
|
}
|
|
5030
5087
|
}, {
|
|
5031
5088
|
key: 'svgUpdate',
|
|
@@ -5050,7 +5107,7 @@ var Canvas = function (_Component) {
|
|
|
5050
5107
|
//for svg should be calculated
|
|
5051
5108
|
if (annotations) {
|
|
5052
5109
|
var imgSize = this.updateImageSize();
|
|
5053
|
-
this.setState({ annos: [].concat(_toConsumableArray$4(backendAnnosToCanvas(annotations, { width: imgSize.imgWidth, height: imgSize.imgHeight }))) });
|
|
5110
|
+
this.setState({ annos: [].concat(_toConsumableArray$4(backendAnnosToCanvas(annotations, { width: imgSize.imgWidth, height: imgSize.imgHeight }, imgSize.imgOffset))) });
|
|
5054
5111
|
}
|
|
5055
5112
|
}
|
|
5056
5113
|
}, {
|