jmgraph 3.2.26 → 3.2.28

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.
Files changed (44) hide show
  1. package/README.md +188 -0
  2. package/dist/jmgraph.core.min.js +1 -1
  3. package/dist/jmgraph.core.min.js.map +1 -1
  4. package/dist/jmgraph.js +2713 -425
  5. package/dist/jmgraph.min.js +1 -1
  6. package/index.d.ts +142 -1
  7. package/package.json +1 -1
  8. package/src/core/jmControl.js +827 -127
  9. package/src/core/jmEvents.js +154 -0
  10. package/src/core/jmFilter.js +38 -1
  11. package/src/core/jmGradient.js +59 -8
  12. package/src/core/jmGraph.js +51 -7
  13. package/src/core/jmLayer.js +34 -2
  14. package/src/core/jmList.js +167 -0
  15. package/src/core/jmObject.js +128 -8
  16. package/src/core/jmPath.js +43 -5
  17. package/src/core/jmProperty.js +181 -2
  18. package/src/core/jmShadow.js +36 -7
  19. package/src/core/jmUtils.js +187 -14
  20. package/src/lib/webgl/base.js +211 -83
  21. package/src/lib/webgl/core/buffer.js +43 -12
  22. package/src/lib/webgl/core/mapSize.js +16 -7
  23. package/src/lib/webgl/core/mapType.js +41 -22
  24. package/src/lib/webgl/core/program.js +94 -54
  25. package/src/lib/webgl/core/shader.js +20 -8
  26. package/src/lib/webgl/core/texture.js +55 -32
  27. package/src/lib/webgl/gradient.js +49 -17
  28. package/src/lib/webgl/index.js +173 -24
  29. package/src/lib/webgl/path.js +61 -12
  30. package/src/shapes/jmArc.js +48 -2
  31. package/src/shapes/jmArrow.js +35 -2
  32. package/src/shapes/jmArrowLine.js +33 -2
  33. package/src/shapes/jmBezier.js +50 -4
  34. package/src/shapes/jmCircle.js +35 -2
  35. package/src/shapes/jmEllipse.js +29 -3
  36. package/src/shapes/jmHArc.js +39 -2
  37. package/src/shapes/jmImage.js +49 -3
  38. package/src/shapes/jmLabel.js +41 -2
  39. package/src/shapes/jmLine.js +42 -2
  40. package/src/shapes/jmPolygon.js +42 -3
  41. package/src/shapes/jmPrismatic.js +34 -2
  42. package/src/shapes/jmRect.js +45 -3
  43. package/src/shapes/jmResize.js +42 -4
  44. package/src/shapes/jmStar.js +38 -4
@@ -1,14 +1,75 @@
1
+ /**
2
+ * @fileoverview jmEvents 事件处理系统
3
+ *
4
+ * jmEvents 是 jmGraph 库的事件处理模块,负责管理所有用户交互事件。
5
+ * 包括鼠标事件、触摸事件和键盘事件的绑定、分发和销毁。
6
+ *
7
+ * 主要功能:
8
+ * - 鼠标事件:mousedown, mousemove, mouseup, click, dblclick 等
9
+ * - 触摸事件:touchstart, touchmove, touchend, touchcancel, tap
10
+ * - 键盘事件:keydown, keyup, keypress
11
+ * - 事件冒泡和委托机制
12
+ *
13
+ * @module jmEvents
14
+ * @author jmGraph Team
15
+ * @license MIT
16
+ */
17
+
1
18
  import {jmUtils} from "./jmUtils.js";
2
19
 
