vislite 0.4.1 → 0.5.0

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 (180) hide show
  1. package/.editorconfig +18 -18
  2. package/AUTHORS.txt +6 -6
  3. package/CHANGELOG +16 -0
  4. package/LICENSE +20 -20
  5. package/README.md +69 -69
  6. package/lib/Buffer/index.umd.js +3 -3
  7. package/lib/Buffer/index.umd.min.js +3 -3
  8. package/lib/Canvas/index.umd.js +3 -3
  9. package/lib/Canvas/index.umd.min.js +3 -3
  10. package/lib/Cardinal/index.umd.js +3 -3
  11. package/lib/Cardinal/index.umd.min.js +3 -3
  12. package/lib/Eoap/index.umd.js +3 -3
  13. package/lib/Eoap/index.umd.min.js +3 -3
  14. package/lib/Geometry/index.umd.js +205 -0
  15. package/lib/Geometry/index.umd.min.js +11 -0
  16. package/lib/Hermite/index.umd.js +3 -3
  17. package/lib/Hermite/index.umd.min.js +3 -3
  18. package/lib/Matrix4/index.umd.js +3 -3
  19. package/lib/Matrix4/index.umd.min.js +3 -3
  20. package/lib/Mercator/index.umd.js +5 -4
  21. package/lib/Mercator/index.umd.min.js +4 -4
  22. package/lib/OralCanvas/index.es.js +3 -3
  23. package/lib/OralCanvas/index.es.min.js +3 -3
  24. package/lib/OralWebGL/index.es.js +11 -11
  25. package/lib/OralWebGL/index.es.min.js +4 -4
  26. package/lib/SVG/index.umd.js +10 -4
  27. package/lib/SVG/index.umd.min.js +4 -4
  28. package/lib/Shader/index.umd.js +11 -11
  29. package/lib/Shader/index.umd.min.js +4 -4
  30. package/lib/Texture/index.umd.js +3 -3
  31. package/lib/Texture/index.umd.min.js +3 -3
  32. package/lib/TreeLayout/index.umd.js +8 -5
  33. package/lib/TreeLayout/index.umd.min.js +4 -4
  34. package/lib/WebGL/index.umd.js +11 -11
  35. package/lib/WebGL/index.umd.min.js +4 -4
  36. package/lib/animation/index.umd.js +3 -3
  37. package/lib/animation/index.umd.min.js +3 -3
  38. package/lib/formatColor/index.umd.js +3 -3
  39. package/lib/formatColor/index.umd.min.js +3 -3
  40. package/lib/getLoopColors/index.umd.js +3 -3
  41. package/lib/getLoopColors/index.umd.min.js +3 -3
  42. package/lib/getWebGLContext/index.umd.js +3 -3
  43. package/lib/getWebGLContext/index.umd.min.js +3 -3
  44. package/lib/index.umd.js +166 -16
  45. package/lib/index.umd.min.js +4 -4
  46. package/lib/resizeObserver/index.umd.js +3 -3
  47. package/lib/resizeObserver/index.umd.min.js +3 -3
  48. package/lib/rotate/index.umd.js +3 -3
  49. package/lib/rotate/index.umd.min.js +3 -3
  50. package/lib/ruler/index.umd.js +3 -3
  51. package/lib/ruler/index.umd.min.js +3 -3
  52. package/lib/throttle/index.umd.js +3 -3
  53. package/lib/throttle/index.umd.min.js +3 -3
  54. package/lib/viewHandler/index.umd.js +3 -3
  55. package/lib/viewHandler/index.umd.min.js +3 -3
  56. package/miniprogram/ui-canvas/index.js +107 -107
  57. package/miniprogram/ui-canvas/index.json +4 -4
  58. package/miniprogram/ui-canvas/index.wxml +4 -4
  59. package/miniprogram/ui-canvas/index.wxss +5 -5
  60. package/package/Buffer/index.ts +2 -2
  61. package/package/Canvas/index.ts +2 -2
  62. package/package/Cardinal/index.ts +2 -2
  63. package/package/Eoap/index.ts +2 -2
  64. package/package/Geometry/index.ts +3 -0
  65. package/package/Hermite/index.ts +2 -2
  66. package/package/Matrix4/index.ts +2 -2
  67. package/package/Mercator/index.ts +2 -2
  68. package/package/OralCanvas/index.ts +2 -2
  69. package/package/OralWebGL/index.ts +2 -2
  70. package/package/SVG/index.ts +2 -2
  71. package/package/Shader/index.ts +39 -39
  72. package/package/Texture/index.ts +2 -2
  73. package/package/TreeLayout/index.ts +2 -2
  74. package/package/WebGL/index.ts +2 -2
  75. package/package/animation/index.ts +2 -2
  76. package/package/formatColor/index.ts +2 -2
  77. package/package/getLoopColors/index.ts +2 -2
  78. package/package/getWebGLContext/index.ts +39 -39
  79. package/package/index.ts +6 -1
  80. package/package/resizeObserver/index.ts +2 -2
  81. package/package/rotate/index.ts +2 -2
  82. package/package/ruler/index.ts +2 -2
  83. package/package/throttle/index.ts +2 -2
  84. package/package/viewHandler/index.ts +2 -2
  85. package/package.json +3 -1
  86. package/src/Canvas.ts +67 -67
  87. package/src/Eoap.ts +1 -1
  88. package/src/Geometry.ts +83 -0
  89. package/src/Matrix4/index.ts +2 -2
  90. package/src/Matrix4/move.ts +12 -12
  91. package/src/Matrix4/rotate.ts +15 -15
  92. package/src/Matrix4/scale.ts +11 -11
  93. package/src/Matrix4/transform.ts +64 -64
  94. package/src/Mercator.ts +3 -2
  95. package/src/SVG.ts +24 -24
  96. package/src/TreeLayout/index.ts +4 -3
  97. package/src/WebGL.ts +66 -66
  98. package/src/animation.ts +98 -98
  99. package/src/common/assemble.ts +22 -22
  100. package/src/common/canvas/arc.ts +50 -50
  101. package/src/common/canvas/config.ts +158 -158
  102. package/src/common/canvas/gradient.ts +29 -29
  103. package/src/common/canvas/index.ts +168 -168
  104. package/src/common/canvas/painter.ts +426 -426
  105. package/src/common/canvas/texts.ts +18 -18
  106. package/src/common/geometry/prism-horizontal.ts +33 -0
  107. package/src/common/geometry/prism-vertical.ts +40 -0
  108. package/src/common/geometry/sphere-fragment.ts +39 -0
  109. package/src/common/geometry/tool/circle.ts +12 -0
  110. package/src/common/mergeOption.ts +6 -6
  111. package/src/common/setStyle.ts +5 -5
  112. package/src/common/svg/config.ts +174 -174
  113. package/src/common/svg/index.ts +9 -1
  114. package/src/common/svg/tool.ts +44 -44
  115. package/src/common/tree/index.ts +25 -25
  116. package/src/common/tree/toInnerTree.ts +56 -56
  117. package/src/common/tree/toPlainTree.ts +131 -131
  118. package/src/common/webgl/buffer.ts +79 -79
  119. package/src/common/webgl/doDraw.ts +108 -108
  120. package/src/common/webgl/getColorFactory.ts +26 -26
  121. package/src/common/webgl/getShader.ts +48 -48
  122. package/src/common/webgl/getTexture.ts +11 -11
  123. package/src/common/webgl/getWebGLContext.ts +27 -27
  124. package/src/common/webgl/index.ts +223 -223
  125. package/src/common/webgl/shader.ts +75 -75
  126. package/src/common/webgl/texture.ts +96 -96
  127. package/src/formatColor.ts +44 -44
  128. package/src/getLoopColors.ts +42 -42
  129. package/src/interpolation/Cardinal.ts +110 -110
  130. package/src/interpolation/Hermite.ts +65 -65
  131. package/src/resizeObserver.ts +36 -36
  132. package/src/rotate.ts +1 -1
  133. package/src/ruler.ts +188 -188
  134. package/src/shader/fsColor.c +7 -7
  135. package/src/shader/fsColors.c +7 -7
  136. package/src/shader/fsCube.c +8 -8
  137. package/src/shader/fsImage.c +8 -8
  138. package/src/shader/vsColor.c +17 -17
  139. package/src/shader/vsColors.c +13 -13
  140. package/src/shader/vsCube.c +13 -13
  141. package/src/shader/vsImage.c +13 -13
  142. package/src/throttle.ts +51 -51
  143. package/src/viewHandler.ts +158 -158
  144. package/types/Buffer.d.ts +23 -23
  145. package/types/Canvas.d.ts +300 -300
  146. package/types/CanvasConfig.d.ts +24 -0
  147. package/types/CanvasOption.d.ts +7 -7
  148. package/types/Cardinal.d.ts +13 -13
  149. package/types/Geometry.d.ts +41 -0
  150. package/types/GeometryOption.d.ts +12 -0
  151. package/types/GeometryResult.d.ts +19 -0
  152. package/types/Gradient.d.ts +14 -14
  153. package/types/Hermite.d.ts +18 -18
  154. package/types/Map.d.ts +2 -2
  155. package/types/Matrix4.d.ts +4 -4
  156. package/types/Object3D.d.ts +114 -114
  157. package/types/SVG.d.ts +18 -13
  158. package/types/SVGConfig.d.ts +76 -60
  159. package/types/Scene3D.d.ts +6 -6
  160. package/types/Shader.d.ts +21 -21
  161. package/types/Texture.d.ts +16 -16
  162. package/types/Tree.d.ts +69 -69
  163. package/types/TreeConfig.d.ts +24 -24
  164. package/types/TreeLayout.d.ts +8 -2
  165. package/types/TreeOption.d.ts +48 -48
  166. package/types/WebGL.d.ts +38 -38
  167. package/types/WebGLOption.d.ts +7 -7
  168. package/types/animation.d.ts +6 -6
  169. package/types/formatColor.d.ts +2 -2
  170. package/types/getLoopColors.d.ts +2 -2
  171. package/types/getWebGLContext.d.ts +2 -2
  172. package/types/index.d.ts +15 -1
  173. package/types/painterConfig.d.ts +2 -2
  174. package/types/resizeObserver.d.ts +2 -2
  175. package/types/rotate.d.ts +1 -1
  176. package/types/ruler.d.ts +7 -7
  177. package/types/throttle.d.ts +4 -4
  178. package/types/throttleOption.d.ts +21 -21
  179. package/types/viewHandler.d.ts +13 -13
  180. package/uni-app/ui-canvas.vue +222 -222
