kfb-view 3.0.7 → 3.0.9
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/lib/kfb-view.js +1 -1
- package/lib/kfb-view.js.LICENSE.txt +3 -3
- package/package.json +3 -2
- package/src/components/area/index.js +38 -48
- package/src/components/board/index.js +1 -1
- package/src/components/common/common.js +0 -67
- package/src/components/grid/index.js +8 -3
- package/src/plugin/openseadragon/openseadragon.js +667 -126
- package/src/util/calculate.js +79 -35
- package/src/util/imageData.js +0 -5
- package/src/view.js +7 -6
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/git_toolbox_prj.xml +0 -20
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/inspectionProfiles/profiles_settings.xml +0 -5
- package/.idea/kfb-view.iml +0 -12
- package/.idea/misc.xml +0 -86
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.idea/watcherTasks.xml +0 -4
- package/.idea/workspace.xml +0 -870
- package/config/utils.js +0 -77
- package/config/webpack.base.conf.js +0 -95
- package/config/webpack.dev.conf.js +0 -80
- package/config/webpack.lib.conf.js +0 -92
- package/config/webpack.prod.conf.js +0 -102
- package/config/webpack.test.conf.js +0 -0
- package/example/index.js +0 -546
- package/example/label/check.svg +0 -8
- package/example/label/check_empty.svg +0 -9
- package/example/label/cross.svg +0 -6
- package/example/label/cross_empty.svg +0 -6
- package/example/label/delete.svg +0 -8
- package/example/label/delete_empty.svg +0 -8
- package/example/label/hasAudit.svg +0 -26
- package/example/style/index.css +0 -153
- package/example/worker/canvas.worker.js +0 -28
- package/test.html +0 -246
- package/yarn.lock +0 -7508
package/example/index.js
DELETED
|
@@ -1,546 +0,0 @@
|
|
|
1
|
-
import {KfbView, hslToRgb, rgbToHsl, cacheGammaTable} from '../src';
|
|
2
|
-
import axios from 'axios';
|
|
3
|
-
import {EVENT_DB_CLICK_LABEL} from '../src/const/event';
|
|
4
|
-
import {regionToPoint} from '../lib/kfb-view';
|
|
5
|
-
import checkSvg from './label/check.svg';
|
|
6
|
-
import checkEmptySvg from './label/check_empty.svg';
|
|
7
|
-
import crossSvg from './label/cross.svg';
|
|
8
|
-
import crossEmptySvg from './label/cross_empty.svg';
|
|
9
|
-
import deleteSvg from './label/delete.svg';
|
|
10
|
-
import deleteEmptySvg from './label/delete_empty.svg';
|
|
11
|
-
import hasAuditSvg from './label/hasAudit.svg';
|
|
12
|
-
|
|
13
|
-
const checkImg = new Image();
|
|
14
|
-
checkImg.src = checkSvg;
|
|
15
|
-
const checkEmptyImg = new Image();
|
|
16
|
-
checkEmptyImg.src = checkEmptySvg;
|
|
17
|
-
const crossImg = new Image();
|
|
18
|
-
crossImg.src = crossSvg;
|
|
19
|
-
const crossEmptyImg = new Image();
|
|
20
|
-
crossEmptyImg.src = crossEmptySvg;
|
|
21
|
-
const deleteImg = new Image();
|
|
22
|
-
deleteImg.src = deleteSvg;
|
|
23
|
-
const deleteEmptyImg = new Image();
|
|
24
|
-
deleteEmptyImg.src = deleteEmptySvg;
|
|
25
|
-
const hasAuditImg = new Image();
|
|
26
|
-
hasAuditImg.src = hasAuditSvg;
|
|
27
|
-
|
|
28
|
-
const fileName = '/data/ftp/950/22/slides/B20230069032023-03-12_16_41_56.kfb';
|
|
29
|
-
|
|
30
|
-
const instance = axios.create({
|
|
31
|
-
baseURL: '/api',
|
|
32
|
-
timeout: 1000,
|
|
33
|
-
headers: {'Authorization': 'bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vMTkyLjE2OC4xLjIyL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNjY3NjE2OTIyLCJleHAiOjE2Njc2NTUzMjIsIm5iZiI6MTY2NzYxNjkyMiwianRpIjoiMDl4SEZMdlpHUlliVExlQyIsInN1YiI6MjcsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.buNwEIsNSqo1-wH8zEaRyjauIVKOXmjJfjaa1-g9l_k'},
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
let cacheImage = {};
|
|
37
|
-
|
|
38
|
-
const debounce = (func, delay) => {
|
|
39
|
-
let timer;
|
|
40
|
-
return function(...args) {
|
|
41
|
-
if (timer) {
|
|
42
|
-
clearTimeout(timer);
|
|
43
|
-
}
|
|
44
|
-
timer = setTimeout(() => {
|
|
45
|
-
// eslint-disable-next-line no-invalid-this,babel/no-invalid-this
|
|
46
|
-
func.apply(this, args);
|
|
47
|
-
}, delay);
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
instance.get(`/common/kfb/info?file=${fileName}`).then(({data}) => {
|
|
52
|
-
let params = {};
|
|
53
|
-
params.file = fileName;
|
|
54
|
-
data = data.data;
|
|
55
|
-
const kv = new KfbView({
|
|
56
|
-
el: '#app',
|
|
57
|
-
fileName,
|
|
58
|
-
scale: data.scanScale,
|
|
59
|
-
area: {
|
|
60
|
-
disabled: false,
|
|
61
|
-
drag: true,
|
|
62
|
-
},
|
|
63
|
-
board: {
|
|
64
|
-
ROI: false,
|
|
65
|
-
},
|
|
66
|
-
graduation: {
|
|
67
|
-
show: true,
|
|
68
|
-
left: 30,
|
|
69
|
-
bottom: 10,
|
|
70
|
-
},
|
|
71
|
-
navigator: {
|
|
72
|
-
disabled: false,
|
|
73
|
-
style: 'right: 0;top: 0',
|
|
74
|
-
thumbnail: `/api/slide/getImage?file=${fileName}&type=thumbnail`,
|
|
75
|
-
scale: data.scanScale,
|
|
76
|
-
},
|
|
77
|
-
pxConversion: {
|
|
78
|
-
unit: 'um',
|
|
79
|
-
imageCapRes: data.imageCapRes || 1,
|
|
80
|
-
},
|
|
81
|
-
grid: {
|
|
82
|
-
show: false,
|
|
83
|
-
ruler: false,
|
|
84
|
-
},
|
|
85
|
-
openSeadragonOptions: {
|
|
86
|
-
maxZoomLevel: data.scanScale * 10,
|
|
87
|
-
// imageLoaderLimit: 1,
|
|
88
|
-
animationTime: 0,
|
|
89
|
-
pixelsPerArrowPress: 120,
|
|
90
|
-
tileSources: {
|
|
91
|
-
height: data.height,
|
|
92
|
-
width: data.width,
|
|
93
|
-
tileSize: 256,
|
|
94
|
-
minLevel: 10,
|
|
95
|
-
getTileUrl(level, x, y) {
|
|
96
|
-
params.x = x;
|
|
97
|
-
params.y = y;
|
|
98
|
-
// temp workaround, need to fix hzztImageOperation library for return fileNum @gikidy
|
|
99
|
-
let maxLen = Math.max(data.width, data.height);
|
|
100
|
-
if (Math.pow(2, data.fileNum - 1) === maxLen) {
|
|
101
|
-
data.fileNum--;
|
|
102
|
-
}
|
|
103
|
-
if (data.fileNum === level) {
|
|
104
|
-
level = data.scanScale;
|
|
105
|
-
params.scale = level.toFixed(6);
|
|
106
|
-
} else {
|
|
107
|
-
level = data.scanScale / Math.pow(2, data.fileNum - level);
|
|
108
|
-
params.scale = level.toFixed(6);
|
|
109
|
-
level = data.ratiomap[level.toFixed(6)];
|
|
110
|
-
if (level === undefined) {
|
|
111
|
-
level = 0;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
params.level = level;
|
|
115
|
-
return `/image.php?${encodeQueryData(params)}`;
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
tileDrawing(e) {
|
|
120
|
-
const {
|
|
121
|
-
context,
|
|
122
|
-
rendered,
|
|
123
|
-
sourceWidth,
|
|
124
|
-
sourceHeight,
|
|
125
|
-
position,
|
|
126
|
-
size,
|
|
127
|
-
initRendered,
|
|
128
|
-
tile,
|
|
129
|
-
} = e;
|
|
130
|
-
let rangeA = document.querySelector('#a').value / 1;
|
|
131
|
-
let rangeS = document.querySelector('#s').value / 1;
|
|
132
|
-
let rangeL = document.querySelector('#l').value / 1;
|
|
133
|
-
let rangeR = document.querySelector('#r').value / 1;
|
|
134
|
-
let rangeG = document.querySelector('#g').value / 1;
|
|
135
|
-
let rangeB = document.querySelector('#b').value / 1;
|
|
136
|
-
if (rangeB === 0 && rangeA === 1 && rangeS === 0 && rangeL === 0 &&
|
|
137
|
-
rangeR === 0 && rangeG === 0) {
|
|
138
|
-
context.drawImage(
|
|
139
|
-
initRendered.canvas,
|
|
140
|
-
0,
|
|
141
|
-
0,
|
|
142
|
-
sourceWidth,
|
|
143
|
-
sourceHeight,
|
|
144
|
-
position.x,
|
|
145
|
-
position.y,
|
|
146
|
-
size.x,
|
|
147
|
-
size.y,
|
|
148
|
-
);
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const url = tile.getUrl();
|
|
152
|
-
if (!cacheImage[url]) {
|
|
153
|
-
const sourceLength = sourceWidth * sourceHeight;
|
|
154
|
-
const canvas = rendered.canvas;
|
|
155
|
-
let imageData = initRendered.getImageData(0, 0, canvas.width,
|
|
156
|
-
canvas.height);
|
|
157
|
-
for (let i = 0; i < sourceLength; i++) {
|
|
158
|
-
let r = imageData.data[i * 4 + 0];
|
|
159
|
-
let g = imageData.data[i * 4 + 1];
|
|
160
|
-
let b = imageData.data[i * 4 + 2];
|
|
161
|
-
if (rangeR !== 0) {
|
|
162
|
-
r = r * (1 + rangeR);
|
|
163
|
-
r = r > 255 ? 255 : r;
|
|
164
|
-
}
|
|
165
|
-
if (rangeG !== 0) {
|
|
166
|
-
g = g * (1 + rangeG);
|
|
167
|
-
g = g > 255 ? 255 : g;
|
|
168
|
-
}
|
|
169
|
-
if (rangeB !== 0) {
|
|
170
|
-
b = b * (1 + rangeB);
|
|
171
|
-
b = b > 255 ? 255 : b;
|
|
172
|
-
}
|
|
173
|
-
if (rangeS !== 0) {
|
|
174
|
-
let {h, s, l} = rgbToHsl(r, g, b);
|
|
175
|
-
const rgb = hslToRgb(h, s * (1 + rangeS), l);
|
|
176
|
-
r = rgb.r;
|
|
177
|
-
g = rgb.g;
|
|
178
|
-
b = rgb.b;
|
|
179
|
-
}
|
|
180
|
-
if (rangeL !== 0) {
|
|
181
|
-
let {h, s, l} = rgbToHsl(r, g, b);
|
|
182
|
-
const rgb = hslToRgb(h, s, l * (1 + rangeL));
|
|
183
|
-
r = rgb.r;
|
|
184
|
-
g = rgb.g;
|
|
185
|
-
b = rgb.b;
|
|
186
|
-
}
|
|
187
|
-
if (rangeA !== 1) {
|
|
188
|
-
r = cacheGammaTable[rangeA][r >> 0];
|
|
189
|
-
g = cacheGammaTable[rangeA][g >> 0];
|
|
190
|
-
b = cacheGammaTable[rangeA][b >> 0];
|
|
191
|
-
}
|
|
192
|
-
if (r > 255 || g > 255 || b > 255) {
|
|
193
|
-
console.log(r, g, b);
|
|
194
|
-
}
|
|
195
|
-
imageData.data[i * 4 + 0] = r;
|
|
196
|
-
imageData.data[i * 4 + 1] = g;
|
|
197
|
-
imageData.data[i * 4 + 2] = b;
|
|
198
|
-
}
|
|
199
|
-
rendered.putImageData(imageData, 0, 0);
|
|
200
|
-
cacheImage[url] = canvas;
|
|
201
|
-
}
|
|
202
|
-
context.drawImage(
|
|
203
|
-
cacheImage[url],
|
|
204
|
-
0,
|
|
205
|
-
0,
|
|
206
|
-
sourceWidth,
|
|
207
|
-
sourceHeight,
|
|
208
|
-
position.x,
|
|
209
|
-
position.y,
|
|
210
|
-
size.x,
|
|
211
|
-
size.y,
|
|
212
|
-
);
|
|
213
|
-
},
|
|
214
|
-
measure: {
|
|
215
|
-
defaultShow: true,
|
|
216
|
-
scale: 9.99,
|
|
217
|
-
handler: (content, label) => {
|
|
218
|
-
return [`类型:${label.__data__?.sub_class || '未知'}`];
|
|
219
|
-
},
|
|
220
|
-
selectHandler: (content, label) => {
|
|
221
|
-
return [
|
|
222
|
-
`类型:${label.__data__?.sub_class || '未知'}`,
|
|
223
|
-
...content,
|
|
224
|
-
`标注人:${label.__data__?.user_name || '未知'}`];
|
|
225
|
-
},
|
|
226
|
-
},
|
|
227
|
-
labelDrawing: (canvas, label, region) => {
|
|
228
|
-
const ctx = canvas.getContext('2d');
|
|
229
|
-
ctx.beginPath();
|
|
230
|
-
const determine = label?.__data__?.determine;
|
|
231
|
-
if (label.region.width < 0) {
|
|
232
|
-
region.y = region.y + region.height;
|
|
233
|
-
}
|
|
234
|
-
if (label.region.height < 0) {
|
|
235
|
-
region.y = region.y - region.height;
|
|
236
|
-
}
|
|
237
|
-
if (!determine) {
|
|
238
|
-
ctx.drawImage(checkEmptyImg, region.x + 5, region.y + region.height + 5,
|
|
239
|
-
20, 20);
|
|
240
|
-
ctx.drawImage(crossEmptyImg, region.x + 30,
|
|
241
|
-
region.y + region.height + 5, 20, 20);
|
|
242
|
-
ctx.drawImage(deleteEmptyImg, region.x + 55,
|
|
243
|
-
region.y + region.height + 5, 20, 20);
|
|
244
|
-
} else if (determine === 1) {
|
|
245
|
-
ctx.drawImage(checkImg, region.x + 5, region.y + region.height + 5, 20,
|
|
246
|
-
20);
|
|
247
|
-
ctx.drawImage(crossEmptyImg, region.x + 30,
|
|
248
|
-
region.y + region.height + 5, 20, 20);
|
|
249
|
-
ctx.drawImage(deleteEmptyImg, region.x + 55,
|
|
250
|
-
region.y + region.height + 5, 20, 20);
|
|
251
|
-
ctx.drawImage(hasAuditImg, region.x - 23, region.y - 15, 46, 35);
|
|
252
|
-
} else if (determine === 2) {
|
|
253
|
-
ctx.drawImage(checkEmptyImg, region.x + 5, region.y + region.height + 5,
|
|
254
|
-
20, 20);
|
|
255
|
-
ctx.drawImage(crossImg, region.x + 30, region.y + region.height + 5, 20,
|
|
256
|
-
20);
|
|
257
|
-
ctx.drawImage(deleteEmptyImg, region.x + 55,
|
|
258
|
-
region.y + region.height + 5, 20, 20);
|
|
259
|
-
ctx.drawImage(hasAuditImg, region.x - 23, region.y - 15, 46, 35);
|
|
260
|
-
} else if (determine === 3) {
|
|
261
|
-
ctx.drawImage(checkEmptyImg, region.x + 5, region.y + region.height + 5,
|
|
262
|
-
20, 20);
|
|
263
|
-
ctx.drawImage(crossEmptyImg, region.x + 30,
|
|
264
|
-
region.y + region.height + 5, 20, 20);
|
|
265
|
-
ctx.drawImage(deleteImg, region.x + 55, region.y + region.height + 5,
|
|
266
|
-
20, 20);
|
|
267
|
-
ctx.drawImage(hasAuditImg, region.x - 23, region.y - 15, 46, 35);
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
});
|
|
271
|
-
/* kv.board.startDraw({
|
|
272
|
-
tool: KfbView.marks.POLYGON,
|
|
273
|
-
});*/
|
|
274
|
-
kv.viewer.addHandler('zoom', (res) => {
|
|
275
|
-
const zoom = kv.viewer.viewport.viewportToImageZoom(res.zoom) *
|
|
276
|
-
kv.$options.scale;
|
|
277
|
-
// console.log(zoom.toFixed(2) / 1);
|
|
278
|
-
});
|
|
279
|
-
console.log(kv);
|
|
280
|
-
let list = [];
|
|
281
|
-
document.querySelector('#a').onchange = debounce(changeRange, 500);
|
|
282
|
-
document.querySelector('#s').onchange = debounce(changeRange, 500);
|
|
283
|
-
document.querySelector('#l').onchange = debounce(changeRange, 500);
|
|
284
|
-
document.querySelector('#r').onchange = debounce(changeRange, 500);
|
|
285
|
-
document.querySelector('#g').onchange = debounce(changeRange, 500);
|
|
286
|
-
document.querySelector('#b').onchange = debounce(changeRange, 500);
|
|
287
|
-
|
|
288
|
-
// eslint-disable-next-line no-unused-vars
|
|
289
|
-
function changeRange() {
|
|
290
|
-
cacheImage = {};
|
|
291
|
-
kv.viewer.forceRedraw();
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const rect = document.querySelector('#rect');
|
|
295
|
-
const dot = document.querySelector('#dot');
|
|
296
|
-
const font = document.querySelector('#font');
|
|
297
|
-
const flag = document.querySelector('#flag');
|
|
298
|
-
const star = document.querySelector('#star');
|
|
299
|
-
const line = document.querySelector('#line');
|
|
300
|
-
const ellipse = document.querySelector('#ellipse');
|
|
301
|
-
const polygon = document.querySelector('#polygon');
|
|
302
|
-
const curve1 = document.querySelector('#curve1');
|
|
303
|
-
|
|
304
|
-
rect.onclick = () => {
|
|
305
|
-
kv.board.startDraw({
|
|
306
|
-
tool: KfbView.marks.RECTANGLE,
|
|
307
|
-
isROI: false,
|
|
308
|
-
measure: true,
|
|
309
|
-
});
|
|
310
|
-
};
|
|
311
|
-
line.onclick = () => {
|
|
312
|
-
kv.board.startDraw({
|
|
313
|
-
tool: KfbView.marks.LINE,
|
|
314
|
-
once: true,
|
|
315
|
-
});
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
ellipse.onclick = () => {
|
|
319
|
-
kv.board.startDraw({
|
|
320
|
-
tool: KfbView.marks.ELLIPSE,
|
|
321
|
-
// isROI: true,
|
|
322
|
-
// fillStyle: '#0000ff8d',
|
|
323
|
-
once: true,
|
|
324
|
-
});
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
dot.onclick = () => {
|
|
328
|
-
kv.board.startDraw({
|
|
329
|
-
tool: KfbView.marks.DOT,
|
|
330
|
-
lineWidth: 10,
|
|
331
|
-
once: true,
|
|
332
|
-
});
|
|
333
|
-
};
|
|
334
|
-
font.onclick = () => {
|
|
335
|
-
kv.board.startDraw({
|
|
336
|
-
tool: KfbView.marks.FONT,
|
|
337
|
-
fontSize: 40,
|
|
338
|
-
text: '测试文字',
|
|
339
|
-
once: true,
|
|
340
|
-
});
|
|
341
|
-
};
|
|
342
|
-
flag.onclick = () => {
|
|
343
|
-
kv.board.startDraw({
|
|
344
|
-
tool: KfbView.marks.FLAG,
|
|
345
|
-
once: true,
|
|
346
|
-
});
|
|
347
|
-
};
|
|
348
|
-
star.onclick = () => {
|
|
349
|
-
kv.board.startDraw({
|
|
350
|
-
tool: KfbView.marks.STAR,
|
|
351
|
-
once: true,
|
|
352
|
-
});
|
|
353
|
-
};
|
|
354
|
-
polygon.onclick = () => {
|
|
355
|
-
kv.board.startDraw({
|
|
356
|
-
tool: KfbView.marks.POLYGON,
|
|
357
|
-
once: true,
|
|
358
|
-
isClose: false,
|
|
359
|
-
enableDbClickClose: true,
|
|
360
|
-
});
|
|
361
|
-
};
|
|
362
|
-
curve1.onclick = () => {
|
|
363
|
-
kv.board.startDraw({
|
|
364
|
-
tool: KfbView.marks.POLYGON,
|
|
365
|
-
once: true,
|
|
366
|
-
enableDbClickClose: true,
|
|
367
|
-
});
|
|
368
|
-
};
|
|
369
|
-
/* kv.viewer.addHandler('tile-loaded', (e) => {
|
|
370
|
-
console.log(e);
|
|
371
|
-
});
|
|
372
|
-
kv.viewer.addHandler('update-level', (e) => {
|
|
373
|
-
console.log(e);
|
|
374
|
-
});*/
|
|
375
|
-
kv.$on(KfbView.events.EVENT_END_PAINTING, (e) => {
|
|
376
|
-
console.time('appendLabelList');
|
|
377
|
-
kv.appendLabelList([e.detail]);
|
|
378
|
-
console.timeEnd('appendLabelList');
|
|
379
|
-
// kv.board.endDraw();
|
|
380
|
-
});
|
|
381
|
-
kv.$on(KfbView.events.EVENT_DELETE_LABEL, (e) => {
|
|
382
|
-
console.log('EVENT_DELETE_LABEL', e.detail);
|
|
383
|
-
// kv.board.endDraw();
|
|
384
|
-
});
|
|
385
|
-
kv.$on(KfbView.events.EVENT_SELECT_LABEL, (e) => {
|
|
386
|
-
// kv.board.endDraw();
|
|
387
|
-
console.log('EVENT_SELECT_LABEL', e.detail);
|
|
388
|
-
});
|
|
389
|
-
kv.$on(KfbView.events.EVENT_CANCEL_SELECT_LABEL, (e) => {
|
|
390
|
-
// kv.board.endDraw();
|
|
391
|
-
console.log(e.detail);
|
|
392
|
-
});
|
|
393
|
-
kv.$on(KfbView.events.EVENT_DB_CLICK_LABEL, (e) => {
|
|
394
|
-
// kv.board.endDraw();
|
|
395
|
-
console.log('EVENT_DB_CLICK_LABEL', e.detail);
|
|
396
|
-
});
|
|
397
|
-
const {width, height} = kv.$options;
|
|
398
|
-
kv.$on(KfbView.events.EVENT_TAILORING_SCREENSHOT, (e) => {
|
|
399
|
-
console.log(e.detail);
|
|
400
|
-
});
|
|
401
|
-
/* kv.tailoring.init(
|
|
402
|
-
{
|
|
403
|
-
left: width / 2 - 100,
|
|
404
|
-
top: height / 2 - 100,
|
|
405
|
-
height: 200,
|
|
406
|
-
width: 200,
|
|
407
|
-
color: '#F00',
|
|
408
|
-
});*/
|
|
409
|
-
setTimeout(() => {
|
|
410
|
-
// kv.destroy();
|
|
411
|
-
setTimeout(() => {
|
|
412
|
-
// kv.destroy();
|
|
413
|
-
}, 6000);
|
|
414
|
-
}, 6000);
|
|
415
|
-
|
|
416
|
-
// initLabels();
|
|
417
|
-
|
|
418
|
-
function initLabels() {
|
|
419
|
-
const labels = [];
|
|
420
|
-
const colors = ['#027AFF', '#f56c6c', '#11ff6c', '#f56cff', '#11ffff'];
|
|
421
|
-
for (let i = 0; i < 10000; i++) {
|
|
422
|
-
const point = {
|
|
423
|
-
x: Math.random() * data.width,
|
|
424
|
-
y: Math.random() * data.height,
|
|
425
|
-
};
|
|
426
|
-
const point1 = {
|
|
427
|
-
x: point.x + Math.random() * 1000,
|
|
428
|
-
y: point.y + Math.random() * 1000,
|
|
429
|
-
};
|
|
430
|
-
const label = {
|
|
431
|
-
// fillStyle: 'rgba(2, 122, 255, 1)',
|
|
432
|
-
lineWidth: 2,
|
|
433
|
-
points: [point, point1],
|
|
434
|
-
scale: 0.1,
|
|
435
|
-
strokeStyle: colors[(Math.random() * colors.length) >> 0],
|
|
436
|
-
tool: 'Rectangle',
|
|
437
|
-
move: true,
|
|
438
|
-
resize: true,
|
|
439
|
-
};
|
|
440
|
-
labels.push(label);
|
|
441
|
-
}
|
|
442
|
-
kv.initLabelList(labels);
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
document.querySelector('#reDraw').addEventListener('click', () => {
|
|
446
|
-
document.querySelector('#a').value = 1;
|
|
447
|
-
document.querySelector('#s').value = 0;
|
|
448
|
-
document.querySelector('#l').value = 0;
|
|
449
|
-
document.querySelector('#r').value = 0;
|
|
450
|
-
document.querySelector('#g').value = 0;
|
|
451
|
-
document.querySelector('#b').value = 0;
|
|
452
|
-
kv.viewer.forceRedraw();
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
/*
|
|
456
|
-
instance.get(
|
|
457
|
-
`/image_annotation?file=${fileName}&slide_label_id=38749&user_id=27`).
|
|
458
|
-
then(({data}) => {
|
|
459
|
-
data = data.data;
|
|
460
|
-
const labelRegionList = [];
|
|
461
|
-
(data || []).filter(item => item.id && item.region.width > 0).
|
|
462
|
-
forEach(item => {
|
|
463
|
-
const subClass = item.sub_class || item.subClass;
|
|
464
|
-
const is_ai = !!item.score || subClass === 'ROI' && !item.user_name; // 通过分数来判断是否是AI识别标注
|
|
465
|
-
const r = {
|
|
466
|
-
...item,
|
|
467
|
-
tool: (item.type || item.tool) === 'Spline' ?
|
|
468
|
-
'Polygon' :
|
|
469
|
-
(item.type || item.tool),
|
|
470
|
-
strokeStyle: item.strokeStyle || `#${item.color.toString(16).
|
|
471
|
-
slice(2)}${item.color.toString(16).slice(0, 2)}`,
|
|
472
|
-
measure: true,
|
|
473
|
-
sub_class: subClass,
|
|
474
|
-
isROI: subClass === 'ROI',
|
|
475
|
-
isClose: item.isClose || item.is_close,
|
|
476
|
-
lineWidth: item.lineWidth || item.width,
|
|
477
|
-
text: item.text || item.description,
|
|
478
|
-
is_ai,
|
|
479
|
-
ai_sub_class: is_ai ? (item.ai_sub_class ?? item.sub_class) : '',
|
|
480
|
-
ai_points: is_ai ? (item.ai_points ?? item.points) : '',
|
|
481
|
-
ai_region: is_ai ? (item.ai_region ?? item.region) : '',
|
|
482
|
-
};
|
|
483
|
-
r.content = (kv.area.getMeasureContent(r)?.texts || []).slice(1, -1);
|
|
484
|
-
labelRegionList.push({
|
|
485
|
-
...r,
|
|
486
|
-
});
|
|
487
|
-
});
|
|
488
|
-
console.time('initLabelList');
|
|
489
|
-
kv.initLabelList(labelRegionList.filter(({deleted_at}) => !deleted_at));
|
|
490
|
-
console.timeEnd('initLabelList');
|
|
491
|
-
});
|
|
492
|
-
document.querySelector('#reDraw').addEventListener('click', () => {
|
|
493
|
-
instance.get(
|
|
494
|
-
`/image_annotation?file=${fileName}&slide_label_id=38749&user_id=27`).
|
|
495
|
-
then(({data}) => {
|
|
496
|
-
data = data.data;
|
|
497
|
-
const labelRegionList = [];
|
|
498
|
-
(data || []).filter(item => item.id && item.region.width > 0).
|
|
499
|
-
forEach(item => {
|
|
500
|
-
const subClass = item.sub_class || item.subClass;
|
|
501
|
-
const is_ai = !!item.score || subClass === 'ROI' && !item.user_name; // 通过分数来判断是否是AI识别标注
|
|
502
|
-
const r = {
|
|
503
|
-
...item,
|
|
504
|
-
tool: (item.type || item.tool) === 'Spline' ?
|
|
505
|
-
'Polygon' :
|
|
506
|
-
(item.type || item.tool),
|
|
507
|
-
strokeStyle: item.strokeStyle || `#${item.color.toString(16).
|
|
508
|
-
slice(2)}${item.color.toString(16).slice(0, 2)}`,
|
|
509
|
-
measure: true,
|
|
510
|
-
sub_class: subClass,
|
|
511
|
-
isROI: subClass === 'ROI',
|
|
512
|
-
isClose: item.isClose || item.is_close,
|
|
513
|
-
lineWidth: item.lineWidth || item.width,
|
|
514
|
-
text: item.text || item.description,
|
|
515
|
-
is_ai,
|
|
516
|
-
ai_sub_class: is_ai ? (item.ai_sub_class ?? item.sub_class) : '',
|
|
517
|
-
ai_points: is_ai ? (item.ai_points ?? item.points) : '',
|
|
518
|
-
ai_region: is_ai ? (item.ai_region ?? item.region) : '',
|
|
519
|
-
};
|
|
520
|
-
r.content = (kv.area.getMeasureContent(r)?.texts || []).slice(1,
|
|
521
|
-
-1);
|
|
522
|
-
labelRegionList.push({
|
|
523
|
-
...r,
|
|
524
|
-
});
|
|
525
|
-
});
|
|
526
|
-
console.time('initLabelList');
|
|
527
|
-
kv.initLabelList(labelRegionList.filter(({deleted_at}) => !deleted_at));
|
|
528
|
-
console.timeEnd('initLabelList');
|
|
529
|
-
});
|
|
530
|
-
});*/
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
/**
|
|
534
|
-
* 解析参数,生成对应的请求参数字符串
|
|
535
|
-
* @param {Object} data
|
|
536
|
-
* @return {string}
|
|
537
|
-
*/
|
|
538
|
-
function encodeQueryData(data) {
|
|
539
|
-
const ret = [];
|
|
540
|
-
for (const d in data) {
|
|
541
|
-
if (Object.prototype.hasOwnProperty.call(data, d)) {
|
|
542
|
-
ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
return ret.join('&');
|
|
546
|
-
}
|
package/example/label/check.svg
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
2
|
-
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
-
<svg t="1663313807126" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7312"
|
|
4
|
-
xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
|
|
5
|
-
<path
|
|
6
|
-
d="M506.0096 16.49664C228.71552 16.49664 3.92704 241.27488 3.92704 518.57408c0 277.2736 224.78848 502.07232 502.07232 502.07232s502.07232-224.79872 502.07232-502.07232c0-277.2992-224.78848-502.07744-502.0672-502.07744z m269.12256 369.54112l-312.40704 312.40192a33.4592 33.4592 0 0 1-47.32928 0l-156.20096-156.20096a33.46432 33.46432 0 0 1 0-47.32928 33.46944 33.46944 0 0 1 47.3344 0l132.53632 132.5312 288.73216-288.73728a33.46944 33.46944 0 1 1 47.3344 47.3344z m0 0"
|
|
7
|
-
fill="#67C23A" p-id="7313"></path>
|
|
8
|
-
</svg>
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<svg t="1663314387498" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
2
|
-
p-id="11052" width="200" height="200">
|
|
3
|
-
<path
|
|
4
|
-
d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 955.733A443.733 443.733 0 1 1 955.733 512 443.733 443.733 0 0 1 512 955.733z"
|
|
5
|
-
p-id="11053" fill="#67C23A"></path>
|
|
6
|
-
<path
|
|
7
|
-
d="M753.323 318.805L439.637 632.491l-168.96-168.619A34.133 34.133 0 1 0 222.208 512l193.195 193.195a34.133 34.133 0 0 0 48.128 0l337.92-337.92a34.133 34.133 0 1 0-48.128-48.128z"
|
|
8
|
-
p-id="11054" fill="#67C23A"></path>
|
|
9
|
-
</svg>
|
package/example/label/cross.svg
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<svg t="1663314014710" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8897"
|
|
2
|
-
width="200" height="200">
|
|
3
|
-
<path
|
|
4
|
-
d="M512 32C251.4285715625 32 32 251.4285715625 32 512s219.4285715625 480 480 480 480-219.4285715625 480-480-219.4285715625-480-480-480z m205.7142853125 617.142856875c20.5714284375 20.5714284375 20.5714284375 48 0 61.714286249999994-20.5714284375 20.5714284375-48 20.5714284375-61.714285312499996 0l-137.142856875-137.1428578125L374.857143125 717.7142853125c-20.5714284375 20.5714284375-48 20.5714284375-68.5714284375 0s-20.5714284375-54.857143125 0-68.5714284375l144-144-137.1428578125-137.142856875c-20.5714284375-13.714285312500001-20.5714284375-41.142856875 0-61.714285312499996 20.5714284375-20.5714284375 48-20.5714284375 61.714286249999994 0l137.142856875 137.142856875 144-144c20.5714284375-20.5714284375 48-20.5714284375 68.5714284375 0 20.5714284375 20.5714284375 20.5714284375 48 0 68.5714284375L580.5714284375 512l137.142856875 137.142856875z"
|
|
5
|
-
fill="#F56C6C" p-id="8898"></path>
|
|
6
|
-
</svg>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<svg t="1663313981454" class="icon" viewBox="0 0 1035 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8704"
|
|
2
|
-
width="200" height="200">
|
|
3
|
-
<path
|
|
4
|
-
d="M972.550494 326.095636c-24.872645-58.823304-60.482966-111.631728-105.828482-156.977244-45.345516-45.345516-98.15394-80.944698-156.977244-105.828482-60.917374-25.763738-125.599617-38.829396-192.253405-38.829396S386.155332 37.526172 325.22682 63.28991c-58.812166 24.872645-111.631728 60.482966-156.977244 105.828482s-80.944698 98.15394-105.828482 156.977244c-25.763738 60.917374-38.829396 125.599617-38.829396 192.253405s13.065657 131.336031 38.829396 192.264543c24.872645 58.812166 60.482966 111.631728 105.828482 156.977244s98.15394 80.944698 156.977244 105.828482c60.917374 25.763738 125.599617 38.829396 192.264543 38.829396s131.336031-13.065657 192.253405-38.829396c58.823304-24.872645 111.631728-60.482966 156.977244-105.828482 45.345516-45.345516 80.944698-98.15394 105.828482-156.977244 25.763738-60.917374 38.829396-125.599617 38.829395-192.264543s-13.065657-131.336031-38.829395-192.253405zM517.491363 923.139364c-223.196624 0-404.779185-181.582561-404.779184-404.779185s181.571422-404.790323 404.779184-404.790323 404.779185 181.582561 404.779185 404.779185-181.582561 404.779185-404.779185 404.779184z m218.62977-560.40865L580.491668 518.360179l155.629465 155.629466c17.398599 17.398599 17.398599 45.612844 0 63.011443-8.699299 8.699299-20.105295 13.054519-31.500152 13.054518s-22.800853-4.355219-31.500153-13.054518L517.491363 581.371623 361.861898 737.001088c-8.699299 8.699299-20.105295 13.054519-31.500152 13.054518s-22.800853-4.355219-31.500153-13.054518c-17.398599-17.398599-17.398599-45.612844 0-63.011443l155.629466-155.629466-155.629466-155.629465c-17.398599-17.398599-17.398599-45.612844 0-63.011443s45.612844-17.398599 63.011444 0L517.502502 455.348736l155.629465-155.629465c17.398599-17.398599 45.612844-17.398599 63.011443 0s17.398599 45.612844 0 63.011443z"
|
|
5
|
-
p-id="8705" fill="#F56C6C"></path>
|
|
6
|
-
</svg>
|
package/example/label/delete.svg
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
2
|
-
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
-
<svg t="1663318752356" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
4
|
-
p-id="12242" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
|
|
5
|
-
<path
|
|
6
|
-
d="M895.464448 119.006208 677.967872 119.006208c0 0-32.8448 1.020928-58.648576-26.943488-10.395648-12.050432-27.804672-23.795712-56.4224-24.799232l-41.183232 0-6.280192 0-41.182208 0c-28.618752 1.004544-46.031872 12.749824-56.4224 24.799232-25.807872 27.964416-58.6496 26.943488-58.6496 26.943488L141.682688 119.006208c-13.99296 0-25.33888 11.34592-25.33888 25.33888l0 93.090816c-0.053248 26.927104 26.083328 26.396672 26.083328 26.396672l49.83808 0L192.265216 913.65376c0 0-3.966976 44.084224 40.121344 46.45888l269.31712 0 33.738752 0 30.808064 0.238592 38.500352 0 174.934016 0 24.297472 0 0.782336-0.238592c44.080128-2.374656 40.117248-46.45888 40.117248-46.45888L844.88192 263.832576l49.842176 0c0 0 26.133504 0.530432 26.083328-26.396672l0-93.090816C920.8064 130.353152 909.46048 119.006208 895.464448 119.006208zM430.539776 803.171328c0 17.042432-13.828096 30.865408-30.865408 30.865408-17.042432 0-30.865408-13.824-30.865408-30.865408L368.80896 320.736256c0-17.042432 13.824-30.865408 30.865408-30.865408 17.038336 0 30.865408 13.824 30.865408 30.865408L430.539776 803.171328zM663.436288 803.171328c0 17.042432-13.824 30.865408-30.865408 30.865408-17.038336 0-30.865408-13.824-30.865408-30.865408L601.705472 320.736256c0-17.042432 13.828096-30.865408 30.865408-30.865408 17.041408 0 30.865408 13.824 30.865408 30.865408L663.436288 803.171328z"
|
|
7
|
-
p-id="12243" fill="#d81e06"></path>
|
|
8
|
-
</svg>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
2
|
-
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
-
<svg t="1663318728465" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
4
|
-
p-id="12045" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
|
|
5
|
-
<path
|
|
6
|
-
d="M202.666667 256h-42.666667a32 32 0 0 1 0-64h704a32 32 0 0 1 0 64H266.666667v565.333333a53.333333 53.333333 0 0 0 53.333333 53.333334h384a53.333333 53.333333 0 0 0 53.333333-53.333334V352a32 32 0 0 1 64 0v469.333333c0 64.8-52.533333 117.333333-117.333333 117.333334H320c-64.8 0-117.333333-52.533333-117.333333-117.333334V256z m224-106.666667a32 32 0 0 1 0-64h170.666666a32 32 0 0 1 0 64H426.666667z m-32 288a32 32 0 0 1 64 0v256a32 32 0 0 1-64 0V437.333333z m170.666666 0a32 32 0 0 1 64 0v256a32 32 0 0 1-64 0V437.333333z"
|
|
7
|
-
p-id="12046" fill="#d81e06"></path>
|
|
8
|
-
</svg>
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
2
|
-
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
-
<svg t="1663319022294" class="icon" viewBox="0 0 1300 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
4
|
-
p-id="12551" xmlns:xlink="http://www.w3.org/1999/xlink" width="253.90625" height="200">
|
|
5
|
-
<path
|
|
6
|
-
d="M772.138805 84.411091l-15.715103-14.58894-2.04757 21.345922-18.735269 10.442609 19.707865 8.497417 4.095141 21.089976 14.179425-16.124617 21.294732 2.559463-10.903312-18.428134 9.060499-19.451919-20.936408 4.658223zM1067.142514 642.37403l19.451918 9.00931-4.658222-20.936408 14.588939-15.715103-21.345922-1.996381-10.442609-18.735269-8.497417 19.656676-21.038786 4.14633 16.073428 14.179425-2.559463 21.294732 18.428134-10.903312zM588.727685 108.777179l20.270947 7.012928-6.756982-20.373325 12.950883-17.097213-21.448301 0.153567-12.234233-17.609105-6.501036 20.424515-20.526893 6.1939 17.404348 12.541369-0.409514 21.4483 17.250781-12.694936zM991.587165 753.659482l-21.089975-3.788005 9.828338 19.093594-10.135474 18.888837 21.192354-3.480869 14.844886 15.459156 3.224923-21.192354 19.298351-9.367634-19.144783-9.623581-2.917788-21.243543-15.100832 15.254399zM440.534776 128.74099l-17.762674-11.927098 1.330921 21.397111-16.892456 13.258019 20.78284 5.323683 7.371253 20.117379 11.517584-18.069809 21.397111-0.819028-13.667533-16.534131 5.886765-20.629272-19.963811 7.883146zM866.787748 868.425804l-17.813863-11.978287 1.330921 21.397111-16.841267 13.258019 20.731651 5.323683 7.371253 20.117379 11.517584-18.069809 21.4483-0.819028-13.667532-16.534131 5.835575-20.629272-19.912622 7.934335zM534.774204 894.225192l-1.996381 21.345921-18.735269 10.442609 19.656676 8.497418 4.14633 21.038786 14.179425-16.073428 21.294733 2.559463-10.903313-18.428134 9.00931-19.451919-20.936408 4.658223-15.715103-14.588939zM242.739473 420.724532l19.503109 9.060499-4.709412-20.936407 14.588939-15.715103-21.345922-2.047571-10.442609-18.735269-8.497417 19.707865-21.038786 4.095141 16.073428 14.230614-2.559464 21.294733 18.428134-10.954502zM717.622243 952.632138l20.270947 7.012928-6.756982-20.322136 12.950883-17.097213-21.448301 0.102379-12.234233-17.609106-6.552225 20.424515-20.475704 6.24509 17.404348 12.490179-0.460703 21.4483 17.30197-12.694936zM303.757072 248.114346l-21.089976-3.788006 9.828338 19.042405-10.135473 18.888837 21.192354-3.42968 14.844885 15.459157 3.224924-21.243544 19.298351-9.316445-19.144784-9.623581-2.917787-21.243543-15.100832 15.2544z"
|
|
7
|
-
fill="#13C463" p-id="12552"></path>
|
|
8
|
-
<path
|
|
9
|
-
d="M407.620081 90.604991a486.861057 486.861057 0 0 1 504.521352 11.77353l25.031548-14.435371a511.892605 511.892605 0 0 0-797.528678 459.57718l25.031548-14.384182A486.758678 486.758678 0 0 1 407.620081 90.604991zM893.201406 933.333787a486.861057 486.861057 0 0 1-504.521351-11.619963l-24.980359 14.384183A511.892605 511.892605 0 0 0 1161.177185 476.572015L1136.401583 490.956197a486.912246 486.912246 0 0 1-243.200177 442.37759z"
|
|
10
|
-
fill="#13C463" p-id="12553"></path>
|
|
11
|
-
<path
|
|
12
|
-
d="M998.804851 570.145983l-29.79215 17.148403a326.792239 326.792239 0 0 1-413.148521 238.08125l-29.79215 17.199592a353.205897 353.205897 0 0 0 472.732821-272.429245zM486.861057 228.099345a326.587482 326.587482 0 0 1 258.14744-29.536204l29.79215-17.199591A353.205897 353.205897 0 0 0 302.016637 453.792794l29.843339-17.148402a326.485103 326.485103 0 0 1 155.001081-208.545047zM1071.442411 35.32059L26.925551 637.255104a53.697534 53.697534 0 0 0-19.707865 73.405399l148.80718 258.19863a53.799913 53.799913 0 0 0 73.4054 19.759055l1044.260914-601.934514a53.748724 53.748724 0 0 0 19.759054-73.4054l-148.602423-258.19863a53.799913 53.799913 0 0 0-73.4054-19.759054z m199.996441 290.754999a28.154093 28.154093 0 0 1-10.237852 38.443135l-1044.260914 601.883325a28.154093 28.154093 0 0 1-38.443135-10.237852L29.382636 697.863188a28.102904 28.102904 0 0 1 2.815409-32.146855 27.130308 27.130308 0 0 1 7.524821-6.296279L1084.239727 57.536729a28.102904 28.102904 0 0 1 38.391945 10.237852z"
|
|
13
|
-
fill="#13C463" p-id="12554"></path>
|
|
14
|
-
<path
|
|
15
|
-
d="M544.653732 672.985208a20.475704 20.475704 0 0 1-9.777149 10.903312l-112.616373 64.856793q-13.360397 7.729578-21.243543-5.835575L363.44375 677.029159l136.061054-78.575515-50.677368-87.789581-163.805634 94.546564 8.855742 15.356778 147.732206-85.281308 33.068263 57.280782-120.192384 69.310259-18.274566-31.583774-15.766292 9.111689 66.801985 115.687729q14.896075 25.901766 39.722866 11.568772l121.164979-69.924529a35.422968 35.422968 0 0 0 15.868671-19.144784q2.303517-12.746126-17.865052-55.233212l-18.120998 4.043952q19.298351 36.856268 16.63651 46.582227zM588.676496 411.664033l-15.049643 12.490179c4.504655 3.071356 9.828338 7.012929 15.91986 11.875909l-83.592062 48.271473 22.83041 39.518109 15.356778-8.906932-14.588939-25.236305 152.339239-87.94315 13.974668 24.161331 15.356778-8.855742-22.16495-38.238377-83.233737 48.066715C598.402455 419.751936 592.669258 414.63301 588.676496 411.664033z"
|
|
16
|
-
fill="#13C463" p-id="12555"></path>
|
|
17
|
-
<path
|
|
18
|
-
d="M621.079298 451.489278l-15.817482 9.214066 12.694937 21.909004-64.088954 36.958646 61.427112 106.473662 15.356778-8.906931-7.422442-13.104451 48.680986-28.102904 25.59463 44.585846 15.817482-9.162878-25.59463-44.534657 49.397636-28.512418 7.115307 12.285423 15.356778-8.906931-61.068787-105.603445-64.754415 37.36816z m42.487086 110.108099l-48.732176 28.102904-14.53775-25.236306 48.680987-28.102904zM640.889541 522.130457l-48.732176 28.102904-14.588939-25.236305 48.732176-28.102904z m87.891961 1.638056l-49.397637 28.512418-14.588939-25.031548 49.397636-28.563607z m-37.265782-64.549657l14.53775 25.236305-49.346447 28.512418-14.588939-25.236305zM951.76192 400.76072a248.370292 248.370292 0 0 0 7.6272-72.893507l-17.404348 0.71665a226.717235 226.717235 0 0 1-59.635489 164.368716l16.431753 8.702174a244.889422 244.889422 0 0 0 48.680986-85.486065 347.779836 347.779836 0 0 1 63.935387 21.038786l4.81179-18.01862a378.800528 378.800528 0 0 0-64.447279-18.428134z"
|
|
19
|
-
fill="#13C463" p-id="12556"></path>
|
|
20
|
-
<path
|
|
21
|
-
d="M843.08712 377.776742l-0.921406 1.38211-1.38211 1.689246 10.749744 11.05688q20.117379-12.797315 47.75958-30.713556a183.257553 183.257553 0 0 1-40.951408 82.875413l16.175806 8.241471q49.704772-60.19857 44.944171-145.172743l-16.63651 0.563082a196.054868 196.054868 0 0 1-0.819028 33.580155q-13.667533 9.265256-39.876434 26.771983 6.091522-21.038786 5.630819-63.833008l60.096192-34.706319-8.241471-14.230614-48.680987 28.102904a290.550243 290.550243 0 0 0-23.751817-18.786459l-14.691318 12.029477a167.747207 167.747207 0 0 1 23.035168 15.356778l-54.874888 31.686152L808.790316 338.361012l42.589465-24.570845q-0.102379 48.117905-8.292661 63.986575z"
|
|
22
|
-
fill="#13C463" p-id="12557"></path>
|
|
23
|
-
<path
|
|
24
|
-
d="M852.915458 413.046143q-30.713556-14.077047-55.745104-22.523275l-8.241471-14.281803 25.901766-14.947264-8.753364-15.356779-25.901766 14.947264-24.724413-42.794221-15.356778 8.753363 24.673224 42.794222-30.252853 17.455538 8.753363 15.356778 29.689771-17.097213a260.041443 260.041443 0 0 1 11.517584 96.952459l15.817482 12.234234a298.177442 298.177442 0 0 0-7.524822-76.374377l63.474683 109.954532 15.356778-8.753364-64.498468-111.746156c10.698555 5.118926 25.59463 12.950883 44.841792 23.905385z"
|
|
25
|
-
fill="#13C463" p-id="12558"></path>
|
|
26
|
-
</svg>
|