med-viewer-sdk 0.1.19 → 0.1.21
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/core/AnnoAnnotator.d.ts +5 -4
- package/dist/core/ColorAdjustPlugin.d.ts +3 -2
- package/dist/core/Engine.d.ts +12 -1
- package/dist/core/Magnification.d.ts +16 -0
- package/dist/core/SelectionPlugin.d.ts +5 -1
- package/dist/core/Toolbar.d.ts +16 -0
- package/dist/med-viewer-sdk.mjs +180 -12
- package/dist/med-viewer-sdk.umd.js +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { MedViewerEngine } from
|
|
3
|
-
import { BaseAnnotator } from
|
|
1
|
+
import 'annotorious-openseadragon-ld/dist/annotorious.min.css';
|
|
2
|
+
import { MedViewerEngine } from './Engine';
|
|
3
|
+
import { BaseAnnotator } from './BaseAnnotator';
|
|
4
4
|
export declare class AnnoAnnotator extends BaseAnnotator {
|
|
5
5
|
anno: any;
|
|
6
6
|
constructor(engine: MedViewerEngine, config?: any);
|
|
7
7
|
setEnabled(enabled: boolean): void;
|
|
8
|
-
setTool(tool:
|
|
8
|
+
setTool(tool: 'rect' | 'polygon' | 'line' | 'point' | 'circle' | 'ellipse' | 'freehand' | null, color?: string): void;
|
|
9
|
+
setLocale(locale: string): void;
|
|
9
10
|
getAnnotations(): any[];
|
|
10
11
|
setAnnotations(data: any[]): void;
|
|
11
12
|
clear(): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import 'openseadragon-filtering';
|
|
2
2
|
export interface ColorAdjustments {
|
|
3
3
|
brightness?: number;
|
|
4
4
|
contrast?: number;
|
|
@@ -12,7 +12,8 @@ export interface ColorAdjustments {
|
|
|
12
12
|
export interface ColorAdjustOptions {
|
|
13
13
|
adjustments?: ColorAdjustments;
|
|
14
14
|
debounceMs?: number;
|
|
15
|
-
loadMode?:
|
|
15
|
+
loadMode?: 'async' | 'sync';
|
|
16
|
+
onAdjustmentsChange?: (adjustments: ColorAdjustments) => void;
|
|
16
17
|
}
|
|
17
18
|
export declare class ColorAdjustPlugin {
|
|
18
19
|
private viewer;
|
package/dist/core/Engine.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ import { ScalebarPlugin, type ScalebarOptions } from './Scalebar';
|
|
|
7
7
|
import { SelectionPlugin, type SelectionOptions } from './SelectionPlugin';
|
|
8
8
|
import { MedToolbar, type ToolbarOptions } from './Toolbar';
|
|
9
9
|
import { Locale } from '../i18n/i18n';
|
|
10
|
+
export interface AnnotoriousOptions {
|
|
11
|
+
onCreateAnnotation?: (annotation: any) => void;
|
|
12
|
+
onUpdateAnnotation?: (annotation: any, previous: any) => void;
|
|
13
|
+
onDeleteAnnotation?: (annotation: any) => void;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}
|
|
10
16
|
/**
|
|
11
17
|
* 引擎配置接口
|
|
12
18
|
*/
|
|
@@ -14,7 +20,7 @@ export interface MedEngineOptions {
|
|
|
14
20
|
osdOptions: OpenSeadragonType.Options;
|
|
15
21
|
locale?: Locale;
|
|
16
22
|
plugins?: {
|
|
17
|
-
annotorious?: boolean |
|
|
23
|
+
annotorious?: boolean | AnnotoriousOptions;
|
|
18
24
|
toolbar?: boolean | ToolbarOptions;
|
|
19
25
|
colorAdjust?: boolean | ColorAdjustOptions;
|
|
20
26
|
selection?: boolean | SelectionOptions;
|
|
@@ -90,4 +96,9 @@ export declare class MedViewerEngine {
|
|
|
90
96
|
* 销毁引擎与所有插件
|
|
91
97
|
*/
|
|
92
98
|
destroy(): void;
|
|
99
|
+
/**
|
|
100
|
+
* 动态设置语言
|
|
101
|
+
* @param locale 语言标识,如 'en' 或 'zh-CN'
|
|
102
|
+
*/
|
|
103
|
+
setLocale(locale: Locale): void;
|
|
93
104
|
}
|
|
@@ -32,6 +32,22 @@ export declare class MagnificationPlugin {
|
|
|
32
32
|
getMagnification(): number;
|
|
33
33
|
private setMagnification;
|
|
34
34
|
private fitToScreen;
|
|
35
|
+
/**
|
|
36
|
+
* 显示放大镜控件
|
|
37
|
+
*/
|
|
38
|
+
show(): void;
|
|
39
|
+
/**
|
|
40
|
+
* 隐藏放大镜控件
|
|
41
|
+
*/
|
|
42
|
+
hide(): void;
|
|
43
|
+
/**
|
|
44
|
+
* 切换放大镜控件的可见性
|
|
45
|
+
*/
|
|
46
|
+
toggle(): void;
|
|
47
|
+
/**
|
|
48
|
+
* 检查放大镜控件是否可见
|
|
49
|
+
*/
|
|
50
|
+
isVisible(): boolean;
|
|
35
51
|
refresh(): void;
|
|
36
52
|
destroy(): void;
|
|
37
53
|
private injectStyles;
|
|
@@ -13,7 +13,7 @@ export interface SelectionOptions {
|
|
|
13
13
|
startRotated?: boolean;
|
|
14
14
|
startRotatedHeight?: number;
|
|
15
15
|
restrictToImage?: boolean;
|
|
16
|
-
onSelection?: (rect: OpenSeadragon.Rect) => void;
|
|
16
|
+
onSelection?: (rect: OpenSeadragon.Rect, blob: Blob | null) => void;
|
|
17
17
|
onSelectionCanceled?: () => void;
|
|
18
18
|
onSelectionChange?: (rect: OpenSeadragon.Rect) => void;
|
|
19
19
|
onSelectionToggled?: (state: {
|
|
@@ -65,6 +65,10 @@ export declare class SelectionPlugin {
|
|
|
65
65
|
private selection;
|
|
66
66
|
private options;
|
|
67
67
|
constructor(viewer: OpenSeadragon.Viewer, options?: SelectionOptions);
|
|
68
|
+
/**
|
|
69
|
+
* 更新语言环境,刷新工具提示
|
|
70
|
+
*/
|
|
71
|
+
updateLocale(): void;
|
|
68
72
|
private init;
|
|
69
73
|
private setupSelection;
|
|
70
74
|
/**
|
package/dist/core/Toolbar.d.ts
CHANGED
|
@@ -30,6 +30,22 @@ export declare class MedToolbar {
|
|
|
30
30
|
private dropdownElement;
|
|
31
31
|
private outsideClickHandler;
|
|
32
32
|
constructor(engine: MedViewerEngine, options?: ToolbarOptions);
|
|
33
|
+
/**
|
|
34
|
+
* 显示工具栏
|
|
35
|
+
*/
|
|
36
|
+
show(): void;
|
|
37
|
+
/**
|
|
38
|
+
* 隐藏工具栏
|
|
39
|
+
*/
|
|
40
|
+
hide(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 切换工具栏的可见性
|
|
43
|
+
*/
|
|
44
|
+
toggle(): void;
|
|
45
|
+
/**
|
|
46
|
+
* 检查工具栏是否可见
|
|
47
|
+
*/
|
|
48
|
+
isVisible(): boolean;
|
|
33
49
|
destroy(): void;
|
|
34
50
|
private render;
|
|
35
51
|
private showDropdown;
|
package/dist/med-viewer-sdk.mjs
CHANGED
|
@@ -12552,7 +12552,7 @@ class AnnoAnnotator extends BaseAnnotator {
|
|
|
12552
12552
|
// 可以在此配置样式、偏好等
|
|
12553
12553
|
});
|
|
12554
12554
|
this.injectStyles();
|
|
12555
|
-
this.initEvents();
|
|
12555
|
+
this.initEvents(config);
|
|
12556
12556
|
}
|
|
12557
12557
|
setEnabled(enabled) {
|
|
12558
12558
|
this.anno.setDrawingEnabled(enabled);
|
|
@@ -12565,6 +12565,12 @@ class AnnoAnnotator extends BaseAnnotator {
|
|
|
12565
12565
|
this.setEnabled(true);
|
|
12566
12566
|
}
|
|
12567
12567
|
}
|
|
12568
|
+
setLocale(locale) {
|
|
12569
|
+
var _a2;
|
|
12570
|
+
if ((_a2 = this.anno) == null ? void 0 : _a2.setLocale) {
|
|
12571
|
+
this.anno.setLocale(locale);
|
|
12572
|
+
}
|
|
12573
|
+
}
|
|
12568
12574
|
getAnnotations() {
|
|
12569
12575
|
return this.anno.getAnnotations();
|
|
12570
12576
|
}
|
|
@@ -12577,10 +12583,22 @@ class AnnoAnnotator extends BaseAnnotator {
|
|
|
12577
12583
|
destroy() {
|
|
12578
12584
|
this.anno.destroy();
|
|
12579
12585
|
}
|
|
12580
|
-
initEvents() {
|
|
12581
|
-
|
|
12582
|
-
|
|
12583
|
-
|
|
12586
|
+
initEvents(config) {
|
|
12587
|
+
if (config.onCreateAnnotation) {
|
|
12588
|
+
this.anno.on("createAnnotation", (annotation) => {
|
|
12589
|
+
config.onCreateAnnotation(annotation);
|
|
12590
|
+
});
|
|
12591
|
+
}
|
|
12592
|
+
if (config.onUpdateAnnotation) {
|
|
12593
|
+
this.anno.on("updateAnnotation", (annotation, previous) => {
|
|
12594
|
+
config.onUpdateAnnotation(annotation, previous);
|
|
12595
|
+
});
|
|
12596
|
+
}
|
|
12597
|
+
if (config.onDeleteAnnotation) {
|
|
12598
|
+
this.anno.on("deleteAnnotation", (annotation) => {
|
|
12599
|
+
config.onDeleteAnnotation(annotation);
|
|
12600
|
+
});
|
|
12601
|
+
}
|
|
12584
12602
|
}
|
|
12585
12603
|
injectStyles() {
|
|
12586
12604
|
const styleId = "med-anno-v2-7-17-overrides";
|
|
@@ -13138,6 +13156,8 @@ class ColorAdjustPlugin {
|
|
|
13138
13156
|
},
|
|
13139
13157
|
debounceMs: 60,
|
|
13140
13158
|
loadMode: "async",
|
|
13159
|
+
onAdjustmentsChange: () => {
|
|
13160
|
+
},
|
|
13141
13161
|
...options
|
|
13142
13162
|
};
|
|
13143
13163
|
this._adjustments = { ...this.options.adjustments };
|
|
@@ -13189,6 +13209,9 @@ class ColorAdjustPlugin {
|
|
|
13189
13209
|
clearTimeout(this.debounceTimer);
|
|
13190
13210
|
this.debounceTimer = setTimeout(() => {
|
|
13191
13211
|
this.apply();
|
|
13212
|
+
if (this.options.onAdjustmentsChange) {
|
|
13213
|
+
this.options.onAdjustmentsChange(this._adjustments);
|
|
13214
|
+
}
|
|
13192
13215
|
this.debounceTimer = null;
|
|
13193
13216
|
}, this.options.debounceMs);
|
|
13194
13217
|
}
|
|
@@ -13198,6 +13221,9 @@ class ColorAdjustPlugin {
|
|
|
13198
13221
|
reset() {
|
|
13199
13222
|
this._adjustments = { ...this.options.adjustments };
|
|
13200
13223
|
this.apply();
|
|
13224
|
+
if (this.options.onAdjustmentsChange) {
|
|
13225
|
+
this.options.onAdjustmentsChange(this._adjustments);
|
|
13226
|
+
}
|
|
13201
13227
|
}
|
|
13202
13228
|
destroy() {
|
|
13203
13229
|
var _a2;
|
|
@@ -14176,8 +14202,12 @@ class MagnificationPlugin {
|
|
|
14176
14202
|
return currentZoom * baseMag;
|
|
14177
14203
|
}
|
|
14178
14204
|
// 修改 setMagnification 方法
|
|
14179
|
-
async setMagnification(mag) {
|
|
14205
|
+
async setMagnification(mag, target = null) {
|
|
14180
14206
|
var _a2, _b2;
|
|
14207
|
+
let point = this.viewer.viewport.getCenter();
|
|
14208
|
+
if (target) {
|
|
14209
|
+
point = this.viewer.viewport.imageToViewportCoordinates(target.x, target.y);
|
|
14210
|
+
}
|
|
14181
14211
|
if (this.options.type === "LD") {
|
|
14182
14212
|
const tiledImage = this.viewer.world.getItemAt(0);
|
|
14183
14213
|
if (!this.magnificationDisplay || !tiledImage)
|
|
@@ -14189,7 +14219,7 @@ class MagnificationPlugin {
|
|
|
14189
14219
|
this.viewer.viewport.getZoom();
|
|
14190
14220
|
const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
|
|
14191
14221
|
const targetZoom = mag / conversionFactor;
|
|
14192
|
-
await this.viewer.viewport.zoomTo(targetZoom,
|
|
14222
|
+
await this.viewer.viewport.zoomTo(targetZoom, point, false);
|
|
14193
14223
|
this.updateMagnificationDisplay();
|
|
14194
14224
|
} else {
|
|
14195
14225
|
const tiledImage = this.viewer.world.getItemAt(0);
|
|
@@ -14198,7 +14228,7 @@ class MagnificationPlugin {
|
|
|
14198
14228
|
const baseMag = ((_b2 = this.viewer.source) == null ? void 0 : _b2.max_magnification) || 40;
|
|
14199
14229
|
const targetImageZoom = mag / baseMag;
|
|
14200
14230
|
const targetViewportZoom = this.viewer.viewport.imageToViewportZoom(targetImageZoom);
|
|
14201
|
-
await this.viewer.viewport.zoomTo(targetViewportZoom,
|
|
14231
|
+
await this.viewer.viewport.zoomTo(targetViewportZoom, point, false);
|
|
14202
14232
|
this.updateMagnificationDisplay();
|
|
14203
14233
|
}
|
|
14204
14234
|
}
|
|
@@ -14207,6 +14237,36 @@ class MagnificationPlugin {
|
|
|
14207
14237
|
this.viewer.viewport.fitHorizontally(true);
|
|
14208
14238
|
this.viewer.viewport.goHome();
|
|
14209
14239
|
}
|
|
14240
|
+
/**
|
|
14241
|
+
* 显示放大镜控件
|
|
14242
|
+
*/
|
|
14243
|
+
show() {
|
|
14244
|
+
if (this.magnificationElement) {
|
|
14245
|
+
this.magnificationElement.style.display = "flex";
|
|
14246
|
+
}
|
|
14247
|
+
}
|
|
14248
|
+
/**
|
|
14249
|
+
* 隐藏放大镜控件
|
|
14250
|
+
*/
|
|
14251
|
+
hide() {
|
|
14252
|
+
if (this.magnificationElement) {
|
|
14253
|
+
this.magnificationElement.style.display = "none";
|
|
14254
|
+
}
|
|
14255
|
+
}
|
|
14256
|
+
/**
|
|
14257
|
+
* 切换放大镜控件的可见性
|
|
14258
|
+
*/
|
|
14259
|
+
toggle() {
|
|
14260
|
+
if (this.magnificationElement) {
|
|
14261
|
+
this.magnificationElement.style.display = this.magnificationElement.style.display === "none" ? "flex" : "none";
|
|
14262
|
+
}
|
|
14263
|
+
}
|
|
14264
|
+
/**
|
|
14265
|
+
* 检查放大镜控件是否可见
|
|
14266
|
+
*/
|
|
14267
|
+
isVisible() {
|
|
14268
|
+
return this.magnificationElement ? this.magnificationElement.style.display !== "none" : false;
|
|
14269
|
+
}
|
|
14210
14270
|
refresh() {
|
|
14211
14271
|
this.updateMagnificationDisplay();
|
|
14212
14272
|
}
|
|
@@ -15232,9 +15292,11 @@ const selectionCancelRest = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAA
|
|
|
15232
15292
|
const selectionCancelGroup = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDRjQ1MzBFODczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDRjQ1MzBFNzczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDg4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz70KmuVAAAHdklEQVR42qxYW2hURxj+d7OXXDQX0hgbLzEG1EgpxYhCk1aKDwUbFV+sYMVAaTWWPsQHH4pKQeyLIrQQTYv2oRpMTSl4wwYbMWIemqqlBoPmYmKjSdRcd7OXs7fT/5vMnM6ebJTWHvh3zpmZ8893vv8y/6zDNE16lcvBl73PnEUpunVJJBJWm5mZSa7/sLBa3KGJejblPFPeK1BmJBIx7QBUC8Hl+pcgIE6WNNmqe4cGBgLtcb31eDxibHJy0lQAdHkpmBQgXFLckOrq6ryqqqpS/monK3RcuXJloKGhYVQCiLFEpcSkJHJycgSoJ0+emHYwM+yoxAYgnWUOS/7Bgwff6uvr+9rn8z0Ih8NmKBQyg8GgGQgETO4zh4aGHra3t9fv3LmzkueXsBThPfl+utQHvY6uri66f/8+dXZ2zg5GAwIGMlhyDhw4sLK/v/9bLAwQaBUIJTqo4eFh8/r16z/s2LHjPQmqEHqkPrcCdOfOHbp169a0JZTjKyBpaWnKLGnyK7y3b9/etmzZshNOpzPJ+fSgUfeYA+tCGDSNjo5Sa2vrF7t27fqJhwMsQRZDmg3mNHncXLdunUAnrmg0Smx7u3m8jPzTkpKSE2qOYRiijcViFI/HLZsrkOhX81wuFxUUFNCaNWu+qq+v/0QykwW9urmYzWRm/H4/ZWdnK1aEn1y+fHn9qlWrfkYOwCLK0fTUot/bWVZM4R5+cf78+c+PHTt2lbt9kiVDOrhwaiua8CWaeWBT76JFiz7mkBRjAKLoh3L9fjYgiikAWrx4MS1fvnwbd7dr0aWHv2mZCfaVl3Dc5ubmambqAyiD+ZRJ2Dnp5MmT9OzZsxm+gxb9p06dIs4nYhzv4WPS09OptLS0ora2FoDmyshSjmwtLC5mQU9onry8vGqv1ytAKiC4Ll68SM+fP6ezZ8/S2NhYUhTCWRsbG8X4pUuXxHy8iw/iSCP2PSoqKtos/QZR5dESqMNpz3Pwl8OHD7/J5lmpnFExALNs2bKFFixYQDAfFgQD6EfLPib6MY55yqkBCHo4UuHQSysqKt7QwLjUluK0ARFRtGTJkvVgxTJPPCE8LMa/2Tm59NH27TRv3jyhvKWlhQYHB0WLZ/Rv5/Hc3FxW6EiKMrA8f/58+M/b0kweParszCgzlbGdzXGmHWEXCgeYZha+n/JPcsi6aePGjZSRkUGcgenatWuixXMV97t5fGpqisIGmzgBdmNiHP4GZ2bQS7XwVmaasTcJdpiRAv4Sx6TfRxFmJsPjpQx2QIAIuJzkc/lo7txsysrKot27d1svnz59muLMwPDYOAOICFZi8Zj4oHAwTG6vR5iUTZZnA+KYDYyDc04CJjIMCH9dZDrJpTkdlDAdgk/kjb17a5Ne5kih43XH6TU2Fe+CxNOZmbgAEuX3+VVhMmbNTLHjkzPVbs3OOK6iyDCiFGSKQxwNgWCI7R6ih70PqaZmD0fNiMiwiCy0IyMjVLOnhsd7xLypQJAXDlKIP8iIGEIfkqsfPykuOxiRCVnpAxW2YAaK/ewD0NHb20v79u0TYQwATU1NVF5eLlo4L/ox3sfzggG/8DX4C3IN9A0MDND4+PhferJTRVgqMAne1lu7u7tFmMI8RtgQeQJfhoQHoACCnIL9B6UAWjAEQBj/judFY3EBJMpAoAf6sENzmfGH3AZUBk4JBgMxzr6dPT09HSqVT/vPNM2HDh2itWvX0pkzZ8QzQONr0eIZToxxzMMzzB3m96EHuaijo6Ofme/idSJ60WUHo5eLxuPHjxtv3rwp8gWcDoAQFVjgyJEj4pnrG7EAFkSLZ/RjHPMwH894H3rOnTsHM/4qy4iw3CgtdlwpzCTKRWaniW387ooVK95HCIN6KAcLT58+tcoEvaZBH4C53W4BAoJQ5lKTHj16RG1tbb/z3tXMU6ckIFWSJpuJ07fODCgMMzsNMAc2OQCC2eDEcFIkMIBRiypToh/jmIf5eA+Ajh49irFfEKwSTFiuYzFjgVEFjhzApBDnkjYG9GVdXZ34WjgtUj4WeZnIfUjc79+/H8x+z0HwG+udkGBCkpmEleQUzZWVlaBRL668cnfNXrhw4WZm58NNmzaVr169WphM+YpV2SODMQCwyKUH8a5PN27cEBHGEfUNmxBF1QjLmK24UmYyLTBc0Qmnu3v3rl7/YjPLRP3BoVuYn5//GS+0dcOGDVRWViZ8QSVHAMHexIU43bt3jy5cuADQzczMj7zGsAQBVvyaA8e0XPMPM+yo4is5RB2204FXbvdzJKjXedGt7Afv8LslXJ+Ioyl8BM7NwLq5/0/WdZXbIbm4T7bKPIYNSDKY4uJiq7jmksB+QlBHlgzJlJJ0zh/FMCXrCbEMykUMKUFNQprTzgCSBKawsDDpuDkxMWE/zrpl/eHVxCP707TjbVw6ZkQDZchne9ZN+oPAAgP72w/l7A+pjrcKmFs77trP2jHb8TauZVozFZAkMIgC+wHNdsLUQdkP/07blpKwHf5fCGIGGESDHqazzX/BXyIzdn/9L5EXgZjxB87/cDleVcHfAgwASAHoonbJ7J4AAAAASUVORK5CYII=";
|
|
15233
15293
|
const selectionCancelHover = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCMUM1QzMyODczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMUM1QzMyNzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
|
|
15234
15294
|
const selectionCancelDown = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERkFFQjU3NzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERkFFQjU3NjczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
|
|
15235
|
-
|
|
15236
|
-
OpenSeadragon.setString("Tooltips.
|
|
15237
|
-
OpenSeadragon.setString("Tooltips.
|
|
15295
|
+
function updateOsdTooltips() {
|
|
15296
|
+
OpenSeadragon.setString("Tooltips.SelectionToggle", t("selection.toggle"));
|
|
15297
|
+
OpenSeadragon.setString("Tooltips.SelectionConfirm", t("selection.confirm"));
|
|
15298
|
+
OpenSeadragon.setString("Tooltips.SelectionCancel", t("selection.cancel"));
|
|
15299
|
+
}
|
|
15238
15300
|
class SelectionPlugin {
|
|
15239
15301
|
constructor(viewer, options = {}) {
|
|
15240
15302
|
__publicField(this, "viewer");
|
|
@@ -15242,6 +15304,10 @@ class SelectionPlugin {
|
|
|
15242
15304
|
// OpenSeadragonSelection instance
|
|
15243
15305
|
__publicField(this, "options");
|
|
15244
15306
|
this.viewer = viewer;
|
|
15307
|
+
const userOnSelection = options.onSelection;
|
|
15308
|
+
if (options.onSelection) {
|
|
15309
|
+
delete options.onSelection;
|
|
15310
|
+
}
|
|
15245
15311
|
this.options = {
|
|
15246
15312
|
showSelectionControl: true,
|
|
15247
15313
|
showConfirmDenyButtons: true,
|
|
@@ -15297,9 +15363,54 @@ class SelectionPlugin {
|
|
|
15297
15363
|
background: "#4CAF50",
|
|
15298
15364
|
border: "2px solid #4CAF50"
|
|
15299
15365
|
},
|
|
15300
|
-
...options
|
|
15366
|
+
...options,
|
|
15367
|
+
// Override onSelection to provide a blob
|
|
15368
|
+
onSelection: (rect) => {
|
|
15369
|
+
if (!userOnSelection) {
|
|
15370
|
+
return;
|
|
15371
|
+
}
|
|
15372
|
+
try {
|
|
15373
|
+
const viewportRect = this.viewer.viewport.imageToViewportRectangle(rect);
|
|
15374
|
+
const webRect = this.viewer.viewport.viewportToViewerElementRectangle(viewportRect);
|
|
15375
|
+
const pixelDensityRatio = OpenSeadragon.pixelDensityRatio || 1;
|
|
15376
|
+
const { x: x2, y: y2, width, height } = webRect || {};
|
|
15377
|
+
const { canvas } = this.viewer.drawer;
|
|
15378
|
+
const selectionCanvas = document.createElement("canvas");
|
|
15379
|
+
const ctx = selectionCanvas.getContext("2d");
|
|
15380
|
+
if (!ctx) {
|
|
15381
|
+
userOnSelection(rect, null);
|
|
15382
|
+
return;
|
|
15383
|
+
}
|
|
15384
|
+
selectionCanvas.width = width * pixelDensityRatio;
|
|
15385
|
+
selectionCanvas.height = height * pixelDensityRatio;
|
|
15386
|
+
ctx.drawImage(
|
|
15387
|
+
canvas,
|
|
15388
|
+
x2 * pixelDensityRatio,
|
|
15389
|
+
y2 * pixelDensityRatio,
|
|
15390
|
+
width * pixelDensityRatio,
|
|
15391
|
+
height * pixelDensityRatio,
|
|
15392
|
+
0,
|
|
15393
|
+
0,
|
|
15394
|
+
width * pixelDensityRatio,
|
|
15395
|
+
height * pixelDensityRatio
|
|
15396
|
+
);
|
|
15397
|
+
selectionCanvas.toBlob((blob) => {
|
|
15398
|
+
userOnSelection(rect, blob);
|
|
15399
|
+
});
|
|
15400
|
+
} catch (e2) {
|
|
15401
|
+
console.error("[SelectionPlugin] Error creating blob from selection:", e2);
|
|
15402
|
+
userOnSelection(rect, null);
|
|
15403
|
+
}
|
|
15404
|
+
}
|
|
15301
15405
|
};
|
|
15302
15406
|
this.init();
|
|
15407
|
+
updateOsdTooltips();
|
|
15408
|
+
}
|
|
15409
|
+
/**
|
|
15410
|
+
* 更新语言环境,刷新工具提示
|
|
15411
|
+
*/
|
|
15412
|
+
updateLocale() {
|
|
15413
|
+
updateOsdTooltips();
|
|
15303
15414
|
}
|
|
15304
15415
|
init() {
|
|
15305
15416
|
this.viewer.addOnceHandler("open", () => {
|
|
@@ -15440,6 +15551,9 @@ const createAnnoDropdownContent = (engine, hide) => {
|
|
|
15440
15551
|
btn.className = "med-tool-item";
|
|
15441
15552
|
btn.textContent = tItem.label;
|
|
15442
15553
|
btn.onclick = () => {
|
|
15554
|
+
if (engine.selection) {
|
|
15555
|
+
engine.selection.disable();
|
|
15556
|
+
}
|
|
15443
15557
|
if (engine.anno)
|
|
15444
15558
|
engine.anno.setTool(tItem.id, selectedColor);
|
|
15445
15559
|
hide();
|
|
@@ -15462,6 +15576,10 @@ const createColorAdjustDropdownContent = (engine, hide) => {
|
|
|
15462
15576
|
var _a2;
|
|
15463
15577
|
const container = document.createElement("div");
|
|
15464
15578
|
container.className = "med-toolbar-dropdown-inner med-color-adjust-dropdown";
|
|
15579
|
+
if (engine.anno)
|
|
15580
|
+
engine.anno.setEnabled(false);
|
|
15581
|
+
if (engine.selection)
|
|
15582
|
+
engine.selection.disable();
|
|
15465
15583
|
const createSlider = (labelText, id, min, max, step, initialValue, onChange) => {
|
|
15466
15584
|
const section = document.createElement("div");
|
|
15467
15585
|
section.className = "med-toolbar-section";
|
|
@@ -15675,6 +15793,12 @@ const DEFAULT_BUTTONS = [
|
|
|
15675
15793
|
label: t("toolbar.reset"),
|
|
15676
15794
|
onClick: (engine, hide) => {
|
|
15677
15795
|
engine.viewer.viewport.goHome();
|
|
15796
|
+
if (engine.selection) {
|
|
15797
|
+
engine.selection.disable();
|
|
15798
|
+
}
|
|
15799
|
+
if (engine.anno) {
|
|
15800
|
+
engine.anno.setEnabled(false);
|
|
15801
|
+
}
|
|
15678
15802
|
hide();
|
|
15679
15803
|
}
|
|
15680
15804
|
},
|
|
@@ -15697,6 +15821,9 @@ const DEFAULT_BUTTONS = [
|
|
|
15697
15821
|
onClick: (engine, hide) => {
|
|
15698
15822
|
var _a2;
|
|
15699
15823
|
(_a2 = engine.selection) == null ? void 0 : _a2.toggleState();
|
|
15824
|
+
if (engine.anno) {
|
|
15825
|
+
engine.anno.setEnabled(false);
|
|
15826
|
+
}
|
|
15700
15827
|
hide();
|
|
15701
15828
|
}
|
|
15702
15829
|
}
|
|
@@ -15717,6 +15844,30 @@ class MedToolbar {
|
|
|
15717
15844
|
this.render();
|
|
15718
15845
|
this.mount();
|
|
15719
15846
|
}
|
|
15847
|
+
/**
|
|
15848
|
+
* 显示工具栏
|
|
15849
|
+
*/
|
|
15850
|
+
show() {
|
|
15851
|
+
this.element.style.display = "flex";
|
|
15852
|
+
}
|
|
15853
|
+
/**
|
|
15854
|
+
* 隐藏工具栏
|
|
15855
|
+
*/
|
|
15856
|
+
hide() {
|
|
15857
|
+
this.element.style.display = "none";
|
|
15858
|
+
}
|
|
15859
|
+
/**
|
|
15860
|
+
* 切换工具栏的可见性
|
|
15861
|
+
*/
|
|
15862
|
+
toggle() {
|
|
15863
|
+
this.element.style.display = this.element.style.display === "none" ? "flex" : "none";
|
|
15864
|
+
}
|
|
15865
|
+
/**
|
|
15866
|
+
* 检查工具栏是否可见
|
|
15867
|
+
*/
|
|
15868
|
+
isVisible() {
|
|
15869
|
+
return this.element.style.display !== "none";
|
|
15870
|
+
}
|
|
15720
15871
|
destroy() {
|
|
15721
15872
|
this.closeDropdown(true);
|
|
15722
15873
|
this.element.remove();
|
|
@@ -16382,6 +16533,23 @@ class MedViewerEngine {
|
|
|
16382
16533
|
(_e2 = this.colorAdjust) == null ? void 0 : _e2.destroy();
|
|
16383
16534
|
this.viewer.destroy();
|
|
16384
16535
|
}
|
|
16536
|
+
/**
|
|
16537
|
+
* 动态设置语言
|
|
16538
|
+
* @param locale 语言标识,如 'en' 或 'zh-CN'
|
|
16539
|
+
*/
|
|
16540
|
+
setLocale(locale) {
|
|
16541
|
+
setLocale(locale);
|
|
16542
|
+
this.options.locale = locale;
|
|
16543
|
+
if (this.anno) {
|
|
16544
|
+
this.anno.setLocale(locale);
|
|
16545
|
+
}
|
|
16546
|
+
if (this.selection) {
|
|
16547
|
+
this.selection.updateLocale();
|
|
16548
|
+
}
|
|
16549
|
+
if (this.toolbar)
|
|
16550
|
+
;
|
|
16551
|
+
console.log(`[MedEngine] Locale changed to ${locale}`);
|
|
16552
|
+
}
|
|
16385
16553
|
}
|
|
16386
16554
|
if (typeof window !== "undefined") {
|
|
16387
16555
|
window.MedViewerSDK = {
|