@@ -1,19 +1,19 @@
1
- export default function (painter: CanvasRenderingContext2D, contents: string, width: number, height: number, doback: (content: string, top: number) => void) {
2
-
3
- let lineNumber = 0, content = ""
4
- for (let i = 0; i < contents.length; i++) {
5
- if (painter.measureText(content + contents[i]).width > width || /\n$/.test(content)) {
6
- lineNumber += 1
7
- doback(content, (lineNumber - 0.5) * height)
8
-
9
- content = contents[i]
10
- } else if (i == contents.length - 1) {
11
- lineNumber += 1
12
- doback(content + contents[i], (lineNumber - 0.5) * height)
13
- } else {
14
- content += contents[i]
15
- }
16
- }
17
-
18
- return lineNumber * height
1
+ export default function (painter: CanvasRenderingContext2D, contents: string, width: number, height: number, doback: (content: string, top: number) => void) {
2
+
3
+ let lineNumber = 0, content = ""
4
+ for (let i = 0; i < contents.length; i++) {
5
+ if (painter.measureText(content + contents[i]).width > width || /\n$/.test(content)) {
6
+ lineNumber += 1
7
+ doback(content, (lineNumber - 0.5) * height)
8
+
9
+ content = contents[i]
10
+ } else if (i == contents.length - 1) {
11
+ lineNumber += 1
12
+ doback(content + contents[i], (lineNumber - 0.5) * height)
13
+ } else {
14
+ content += contents[i]
15
+ }
16
+ }
17
+
18
+ return lineNumber * height
19
19
  }
@@ -0,0 +1,33 @@
1
+ import rotate from '../../rotate'
2
+
3
+ // 棱柱水平部分
4
+
5
+ export default function (normal: boolean, x: number, y: number, z: number, radius: number, num: number, d: number) {
6
+
7
+ let beginX: number, beginZ: number
8
+ if (num == 4) {
9
+ let temp = radius / 1.414
10
+ beginX = x + temp
11
+ beginZ = z + temp
12
+
13
+ } else {
14
+ beginX = x + radius
15
+ beginZ = z
16
+ }
17
+
18
+ let point = [beginX, beginZ], points = [], deg = Math.PI * 2 / num
19
+ for (let i = 0; i < num; i++) {
20
+
21
+ points.push(x, y, z)
22
+ if (normal) points.push(0, d, 0)
23
+
24
+ points.push(point[0], y, point[1])
25
+ if (normal) points.push(0, d, 0)
26
+
27
+ point = rotate(x, z, deg * (i + 1), beginX, beginZ)
28
+ points.push(point[0], y, point[1])
29
+ if (normal) points.push(0, d, 0)
30
+ }
31
+
32
+ return points
33
+ }
@@ -0,0 +1,40 @@
1
+ import rotate from '../../rotate'
2
+
3
+ // 棱柱垂直部分
4
+
5
+ export default function (normal: boolean, x: number, y: number, z: number, radius: number, height: number, num: number) {
6
+ let points = []
7
+ let beginPosition: [number, number]
8
+
9
+ if (num == 4) {
10
+ beginPosition = rotate(x, z, Math.PI * 0.25, x - radius, z)
11
+ } else {
12
+ beginPosition = [x + radius, z]
13
+ }
14
+
15
+ let deg = Math.PI * 2 / num, degHalf = Math.PI * 2 / (num * 2)
16
+
17
+ let endPosition: [number, number], normalPosition = []
18
+ for (let i = 0; i < num; i++) {
19
+
20
+ endPosition = rotate(x, z, deg, ...beginPosition)
21
+
22
+ if (normal) {
23
+ let halfPosition = rotate(x, z, degHalf, ...beginPosition)
24
+ normalPosition = [halfPosition[0], 0, halfPosition[1]]
25
+ }
26
+
27
+ points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
28
+ points.push(beginPosition[0], y + height, beginPosition[1], ...normalPosition)
29
+ points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
30
+
31
+ points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
32
+ points.push(endPosition[0], y, endPosition[1], ...normalPosition)
33
+ points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
34
+
35
+
36
+ beginPosition = endPosition
37
+ }
38
+
39
+ return points
40
+ }
@@ -0,0 +1,39 @@
1
+ import rotate from '../../rotate'
2
+
3
+ // 球体中的一瓣子
4
+
5
+ export default function (normal: boolean, cx: number, cy: number, cz: number, radius: number, num: number, index: number) {
6
+ let points = [cx, cy + radius, cz], deg = Math.PI * 2 / num, point: [number, number]
7
+
8
+ if (normal) points.push(0, radius, 0)
9
+
10
+ let copy2 = () => {
11
+ points.push(...points.slice(points.length - (normal ? 12 : 6)))
12
+ }
13
+
14
+ for (let i = 1; i < num * 0.5; i++) {
15
+ point = rotate(cx, cy, deg * i, cx, cy + radius)
16
+
17
+ if (i > 1) copy2()
18
+
19
+ // 第一个点
20
+ let point1 = rotate(cx, cz, deg * index, point[0], cz)
21
+ points.push(point1[0], point[1], point1[1])
22
+
23
+ if (normal) points.push(point1[0] - cx, point[1] - cy, point1[1] - cz)
24
+
25
+ if (i > 1) copy2()
26
+
27
+ // 下一个点
28
+ let point2 = rotate(cx, cz, deg * (index + 1), point[0], cz)
29
+ points.push(point2[0], point[1], point2[1])
30
+
31
+ if (normal) points.push(point2[0] - cx, point2[1] - cy, point2[1] - cz)
32
+ }
33
+ copy2()
34
+ points.push(cx, cy - radius, cz)
35
+
36
+ if (normal) points.push(0, - radius, 0)
37
+
38
+ return points
39
+ }
@@ -0,0 +1,12 @@
1
+ // 计算切割份数
2
+ export let splitNum = function (precision: number, radius: number) {
3
+
4
+ // 根据切割弧度得出切割块数目
5
+ let num = Math.ceil(Math.PI * 2 /
6
+
7
+ // 为了满足最小精度而得出的切割弧度
8
+ Math.asin(precision / radius) * 2)
9
+
10
+ return (isNaN(num) || num < 12) ? 12 : num
11
+
12
+ }
@@ -1,7 +1,7 @@
1
- export default function (option: any, defaultOption: any) {
2
- for (let key in option) {
3
- defaultOption[key] = option[key]
4
- }
5
-
6
- return defaultOption
1
+ export default function (option: any, defaultOption: any) {
2
+ for (let key in option) {
3
+ defaultOption[key] = option[key]
4
+ }
5
+
6
+ return defaultOption
7
7
  }
@@ -1,6 +1,6 @@
1
- // 修改样式
2
- export default function (el: HTMLElement | SVGElement, styles: any) {
3
- for (let key in styles) {
4
- el.style[key] = styles[key]
5
- }
1
+ // 修改样式
2
+ export default function (el: HTMLElement | SVGElement, styles: any) {
3
+ for (let key in styles) {
4
+ el.style[key] = styles[key]
5
+ }
6
6
  }
@@ -1,174 +1,174 @@
1
- import type SVGConfigType from "../../../types/SVGConfig"
2
-
3
- import { setAttribute } from "./tool"
4
- import setStyle from "../setStyle"
5
- import arc from "../canvas/arc"
6
-
7
- // 文字统一设置方法
8
- export let initText = (
9
- el: SVGElement,
10
- config: SVGConfigType,
11
- x: number,
12
- y: number,
13
- deg: number
14
- ) => {
15
- if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
16
-
17
- // 垂直对齐采用dy实现
18
- setAttribute(
19
- el,
20
- "dy",
21
- {
22
- top: config["fontSize"] * 0.5,
23
- middle: 0,
24
- bottom: -config["fontSize"] * 0.5,
25
- }[config.textBaseline]
26
- )
27
-
28
- setStyle(el, {
29
- // 文字对齐方式
30
- "text-anchor": {
31
- left: "start",
32
- right: "end",
33
- center: "middle",
34
- }[config.textAlign],
35
- "dominant-baseline": "central",
36
-
37
- // 文字大小和字体设置
38
- "font-size": config["fontSize"] + "px",
39
- "font-family": config["fontFamily"],
40
- })
41
-
42
- // 位置
43
- setAttribute(el, "x", x)
44
- setAttribute(el, "y", y)
45
-
46
- // 旋转
47
- if (typeof deg == "number") {
48
- deg = deg % 360
49
- setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
50
- }
51
- }
52
-
53
- // 画圆统一设置方法
54
- export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
55
- if (el.nodeName.toLowerCase() !== "circle")
56
- throw new Error("Need a <circle> !")
57
- setAttribute(el, "cx", cx)
58
- setAttribute(el, "cy", cy)
59
- setAttribute(el, "r", r)
60
- }
61
-
62
- // 路径统一设置方法
63
- export let initPath = (el: SVGElement, path: string) => {
64
- if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
65
- setAttribute(el, "d", path)
66
- }
67
-
68
- // 画矩形统一设置方法
69
- export let initRect = (
70
- el: SVGElement,
71
- x: number,
72
- y: number,
73
- width: number,
74
- height: number
75
- ) => {
76
- if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
77
-
78
- // 由于高和宽不可以是负数,校对一下
79
- if (height < 0) {
80
- height *= -1
81
- y -= height
82
- }
83
- if (width < 0) {
84
- width *= -1
85
- x -= width
86
- }
87
-
88
- setAttribute(el, "x", x)
89
- setAttribute(el, "y", y)
90
- setAttribute(el, "width", width)
91
- setAttribute(el, "height", height)
92
- }
93
-
94
- // 画弧统一设置方法
95
- export let initArc = (
96
- el: SVGElement,
97
- config: SVGConfigType,
98
- cx: number,
99
- cy: number,
100
- r1: number,
101
- r2: number,
102
- beginDeg: number,
103
- deg: number
104
- ) => {
105
- if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
106
-
107
- beginDeg = (beginDeg / 180) * Math.PI
108
- deg = (deg / 180) * Math.PI
109
-
110
- beginDeg = beginDeg % (Math.PI * 2)
111
-
112
- if (r1 > r2) {
113
- let temp = r1
114
- r1 = r2
115
- r2 = temp
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)
172
- }
173
- )
174
- }
1
+ import type SVGConfigType from "../../../types/SVGConfig"
2
+
3
+ import { setAttribute } from "./tool"
4
+ import setStyle from "../setStyle"
5
+ import arc from "../canvas/arc"
6
+
7
+ // 文字统一设置方法
8
+ export let initText = (
9
+ el: SVGElement,
10
+ config: SVGConfigType,
11
+ x: number,
12
+ y: number,
13
+ deg: number
14
+ ) => {
15
+ if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
16
+
17
+ // 垂直对齐采用dy实现
18
+ setAttribute(
19
+ el,
20
+ "dy",
21
+ {
22
+ top: config["fontSize"] * 0.5,
23
+ middle: 0,
24
+ bottom: -config["fontSize"] * 0.5,
25
+ }[config.textBaseline]
26
+ )
27
+
28
+ setStyle(el, {
29
+ // 文字对齐方式
30
+ "text-anchor": {
31
+ left: "start",
32
+ right: "end",
33
+ center: "middle",
34
+ }[config.textAlign],
35
+ "dominant-baseline": "central",
36
+
37
+ // 文字大小和字体设置
38
+ "font-size": config["fontSize"] + "px",
39
+ "font-family": config["fontFamily"],
40
+ })
41
+
42
+ // 位置
43
+ setAttribute(el, "x", x)
44
+ setAttribute(el, "y", y)
45
+
46
+ // 旋转
47
+ if (typeof deg == "number") {
48
+ deg = deg % 360
49
+ setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
50
+ }
51
+ }
52
+
53
+ // 画圆统一设置方法
54
+ export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
55
+ if (el.nodeName.toLowerCase() !== "circle")
56
+ throw new Error("Need a <circle> !")
57
+ setAttribute(el, "cx", cx)
58
+ setAttribute(el, "cy", cy)
59
+ setAttribute(el, "r", r)
60
+ }
61
+
62
+ // 路径统一设置方法
63
+ export let initPath = (el: SVGElement, path: string) => {
64
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
65
+ setAttribute(el, "d", path)
66
+ }
67
+
68
+ // 画矩形统一设置方法
69
+ export let initRect = (
70
+ el: SVGElement,
71
+ x: number,
72
+ y: number,
73
+ width: number,
74
+ height: number
75
+ ) => {
76
+ if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
77
+
78
+ // 由于高和宽不可以是负数,校对一下
79
+ if (height < 0) {
80
+ height *= -1
81
+ y -= height
82
+ }
83
+ if (width < 0) {
84
+ width *= -1
85
+ x -= width
86
+ }
87
+
88
+ setAttribute(el, "x", x)
89
+ setAttribute(el, "y", y)
90
+ setAttribute(el, "width", width)
91
+ setAttribute(el, "height", height)
92
+ }
93
+
94
+ // 画弧统一设置方法
95
+ export let initArc = (
96
+ el: SVGElement,
97
+ config: SVGConfigType,
98
+ cx: number,
99
+ cy: number,
100
+ r1: number,
101
+ r2: number,
102
+ beginDeg: number,
103
+ deg: number
104
+ ) => {
105
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
106
+
107
+ beginDeg = (beginDeg / 180) * Math.PI
108
+ deg = (deg / 180) * Math.PI
109
+
110
+ beginDeg = beginDeg % (Math.PI * 2)
111
+
112
+ if (r1 > r2) {
113
+ let temp = r1
114
+ r1 = r2
115
+ r2 = temp
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)
172
+ }
173
+ )
174
+ }
@@ -28,7 +28,7 @@ class SVG {
28
28
  textBaseline: <textBaselineType>"middle",
29
29
 
30
30
  // 文字设置
31
- "fontSize": 50,
31
+ "fontSize": 16,
32
32
  "fontFamily": "sans-serif",
33
33
 
34
34
  // arc二端闭合方式['butt':直线闭合,'round':圆帽闭合]
@@ -331,6 +331,14 @@ class SVG {
331
331
  "C" + cp1x + " " + cp1y + "," + cp2x + " " + cp2y + "," + x + " " + y
332
332
  return this
333
333
  }
334
+
335
+ // 绑定事件
336
+ bind(eventType: string, callback: (event: Event, target: SVGElement) => void) {
337
+ this.__useEl.addEventListener(eventType, function (event: Event) {
338
+ callback.call(this, event, this)
339
+ }, false)
340
+ return this
341
+ }
334
342
  }
