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/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 {*} image Image object {width, height}
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, image, type) {
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 = image.width * data.w
62
- // const h = image.height * data.h
63
- // const x0 = image.width * data.x - w/2.0
64
- // const y0 = image.height * data.y - h/2.0
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 / image.width,
83
- y: y / image.height,
84
- w: w / image.width,
85
- h: h / image.height };
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 / image.width,
89
- y: data[0].y / image.height
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 / image.width,
96
- y: e.y / image.height
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
- this.props.annos.image.url.split('/').pop() + " (ID: " + this.props.annos.image.id + ")"
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.updateCanvasView(canvasToBackendAnnos(this.state.annos, this.state.svg));
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
- if (!('color' in lbls[0])) {
4444
- lbls = lbls.map(function (e) {
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
- if (this.props.centerCanvasInContainer) {
5008
- var resSpaceX = maxImgWidth - imgWidth;
5009
- if (resSpaceX > 2) {
5010
- canvasLeft = canvasLeft + resSpaceX / 2;
5011
- }
5012
- var resSpaceY = maxImgHeight - imgHeight;
5013
- if (resSpaceY > 2) {
5014
- canvasTop = canvasTop + resSpaceY / 2;
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
  }, {