20
+ /**
21
+ * jmEvents 事件处理类
22
+ *
23
+ * 统一管理画布上的所有交互事件,包括鼠标、触摸和键盘事件。
24
+ * 支持事件冒泡机制,可以将事件传递给子控件处理。
25
+ *
26
+ * @class jmEvents
27
+ *
28
+ * @param {jmGraph} container jmGraph 实例
29
+ * @param {HTMLElement} target 事件目标元素(通常是 canvas 元素)
30
+ *
31
+ * @example
32
+ * // 通常由 jmGraph 内部创建,不需要手动实例化
33
+ * const events = new jmEvents(graph, canvasElement);
34
+ */
3
35
  export default class jmEvents {
4
36
 
37
+ /**
38
+ * 构造函数
39
+ *
40
+ * @param {jmGraph} container jmGraph 实例
41
+ * @param {HTMLElement} target 事件目标元素
42
+ */
5
43
  constructor(container, target) {
44
+ /**
45
+ * jmGraph 实例
46
+ * @type {jmGraph}
47
+ */
6
48
  this.container = container;
49
+ /**
50
+ * 事件目标元素
51
+ * @type {HTMLElement}
52
+ */
7
53
  this.target = target || container;
54
+ /**
55
+ * 鼠标事件处理器
56
+ * @type {jmMouseEvent}
57
+ */
8
58
  this.mouseHandler = new jmMouseEvent(this, container, target);
59
+ /**
60
+ * 键盘事件处理器
61
+ * @type {jmKeyEvent}
62
+ */
9
63
  this.keyHandler = new jmKeyEvent(this, container, target);
10
64
  }
11
65
 
66
+ /**
67
+ * 触摸开始事件处理
68
+ *
69
+ * @method touchStart
70
+ * @param {TouchEvent} evt 触摸事件对象
71
+ * @return {boolean} 如果事件目标为画布本身则返回 false
72
+ */
12
73
  touchStart(evt) {
13
74
  evt = evt || window.event;
14
75
  evt.eventName = 'touchstart';
@@ -19,6 +80,13 @@ export default class jmEvents {
19
80
  }
20
81
  };
21
82
 
83
+ /**
84
+ * 触摸移动事件处理
85
+ *
86
+ * @method touchMove
87
+ * @param {TouchEvent} evt 触摸事件对象
88
+ * @return {boolean} 如果事件目标为画布本身则返回 false
89
+ */
22
90
  touchMove(evt) {
23
91
  evt = evt || window.event;
24
92
  evt.eventName = 'touchmove';
@@ -29,6 +97,13 @@ export default class jmEvents {
29
97
  }
30
98
  };
31
99
 
100
+ /**
101
+ * 触摸结束事件处理
102
+ *
103
+ * @method touchEnd
104
+ * @param {TouchEvent} evt 触摸事件对象
105
+ * @return {boolean} 如果事件目标为画布本身则返回 false
106
+ */
32
107
  touchEnd(evt) {
33
108
  evt = evt || window.event;
34
109
  evt.eventName = 'touchend';
@@ -40,6 +115,13 @@ export default class jmEvents {
40
115
  }
41
116
  };
42
117
 
118
+ /**
119
+ * 触摸取消事件处理
120
+ *
121
+ * @method touchCancel
122
+ * @param {TouchEvent} evt 触摸事件对象
123
+ * @return {boolean} 如果事件目标为画布本身则返回 false
124
+ */
43
125
  touchCancel(evt) {
44
126
  evt = evt || window.event;
45
127
  evt.eventName = 'touchcancel';
@@ -51,6 +133,13 @@ export default class jmEvents {
51
133
  }
52
134
  };
53
135
 
136
+ /**
137
+ * 轻触事件处理
138
+ *
139
+ * @method tap
140
+ * @param {Event} evt 事件对象
141
+ * @return {boolean} 如果事件目标为画布本身则返回 false
142
+ */
54
143
  tap(evt) {
55
144
  evt = evt || window.event;
56
145
  evt.eventName = 'tap';
@@ -62,23 +151,56 @@ export default class jmEvents {
62
151
  }
63
152
  };
64
153
 
154
+ /**
155
+ * 销毁事件处理器
156
+ *
157
+ * 移除所有绑定的事件监听器,释放资源。
158
+ *
159
+ * @method destroy
160
+ */
65
161
  destroy() {
66
162
  this.mouseHandler.destroy();
67
163
  this.keyHandler.destroy();
68
164
  }
69
165
  }
