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,4 +1,54 @@
1
+ /**
2
+ * @fileoverview jmList 列表类
3
+ *
4
+ * jmList 是 jmGraph 库的集合类,继承自原生 Array。
5
+ * 提供了增强的列表操作方法,包括去重添加、条件查找、遍历等。
6
+ *
7
+ * 主要功能:
8
+ * - 去重添加元素(add)
9
+ * - 条件查找(get)
10
+ * - 正向/反向遍历(each)
11
+ * - 元素计数(count)
12
+ * - 移除回调支持
13
+ *
14
+ * @module jmList
15
+ * @author jmGraph Team
16
+ * @license MIT
17
+ */
18
+
19
+ /**
20
+ * jmList 列表类
21
+ *
22
+ * 继承自 Array 的增强列表类,提供去重、遍历、查找等功能。
23
+ * 主要用于管理图形对象的子元素集合。
24
+ *
25
+ * @class jmList
26
+ * @extends Array
27
+ *
28
+ * @param {...*} arg 初始元素或数组
29
+ *
30
+ * @example
31
+ * // 创建列表
32
+ * const list = new jmList([1, 2, 3]);
33
+ *
34
+ * // 添加元素(自动去重)
35
+ * list.add(4);
36
+ * list.add([5, 6]);
37
+ *
38
+ * // 遍历
39
+ * list.each((index, item) => {
40
+ * console.log(index, item);
41
+ * });
42
+ *
43
+ * // 条件查找
44
+ * const found = list.get(item => item > 3);
45
+ */
1
46
  export default class jmList extends Array {
47
+ /**
48
+ * 构造函数
49
+ *
50
+ * @param {...*} arg 初始元素或数组
51
+ */
2
52
  constructor(...arg) {
3
53
  const ps = [];
4
54
  if(arg && arg.length && Array.isArray(arg[0])) {
@@ -8,10 +58,33 @@ export default class jmList extends Array {
8
58
  else {
9
59
  super();
10
60
  }
61
+ /**
62
+ * 配置选项
63
+ * @type {Object}
64
+ * @property {function} removeHandler 元素移除时的回调函数
65
+ */
11
66
  this.option = {};
67
+ /**
68
+ * 类型标识
69
+ * @type {string}
70
+ */
12
71
  this.type = 'jmList';
13
72
  }
14
73
 
74
+ /**
75
+ * 添加元素到列表
76
+ *
77
+ * 自动去重,如果元素已存在则不会重复添加。
78
+ * 支持添加单个元素或数组。
79
+ *
80
+ * @method add
81
+ * @param {*} obj 要添加的元素或数组
82
+ * @returns {*} 添加的元素
83
+ *
84
+ * @example
85
+ * list.add(1); // 添加单个元素
86
+ * list.add([2, 3, 4]); // 添加数组
87
+ */
15
88
  add(obj) {
16
89
  if(obj && Array.isArray(obj)) {
17
90
  for(let i=0; i < obj.length; i++) {
@@ -24,6 +97,17 @@ export default class jmList extends Array {
24
97
  return obj;
25
98
  }
26
99
 
100
+ /**
101
+ * 从列表中移除元素
102
+ *
103
+ * 移除所有匹配的元素,并触发移除回调。
104
+ *
105
+ * @method remove
106
+ * @param {*} obj 要移除的元素
107
+ *
108
+ * @example
109
+ * list.remove(item);
110
+ */
27
111
  remove(obj) {
28
112
  for(let i = this.length -1; i>=0; i--) {
29
113
  if(this[i] == obj) {
@@ -32,6 +116,15 @@ export default class jmList extends Array {
32
116
  }
33
117
  }
34
118
 
119
+ /**
120
+ * 移除指定索引位置的元素
121
+ *
122
+ * @method removeAt
123
+ * @param {number} index 要移除的元素索引
124
+ *
125
+ * @example
126
+ * list.removeAt(0); // 移除第一个元素
127
+ */
35
128
  removeAt(index) {
36
129
  if(this.length > index) {
37
130
  const obj = this[index];
@@ -40,10 +133,39 @@ export default class jmList extends Array {
40
133
  }
41
134
  }
42
135
 
136
+ /**
137
+ * 检查列表是否包含指定元素
138
+ *
139
+ * @method contain
140
+ * @param {*} obj 要检查的元素
141
+ * @returns {boolean} 如果包含返回 true,否则返回 false
142
+ *
143
+ * @example
144
+ * if (list.contain(item)) {
145
+ * console.log('元素存在');
146
+ * }
147
+ */
43
148
  contain(obj) {
44
149
  return this.includes(obj);
45
150
  }
46
151
 
152
+ /**
153
+ * 获取元素
154
+ *
155
+ * 如果参数是函数,则返回第一个满足条件的元素;
156
+ * 如果参数是数字,则返回指定索引的元素。
157
+ *
158
+ * @method get
159
+ * @param {number|function} index 索引或条件函数
160
+ * @returns {*} 找到的元素,如果未找到返回 undefined
161
+ *
162
+ * @example
163
+ * // 按索引获取
164
+ * const item = list.get(0);
165
+ *
166
+ * // 按条件查找
167
+ * const found = list.get(item => item.id === 5);
168
+ */
47
169
  get(index) {
48
170
  if(typeof index == 'function') {
49
171
  return this.find(index);
@@ -53,6 +175,27 @@ export default class jmList extends Array {
53
175
  }
54
176
  }
55
177
 
178
+ /**
179
+ * 遍历列表
180
+ *
181
+ * 支持正向和反向遍历。在回调中返回 false 可以中断遍历。
182
+ *
183
+ * @method each
184
+ * @param {function} cb 回调函数,参数为 (index, item)
185
+ * @param {boolean} [inverse=false] 是否反向遍历
186
+ *
187
+ * @example
188
+ * // 正向遍历
189
+ * list.each((index, item) => {
190
+ * console.log(index, item);
191
+ * if (item.id === 3) return false; // 中断遍历
192
+ * });
193
+ *
194
+ * // 反向遍历
195
+ * list.each((index, item) => {
196
+ * console.log(index, item);
197
+ * }, true);
198
+ */
56
199
  each(cb, inverse) {
57
200
  if(cb && typeof cb == 'function') {
58
201
  if(inverse) {
@@ -71,6 +214,20 @@ export default class jmList extends Array {
71
214
  }
72
215
  }
73
216
 
217
+ /**
218
+ * 统计元素数量
219
+ *
220
+ * 如果提供了条件函数,返回满足条件的元素数量;
221
+ * 否则返回列表总长度。
222
+ *
223
+ * @method count
224
+ * @param {function} [handler] 条件函数
225
+ * @returns {number} 元素数量
226
+ *
227
+ * @example
228
+ * const total = list.count(); // 总数量
229
+ * const matched = list.count(item => item.active); // 满足条件的数量
230
+ */
74
231
  count(handler) {
75
232
  if(handler && typeof handler == 'function') {
76
233
  let count = 0;
@@ -85,6 +242,16 @@ export default class jmList extends Array {
85
242
  return this.length;
86
243
  }
87
244
 
245
+ /**
246
+ * 清空列表
247
+ *
248
+ * 移除列表中的所有元素。
249
+ *
250
+ * @method clear
251
+ *
252
+ * @example
253
+ * list.clear();
254
+ */
88
255
  clear() {
89
256
  this.splice(0, this.length);
90
257
  }
@@ -1,78 +1,198 @@
1
1
 
2
+ /**
3
+ * @fileoverview jmGraph 基础对象类
4
+ *
5
+ * jmObject 是 jmGraph 库中所有对象的基类,提供了:
6
+ * - 唯一ID生成机制
7
+ * - 类型检查方法
8
+ * - 动画帧调度系统
9
+ *
10
+ * @module jmObject
11
+ * @author jmGraph Team
12
+ * @license MIT
13
+ */
14
+
2
15
  import {jmList} from "./jmList.js";
3
16
 
17
+ /**
18
+ * 控件ID计数器
19
+ * 用于为每个新创建的对象生成唯一标识符
20
+ * @type {number}
21
+ * @private
22
+ */
4
23
  let control_id_counter = 0;
5
24
 
25
+ /**
26
+ * jmGraph 基础对象类
27
+ *
28
+ * 所有图形控件、属性对象、工具类的基类。
29
+ * 提供了对象标识、类型检查和动画调度等核心功能。
30
+ *
31
+ * @class jmObject
32
+ * @example
33
+ * // 创建一个基础对象
34
+ * const obj = new jmObject();
35
+ * console.log(obj.id); // 输出唯一ID
36
+ *
37
+ * // 类型检查
38
+ * obj.is('jmObject'); // true
39
+ * obj.is(jmObject); // true
40
+ */
6
41
  export default class jmObject {
42
+ /**
43
+ * 构造函数
44
+ *
45
+ * 创建一个新的基础对象实例,自动分配唯一ID。
46
+ * 如果传入的是 jmGraph 实例,则建立关联关系。
47
+ *
48
+ * @constructor
49
+ * @param {jmGraph} [g] - 可选的 jmGraph 实例,用于建立对象与画布的关联
50
+ *
51
+ * @example
52
+ * // 创建独立对象
53
+ * const obj = new jmObject();
54
+ *
55
+ * // 创建关联画布的对象
56
+ * const graph = new jmGraph(canvas);
57
+ * const objWithGraph = new jmObject(graph);
58
+ */
7
59
  constructor(g) {
60
+ // 如果传入的是 jmGraph 实例,则建立引用关系
8
61
  if(g && g.type == 'jmGraph') {
9
62
  this.graph = g;
10
63
  }
64
+ // 生成唯一ID
11
65
  this.id = ++control_id_counter;
12
66
  }
13
67
 
14
68
  /**
15
- * 检 查对象是否为指定类型
69
+ * 检查对象是否为指定类型
70
+ *
71
+ * 支持两种类型检查方式:
72
+ * 1. 字符串方式:检查对象的 type 属性是否匹配
73
+ * 2. 类构造函数方式:使用 instanceof 检查原型链
16
74
  *
17
75
  * @method is
18
- * @param {class} type 判断的类型
19
- * @for jmObject
20
- * @return {boolean} true=表示当前对象为指定的类型type,false=表示不是
76
+ * @param {string|Function} type - 要检查的类型名称(字符串)或类构造函数
77
+ * @returns {boolean} 如果对象是指定类型则返回 true,否则返回 false
78
+ *
79
+ * @example
80
+ * // 使用字符串检查
81
+ * control.is('jmRect'); // 检查是否为矩形
82
+ *
83
+ * // 使用类构造函数检查
84
+ * control.is(jmControl); // 检查是否为 jmControl 实例
85
+ * control.is(jmPath); // 检查是否继承自 jmPath
21
86
  */
22
87
  is(type) {
88
+ // 字符串类型:检查 type 属性
23
89
  if(typeof type == 'string') {
24
90
  return this.type == type;
25
91
  }
92
+ // 类构造函数:使用 instanceof 检查原型链
26
93
  return this instanceof type;
27
94
  }
28
95
 
96
+ /**
97
+ * 注册并执行动画帧回调
98
+ *
99
+ * 提供动画帧调度功能,支持:
100
+ * - 按指定时间间隔执行回调
101
+ * - 多个动画句柄并行执行
102
+ * - 自动清理返回 false 的动画
103
+ * - 错误自动移除异常动画
104
+ *
105
+ * 此方法通常由 jmGraph 实例调用,子控件会委托给所属的 graph 处理。
106
+ *
107
+ * @method animate
108
+ * @param {Function} handle - 动画回调函数,返回 false 时自动移除
109
+ * @param {number} [millisec=20] - 执行间隔(毫秒),默认 20ms
110
+ * @param {...*} [params] - 传递给回调函数的额外参数
111
+ *
112
+ * @example
113
+ * // 创建一个简单的动画
114
+ * let x = 0;
115
+ * graph.animate(function() {
116
+ * x += 1;
117
+ * rect.position.x = x;
118
+ * graph.redraw();
119
+ *
120
+ * // 动画结束条件
121
+ * if(x > 100) return false;
122
+ * }, 16); // 约60fps
123
+ *
124
+ * // 带参数的动画
125
+ * graph.animate(function(speed) {
126
+ * x += speed;
127
+ * // ...
128
+ * }, 16, 5); // speed = 5
129
+ */
29
130
  animate(...args) {
131
+ // 只有 jmGraph 实例才真正处理动画调度
30
132
  if(this.is('jmGraph')) {
133
+ // 注册新的动画句柄
31
134
  if(args.length > 1) {
32
135
  if(!this.animateHandles) this.animateHandles = new jmList();
33
136
 
137
+ // 收集额外参数
34
138
  const params = [];
35
139
  if(args.length > 2) {
36
140
  for(let i=2;i<args.length;i++) {
37
141
  params.push(args[i]);
38
142
  }
39
143
  }
144
+ // 添加动画句柄到列表
40
145
  this.animateHandles.add({
41
- millisec: args[1] || 20,
42
- handle: args[0],
43
- params: params
146
+ millisec: args[1] || 20, // 执行间隔
147
+ handle: args[0], // 回调函数
148
+ params: params // 额外参数
44
149
  });
45
150
  }
151
+
152
+ // 如果有动画句柄,启动调度循环
46
153
  if(this.animateHandles) {
47
154
  if(this.animateHandles.count() > 0) {
48
155
  const self = this;
156
+ // 使用 setTimeout 进行调度(避免 requestAnimationFrame 的固定帧率限制)
49
157
  this.dispatcher = setTimeout(function(_this) {
50
158
  _this = _this || self;
51
- const overduehandles = [];
159
+ const overduehandles = []; // 需要移除的句柄
52
160
  const curTimes = Date.now();
161
+
162
+ // 遍历执行所有动画句柄
53
163
  _this.animateHandles.each(function(i,ani) {
54
164
  try {
165
+ // 检查是否到达执行时间
55
166
  if(ani && ani.handle && (!ani.times || curTimes - ani.times >= ani.millisec)) {
167
+ // 执行回调
56
168
  const r = ani.handle.apply(_this, ani.params);
169
+ // 返回 false 表示动画结束
57
170
  if(r === false) {
58
171
  overduehandles.push(ani);
59
172
  }
173
+ // 更新最后执行时间
60
174
  ani.times = curTimes;
61
175
  }
62
176
  }
63
177
  catch(e) {
178
+ // 出错的句柄自动移除
64
179
  if(ani) overduehandles.push(ani);
65
180
  }
66
181
  });
182
+
183
+ // 移除已完成的动画句柄
67
184
  for(const i in overduehandles) {
68
185
  _this.animateHandles.remove(overduehandles[i]);
69
186
  }
187
+
188
+ // 继续下一轮调度
70
189
  _this.animate();
71
190
  },10,this);
72
191
  }
73
192
  }
74
193
  }
75
194
  else {
195
+ // 非 jmGraph 对象委托给所属的 graph 处理
76
196
  const graph = this.graph;
77
197
  if(graph) {
78
198
  graph.animate(...args);
@@ -1,13 +1,51 @@
1
+ /**
2
+ * @fileoverview jmPath 路径基类
3
+ *
4
+ * jmPath 是大部分图形的基类,提供了基于点序列的路径绘制能力。
5
+ * 所有需要通过点序列定义形状的图形(如多边形、线条、贝塞尔曲线等)
6
+ * 都可以继承此类。
7
+ *
8
+ * 主要功能:
9
+ * - 点序列管理(points 属性)
10
+ * - SVG 导出支持(toSVG 方法)
11
+ * - 路径闭合控制
12
+ *
13
+ * @module jmPath
14
+ * @author jmGraph Team
15
+ * @license MIT
16
+ */
17
+
1
18
  import {jmControl} from "./jmControl.js";
19
+
2
20
  /**
3
- * 基础路径,大部分图型的基类
4
- * 指定一系列点,画出图形
5
- *
21
+ * 基础路径类
22
+ *
23
+ * 大部分图形的基类,通过指定一系列点来画出图形。
24
+ * 支持开放路径和闭合路径,支持 SVG 导出。
25
+ *
6
26
  * @class jmPath
7
27
  * @extends jmControl
8
- * @param {object} params 路径参数 points=所有描点
28
+ *
29
+ * @param {Object} params 路径参数
30
+ * @param {Array<Object>} [params.points] 点序列,每个点格式:{x:0, y:0, m:false}
31
+ * @param {string} [t='jmPath'] 类型标识
32
+ *
33
+ * @example
34
+ * // 创建自定义路径
35
+ * const path = new jmPath({
36
+ * points: [
37
+ * {x: 0, y: 0},
38
+ * {x: 100, y: 0},
39
+ * {x: 100, y: 100},
40
+ * {x: 0, y: 100}
41
+ * ],
42
+ * style: {
43
+ * fill: '#ff0000',
44
+ * stroke: '#000000',
45
+ * close: true // 闭合路径
46
+ * }
47
+ * });
9
48
  */
10
-
11
49
  export default class jmPath extends jmControl {
12
50
 
13
51
  constructor(params, t='jmPath') {