giser-maptalks-drawtool 1.0.0 → 1.0.2

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.
@@ -2,6 +2,28 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var maptalks = require('maptalks');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n["default"] = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var maptalks__namespace = /*#__PURE__*/_interopNamespace(maptalks);
26
+
5
27
  /* eslint-disable @typescript-eslint/no-explicit-any */
6
28
  const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
7
29
  const DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';
@@ -32,7 +54,7 @@ class SelfIntersectionDrawTool {
32
54
  constructor(options) {
33
55
  this._hasSelfIntersection = false;
34
56
  const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);
35
- this._drawTool = new maptalks.DrawTool(opts);
57
+ this._drawTool = new maptalks__namespace.DrawTool(opts);
36
58
  this.options = this._drawTool.options;
37
59
  this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);
38
60
  }
@@ -242,4 +264,4 @@ if (typeof window !== 'undefined') {
242
264
 
243
265
  exports.SelfIntersectionDrawTool = SelfIntersectionDrawTool;
244
266
  exports["default"] = SelfIntersectionDrawTool;
245
- //# sourceMappingURL=giser-maptalks-drawTool.cjs.js.map
267
+ //# sourceMappingURL=giser-maptalks-drawtool.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"giser-maptalks-drawtool.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":["maptalks"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import * as maptalks from 'maptalks';
2
+
1
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
4
  const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
3
5
  const DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';
@@ -237,4 +239,4 @@ if (typeof window !== 'undefined') {
237
239
  }
238
240
 
239
241
  export { SelfIntersectionDrawTool, SelfIntersectionDrawTool as default };
240
- //# sourceMappingURL=giser-maptalks-drawTool.esm.js.map
242
+ //# sourceMappingURL=giser-maptalks-drawtool.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"giser-maptalks-drawtool.esm.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
@@ -1,8 +1,28 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.giserMaptalksDrawTool = {}));
5
- })(this, (function (exports) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('maptalks')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'maptalks'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.giserMaptalksDrawTool = {}, global.maptalks));
5
+ })(this, (function (exports, maptalks) { 'use strict';
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n["default"] = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var maptalks__namespace = /*#__PURE__*/_interopNamespace(maptalks);
6
26
 
7
27
  /* eslint-disable @typescript-eslint/no-explicit-any */
8
28
  const DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';
@@ -34,7 +54,7 @@
34
54
  constructor(options) {
35
55
  this._hasSelfIntersection = false;
36
56
  const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);
37
- this._drawTool = new maptalks.DrawTool(opts);
57
+ this._drawTool = new maptalks__namespace.DrawTool(opts);
38
58
  this.options = this._drawTool.options;
39
59
  this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);
40
60
  }
@@ -248,4 +268,4 @@
248
268
  Object.defineProperty(exports, '__esModule', { value: true });
249
269
 
250
270
  }));
251
- //# sourceMappingURL=giser-maptalks-drawTool.umd.js.map
271
+ //# sourceMappingURL=giser-maptalks-drawtool.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"giser-maptalks-drawtool.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport * as maptalks from 'maptalks';\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":["maptalks"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "giser-maptalks-drawtool",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "maptalks DrawTool extension with self-intersection detection for polygon drawing",
5
5
  "main": "dist/giser-maptalks-drawtool.cjs.js",
6
6
  "module": "dist/giser-maptalks-drawtool.esm.js",
@@ -19,12 +19,14 @@
19
19
  "polygon"
20
20
  ],