70
166
 
167
+ /**
168
+ * 鼠标事件处理器
169
+ *
170
+ * @class jmMouseEvent
171
+ * @private
172
+ */
71
173
  class jmMouseEvent {
174
+ /**
175
+ * 构造函数
176
+ *
177
+ * @param {jmEvents} instance jmEvents 实例
178
+ * @param {jmGraph} container jmGraph 实例
179
+ * @param {HTMLElement} target 事件目标元素
180
+ */
72
181
  constructor(instance, container, target) {
73
182
  this.instance = instance;
74
183
  this.container = container;
75
184
  this.target = target || container;
76
185
 
186
+ /**
187
+ * 已绑定的事件映射表
188
+ * @type {Object}
189
+ */
77
190
  this.eventEvents = {};
78
191
 
79
192
  this.init(instance, container, target);
80
193
  }
81
194
 
195
+ /**
196
+ * 初始化鼠标事件绑定
197
+ *
198
+ * @method init
199
+ * @private
200
+ * @param {jmEvents} instance jmEvents 实例
201
+ * @param {jmGraph} container jmGraph 实例
202
+ * @param {HTMLElement} target 事件目标元素
203
+ */
82
204
  init(instance, container, target) {
83
205
  const canvas = this.target;
84
206
  const doc = typeof document != 'undefined'? document: null;
@@ -163,6 +285,13 @@ class jmMouseEvent {
163
285
  },{ passive: false }));
164
286
  }
165
287
 