335
343
 
336
344
  export default SVG
@@ -1,45 +1,45 @@
1
- import type SVGConfigType from '../../../types/SVGConfig'
2
-
3
- import { XLINK_ATTRIBUTE } from "./dictionary"
4
-
5
- // 新建节点
6
- export function toNode(tagname: string) {
7
- return document.createElementNS('http://www.w3.org/2000/svg', tagname)
8
- }
9
-
10
- // 设置属性
11
- let _setAttribute = function (el: SVGElement, key: string, value: string | number) {
12
-
13
- // 需要使用xlink命名空间的xml属性
14
- if (XLINK_ATTRIBUTE.indexOf(key) > -1) {
15
- el.setAttributeNS("http://www.w3.org/1999/xlink", 'xlink:' + key, value + "")
16
- }
17
-
18
- // 否则
19
- else {
20
- el.setAttribute(key, value + "")
21
- }
22
- }
23
- export let setAttribute = _setAttribute
24
-
25
- // 获取属性
26
- export function getAttribute(el: SVGElement, key: string) {
27
- if (XLINK_ATTRIBUTE.indexOf(key) > -1) key = 'xlink:' + key
28
- return el.getAttribute(key)
29
- }
30
-
31
- export function full(el: SVGElement, config: SVGConfigType) {
32
- _setAttribute(el, "stroke", config.strokeStyle)
33
- _setAttribute(el, "fill", config.fillStyle)
34
- _setAttribute(el, "stroke-dasharray", config.lineDash.join(','))
35
- }
36
-
37
- export function fill(el: SVGElement, config: SVGConfigType) {
38
- _setAttribute(el, "fill", config.fillStyle)
39
- }
40
-
41
- export function stroke(el: SVGElement, config: SVGConfigType) {
42
- _setAttribute(el, "stroke", config.strokeStyle)
43
- _setAttribute(el, "fill", "none")
44
- _setAttribute(el, "stroke-dasharray", config.lineDash.join(','))
1
+ import type SVGConfigType from '../../../types/SVGConfig'
2
+
3
+ import { XLINK_ATTRIBUTE } from "./dictionary"
4
+
5
+ // 新建节点
6
+ export function toNode(tagname: string) {
7
+ return document.createElementNS('http://www.w3.org/2000/svg', tagname)
8
+ }
9
+
10
+ // 设置属性
11
+ let _setAttribute = function (el: SVGElement, key: string, value: string | number) {
12
+
13
+ // 需要使用xlink命名空间的xml属性
14
+ if (XLINK_ATTRIBUTE.indexOf(key) > -1) {
15
+ el.setAttributeNS("http://www.w3.org/1999/xlink", 'xlink:' + key, value + "")
16
+ }
17
+
18
+ // 否则
19
+ else {
20
+ el.setAttribute(key, value + "")
21
+ }
22
+ }
23
+ export let setAttribute = _setAttribute
24
+
25
+ // 获取属性
26
+ export function getAttribute(el: SVGElement, key: string) {
27
+ if (XLINK_ATTRIBUTE.indexOf(key) > -1) key = 'xlink:' + key
28
+ return el.getAttribute(key)
29
+ }
30
+
31
+ export function full(el: SVGElement, config: SVGConfigType) {
32
+ _setAttribute(el, "stroke", config.strokeStyle)
33
+ _setAttribute(el, "fill", config.fillStyle)
34
+ _setAttribute(el, "stroke-dasharray", config.lineDash.join(','))
35
+ }
36
+
37
+ export function fill(el: SVGElement, config: SVGConfigType) {
38
+ _setAttribute(el, "fill", config.fillStyle)
39
+ }
40
+
41
+ export function stroke(el: SVGElement, config: SVGConfigType) {
42
+ _setAttribute(el, "stroke", config.strokeStyle)
43
+ _setAttribute(el, "fill", "none")
44
+ _setAttribute(el, "stroke-dasharray", config.lineDash.join(','))
45
45
  }