21
21
  "peerDependencies": {
22
- "maptalks": ">=1.0.0"
22
+ "maptalks": ">=1.0.0",
23
+ "maptalks-gl": ">=0.124.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@rollup/plugin-node-resolve": "^16.0.3",
26
27
  "@rollup/plugin-typescript": "^8.5.0",
27
28
  "maptalks": "^1.0.0",
29
+ "maptalks-gl": "^0.124.4",
28
30
  "rollup": "^2.80.0",
29
31
  "tslib": "^2.8.1",
30
32
  "typescript": "^4.9.5"
@@ -1 +0,0 @@
1
- {"version":3,"file":"giser-maptalks-drawTool.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"giser-maptalks-drawTool.esm.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"giser-maptalks-drawTool.umd.js","sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * 声明 maptalks 全局变量(UMD 模式下)\r\n */\r\ndeclare const maptalks: any;\r\n\r\n/**\r\n * 自定义 DrawTool 选项\r\n */\r\nexport interface SelfIntersectionDrawToolOptions {\r\n mode?: string;\r\n symbol?: any;\r\n once?: boolean;\r\n autoPanAtEdge?: boolean;\r\n blockGeometryEvents?: boolean;\r\n zIndex?: number;\r\n doubleClickZoom?: boolean;\r\n ignoreMouseleave?: boolean;\r\n enableAltitude?: boolean;\r\n interactive?: boolean;\r\n edgeAutoComplete?: boolean;\r\n transformCoordinate?: any;\r\n /** 是否启用自相交检测,默认 false */\r\n enableSelfIntersectionCheck?: boolean;\r\n /** 自相交时的提示消息 */\r\n selfIntersectionErrorMessage?: string;\r\n /** 自相交检测到时的回调函数 */\r\n onSelfIntersectionError?: (message: string) => void;\r\n [key: string]: any;\r\n}\r\n\r\nconst DEFAULT_ERROR_MESSAGE = '绘制面出现自相交,请重新绘制';\r\nconst DBLCLICK_ERROR_MESSAGE = '绘制面存在自相交,请继续绘制';\r\nconst DRAWEND_ERROR_MESSAGE = '绘制面存在自相交,无法完成绘制,请继续绘制或按ESC取消';\r\n\r\n/**\r\n * 判断两条线段是否相交(跨立实验)\r\n * ccw 函数提取到外层,避免每次调用重新创建\r\n */\r\nfunction ccw(A: any, B: any, C: any): boolean {\r\n return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x);\r\n}\r\n\r\nfunction segmentsIntersect(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\nfunction sharesEndpoint(p1: any, p2: any, p3: any, p4: any): boolean {\r\n return (p1.x === p3.x && p1.y === p3.y) ||\r\n (p1.x === p4.x && p1.y === p4.y) ||\r\n (p2.x === p3.x && p2.y === p3.y) ||\r\n (p2.x === p4.x && p2.y === p4.y);\r\n}\r\n\r\nfunction segmentsIntersectSafe(p1: any, p2: any, p3: any, p4: any): boolean {\r\n if (sharesEndpoint(p1, p2, p3, p4)) return false;\r\n return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);\r\n}\r\n\r\n/**\r\n * 自定义 DrawTool,包装 maptalks DrawTool\r\n * 添加功能:在绘制面过程中检测自相交,如果出现自相交则回退到上一个点\r\n */\r\nexport class SelfIntersectionDrawTool {\r\n\r\n private _drawTool: any;\r\n options: SelfIntersectionDrawToolOptions;\r\n private _selfIntersectionHandler: any;\r\n private _hasSelfIntersection: boolean = false;\r\n\r\n constructor(options: SelfIntersectionDrawToolOptions) {\r\n const opts = Object.assign({}, { enableSelfIntersectionCheck: false }, options);\r\n this._drawTool = new maptalks.DrawTool(opts);\r\n this.options = this._drawTool.options;\r\n this._selfIntersectionHandler = this._checkSelfIntersection.bind(this);\r\n }\r\n\r\n /**\r\n * 触发警告\r\n */\r\n private _fireWarning(message: string): void {\r\n this._drawTool._fireEvent('selfintersectionwarning', { type: 'selfintersectionwarning', message });\r\n this.options.onSelfIntersectionError?.(message);\r\n }\r\n\r\n /**\r\n * 获取当前错误消息\r\n */\r\n private _getErrorMessage(defaultMsg: string): string {\r\n return this.options.selfIntersectionErrorMessage || defaultMsg;\r\n }\r\n\r\n /**\r\n * 从坐标中提取环\r\n */\r\n private _getRing(coordinates: any[]): any[] | null {\r\n if (!coordinates || !Array.isArray(coordinates)) return null;\r\n\r\n if (typeof (coordinates[0] as any).x === 'number') {\r\n return coordinates;\r\n }\r\n\r\n if (Array.isArray(coordinates[0]) && Array.isArray(coordinates[0])) {\r\n return coordinates[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 绑定自相交检测事件\r\n */\r\n private _bindSelfIntersectionEvents(): void {\r\n this._drawTool.off('drawvertex', this._selfIntersectionHandler);\r\n\r\n if (!this.options.enableSelfIntersectionCheck) return;\r\n\r\n const mode = this.getMode();\r\n if (mode === 'polygon' || mode === 'freeHandPolygon') {\r\n this._drawTool.on('drawvertex', this._selfIntersectionHandler);\r\n }\r\n }\r\n\r\n /**\r\n * 绑定结束绘制拦截器\r\n */\r\n private _bindEndDrawInterceptor(): void {\r\n // 拦截双击\r\n this._drawTool.on('dblclick', (param: any) => {\r\n if (this._hasSelfIntersection) {\r\n param.domEvent.stopPropagation();\r\n param.domEvent.preventDefault();\r\n this._fireWarning(this._getErrorMessage(DBLCLICK_ERROR_MESSAGE));\r\n }\r\n });\r\n\r\n // 拦截绘制结束\r\n this._drawTool.on('drawend', (param: any) => {\r\n if (!param.geometry || !this._hasSelfIntersection) return;\r\n\r\n param.geometry.remove();\r\n this._hasSelfIntersection = false;\r\n this._fireWarning(this._getErrorMessage(DRAWEND_ERROR_MESSAGE));\r\n });\r\n }\r\n\r\n // ========== DrawTool 方法的代理 ==========\r\n\r\n addTo(map: any): this {\r\n this._drawTool.addTo(map);\r\n this._bindSelfIntersectionEvents();\r\n this._bindEndDrawInterceptor();\r\n return this;\r\n }\r\n\r\n getMode(): string {\r\n return this._drawTool.getMode();\r\n }\r\n\r\n setMode(mode: string): this {\r\n this._drawTool.setMode(mode);\r\n this._hasSelfIntersection = false;\r\n this._bindSelfIntersectionEvents();\r\n return this;\r\n }\r\n\r\n getSymbol(): any {\r\n return this._drawTool.getSymbol();\r\n }\r\n\r\n setSymbol(symbol: any): this {\r\n this._drawTool.setSymbol(symbol);\r\n return this;\r\n }\r\n\r\n getCurrentGeometry(): any {\r\n return this._drawTool.getCurrentGeometry();\r\n }\r\n\r\n undo(): this {\r\n this._drawTool.undo();\r\n return this;\r\n }\r\n\r\n redo(): this {\r\n this._drawTool.redo();\r\n return this;\r\n }\r\n\r\n endDraw(param?: any): this {\r\n this._drawTool.endDraw(param);\r\n return this;\r\n }\r\n\r\n on(eventType: string, handler: any): this {\r\n this._drawTool.on(eventType, handler);\r\n return this;\r\n }\r\n\r\n off(eventType: string, handler: any): this {\r\n this._drawTool.off(eventType, handler);\r\n return this;\r\n }\r\n\r\n enable(): this {\r\n this._drawTool.enable();\r\n return this;\r\n }\r\n\r\n disable(): this {\r\n this._drawTool.disable();\r\n return this;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this._drawTool.isEnabled();\r\n }\r\n\r\n getMap(): any {\r\n return this._drawTool.getMap();\r\n }\r\n\r\n addCoordinate(coordinate: any): this {\r\n this._drawTool.addCoordinate(coordinate);\r\n return this;\r\n }\r\n\r\n getTempGeometry(): any {\r\n return this._drawTool.getTempGeometry();\r\n }\r\n\r\n setLayerZIndex(zIndex: number): this {\r\n this._drawTool.setLayerZIndex(zIndex);\r\n return this;\r\n }\r\n\r\n // ========== 自相交检测 ==========\r\n\r\n getCurrentCoordinates(): any[] | null {\r\n return this.getCurrentGeometry()?.getCoordinates() || null;\r\n }\r\n\r\n isSelfIntersecting(coordinates: any[]): boolean {\r\n if (!coordinates || coordinates.length === 0) return false;\r\n\r\n const ring = this._getRing(coordinates);\r\n if (!ring || ring.length < 4) return false;\r\n\r\n const n = ring.length;\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n\r\n for (let j = 2; j < n; j++) {\r\n if (Math.abs(i - j) <= 1) continue;\r\n if ((i === 0 && j === n - 1) || (j === 0 && i === n - 1)) continue;\r\n\r\n if (segmentsIntersectSafe(a1, a2, ring[j], ring[(j + 1) % n])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检测并处理自相交\r\n */\r\n private _checkSelfIntersection(): void {\r\n const coordinates = this.getCurrentCoordinates();\r\n if (!coordinates) return;\r\n\r\n if (this.isSelfIntersecting(coordinates)) {\r\n this._removeLastVertex();\r\n this._hasSelfIntersection = true;\r\n this._fireWarning(this._getErrorMessage(DEFAULT_ERROR_MESSAGE));\r\n } else {\r\n this._hasSelfIntersection = false;\r\n }\r\n }\r\n\r\n /**\r\n * 移除最后一个顶点\r\n */\r\n private _removeLastVertex(): void {\r\n const geometry = this.getCurrentGeometry();\r\n if (!geometry) return;\r\n\r\n const coords = geometry.getCoordinates();\r\n if (!coords || coords.length === 0) return;\r\n\r\n const clickCoords = this._drawTool._clickCoords;\r\n if (!clickCoords || clickCoords.length === 0) return;\r\n\r\n clickCoords.pop();\r\n this._drawTool._historyPointer = clickCoords.length;\r\n\r\n const ring = this._getRing(coords);\r\n if (ring?.length) {\r\n ring.pop();\r\n geometry.setCoordinates(coords);\r\n }\r\n\r\n const registerMode = this._drawTool._getRegisterMode();\r\n registerMode.update(this._drawTool.getMap().getProjection(), clickCoords, geometry);\r\n }\r\n}\r\n\r\n// UMD 环境下暴露为 window.giserMaptalksDrawTool\r\nif (typeof window !== 'undefined') {\r\n (window as any).giserMaptalksDrawTool = SelfIntersectionDrawTool;\r\n}\r\n\r\nexport default SelfIntersectionDrawTool;"],"names":[],"mappings":";;;;;;IAAA;IAgCA,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;IAC/C,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;IAChD,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;IAE7D;;;IAGG;IACH,SAAS,GAAG,CAAC,CAAM,EAAE,CAAM,EAAE,CAAM,EAAA;IACjC,IAAA,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAMD,SAAS,cAAc,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAA;IACxD,IAAA,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/B,SAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChC,SAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChC,SAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,qBAAqB,CAAC,EAAO,EAAE,EAAO,EAAE,EAAO,EAAE,EAAO,EAAA;QAC/D,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAAE,QAAA,OAAO,KAAK,CAAC;IACjD,IAAA,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED;;;IAGG;UACU,wBAAwB,CAAA;IAOnC,IAAA,WAAA,CAAY,OAAwC,EAAA;YAF5C,IAAoB,CAAA,oBAAA,GAAY,KAAK,CAAC;IAG5C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YAChF,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACtC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACxE;IAED;;IAEG;IACK,IAAA,YAAY,CAAC,OAAe,EAAA;;IAClC,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC,CAAC;YACnG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,EAAC,uBAAuB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,OAAO,CAAC,CAAC;SACjD;IAED;;IAEG;IACK,IAAA,gBAAgB,CAAC,UAAkB,EAAA;IACzC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,IAAI,UAAU,CAAC;SAChE;IAED;;IAEG;IACK,IAAA,QAAQ,CAAC,WAAkB,EAAA;YACjC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;IAAE,YAAA,OAAO,IAAI,CAAC;YAE7D,IAAI,OAAQ,WAAW,CAAC,CAAC,CAAS,CAAC,CAAC,KAAK,QAAQ,EAAE;IACjD,YAAA,OAAO,WAAW,CAAC;IACpB,SAAA;IAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;IAClE,YAAA,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,SAAA;IAED,QAAA,OAAO,IAAI,CAAC;SACb;IAED;;IAEG;QACK,2BAA2B,GAAA;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAEhE,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B;gBAAE,OAAO;IAEtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,QAAA,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,iBAAiB,EAAE;gBACpD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAChE,SAAA;SACF;IAED;;IAEG;QACK,uBAAuB,GAAA;;YAE7B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,KAAU,KAAI;gBAC3C,IAAI,IAAI,CAAC,oBAAoB,EAAE;IAC7B,gBAAA,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACjC,gBAAA,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAClE,aAAA;IACH,SAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAU,KAAI;gBAC1C,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB;oBAAE,OAAO;IAE1D,YAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACxB,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;gBAClC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAClE,SAAC,CAAC,CAAC;SACJ;;IAID,IAAA,KAAK,CAAC,GAAQ,EAAA;IACZ,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACnC,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAC/B,QAAA,OAAO,IAAI,CAAC;SACb;QAED,OAAO,GAAA;IACL,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SACjC;IAED,IAAA,OAAO,CAAC,IAAY,EAAA;IAClB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACnC,QAAA,OAAO,IAAI,CAAC;SACb;QAED,SAAS,GAAA;IACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;SACnC;IAED,IAAA,SAAS,CAAC,MAAW,EAAA;IACnB,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,QAAA,OAAO,IAAI,CAAC;SACb;QAED,kBAAkB,GAAA;IAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;SAC5C;QAED,IAAI,GAAA;IACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,QAAA,OAAO,IAAI,CAAC;SACb;QAED,IAAI,GAAA;IACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,QAAA,OAAO,IAAI,CAAC;SACb;IAED,IAAA,OAAO,CAAC,KAAW,EAAA;IACjB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,QAAA,OAAO,IAAI,CAAC;SACb;QAED,EAAE,CAAC,SAAiB,EAAE,OAAY,EAAA;YAChC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,QAAA,OAAO,IAAI,CAAC;SACb;QAED,GAAG,CAAC,SAAiB,EAAE,OAAY,EAAA;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvC,QAAA,OAAO,IAAI,CAAC;SACb;QAED,MAAM,GAAA;IACJ,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACxB,QAAA,OAAO,IAAI,CAAC;SACb;QAED,OAAO,GAAA;IACL,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACzB,QAAA,OAAO,IAAI,CAAC;SACb;QAED,SAAS,GAAA;IACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;SACnC;QAED,MAAM,GAAA;IACJ,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;SAChC;IAED,IAAA,aAAa,CAAC,UAAe,EAAA;IAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,QAAA,OAAO,IAAI,CAAC;SACb;QAED,eAAe,GAAA;IACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;SACzC;IAED,IAAA,cAAc,CAAC,MAAc,EAAA;IAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,QAAA,OAAO,IAAI,CAAC;SACb;;QAID,qBAAqB,GAAA;;YACnB,OAAO,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,kBAAkB,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,cAAc,EAAE,KAAI,IAAI,CAAC;SAC5D;IAED,IAAA,kBAAkB,CAAC,WAAkB,EAAA;IACnC,QAAA,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;IAAE,YAAA,OAAO,KAAK,CAAC;YAE3D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;IAAE,YAAA,OAAO,KAAK,CAAC;IAE3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IAC1B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACnC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAAE,SAAS;oBAEnE,IAAI,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IAC7D,oBAAA,OAAO,IAAI,CAAC;IACb,iBAAA;IACF,aAAA;IACF,SAAA;IACD,QAAA,OAAO,KAAK,CAAC;SACd;IAED;;IAEG;QACK,sBAAsB,GAAA;IAC5B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjD,QAAA,IAAI,CAAC,WAAW;gBAAE,OAAO;IAEzB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE;gBACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACzB,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACjE,SAAA;IAAM,aAAA;IACL,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACnC,SAAA;SACF;IAED;;IAEG;QACK,iBAAiB,GAAA;IACvB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3C,QAAA,IAAI,CAAC,QAAQ;gBAAE,OAAO;IAEtB,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IACzC,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;IAE3C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;IAChD,QAAA,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAErD,WAAW,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC;YAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,MAAM,EAAE;gBAChB,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,YAAA,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACjC,SAAA;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;IACvD,QAAA,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;SACrF;IACF,CAAA;IAED;IACA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IAChC,IAAA,MAAc,CAAC,qBAAqB,GAAG,wBAAwB,CAAC;IAClE;;;;;;;;;;;"}