288
+ /**
289
+ * 销毁鼠标事件处理器
290
+ *
291
+ * 移除所有绑定的鼠标事件监听器。
292
+ *
293
+ * @method destroy
294
+ */
166
295
  destroy() {
167
296
  for(const name in this.eventEvents) {
168
297
  const event = this.eventEvents[name];
@@ -172,17 +301,42 @@ class jmMouseEvent {
172
301
  }
173
302
  }
174
303
 
304
+ /**
305
+ * 键盘事件处理器
306
+ *
307
+ * @class jmKeyEvent
308
+ * @private
309
+ */
175
310
  class jmKeyEvent {
311
+ /**
312
+ * 构造函数
313
+ *
314
+ * @param {jmEvents} instance jmEvents 实例
315
+ * @param {jmGraph} container jmGraph 实例
316
+ * @param {HTMLElement} target 事件目标元素
317
+ */
176
318
  constructor(instance, container,target) {
177
319
  this.instance = instance;
178
320
  this.container = container;
179
321
  this.target = target || container;
180
322
 
323
+ /**
324
+ * 已绑定的事件映射表
325
+ * @type {Object}
326
+ */
181
327
  this.eventEvents = {};
182
328
 
183
329
  this.init(container, target);
184
330
  }
185
331
 
332
+ /**
333
+ * 初始化键盘事件绑定
334
+ *
335
+ * @method init
336
+ * @private
337
+ * @param {jmGraph} container jmGraph 实例
338
+ * @param {HTMLElement} target 事件目标元素
339
+ */
186
340
  init(container, target) {
187
341
  const doc = typeof document != 'undefined'? document: null;
188
342
 
@@ -1,13 +1,50 @@
1
+ /**
2
+ * @fileoverview jmFilter 滤镜类
3
+ *
4
+ * jmFilter 提供了 CSS 滤镜效果的管理和应用功能。
5
+ * 支持多种滤镜效果,可以组合使用。
6
+ *
7
+ * 支持的滤镜:
8
+ * - blur: 模糊效果
9
+ * - grayscale: 灰度效果
10
+ * - sepia: 复古效果
11
+ * - brightness: 亮度调节
12
+ * - contrast: 对比度调节
13
+ * - saturate: 饱和度调节
14
+ * - hue-rotate: 色相旋转
15
+ * - invert: 反色效果
16
+ * - opacity: 透明度调节
17
+ *
18
+ * @module jmFilter
19
+ * @author jmGraph Team
20
+ * @license MIT
21
+ */
22
+
1
23
  import {jmUtils} from "./jmUtils.js";
2
24
 
3
25
  /**
4
- * CSS滤镜效果类
26
+ * CSS 滤镜效果类
27
+ *
5
28
  * 支持的滤镜: blur, grayscale, sepia, brightness, contrast, saturate, hue-rotate, invert, opacity
6
29
  *
7
30
  * @class jmFilter
8
31
  * @param {string|object} opt 滤镜参数
9
32
  * 字符串格式: "blur(2px) grayscale(50%) brightness(1.2)"
10
33
  * 对象格式: { blur: 2, grayscale: 0.5, brightness: 1.2 }
34
+ *
35
+ * @example
36
+ * // 从字符串创建
37
+ * const filter = new jmFilter('blur(2px) grayscale(50%)');
38
+ *
39
+ * // 从对象创建
40
+ * const filter = new jmFilter({
41
+ * blur: 2,
42
+ * grayscale: 0.5,
43
+ * brightness: 1.2
44
+ * });
45
+ *
46
+ * // 应用到图形
47
+ * shape.style.filter = filter;
11
48
  */
12
49
  export default class jmFilter {
13
50
  constructor(opt) {
@@ -1,11 +1,56 @@
1
- import {jmUtils} from "./jmUtils.js";
1
+ /**
2
+ * @fileoverview jmGradient 渐变类
3
+ *
4
+ * jmGradient 提供了线性渐变和径向渐变的创建和管理功能。
5
+ * 支持从 CSS 渐变字符串解析,以及转换为 Canvas 渐变对象。
6
+ *
7
+ * 主要功能:
8
+ * - 线性渐变(linear-gradient)
9
+ * - 径向渐变(radial-gradient)
10
+ * - CSS 渐变字符串解析
11
+ * - Canvas 渐变对象生成
12
+ * - WebGL 渐变支持
13
+ *
14
+ * @module jmGradient
15
+ * @author jmGraph Team
16
+ * @license MIT
17
+ */
18
+
19
+ import {jmUtils, colorKeywords} from "./jmUtils.js";
2
20
  import {jmList} from "./jmList.js";
3
21
 
4
22
  /**
5
23
  * 渐变类
6
- *
24
+ *
25
+ * 用于创建和管理线性渐变或径向渐变效果。
26
+ * 支持 CSS 渐变字符串格式解析,可以转换为 Canvas 或 WebGL 兼容的渐变对象。
27
+ *
7
28
  * @class jmGradient
8
- * @param {object} op 渐变参数,type:[linear= 线性渐变,radial=放射性渐变]
29
+ *
30
+ * @param {Object|string} opt 渐变参数对象或 CSS 渐变字符串
31
+ * @param {string} [opt.type='linear'] 渐变类型:'linear' 或 'radial'
32
+ * @param {number|string} [opt.x1] 起点X坐标(支持百分比)
33
+ * @param {number|string} [opt.y1] 起点Y坐标(支持百分比)
34
+ * @param {number|string} [opt.x2] 终点X坐标(支持百分比)
35
+ * @param {number|string} [opt.y2] 终点Y坐标(支持百分比)
36
+ * @param {number|string} [opt.r1] 内圆半径(径向渐变)
37
+ * @param {number|string} [opt.r2] 外圆半径(径向渐变)
38
+ * @param {Array} [opt.stops] 颜色停止点数组 [{offset, color}, ...]
39
+ *
40
+ * @example
41
+ * // 创建线性渐变
42
+ * const gradient = new jmGradient({
43
+ * type: 'linear',
44
+ * x1: 0, y1: 0,
45
+ * x2: '100%', y2: '100%',
46
+ * stops: [
47
+ * { offset: 0, color: '#ff0000' },
48
+ * { offset: 1, color: '#0000ff' }
49
+ * ]
50
+ * });
51
+ *
52
+ * // 从 CSS 字符串创建
53
+ * const gradient = new jmGradient('linear-gradient(180deg, #ff0000, #0000ff)');
9
54
  */
10
55
  export default class jmGradient {
11
56
  constructor(opt) {
@@ -220,7 +265,8 @@ export default class jmGradient {
220
265
  console.warn('jmGradient: 渐变字符串为空');
221
266
  return;
222
267
  }
223
- const gradientMatch = s.match(/(linear|radial)-gradient\s*\(\s*(.+)\)/i);
268
+ // 使用 [\s\S] 匹配任意字符(包括换行符),支持多行渐变字符串
269
+ const gradientMatch = s.match(/(linear|radial)-gradient\s*\(\s*([\s\S]+)\)/i);
224
270
  if(!gradientMatch || gradientMatch.length < 3) {
225
271
  console.warn('jmGradient: 无效的渐变字符串格式: "' + s + '"');
226
272
  return;
@@ -605,14 +651,19 @@ export default class jmGradient {
605
651
  const hexPattern = /^#([a-fA-F0-9]{3,8})$/;
606
652
  if(hexPattern.test(color)) return true;
607
653
 
608
- const rgbPattern = /^rgba?\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*[\d.]+\s*)?\)$/i;
654
+ // 支持 rgba(r,g,b,a) 和 rgba(r, g, b, a) 等各种空格格式
655
+ const rgbPattern = /^rgba?\s*\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*(,\s*[\d.]+\s*)?\)$/i;
609
656
  if(rgbPattern.test(color)) return true;
610
657
 
611
- const hslPattern = /^hsla?\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})%?\s*,\s*(\d{1,3})%?\s*(,\s*[\d.]+\s*)?\)$/i;
658
+ const hslPattern = /^hsla?\s*\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*(,\s*[\d.]+\s*)?\)$/i;
612
659
  if(hslPattern.test(color)) return true;
613
660
 
614
- const namedColors = ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'white', 'black', 'cyan', 'magenta', 'gray', 'grey', 'brown', 'navy', 'teal', 'olive', 'maroon', 'silver', 'lime', 'aqua', 'fuchsia', 'violet', 'indigo', 'gold', 'silver', 'transparent'];
615
- if(namedColors.includes(color.toLowerCase())) return true;
661
+ // 使用 jmUtils 中的完整 CSS 颜色关键字表
662
+ if(colorKeywords && colorKeywords[color.toLowerCase()]) return true;
663
+
664
+ // 宽松处理:符合 CSS 关键字命名规则的字符串也视为有效颜色
665
+ // (纯字母,可能在运行时被浏览器或其他环境解析)
666
+ if(/^[a-zA-Z]+$/.test(color)) return true;
616
667
 
617
668
  return false;
618
669
  }
