jmgraph 3.2.27 → 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.
- package/dist/jmgraph.core.min.js +1 -1
- package/dist/jmgraph.core.min.js.map +1 -1
- package/dist/jmgraph.js +2661 -415
- package/dist/jmgraph.min.js +1 -1
- package/package.json +1 -1
- package/src/core/jmControl.js +827 -127
- package/src/core/jmEvents.js +154 -0
- package/src/core/jmFilter.js +38 -1
- package/src/core/jmGradient.js +47 -2
- package/src/core/jmGraph.js +51 -7
- package/src/core/jmLayer.js +34 -2
- package/src/core/jmList.js +167 -0
- package/src/core/jmObject.js +128 -8
- package/src/core/jmPath.js +43 -5
- package/src/core/jmProperty.js +181 -2
- package/src/core/jmShadow.js +36 -7
- package/src/core/jmUtils.js +149 -12
- package/src/lib/webgl/base.js +211 -83
- package/src/lib/webgl/core/buffer.js +43 -12
- package/src/lib/webgl/core/mapSize.js +16 -7
- package/src/lib/webgl/core/mapType.js +41 -22
- package/src/lib/webgl/core/program.js +94 -54
- package/src/lib/webgl/core/shader.js +20 -8
- package/src/lib/webgl/core/texture.js +55 -32
- package/src/lib/webgl/gradient.js +49 -17
- package/src/lib/webgl/index.js +173 -24
- package/src/lib/webgl/path.js +61 -12
- package/src/shapes/jmArc.js +48 -2
- package/src/shapes/jmArrow.js +35 -2
- package/src/shapes/jmArrowLine.js +33 -2
- package/src/shapes/jmBezier.js +50 -4
- package/src/shapes/jmCircle.js +35 -2
- package/src/shapes/jmEllipse.js +29 -3
- package/src/shapes/jmHArc.js +39 -2
- package/src/shapes/jmImage.js +49 -3
- package/src/shapes/jmLabel.js +41 -2
- package/src/shapes/jmLine.js +42 -2
- package/src/shapes/jmPolygon.js +42 -3
- package/src/shapes/jmPrismatic.js +34 -2
- package/src/shapes/jmRect.js +45 -3
- package/src/shapes/jmResize.js +42 -4
- package/src/shapes/jmStar.js +38 -4
package/src/core/jmObject.js
CHANGED
|
@@ -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 {
|
|
19
|
-
* @
|
|
20
|
-
*
|
|
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);
|
package/src/core/jmPath.js
CHANGED
|
@@ -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
|
-
*
|
|
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') {
|
package/src/core/jmProperty.js
CHANGED
|
@@ -1,45 +1,170 @@
|
|
|
1
1
|
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview jmGraph 属性管理基类
|
|
4
|
+
*
|
|
5
|
+
* jmProperty 是 jmGraph 库中属性管理的核心类,继承自 jmObject。
|
|
6
|
+
* 提供了:
|
|
7
|
+
* - 基于 Symbol 的私有属性存储
|
|
8
|
+
* - 属性变更事件通知机制
|
|
9
|
+
* - 渲染模式管理(2D/WebGL)
|
|
10
|
+
* - 动画帧请求封装
|
|
11
|
+
*
|
|
12
|
+
* @module jmProperty
|
|
13
|
+
* @extends jmObject
|
|
14
|
+
* @author jmGraph Team
|
|
15
|
+
* @license MIT
|
|
16
|
+
*/
|
|
17
|
+
|
|
2
18
|
import {jmUtils} from "./jmUtils.js";
|
|
3
19
|
import { jmObject } from "./jmObject.js";
|
|
4
20
|
|
|
21
|
+
/**
|
|
22
|
+
* 属性存储的 Symbol 键
|
|
23
|
+
* 使用 Symbol 确保属性存储的私有性和唯一性
|
|
24
|
+
* @type {Symbol}
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
5
27
|
const PROPERTY_KEY = Symbol("properties");
|
|
6
28
|
|
|
29
|
+
/**
|
|
30
|
+
* jmGraph 属性管理基类
|
|
31
|
+
*
|
|
32
|
+
* jmProperty 是 jmControl 的父类,为所有图形控件提供属性管理功能。
|
|
33
|
+
* 采用 Symbol + WeakMap 模式实现真正的私有属性存储,避免属性名冲突。
|
|
34
|
+
*
|
|
35
|
+
* 核心特性:
|
|
36
|
+
* 1. **私有属性存储**:使用 Symbol 键确保属性不被外部直接访问
|
|
37
|
+
* 2. **属性变更通知**:设置属性时自动触发 'propertyChange' 事件
|
|
38
|
+
* 3. **渲染模式继承**:子控件自动继承所属 graph 的渲染模式
|
|
39
|
+
* 4. **脏标记传播**:子控件 needUpdate 会自动传播到 graph
|
|
40
|
+
*
|
|
41
|
+
* @class jmProperty
|
|
42
|
+
* @extends jmObject
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* // 创建属性对象
|
|
46
|
+
* const prop = new jmProperty({ mode: 'webgl' });
|
|
47
|
+
*
|
|
48
|
+
* // 设置和获取属性
|
|
49
|
+
* prop.property('customValue', 100);
|
|
50
|
+
* console.log(prop.property('customValue')); // 100
|
|
51
|
+
*
|
|
52
|
+
* // 监听属性变更
|
|
53
|
+
* prop.on('propertyChange', (name, args) => {
|
|
54
|
+
* console.log(`${name} changed from ${args.oldValue} to ${args.newValue}`);
|
|
55
|
+
* });
|
|
56
|
+
*/
|
|
7
57
|
export default class jmProperty extends jmObject {
|
|
58
|
+
/**
|
|
59
|
+
* 构造函数
|
|
60
|
+
*
|
|
61
|
+
* 初始化属性存储对象,并设置初始渲染模式。
|
|
62
|
+
*
|
|
63
|
+
* @constructor
|
|
64
|
+
* @param {Object} [params] - 初始化参数
|
|
65
|
+
* @param {'2d'|'webgl'} [params.mode] - 渲染模式,默认 '2d'
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* // 创建使用 WebGL 渲染的属性对象
|
|
69
|
+
* const prop = new jmProperty({ mode: 'webgl' });
|
|
70
|
+
*/
|
|
8
71
|
constructor(params) {
|
|
9
72
|
super();
|
|
73
|
+
// 初始化私有属性存储对象
|
|
10
74
|
this[PROPERTY_KEY] = {};
|
|
75
|
+
// 设置渲染模式
|
|
11
76
|
if(params && params.mode) this.mode = params.mode;
|
|
12
77
|
}
|
|
13
78
|
|
|
79
|
+
/**
|
|
80
|
+
* 获取或设置属性值
|
|
81
|
+
*
|
|
82
|
+
* 这是属性系统的核心方法,所有属性的存取都通过此方法。
|
|
83
|
+
* 设置属性时会自动触发 'propertyChange' 事件,便于实现响应式更新。
|
|
84
|
+
*
|
|
85
|
+
* @method property
|
|
86
|
+
* @param {string} name - 属性名称
|
|
87
|
+
* @param {*} [value] - 属性值(设置时提供)
|
|
88
|
+
* @returns {*} 获取时返回属性值,设置时返回设置的值
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* // 获取属性
|
|
92
|
+
* const value = obj.property('myProp');
|
|
93
|
+
*
|
|
94
|
+
* // 设置属性
|
|
95
|
+
* obj.property('myProp', 'newValue');
|
|
96
|
+
*
|
|
97
|
+
* // 链式调用
|
|
98
|
+
* obj.property('a', 1).property('b', 2);
|
|
99
|
+
*/
|
|
14
100
|
property(...pars) {
|
|
15
101
|
if(pars) {
|
|
16
102
|
const pros = this[PROPERTY_KEY];
|
|
17
103
|
const name = pars[0];
|
|
104
|
+
|
|
105
|
+
// 设置属性
|
|
18
106
|
if(pars.length > 1) {
|
|
19
107
|
const value = pars[1];
|
|
20
108
|
const args = {oldValue: pros[name], newValue: value};
|
|
21
109
|
pros[name] = pars[1];
|
|
110
|
+
// 触发属性变更事件(如果对象支持事件)
|
|
22
111
|
if(this.emit) this.emit('propertyChange', name, args);
|
|
23
112
|
return pars[1];
|
|
24
113
|
}
|
|
114
|
+
// 获取属性
|
|
25
115
|
else if(name) {
|
|
26
116
|
return pros[name];
|
|
27
117
|
}
|
|
28
118
|
}
|
|
29
119
|
}
|
|
30
120
|
|
|
121
|
+
/**
|
|
122
|
+
* 是否需要重绘标记
|
|
123
|
+
*
|
|
124
|
+
* 当属性变化导致需要重新渲染时设置此标记。
|
|
125
|
+
* 设置为 true 时,会自动将所属 graph 的 needUpdate 设为 true,
|
|
126
|
+
* 从而触发画布重绘。
|
|
127
|
+
*
|
|
128
|
+
* @type {boolean}
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* // 标记需要重绘
|
|
132
|
+
* control.needUpdate = true;
|
|
133
|
+
*
|
|
134
|
+
* // 检查是否需要重绘
|
|
135
|
+
* if(control.needUpdate) {
|
|
136
|
+
* control.redraw();
|
|
137
|
+
* }
|
|
138
|
+
*/
|
|
31
139
|
get needUpdate() {
|
|
32
140
|
return this.property('needUpdate');
|
|
33
141
|
}
|
|
34
142
|
set needUpdate(v) {
|
|
35
143
|
this.property('needUpdate', v);
|
|
144
|
+
// 传播脏标记到 graph(避免 jmGraph 自身循环)
|
|
36
145
|
if(v && !this.is('jmGraph') && this.graph) {
|
|
37
146
|
this.graph.needUpdate = true;
|
|
38
147
|
}
|
|
39
148
|
}
|
|
40
149
|
|
|
150
|
+
/**
|
|
151
|
+
* 所属的画布实例
|
|
152
|
+
*
|
|
153
|
+
* 获取或设置当前对象所属的 jmGraph 实例。
|
|
154
|
+
* 如果未显式设置,会自动向上查找父级链中的 jmGraph。
|
|
155
|
+
*
|
|
156
|
+
* @type {jmGraph}
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* // 获取所属画布
|
|
160
|
+
* const graph = control.graph;
|
|
161
|
+
*
|
|
162
|
+
* // 设置所属画布(通常由框架内部调用)
|
|
163
|
+
* control.graph = myGraph;
|
|
164
|
+
*/
|
|
41
165
|
get graph() {
|
|
42
166
|
let g = this.property('graph');
|
|
167
|
+
// 如果未设置,尝试从父级链查找
|
|
43
168
|
g = g || (this.property('graph', this.findParent('jmGraph')));
|
|
44
169
|
return g;
|
|
45
170
|
}
|
|
@@ -47,20 +172,74 @@ export default class jmProperty extends jmObject {
|
|
|
47
172
|
return this.property('graph', v);
|
|
48
173
|
}
|
|
49
174
|
|
|
175
|
+
/**
|
|
176
|
+
* 渲染模式
|
|
177
|
+
*
|
|
178
|
+
* 获取当前渲染模式,支持 '2d' 和 'webgl' 两种模式。
|
|
179
|
+
* 渲染模式的查找优先级:
|
|
180
|
+
* 1. 当前对象设置的 mode
|
|
181
|
+
* 2. 如果是 jmGraph,默认 '2d'
|
|
182
|
+
* 3. 从所属 graph 继承 mode
|
|
183
|
+
*
|
|
184
|
+
* @type {'2d'|'webgl'}
|
|
185
|
+
* @readonly
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* // 检查渲染模式
|
|
189
|
+
* if(control.mode === 'webgl') {
|
|
190
|
+
* // 使用 WebGL 特性
|
|
191
|
+
* } else {
|
|
192
|
+
* // 使用 Canvas 2D API
|
|
193
|
+
* }
|
|
194
|
+
*/
|
|
50
195
|
get mode() {
|
|
51
196
|
let m = this.property('mode');
|
|
52
197
|
if(m) return m;
|
|
53
|
-
|
|
54
|
-
return this.
|
|
198
|
+
// 如果当前对象是jmGraph且没有设置mode,返回默认值
|
|
199
|
+
if(this.is('jmGraph')) return this.property('mode') || '2d';
|
|
200
|
+
// 否则从所属的graph获取mode
|
|
201
|
+
return this.graph?.mode || '2d';
|
|
55
202
|
}
|
|
56
203
|
set mode(v) {
|
|
57
204
|
return this.property('mode', v);
|
|
58
205
|
}
|
|
59
206
|
|
|
207
|
+
/**
|
|
208
|
+
* 请求动画帧
|
|
209
|
+
*
|
|
210
|
+
* 封装 requestAnimationFrame,支持在不同环境下工作。
|
|
211
|
+
* 如果当前对象关联了 canvas,会使用 canvas 的 requestAnimationFrame。
|
|
212
|
+
*
|
|
213
|
+
* @method requestAnimationFrame
|
|
214
|
+
* @param {Function} handler - 动画帧回调函数
|
|
215
|
+
* @returns {number} 动画帧请求ID,用于取消
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* // 请求下一帧动画
|
|
219
|
+
* const frameId = control.requestAnimationFrame(() => {
|
|
220
|
+
* // 更新动画状态
|
|
221
|
+
* control.redraw();
|
|
222
|
+
* });
|
|
223
|
+
*
|
|
224
|
+
* // 取消动画帧
|
|
225
|
+
* control.cancelAnimationFrame(frameId);
|
|
226
|
+
*/
|
|
60
227
|
requestAnimationFrame(handler) {
|
|
61
228
|
return jmUtils.requestAnimationFrame(handler, this.graph? this.graph.canvas: null);
|
|
62
229
|
}
|
|
63
230
|
|
|
231
|
+
/**
|
|
232
|
+
* 取消动画帧请求
|
|
233
|
+
*
|
|
234
|
+
* 取消之前通过 requestAnimationFrame 注册的回调。
|
|
235
|
+
*
|
|
236
|
+
* @method cancelAnimationFrame
|
|
237
|
+
* @param {number} handler - 动画帧请求ID
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* // 取消动画帧
|
|
241
|
+
* control.cancelAnimationFrame(frameId);
|
|
242
|
+
*/
|
|
64
243
|
cancelAnimationFrame(handler) {
|
|
65
244
|
return jmUtils.cancelAnimationFrame(handler, this.graph? this.graph.canvas: null);
|
|
66
245
|
}
|
package/src/core/jmShadow.js
CHANGED
|
@@ -1,15 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview jmShadow 阴影类
|
|
3
|
+
*
|
|
4
|
+
* jmShadow 提供了图形阴影效果的创建和管理功能。
|
|
5
|
+
* 支持设置阴影的偏移、模糊程度和颜色。
|
|
6
|
+
*
|
|
7
|
+
* 主要功能:
|
|
8
|
+
* - 阴影偏移设置(x, y)
|
|
9
|
+
* - 模糊程度设置(blur)
|
|
10
|
+
* - 阴影颜色设置(color)
|
|
11
|
+
* - 字符串解析和序列化
|
|
12
|
+
*
|
|
13
|
+
* @module jmShadow
|
|
14
|
+
* @author jmGraph Team
|
|
15
|
+
* @license MIT
|
|
16
|
+
*/
|
|
17
|
+
|
|
1
18
|
import {jmUtils} from "./jmUtils.js";
|
|
2
19
|
|
|
3
20
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
21
|
+
* 阴影类
|
|
22
|
+
*
|
|
23
|
+
* 用于创建图形的阴影效果。阴影可以应用于任何图形控件。
|
|
24
|
+
*
|
|
6
25
|
* @class jmShadow
|
|
7
|
-
*
|
|
8
|
-
* @param {number} y
|
|
9
|
-
* @param {number}
|
|
10
|
-
* @param {
|
|
26
|
+
*
|
|
27
|
+
* @param {number|string} x 横坐标偏移量,或阴影字符串格式 'x,y,blur,color'
|
|
28
|
+
* @param {number} [y] 纵坐标偏移量
|
|
29
|
+
* @param {number} [blur] 模糊值
|
|
30
|
+
* @param {string} [color] 阴影颜色
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // 创建阴影
|
|
34
|
+
* const shadow = new jmShadow(5, 5, 10, 'rgba(0,0,0,0.5)');
|
|
35
|
+
*
|
|
36
|
+
* // 从字符串创建
|
|
37
|
+
* const shadow = new jmShadow('5, 5, 10, rgba(0,0,0,0.5)');
|
|
38
|
+
*
|
|
39
|
+
* // 应用到图形
|
|
40
|
+
* rect.style.shadow = shadow;
|
|
11
41
|
*/
|
|
12
|
-
|
|
13
42
|
export default class jmShadow {
|
|
14
43
|
constructor(x, y, blur, color) {
|
|
15
44
|
if(typeof x == 'string' && !y && !blur && !color) {
|