vislite 0.5.2-alpha.0 → 0.5.2-alpha.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.
- package/CHANGELOG +7 -1
- package/lib/Buffer/index.umd.js +55 -0
- package/lib/Buffer/index.umd.min.js +11 -0
- package/lib/Canvas/index.umd.js +721 -0
- package/lib/Canvas/index.umd.min.js +11 -0
- package/lib/Cardinal/index.umd.js +112 -0
- package/lib/Cardinal/index.umd.min.js +11 -0
- package/lib/Eoap/index.umd.js +53 -0
- package/lib/Eoap/index.umd.min.js +11 -0
- package/lib/Geometry/index.umd.js +205 -0
- package/lib/Geometry/index.umd.min.js +11 -0
- package/lib/Hermite/index.umd.js +55 -0
- package/lib/Hermite/index.umd.min.js +11 -0
- package/lib/Matrix4/index.umd.js +146 -0
- package/lib/Matrix4/index.umd.min.js +11 -0
- package/lib/Mercator/index.umd.js +39 -0
- package/lib/Mercator/index.umd.min.js +11 -0
- package/lib/OralCanvas/index.es.js +657 -0
- package/lib/OralCanvas/index.es.min.js +11 -0
- package/lib/OralWebGL/index.es.js +611 -0
- package/lib/OralWebGL/index.es.min.js +11 -0
- package/lib/SVG/index.umd.js +540 -0
- package/lib/SVG/index.umd.min.js +11 -0
- package/lib/Shader/index.umd.js +134 -0
- package/lib/Shader/index.umd.min.js +11 -0
- package/lib/Texture/index.umd.js +72 -0
- package/lib/Texture/index.umd.min.js +11 -0
- package/lib/TreeLayout/index.umd.js +430 -0
- package/lib/TreeLayout/index.umd.min.js +11 -0
- package/lib/WebGL/index.umd.js +684 -0
- package/lib/WebGL/index.umd.min.js +11 -0
- package/lib/animation/index.umd.js +91 -0
- package/lib/animation/index.umd.min.js +11 -0
- package/lib/formatColor/index.umd.js +59 -0
- package/lib/formatColor/index.umd.min.js +11 -0
- package/lib/getLoopColors/index.umd.js +55 -0
- package/lib/getLoopColors/index.umd.min.js +11 -0
- package/lib/getWebGLContext/index.umd.js +65 -0
- package/lib/getWebGLContext/index.umd.min.js +11 -0
- package/lib/index.umd.js +2916 -0
- package/lib/index.umd.min.js +11 -0
- package/lib/move/index.umd.js +27 -0
- package/lib/move/index.umd.min.js +11 -0
- package/lib/resizeObserver/index.umd.js +48 -0
- package/lib/resizeObserver/index.umd.min.js +11 -0
- package/lib/rotate/index.umd.js +27 -0
- package/lib/rotate/index.umd.min.js +11 -0
- package/lib/ruler/index.umd.js +145 -0
- package/lib/ruler/index.umd.min.js +11 -0
- package/lib/scale/index.umd.js +26 -0
- package/lib/scale/index.umd.min.js +11 -0
- package/lib/throttle/index.umd.js +70 -0
- package/lib/throttle/index.umd.min.js +11 -0
- package/lib/viewHandler/index.umd.js +139 -0
- package/lib/viewHandler/index.umd.min.js +11 -0
- package/package/index.ts +4 -0
- package/package/move/index.ts +3 -0
- package/package/scale/index.ts +3 -0
- package/package.json +1 -1
- package/src/common/svg/config.ts +157 -145
- package/src/common/svg/gradient.ts +63 -0
- package/src/common/svg/index.ts +12 -0
- package/src/move.ts +8 -0
- package/src/scale.ts +7 -0
- package/types/Canvas.d.ts +2 -2
- package/types/Gradient.d.ts +2 -2
- package/types/SVG.d.ts +23 -0
- package/types/index.d.ts +6 -0
- package/types/move.d.ts +3 -0
- package/types/scale.d.ts +3 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* VISLite JavaScript Library v0.5.2-alpha.2
|
|
3
|
+
* git+https://github.com/oi-contrib/VISLite.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright zxl20070701
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
* https://zxl20070701.github.io/notebook/home.html
|
|
8
|
+
*
|
|
9
|
+
* Publish Date: Mon Oct 23 2023 22:21:10 GMT+0800 (中国标准时间)
|
|
10
|
+
*/
|
|
11
|
+
(function (global, factory) {
|
|
12
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
13
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
14
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VISLite_viewHandler = factory());
|
|
15
|
+
})(this, (function () { 'use strict';
|
|
16
|
+
|
|
17
|
+
var mousePosition = function (el, event) {
|
|
18
|
+
var bounding = el.getBoundingClientRect();
|
|
19
|
+
return {
|
|
20
|
+
"x": event.clientX - bounding.left,
|
|
21
|
+
"y": event.clientY - bounding.top
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
var getKeyString = function (event) {
|
|
25
|
+
return {
|
|
26
|
+
37: "left",
|
|
27
|
+
38: "up",
|
|
28
|
+
39: "right",
|
|
29
|
+
40: "down",
|
|
30
|
+
}[event.keyCode || event.which];
|
|
31
|
+
};
|
|
32
|
+
function viewHandler (callback) {
|
|
33
|
+
var el = document.getElementsByTagName('body')[0];
|
|
34
|
+
el.addEventListener("keydown", function (event) {
|
|
35
|
+
var keyCode = getKeyString(event);
|
|
36
|
+
if (keyCode == 'up') {
|
|
37
|
+
callback({
|
|
38
|
+
type: "lookUp",
|
|
39
|
+
normal: [],
|
|
40
|
+
value: 0.1,
|
|
41
|
+
event: event
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (keyCode == 'down') {
|
|
45
|
+
callback({
|
|
46
|
+
type: "lookDown",
|
|
47
|
+
normal: [],
|
|
48
|
+
value: 0.1,
|
|
49
|
+
event: event
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else if (keyCode == 'left') {
|
|
53
|
+
callback({
|
|
54
|
+
type: "lookLeft",
|
|
55
|
+
normal: [],
|
|
56
|
+
value: 0.1,
|
|
57
|
+
event: event
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (keyCode == 'right') {
|
|
61
|
+
callback({
|
|
62
|
+
type: "lookRight",
|
|
63
|
+
normal: [],
|
|
64
|
+
value: 0.1,
|
|
65
|
+
event: event
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
var mouseP = null;
|
|
70
|
+
var doMove = function (event) {
|
|
71
|
+
if (mouseP == null) {
|
|
72
|
+
callback({
|
|
73
|
+
type: "hover",
|
|
74
|
+
normal: [],
|
|
75
|
+
value: 0,
|
|
76
|
+
event: event
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
var tempMouseP = mousePosition(el, event);
|
|
81
|
+
var normal = [tempMouseP.x - mouseP.x, tempMouseP.y - mouseP.y];
|
|
82
|
+
var rotateNormal = [
|
|
83
|
+
normal[1],
|
|
84
|
+
normal[0],
|
|
85
|
+
0
|
|
86
|
+
];
|
|
87
|
+
if (rotateNormal[0] == 0 && rotateNormal[1] == 0)
|
|
88
|
+
return;
|
|
89
|
+
callback({
|
|
90
|
+
type: "rotate",
|
|
91
|
+
normal: rotateNormal,
|
|
92
|
+
value: (Math.abs(tempMouseP.x - mouseP.x) + Math.abs(tempMouseP.y - mouseP.y)) * 0.01,
|
|
93
|
+
event: event
|
|
94
|
+
});
|
|
95
|
+
mouseP = tempMouseP;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
el.addEventListener("mousedown", function (event) {
|
|
99
|
+
mouseP = mousePosition(el, event);
|
|
100
|
+
});
|
|
101
|
+
el.addEventListener("mouseup", function (event) {
|
|
102
|
+
mouseP = null;
|
|
103
|
+
});
|
|
104
|
+
el.addEventListener("mousemove", function (event) {
|
|
105
|
+
doMove(event);
|
|
106
|
+
});
|
|
107
|
+
el.addEventListener("touchend", function (event) {
|
|
108
|
+
mouseP = null;
|
|
109
|
+
});
|
|
110
|
+
el.addEventListener("touchstart", function (event) {
|
|
111
|
+
mouseP = mousePosition(el, event);
|
|
112
|
+
});
|
|
113
|
+
el.addEventListener("touchmove", function (event) {
|
|
114
|
+
doMove(event.touches[0]);
|
|
115
|
+
});
|
|
116
|
+
var doScale = function (value, event) {
|
|
117
|
+
if (value == 0)
|
|
118
|
+
return;
|
|
119
|
+
var baseTimes = 0.899;
|
|
120
|
+
callback({
|
|
121
|
+
type: "scale",
|
|
122
|
+
value: value < 0 ? baseTimes : 2 - baseTimes,
|
|
123
|
+
normal: [],
|
|
124
|
+
event: event
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
el.addEventListener("mousewheel", function (event) {
|
|
128
|
+
doScale(event.wheelDelta, event);
|
|
129
|
+
});
|
|
130
|
+
if (window.addEventListener) {
|
|
131
|
+
window.addEventListener('DOMMouseScroll', function (event) {
|
|
132
|
+
doScale(-1 * event.detail, event);
|
|
133
|
+
}, false);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return viewHandler;
|
|
138
|
+
|
|
139
|
+
}));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* VISLite JavaScript Library v0.5.2-alpha.2
|
|
3
|
+
* git+https://github.com/oi-contrib/VISLite.git
|
|
4
|
+
*
|
|
5
|
+
* Copyright zxl20070701
|
|
6
|
+
* Released under the MIT license
|
|
7
|
+
* https://zxl20070701.github.io/notebook/home.html
|
|
8
|
+
*
|
|
9
|
+
* Publish Date: Mon Oct 23 2023 22:21:10 GMT+0800 (中国标准时间)
|
|
10
|
+
*/
|
|
11
|
+
var e,n;e=this,n=function(){"use strict";var e=function(e,n){var t=e.getBoundingClientRect();return{x:n.clientX-t.left,y:n.clientY-t.top}};return function(n){var t=document.getElementsByTagName("body")[0];t.addEventListener("keydown",(function(e){var t=function(e){return{37:"left",38:"up",39:"right",40:"down"}[e.keyCode||e.which]}(e);"up"==t?n({type:"lookUp",normal:[],value:.1,event:e}):"down"==t?n({type:"lookDown",normal:[],value:.1,event:e}):"left"==t?n({type:"lookLeft",normal:[],value:.1,event:e}):"right"==t&&n({type:"lookRight",normal:[],value:.1,event:e})}));var o=null,i=function(i){if(null==o)n({type:"hover",normal:[],value:0,event:i});else{var u=e(t,i),l=[u.x-o.x,u.y-o.y],a=[l[1],l[0],0];if(0==a[0]&&0==a[1])return;n({type:"rotate",normal:a,value:.01*(Math.abs(u.x-o.x)+Math.abs(u.y-o.y)),event:i}),o=u}};t.addEventListener("mousedown",(function(n){o=e(t,n)})),t.addEventListener("mouseup",(function(e){o=null})),t.addEventListener("mousemove",(function(e){i(e)})),t.addEventListener("touchend",(function(e){o=null})),t.addEventListener("touchstart",(function(n){o=e(t,n)})),t.addEventListener("touchmove",(function(e){i(e.touches[0])}));var u=function(e,t){0!=e&&n({type:"scale",value:e<0?.899:1.101,normal:[],event:t})};t.addEventListener("mousewheel",(function(e){u(e.wheelDelta,e)})),window.addEventListener&&window.addEventListener("DOMMouseScroll",(function(e){u(-1*e.detail,e)}),!1)}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).VISLite_viewHandler=n();
|
package/package/index.ts
CHANGED
|
@@ -3,6 +3,8 @@ import Hermite from "./Hermite/index"
|
|
|
3
3
|
|
|
4
4
|
import Matrix4 from "./Matrix4/index"
|
|
5
5
|
import rotate from "./rotate/index"
|
|
6
|
+
import move from "./move/index"
|
|
7
|
+
import scale from "./scale/index"
|
|
6
8
|
|
|
7
9
|
import getLoopColors from "./getLoopColors/index"
|
|
8
10
|
import formatColor from "./formatColor/index"
|
|
@@ -38,6 +40,8 @@ export default {
|
|
|
38
40
|
// 变换
|
|
39
41
|
Matrix4,
|
|
40
42
|
rotate,
|
|
43
|
+
move,
|
|
44
|
+
scale,
|
|
41
45
|
|
|
42
46
|
// 工具
|
|
43
47
|
getLoopColors,
|
package/package.json
CHANGED
package/src/common/svg/config.ts
CHANGED
|
@@ -3,172 +3,184 @@ import type SVGConfigType from "../../../types/SVGConfig"
|
|
|
3
3
|
import { setAttribute } from "./tool"
|
|
4
4
|
import setStyle from "../setStyle"
|
|
5
5
|
import arc from "../canvas/arc"
|
|
6
|
+
import { toNode } from "./tool"
|
|
7
|
+
|
|
8
|
+
export let initDefs = (el: SVGElement) => {
|
|
9
|
+
let defs = el.getElementsByTagName('defs')
|
|
10
|
+
if (defs.length <= 0) {
|
|
11
|
+
let newDefs = toNode("defs")
|
|
12
|
+
el.appendChild(newDefs)
|
|
13
|
+
return newDefs
|
|
14
|
+
} else {
|
|
15
|
+
return defs[0]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
6
18
|
|
|
7
19
|
// 文字统一设置方法
|
|
8
20
|
export let initText = (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
21
|
+
el: SVGElement,
|
|
22
|
+
config: SVGConfigType,
|
|
23
|
+
x: number,
|
|
24
|
+
y: number,
|
|
25
|
+
deg: number
|
|
14
26
|
) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
27
|
+
if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
|
|
28
|
+
|
|
29
|
+
// 垂直对齐采用dy实现
|
|
30
|
+
setAttribute(
|
|
31
|
+
el,
|
|
32
|
+
"dy",
|
|
33
|
+
{
|
|
34
|
+
top: config["fontSize"] * 0.5,
|
|
35
|
+
middle: 0,
|
|
36
|
+
bottom: -config["fontSize"] * 0.5,
|
|
37
|
+
}[config.textBaseline]
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
setStyle(el, {
|
|
41
|
+
// 文字对齐方式
|
|
42
|
+
"text-anchor": {
|
|
43
|
+
left: "start",
|
|
44
|
+
right: "end",
|
|
45
|
+
center: "middle",
|
|
46
|
+
}[config.textAlign],
|
|
47
|
+
"dominant-baseline": "central",
|
|
48
|
+
|
|
49
|
+
// 文字大小和字体设置
|
|
50
|
+
"font-size": config["fontSize"] + "px",
|
|
51
|
+
"font-family": config["fontFamily"],
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// 位置
|
|
55
|
+
setAttribute(el, "x", x)
|
|
56
|
+
setAttribute(el, "y", y)
|
|
57
|
+
|
|
58
|
+
// 旋转
|
|
59
|
+
if (typeof deg == "number") {
|
|
60
|
+
deg = deg % 360
|
|
61
|
+
setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
|
|
62
|
+
}
|
|
51
63
|
}
|
|
52
64
|
|
|
53
65
|
// 画圆统一设置方法
|
|
54
66
|
export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
if (el.nodeName.toLowerCase() !== "circle")
|
|
68
|
+
throw new Error("Need a <circle> !")
|
|
69
|
+
setAttribute(el, "cx", cx)
|
|
70
|
+
setAttribute(el, "cy", cy)
|
|
71
|
+
setAttribute(el, "r", r)
|
|
60
72
|
}
|
|
61
73
|
|
|
62
74
|
// 路径统一设置方法
|
|
63
75
|
export let initPath = (el: SVGElement, path: string) => {
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
|
|
77
|
+
setAttribute(el, "d", path)
|
|
66
78
|
}
|
|
67
79
|
|
|
68
80
|
// 画矩形统一设置方法
|
|
69
81
|
export let initRect = (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
el: SVGElement,
|
|
83
|
+
x: number,
|
|
84
|
+
y: number,
|
|
85
|
+
width: number,
|
|
86
|
+
height: number
|
|
75
87
|
) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
|
|
89
|
+
|
|
90
|
+
// 由于高和宽不可以是负数,校对一下
|
|
91
|
+
if (height < 0) {
|
|
92
|
+
height *= -1
|
|
93
|
+
y -= height
|
|
94
|
+
}
|
|
95
|
+
if (width < 0) {
|
|
96
|
+
width *= -1
|
|
97
|
+
x -= width
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
setAttribute(el, "x", x)
|
|
101
|
+
setAttribute(el, "y", y)
|
|
102
|
+
setAttribute(el, "width", width)
|
|
103
|
+
setAttribute(el, "height", height)
|
|
92
104
|
}
|
|
93
105
|
|
|
94
106
|
// 画弧统一设置方法
|
|
95
107
|
export let initArc = (
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
108
|
+
el: SVGElement,
|
|
109
|
+
config: SVGConfigType,
|
|
110
|
+
cx: number,
|
|
111
|
+
cy: number,
|
|
112
|
+
r1: number,
|
|
113
|
+
r2: number,
|
|
114
|
+
beginDeg: number,
|
|
115
|
+
deg: number
|
|
104
116
|
) => {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// 当|deg|>=2π的时候都认为是一个圆环
|
|
119
|
-
if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
|
|
120
|
-
deg = Math.PI * 1.999999
|
|
121
|
-
} else {
|
|
122
|
-
deg = deg % (Math.PI * 2)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
arc(
|
|
126
|
-
beginDeg,
|
|
127
|
-
deg,
|
|
128
|
-
cx,
|
|
129
|
-
cy,
|
|
130
|
-
r1,
|
|
131
|
-
r2,
|
|
132
|
-
function (
|
|
133
|
-
beginA: number,
|
|
134
|
-
endA: number,
|
|
135
|
-
begInnerX: number,
|
|
136
|
-
begInnerY: number,
|
|
137
|
-
begOuterX: number,
|
|
138
|
-
begOuterY: number,
|
|
139
|
-
endInnerX: number,
|
|
140
|
-
endInnerY: number,
|
|
141
|
-
endOuterX: number,
|
|
142
|
-
endOuterY: number,
|
|
143
|
-
r: number
|
|
144
|
-
) {
|
|
145
|
-
let f = endA - beginA > Math.PI ? 1 : 0,
|
|
146
|
-
d = "M" + begInnerX + " " + begInnerY
|
|
147
|
-
if (r < 0) r = -r
|
|
148
|
-
|
|
149
|
-
d +=
|
|
150
|
-
// 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
|
|
151
|
-
"A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
|
|
152
|
-
|
|
153
|
-
// 结尾
|
|
154
|
-
if (config.arcEndCap == "round")
|
|
155
|
-
d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
|
|
156
|
-
else if (config.arcEndCap == "-round")
|
|
157
|
-
d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
|
|
158
|
-
else d += "L" + endOuterX + " " + endOuterY
|
|
159
|
-
d +=
|
|
160
|
-
"A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
|
|
161
|
-
|
|
162
|
-
// 开头
|
|
163
|
-
if (config.arcStartCap == "round")
|
|
164
|
-
d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
|
|
165
|
-
else if (config.arcStartCap == "-round")
|
|
166
|
-
d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
|
|
167
|
-
else d += "L" + begInnerX + " " + begInnerY
|
|
168
|
-
|
|
169
|
-
if (config.arcStartCap == "butt") d += "Z"
|
|
170
|
-
|
|
171
|
-
setAttribute(el, "d", d)
|
|
117
|
+
if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
|
|
118
|
+
|
|
119
|
+
beginDeg = (beginDeg / 180) * Math.PI
|
|
120
|
+
deg = (deg / 180) * Math.PI
|
|
121
|
+
|
|
122
|
+
beginDeg = beginDeg % (Math.PI * 2)
|
|
123
|
+
|
|
124
|
+
if (r1 > r2) {
|
|
125
|
+
let temp = r1
|
|
126
|
+
r1 = r2
|
|
127
|
+
r2 = temp
|
|
172
128
|
}
|
|
173
|
-
|
|
129
|
+
|
|
130
|
+
// 当|deg|>=2π的时候都认为是一个圆环
|
|
131
|
+
if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
|
|
132
|
+
deg = Math.PI * 1.999999
|
|
133
|
+
} else {
|
|
134
|
+
deg = deg % (Math.PI * 2)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
arc(
|
|
138
|
+
beginDeg,
|
|
139
|
+
deg,
|
|
140
|
+
cx,
|
|
141
|
+
cy,
|
|
142
|
+
r1,
|
|
143
|
+
r2,
|
|
144
|
+
function (
|
|
145
|
+
beginA: number,
|
|
146
|
+
endA: number,
|
|
147
|
+
begInnerX: number,
|
|
148
|
+
begInnerY: number,
|
|
149
|
+
begOuterX: number,
|
|
150
|
+
begOuterY: number,
|
|
151
|
+
endInnerX: number,
|
|
152
|
+
endInnerY: number,
|
|
153
|
+
endOuterX: number,
|
|
154
|
+
endOuterY: number,
|
|
155
|
+
r: number
|
|
156
|
+
) {
|
|
157
|
+
let f = endA - beginA > Math.PI ? 1 : 0,
|
|
158
|
+
d = "M" + begInnerX + " " + begInnerY
|
|
159
|
+
if (r < 0) r = -r
|
|
160
|
+
|
|
161
|
+
d +=
|
|
162
|
+
// 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
|
|
163
|
+
"A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
|
|
164
|
+
|
|
165
|
+
// 结尾
|
|
166
|
+
if (config.arcEndCap == "round")
|
|
167
|
+
d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
|
|
168
|
+
else if (config.arcEndCap == "-round")
|
|
169
|
+
d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
|
|
170
|
+
else d += "L" + endOuterX + " " + endOuterY
|
|
171
|
+
d +=
|
|
172
|
+
"A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
|
|
173
|
+
|
|
174
|
+
// 开头
|
|
175
|
+
if (config.arcStartCap == "round")
|
|
176
|
+
d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
|
|
177
|
+
else if (config.arcStartCap == "-round")
|
|
178
|
+
d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
|
|
179
|
+
else d += "L" + begInnerX + " " + begInnerY
|
|
180
|
+
|
|
181
|
+
if (config.arcStartCap == "butt") d += "Z"
|
|
182
|
+
|
|
183
|
+
setAttribute(el, "d", d)
|
|
184
|
+
}
|
|
185
|
+
)
|
|
174
186
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { initDefs } from './config'
|
|
2
|
+
import { toNode, setAttribute } from "./tool"
|
|
3
|
+
|
|
4
|
+
// 线性渐变
|
|
5
|
+
export let linearGradient = function (el: SVGElement, x0: number, y0: number, x1: number, y1: number) {
|
|
6
|
+
|
|
7
|
+
let defs = initDefs(el)
|
|
8
|
+
let gradientId = "vislite-lg-" + new Date().valueOf() + "-" + Math.random()
|
|
9
|
+
|
|
10
|
+
let linearGradient = toNode("linearGradient")
|
|
11
|
+
defs.appendChild(linearGradient)
|
|
12
|
+
setAttribute(linearGradient, "id", gradientId)
|
|
13
|
+
setAttribute(linearGradient, "x1", x0 + "%")
|
|
14
|
+
setAttribute(linearGradient, "y1", y0 + "%")
|
|
15
|
+
setAttribute(linearGradient, "x2", x1 + "%")
|
|
16
|
+
setAttribute(linearGradient, "y2", y1 + "%")
|
|
17
|
+
|
|
18
|
+
let enhanceGradient = {
|
|
19
|
+
"value": function () {
|
|
20
|
+
return "url(#" + gradientId + ")";
|
|
21
|
+
},
|
|
22
|
+
"setColor": function (stop: number, color: string) {
|
|
23
|
+
|
|
24
|
+
let stopEl = toNode("stop")
|
|
25
|
+
linearGradient.appendChild(stopEl)
|
|
26
|
+
setAttribute(stopEl, "offset", (stop * 100) + "%")
|
|
27
|
+
setAttribute(stopEl, "style", "stop-color:" + color + ";")
|
|
28
|
+
|
|
29
|
+
return enhanceGradient
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return enhanceGradient
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 环形渐变
|
|
36
|
+
export let radialGradient = function (el: SVGElement, cx: number, cy: number, r: number) {
|
|
37
|
+
|
|
38
|
+
let defs = initDefs(el)
|
|
39
|
+
let gradientId = "vislite-rg-" + new Date().valueOf() + "-" + Math.random()
|
|
40
|
+
|
|
41
|
+
let radialGradient = toNode("radialGradient")
|
|
42
|
+
defs.appendChild(radialGradient)
|
|
43
|
+
setAttribute(radialGradient, "id", gradientId)
|
|
44
|
+
setAttribute(radialGradient, "cx", cx + "%")
|
|
45
|
+
setAttribute(radialGradient, "cy", cy + "%")
|
|
46
|
+
setAttribute(radialGradient, "r", r + "%")
|
|
47
|
+
|
|
48
|
+
let enhanceGradient = {
|
|
49
|
+
"value": function () {
|
|
50
|
+
return "url(#" + gradientId + ")";
|
|
51
|
+
},
|
|
52
|
+
"setColor": function (stop: number, color: string) {
|
|
53
|
+
|
|
54
|
+
let stopEl = toNode("stop")
|
|
55
|
+
radialGradient.appendChild(stopEl)
|
|
56
|
+
setAttribute(stopEl, "offset", (stop * 100) + "%")
|
|
57
|
+
setAttribute(stopEl, "style", "stop-color:" + color + ";")
|
|
58
|
+
|
|
59
|
+
return enhanceGradient
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return enhanceGradient
|
|
63
|
+
}
|
package/src/common/svg/index.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { arcCapType, textAlignType, textBaselineType } from "../../../types
|
|
|
4
4
|
import { initText, initCircle, initPath, initRect, initArc } from "./config"
|
|
5
5
|
import { toNode, setAttribute, getAttribute, full, fill, stroke } from "./tool"
|
|
6
6
|
import rotate from "../../rotate"
|
|
7
|
+
import { linearGradient, radialGradient } from "./gradient"
|
|
7
8
|
|
|
8
9
|
// 属性名向下兼容
|
|
9
10
|
let oldAttrName = {
|
|
@@ -339,6 +340,17 @@ class SVG {
|
|
|
339
340
|
}, false)
|
|
340
341
|
return this
|
|
341
342
|
}
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
// 线性渐变
|
|
346
|
+
createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
|
|
347
|
+
return linearGradient(this.__svg, x0, y0, x1, y1)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// 环形渐变
|
|
351
|
+
createRadialGradient(cx: number, cy: number, r: number) {
|
|
352
|
+
return radialGradient(this.__svg, cx, cy, r)
|
|
353
|
+
}
|
|
342
354
|
}
|
|
343
355
|
|
|
344
356
|
export default SVG
|
package/src/move.ts
ADDED
package/src/scale.ts
ADDED
package/types/Canvas.d.ts
CHANGED
|
@@ -274,7 +274,7 @@ export default interface CanvasType {
|
|
|
274
274
|
y0: number,
|
|
275
275
|
x1: number,
|
|
276
276
|
y1: number
|
|
277
|
-
): GradientType
|
|
277
|
+
): GradientType<CanvasGradient>
|
|
278
278
|
|
|
279
279
|
/**
|
|
280
280
|
* 创建环形渐变
|
|
@@ -282,7 +282,7 @@ export default interface CanvasType {
|
|
|
282
282
|
* @param cy
|
|
283
283
|
* @param r 半径
|
|
284
284
|
*/
|
|
285
|
-
createRadialGradient(cx: number, cy: number, r: number): GradientType
|
|
285
|
+
createRadialGradient(cx: number, cy: number, r: number): GradientType<CanvasGradient>
|
|
286
286
|
|
|
287
287
|
/**
|
|
288
288
|
* 获取指定位置颜色
|
package/types/Gradient.d.ts
CHANGED