@@ -1,3 +1,23 @@
1
+ /**
2
+ * @fileoverview jmGraph 主画布类
3
+ *
4
+ * jmGraph 是 jmGraph 库的核心类,代表一个完整的画布实例。
5
+ * 它继承自 jmControl,提供了完整的图形渲染、事件处理、缩放平移等功能。
6
+ *
7
+ * 主要功能:
8
+ * - Canvas/WebGL 双渲染模式支持
9
+ * - 图形创建与管理(createShape, createLine, createPath 等)
10
+ * - 渐变和阴影效果(createLinearGradient, createRadialGradient, createShadow)
11
+ * - 缩放和平移(setZoom, pan, resetTransform)
12
+ * - 导出功能(toDataURL, exportToPNG, exportToJPEG, exportToSVG)
13
+ * - 自动刷新动画循环(autoRefresh)
14
+ * - 微信小程序支持
15
+ *
16
+ * @module jmGraph
17
+ * @author jmGraph Team
18
+ * @license MIT
19
+ */
20
+
1
21
  import {jmUtils} from "./jmUtils.js";
2
22
  import {jmList} from "./jmList.js";
3
23
  import {jmProperty} from './jmProperty.js';
@@ -9,15 +29,39 @@ import {jmControl} from "./jmControl.js";
9
29
  import {jmPath} from "./jmPath.js";
10
30
 
11
31
  /**
12
- * jmGraph画图类库
13
- * 对canvas画图api进行二次封装,使其更易调用,省去很多重复的工作。
14
- *
15
- * @module jmGraph
32
+ * jmGraph 画图类
33
+ *
34
+ * 对 Canvas 画图 API 进行二次封装,使其更易调用,省去很多重复的工作。
35
+ * 支持多种图形的创建、渲染、交互和导出。
36
+ *
16
37
  * @class jmGraph
17
38
  * @extends jmControl
18
- * @param {element} canvas 标签canvas
19
- * @param {object} option 参数:{width:宽,height:高}
20
- * @param {function} callback 初始化后的回调
39
+ *
40
+ * @param {HTMLElement|string} canvas Canvas 元素或元素 ID
41
+ * @param {Object} [option] 配置选项
42
+ * @param {number} [option.width] 画布宽度
43
+ * @param {number} [option.height] 画布高度
44
+ * @param {string} [option.mode='2d'] 渲染模式:'2d' 或 'webgl'
45
+ * @param {boolean} [option.autoRefresh=false] 是否自动刷新
46
+ * @param {Object} [option.shapes] 自定义图形类型映射
47
+ * @param {function} [callback] 初始化完成后的回调函数
48
+ *
49
+ * @example
50
+ * // 创建画布实例
51
+ * const graph = new jmGraph('canvasId', {
52
+ * width: 800,
53
+ * height: 600,
54
+ * mode: '2d'
55
+ * });
56
+ *
57
+ * // 创建一个矩形
58
+ * const rect = graph.createShape('rect', {
59
+ * x: 100, y: 100,
60
+ * width: 200, height: 150,
61
+ * style: { fill: '#ff0000' }
62
+ * });
63
+ * graph.children.add(rect);
64
+ * graph.refresh();
21
65
  */
22
66
  export default class jmGraph extends jmControl {
23
67
 
@@ -1,9 +1,27 @@
1
+ /**
2
+ * @fileoverview jmLayer 图层类
3
+ *
4
+ * jmLayer 提供了图层管理功能,用于组织和控制图形对象的显示和交互。
5
+ * 图层可以包含多个图形对象,支持可见性和锁定控制。
6
+ *
7
+ * 主要功能:
8
+ * - 图层可见性控制
9
+ * - 图层锁定(防止交互)
10
+ * - 图形对象组织和管理
11
+ * - 批量操作支持
12
+ *
13
+ * @module jmLayer
14
+ * @author jmGraph Team
15
+ * @license MIT
16
+ */
17
+
1
18
  import {jmControl} from "./jmControl.js";
2
19
 
3
20
  /**
4
21
  * 图层类
5
- * 用于组织和管理图形对象,支持可见性和锁定控制
6
- * 图层可以包含多个图形对象,并控制它们的显示和交互
22
+ *
23
+ * 用于组织和管理图形对象,支持可见性和锁定控制。
24
+ * 图层可以包含多个图形对象,并控制它们的显示和交互。
7
25
  *
8
26
  * @class jmLayer
9
27
  * @extends jmControl
@@ -12,6 +30,20 @@ import {jmControl} from "./jmControl.js";
12
30
  * @param {boolean} [params.visible=true] 图层是否可见
13
31
  * @param {boolean} [params.locked=false] 图层是否锁定(锁定后不可交互)
14
32
  * @param {jmGraph} [params.graph] 所属的画布对象
33
+ *
34
+ * @example
35
+ * // 创建图层
36
+ * const layer = new jmLayer({
37
+ * name: 'background',
38
+ * visible: true,
39
+ * locked: false
40
+ * });
41
+ *
42
+ * // 添加图形到图层
43
+ * layer.children.add(rect);
44
+ *
45
+ * // 锁定图层
46
+ * layer.locked = true;
15
47
  */
16
48
  export default class jmLayer extends jmControl {
17
49