vislite 1.12.0 → 2.0.0-next.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/AUTHORS.txt +6 -6
  2. package/CHANGELOG +414 -403
  3. package/LICENSE +20 -20
  4. package/README-en.md +245 -245
  5. package/README.md +245 -245
  6. package/bin/formatArgv.js +30 -30
  7. package/bin/help.js +21 -17
  8. package/bin/minialipay.js +27 -0
  9. package/bin/run +25 -21
  10. package/bin/skills.js +26 -26
  11. package/lib/BarLayout/index.es.js +348 -348
  12. package/lib/Buffer/index.es.js +34 -34
  13. package/lib/Canvas/index.es.js +804 -804
  14. package/lib/Cardinal/index.es.js +89 -89
  15. package/lib/Eoap/index.es.js +32 -32
  16. package/lib/Hermite/index.es.js +34 -34
  17. package/lib/MapCoordinate/index.es.js +199 -199
  18. package/lib/Matrix4/index.es.js +123 -123
  19. package/lib/Mercator/index.es.js +18 -18
  20. package/lib/PieLayout/index.es.js +115 -115
  21. package/lib/RawCanvas/index.es.js +736 -736
  22. package/lib/SVG/index.es.js +626 -626
  23. package/lib/Shader/index.es.js +34 -34
  24. package/lib/Texture/index.es.js +52 -52
  25. package/lib/TreeLayout/index.es.js +301 -301
  26. package/lib/animation/index.es.js +2 -2
  27. package/lib/assemble/index.es.js +19 -19
  28. package/lib/getLoopColors/index.es.js +34 -34
  29. package/lib/getWebGLContext/index.es.js +61 -61
  30. package/lib/index.umd.js +2797 -2797
  31. package/lib/index.umd.min.js +1 -1
  32. package/lib/initOption/index.es.js +5 -5
  33. package/lib/mergeOption/index.es.js +34 -34
  34. package/lib/move/index.es.js +6 -6
  35. package/lib/rotate/index.es.js +6 -6
  36. package/lib/ruler/index.es.js +136 -136
  37. package/lib/scale/index.es.js +5 -5
  38. package/minialipay/ui-canvas/drawImage.js +35 -35
  39. package/minialipay/ui-canvas/index.acss +4 -4
  40. package/minialipay/ui-canvas/index.axml +3 -3
  41. package/minialipay/ui-canvas/index.d.ts +1 -1
  42. package/minialipay/ui-canvas/index.js +100 -100
  43. package/minialipay/ui-canvas/index.json +6 -6
  44. package/miniprogram/ui-canvas/drawImage.js +35 -35
  45. package/miniprogram/ui-canvas/index.js +125 -125
  46. package/miniprogram/ui-canvas/index.json +4 -4
  47. package/miniprogram/ui-canvas/index.wxml +4 -4
  48. package/miniprogram/ui-canvas/index.wxss +5 -5
  49. package/package/BarLayout/index.ts +2 -2
  50. package/package/Buffer/index.ts +2 -2
  51. package/package/Canvas/index.ts +2 -2
  52. package/package/Cardinal/index.ts +2 -2
  53. package/package/Eoap/index.ts +2 -2
  54. package/package/Hermite/index.ts +2 -2
  55. package/package/MapCoordinate/index.ts +2 -2
  56. package/package/Matrix4/index.ts +2 -2
  57. package/package/Mercator/index.ts +2 -2
  58. package/package/PieLayout/index.ts +2 -2
  59. package/package/RawCanvas/index.ts +2 -2
  60. package/package/SVG/index.ts +2 -2
  61. package/package/Shader/index.ts +2 -2
  62. package/package/Texture/index.ts +2 -2
  63. package/package/TreeLayout/index.ts +2 -2
  64. package/package/animation/index.ts +5 -5
  65. package/package/assemble/index.ts +2 -2
  66. package/package/getLoopColors/index.ts +2 -2
  67. package/package/getWebGLContext/index.ts +40 -40
  68. package/package/index.ts +84 -84
  69. package/package/initOption/index.ts +2 -2
  70. package/package/mergeOption/index.ts +2 -2
  71. package/package/move/index.ts +2 -2
  72. package/package/rotate/index.ts +2 -2
  73. package/package/ruler/index.ts +2 -2
  74. package/package/scale/index.ts +2 -2
  75. package/package/throttle/index.ts +2 -2
  76. package/package.json +103 -79
  77. package/skills/vislite-lib/BarLayout.md +117 -117
  78. package/skills/vislite-lib/Canvas.md +183 -183
  79. package/skills/vislite-lib/Interpolation.md +129 -129
  80. package/skills/vislite-lib/Matrix.md +174 -174
  81. package/skills/vislite-lib/PieLayout.md +131 -131
  82. package/skills/vislite-lib/Projections.md +158 -158
  83. package/skills/vislite-lib/SKILL.md +179 -179
  84. package/skills/vislite-lib/SVG.md +137 -137
  85. package/skills/vislite-lib/TreeLayout.md +176 -176
  86. package/skills/vislite-lib/Utilities.md +261 -261
  87. package/skills/vislite-lib/WebGL.md +106 -106
  88. package/skills/vislite-lib/minialipay/ui-canvas.md +95 -95
  89. package/skills/vislite-lib/miniprogram/ui-canvas.md +98 -98
  90. package/skills/vislite-lib/uniapp/ui-canvas.md +113 -113
  91. package/src/Canvas.ts +89 -89
  92. package/src/Eoap.ts +66 -66
  93. package/src/Matrix4/index.ts +84 -84
  94. package/src/Matrix4/move.ts +12 -12
  95. package/src/Matrix4/rotate.ts +15 -15
  96. package/src/Matrix4/scale.ts +11 -11
  97. package/src/Matrix4/transform.ts +64 -64
  98. package/src/Mercator.ts +27 -27
  99. package/src/SVG.ts +86 -86
  100. package/src/common/assemble.ts +30 -30
  101. package/src/common/canvas/arc.ts +51 -51
  102. package/src/common/canvas/config.ts +176 -176
  103. package/src/common/canvas/default.ts +64 -64
  104. package/src/common/canvas/gradient.ts +31 -31
  105. package/src/common/canvas/index.ts +189 -189
  106. package/src/common/canvas/painter.ts +475 -475
  107. package/src/common/canvas/texts.ts +18 -18
  108. package/src/common/map/getBoundary.ts +15 -15
  109. package/src/common/map/tool.ts +29 -29
  110. package/src/common/option.ts +31 -31
  111. package/src/common/setStyle.ts +5 -5
  112. package/src/common/svg/config.ts +213 -213
  113. package/src/common/svg/default.ts +29 -29
  114. package/src/common/svg/gradient.ts +53 -53
  115. package/src/common/svg/index.ts +420 -420
  116. package/src/common/svg/tool.ts +51 -51
  117. package/src/common/tree/index.ts +25 -25
  118. package/src/common/tree/toInnerTree.ts +61 -61
  119. package/src/common/tree/toPlainTree.ts +135 -135
  120. package/src/common/type.ts +26 -26
  121. package/src/common/webgl/buffer.ts +79 -79
  122. package/src/common/webgl/getWebGLContext.ts +45 -45
  123. package/src/common/webgl/shader.ts +75 -75
  124. package/src/common/webgl/texture.ts +98 -98
  125. package/src/coordinate/MapCoordinate.ts +80 -80
  126. package/src/getLoopColors.ts +42 -42
  127. package/src/interpolation/Cardinal.ts +110 -110
  128. package/src/interpolation/Hermite.ts +65 -65
  129. package/src/layout/BarLayout.ts +249 -249
  130. package/src/layout/PieLayout.ts +146 -146
  131. package/src/layout/TreeLayout.ts +200 -200
  132. package/src/move.ts +7 -7
  133. package/src/rotate.ts +7 -7
  134. package/src/ruler.ts +209 -209
  135. package/src/scale.ts +6 -6
  136. package/types/Bar.d.ts +91 -91
  137. package/types/BarConfig.d.ts +4 -4
  138. package/types/BarLayout.d.ts +48 -48
  139. package/types/BarOption.d.ts +31 -31
  140. package/types/Buffer.d.ts +30 -30
  141. package/types/Canvas.d.ts +379 -379
  142. package/types/CanvasConfig.d.ts +61 -61
  143. package/types/CanvasOption.d.ts +13 -13
  144. package/types/CanvasOpts.d.ts +9 -9
  145. package/types/Cardinal.d.ts +20 -20
  146. package/types/Gradient.d.ts +20 -20
  147. package/types/Hermite.d.ts +25 -25
  148. package/types/Map.d.ts +9 -9
  149. package/types/MapConfig.d.ts +27 -27
  150. package/types/MapCoordinate.d.ts +22 -22
  151. package/types/Matrix4.d.ts +79 -79
  152. package/types/Pie.d.ts +73 -73
  153. package/types/PieConfig.d.ts +26 -26
  154. package/types/PieLayout.d.ts +40 -40
  155. package/types/PieOption.d.ts +21 -21
  156. package/types/SVG.d.ts +282 -282
  157. package/types/SVGConfig.d.ts +54 -54
  158. package/types/Shader.d.ts +22 -22
  159. package/types/Texture.d.ts +22 -22
  160. package/types/Tree.d.ts +74 -74
  161. package/types/TreeConfig.d.ts +52 -52
  162. package/types/TreeLayout.d.ts +71 -71
  163. package/types/TreeOption.d.ts +48 -48
  164. package/types/animation.d.ts +26 -26
  165. package/types/assemble.d.ts +14 -14
  166. package/types/getLoopColors.d.ts +13 -13
  167. package/types/getWebGLContext.d.ts +7 -7
  168. package/types/index.d.ts +220 -220
  169. package/types/module.d.ts +110 -110
  170. package/types/move.d.ts +15 -15
  171. package/types/option.d.ts +12 -12
  172. package/types/painterConfig.d.ts +14 -14
  173. package/types/rotate.d.ts +15 -15
  174. package/types/ruler.d.ts +24 -24
  175. package/types/scale.d.ts +15 -15
  176. package/types/throttle.d.ts +6 -6
  177. package/types/ui-canvas.d.ts +4 -4
  178. package/types/uni-canvas.d.ts +3 -3
  179. package/uni-app/drawImage.js +19 -19
  180. package/uni-app/ui-canvas.vue +295 -295
@@ -1,420 +1,420 @@
1
- import type { default as SVGConfigType, svgElType, svgBoardType } from "../../../types/SVGConfig"
2
-
3
- import { initText, initCircle, initPath, initRect, initArc } from "./config"
4
- import { toNode, setAttribute, getAttribute, full, fill, stroke } from "./tool"
5
- import rotate from "../../rotate"
6
- import { linearGradient, radialGradient } from "./gradient"
7
- import defaultFactory from "./default"
8
- import { initOption } from "../option"
9
-
10
- class SVG {
11
- readonly name: string = "SVG"
12
-
13
- // 用于记录配置
14
- private __config = defaultFactory()
15
-
16
- // 作用的节点
17
- private __useEl: SVGElement
18
-
19
- // 路径(和canvas2D的类似)
20
- private __path: string = ""
21
- private __currentPosition: number[] = []
22
-
23
- // 变换(和canvas2D的类似,内部维护了用于记录)
24
- private __transform_history: Array<string> = []
25
- private __transform_current = ""
26
-
27
- protected __svg: SVGElement
28
- constructor(svg: SVGElement) {
29
- this.__svg = svg
30
- }
31
-
32
- // 属性设置或获取
33
- config(params: SVGConfigType) {
34
- if (typeof params !== "object") {
35
- return this.__config[params]
36
- } else {
37
- for (const key in params) {
38
- (this.__config as any)[key] = (params as any)[key]
39
- }
40
- }
41
- return this
42
- }
43
-
44
- reset(config: SVGConfigType = {}) {
45
- this.config(initOption(config, defaultFactory()))
46
- return this
47
- }
48
-
49
- /**
50
- * 基础方法
51
- * ---------------------------------
52
- */
53
-
54
- // 标记应用节点
55
- // 也就是后续操作都会作用在此节点
56
- useEl(el: SVGElement) {
57
- this.__useEl = el
58
- return this
59
- }
60
-
61
- // 获取当前应用的节点
62
- getEl() {
63
- return this.__useEl
64
- }
65
-
66
- // 追加节点
67
- // el可以是结点或字符串,字符串的话表示节点名称
68
- // context可选,表示追加位置,可选,默认根svg
69
- // 此外,和appendBoard等操作一样,执行后新加入的结点会自动变成应用节点
70
- appendEl(el: svgElType, context?: SVGElement) {
71
- context = context || this.__svg
72
-
73
- if (typeof el == "string") el = toNode(el)
74
- context.appendChild(el as SVGElement)
75
-
76
- this.__useEl = el as SVGElement
77
- return this
78
- }
79
-
80
- // 追加绘制板
81
- // 参数和appendEl类似,只是el如果是字符串的话,表示需要绘制对应什么内容,
82
- // 比如el = “arc”,表示画弧(不是路径arc),那么我们会创建path节点,因为我们是使用path实现的
83
- appendBoard(el: svgBoardType, context?: SVGElement) {
84
- let _el: svgBoardType | string = el
85
-
86
- if (typeof el == "string")
87
- _el =
88
- {
89
- text: "text",
90
- path: "path",
91
- arc: "path",
92
- circle: "circle",
93
- rect: "path",
94
- }[el] || ""
95
-
96
- if (_el == "") throw new Error("Unsupported drawing method:" + el)
97
- return this.appendEl(_el as svgElType, context)
98
- }
99
-
100
- // 删除当前维护的节点
101
- remove() {
102
- if (!this.__useEl) {
103
- throw new Error("Currently, no node can be deleted.")
104
- } else {
105
- ((this.__useEl as SVGElement).parentNode as SVGElement).removeChild(
106
- this.__useEl
107
- )
108
- }
109
- return this
110
- }
111
-
112
- // 设置或获取节点属性
113
- attr(params: any) {
114
- if (!this.__useEl)
115
- throw new Error("Currently, no node can be modified or viewed.")
116
-
117
- if (typeof params !== "object") {
118
- return getAttribute(this.__useEl, params)
119
- } else {
120
- for (const key in params) {
121
- setAttribute(this.__useEl, key, params[key])
122
- }
123
- return this
124
- }
125
- }
126
-
127
- /**
128
- * 绘制方法
129
- * ---------------------------------
130
- */
131
-
132
- // 文字
133
- // deg表示文字旋转角度,是角度值,不是弧度
134
- fillText(text: string, x: number, y: number, deg: number = 0) {
135
- initText(this.__useEl, this.__config, x, y, deg)
136
- this.attr({
137
- transform: this.__transform_current
138
- })
139
- this.__useEl.textContent = text
140
- fill(this.__useEl, this.__config)
141
- return this
142
- }
143
- strokeText(text: string, x: number, y: number, deg: number = 0) {
144
- initText(this.__useEl, this.__config, x, y, deg)
145
- this.attr({
146
- transform: this.__transform_current
147
- })
148
- this.__useEl.textContent = text
149
- stroke(this.__useEl, this.__config)
150
- return this
151
- }
152
- fullText(text: string, x: number, y: number, deg: number = 0) {
153
- initText(this.__useEl, this.__config, x, y, deg)
154
- this.attr({
155
- transform: this.__transform_current
156
- })
157
- this.__useEl.textContent = text
158
- full(this.__useEl, this.__config)
159
- return this
160
- }
161
-
162
- // 弧
163
- fillArc(
164
- cx: number,
165
- cy: number,
166
- r1: number,
167
- r2: number,
168
- beginDeg: number,
169
- deg: number
170
- ) {
171
- initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
172
- this.attr({
173
- transform: this.__transform_current
174
- })
175
- fill(this.__useEl, this.__config)
176
- return this
177
- }
178
- strokeArc(
179
- cx: number,
180
- cy: number,
181
- r1: number,
182
- r2: number,
183
- beginDeg: number,
184
- deg: number
185
- ) {
186
- initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
187
- this.attr({
188
- transform: this.__transform_current
189
- })
190
- stroke(this.__useEl, this.__config)
191
- return this
192
- }
193
- fullArc(
194
- cx: number,
195
- cy: number,
196
- r1: number,
197
- r2: number,
198
- beginDeg: number,
199
- deg: number
200
- ) {
201
- initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
202
- this.attr({
203
- transform: this.__transform_current
204
- })
205
- full(this.__useEl, this.__config)
206
- return this
207
- }
208
-
209
- // 圆形
210
- fillCircle(cx: number, cy: number, r: number) {
211
- initCircle(this.__useEl, cx, cy, r)
212
- this.attr({
213
- transform: this.__transform_current
214
- })
215
- fill(this.__useEl, this.__config)
216
- return this
217
- }
218
- strokeCircle(cx: number, cy: number, r: number) {
219
- initCircle(this.__useEl, cx, cy, r)
220
- this.attr({
221
- transform: this.__transform_current
222
- })
223
- stroke(this.__useEl, this.__config)
224
- return this
225
- }
226
- fullCircle(cx: number, cy: number, r: number) {
227
- initCircle(this.__useEl, cx, cy, r)
228
- this.attr({
229
- transform: this.__transform_current
230
- })
231
- full(this.__useEl, this.__config)
232
- return this
233
- }
234
-
235
- // 矩形
236
- fillRect(x: number, y: number, width: number, height: number) {
237
- initRect(this.__useEl, this.__config, x, y, width, height)
238
- this.attr({
239
- transform: this.__transform_current
240
- })
241
- fill(this.__useEl, this.__config)
242
- return this
243
- }
244
- strokeRect(x: number, y: number, width: number, height: number) {
245
- initRect(this.__useEl, this.__config, x, y, width, height)
246
- this.attr({
247
- transform: this.__transform_current
248
- })
249
- stroke(this.__useEl, this.__config)
250
- return this
251
- }
252
- fullRect(x: number, y: number, width: number, height: number) {
253
- initRect(this.__useEl, this.__config, x, y, width, height)
254
- this.attr({
255
- transform: this.__transform_current
256
- })
257
- full(this.__useEl, this.__config)
258
- return this
259
- }
260
-
261
- // 路径
262
- beginPath() {
263
- this.__currentPosition = []
264
- this.__path = ""
265
- return this
266
- }
267
- closePath() {
268
- this.__path += "Z"
269
- return this
270
- }
271
- moveTo(x: number, y: number) {
272
- this.__currentPosition = [x, y]
273
-
274
- this.__path += "M" + x + " " + y
275
- return this
276
- }
277
- lineTo(x: number, y: number) {
278
- this.__currentPosition = [x, y]
279
-
280
- this.__path += (this.__path == "" ? "M" : "L") + x + " " + y
281
- return this
282
- }
283
- fill() {
284
- initPath(this.__useEl, this.__path)
285
- this.attr({
286
- transform: this.__transform_current
287
- })
288
- fill(this.__useEl, this.__config)
289
- return this
290
- }
291
- stroke() {
292
- initPath(this.__useEl, this.__path)
293
- this.attr({
294
- transform: this.__transform_current
295
- })
296
- stroke(this.__useEl, this.__config)
297
- return this
298
- }
299
- full() {
300
- initPath(this.__useEl, this.__path)
301
- this.attr({
302
- transform: this.__transform_current
303
- })
304
- full(this.__useEl, this.__config)
305
- return this
306
- }
307
-
308
- save() {
309
- this.__transform_history.push(this.__transform_current);
310
- return this
311
- }
312
- restore() {
313
- if (this.__transform_history.length > 0) this.__transform_current = this.__transform_history.pop() as string;
314
- return this
315
- }
316
-
317
- arc(x: number, y: number, r: number, beginDeg: number, deg: number) {
318
- const begPosition = rotate(x, y, (beginDeg / 180) * Math.PI, x + r, y)
319
- const endPosition = rotate(
320
- x,
321
- y,
322
- ((beginDeg + deg) / 180) * Math.PI,
323
- x + r,
324
- y
325
- )
326
- // 如果当前没有路径,说明是开始的,就移动到正确位置
327
- if (this.__path == "") {
328
- this.__path += "M" + begPosition[0] + "," + begPosition[1]
329
- }
330
- // 如果当前有路径,位置不正确,应该画到正确位置(和canvas保持一致)
331
- else if (
332
- begPosition[0] != this.__currentPosition[0] ||
333
- begPosition[1] != this.__currentPosition[1]
334
- ) {
335
- this.__path += "L" + begPosition[0] + "," + begPosition[1]
336
- }
337
- this.__path +=
338
- "A" +
339
- r +
340
- "," +
341
- r +
342
- " 0 " +
343
- (deg > 180 || deg < -180 ? 1 : 0) +
344
- "," +
345
- (deg > 0 ? 1 : 0) +
346
- " " +
347
- endPosition[0] +
348
- "," +
349
- endPosition[1]
350
- return this
351
- }
352
-
353
- // 路径 - 贝塞尔曲线
354
- quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
355
- this.__path += "Q" + cpx + " " + cpy + "," + x + " " + y
356
- return this
357
- }
358
- bezierCurveTo(
359
- cp1x: number,
360
- cp1y: number,
361
- cp2x: number,
362
- cp2y: number,
363
- x: number,
364
- y: number
365
- ) {
366
- this.__path +=
367
- "C" + cp1x + " " + cp1y + "," + cp2x + " " + cp2y + "," + x + " " + y
368
- return this
369
- }
370
-
371
- // 绑定事件
372
- bind(eventType: string, callback: (event: Event, target: SVGElement) => void) {
373
- this.__useEl.addEventListener(eventType, function (event: Event) {
374
- callback.call(this, event, this)
375
- }, false)
376
- return this
377
- }
378
-
379
- // 线性渐变
380
- createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
381
- return linearGradient(this.__svg, x0, y0, x1, y1)
382
- }
383
-
384
- // 环形渐变
385
- createRadialGradient(cx: number, cy: number, r: number) {
386
- return radialGradient(this.__svg, cx, cy, r)
387
- }
388
-
389
- // 转换画布
390
- translate(dx: number, dy: number) {
391
- this.__transform_current += ' translate(' + dx + ',' + dy + ')'
392
- return this
393
- }
394
- rotate(deg: number) {
395
- this.__transform_current += ' rotate(' + deg + ')'
396
- return this
397
- }
398
-
399
- // 扩展绘制方法
400
- install(methods: {
401
- [key: string]: Function
402
- }): any {
403
- for (const key in methods) {
404
-
405
- if (key in this) {
406
- throw new Error("VISLite SVG:Method already exists and cannot be overwritten.")
407
- } else {
408
- (this as any)[key] = (...args: any) => {
409
- const value = methods[key].apply(this, args)
410
- if (value != void 0) return value
411
- return this
412
- }
413
- }
414
-
415
- }
416
- return this
417
- }
418
- }
419
-
420
- export default SVG
1
+ import type { default as SVGConfigType, svgElType, svgBoardType } from "../../../types/SVGConfig"
2
+
3
+ import { initText, initCircle, initPath, initRect, initArc } from "./config"
4
+ import { toNode, setAttribute, getAttribute, full, fill, stroke } from "./tool"
5
+ import rotate from "../../rotate"
6
+ import { linearGradient, radialGradient } from "./gradient"
7
+ import defaultFactory from "./default"
8
+ import { initOption } from "../option"
9
+
10
+ class SVG {
11
+ readonly name: string = "SVG"
12
+
13
+ // 用于记录配置
14
+ private __config = defaultFactory()
15
+
16
+ // 作用的节点
17
+ private __useEl: SVGElement
18
+
19
+ // 路径(和canvas2D的类似)
20
+ private __path: string = ""
21
+ private __currentPosition: number[] = []
22
+
23
+ // 变换(和canvas2D的类似,内部维护了用于记录)
24
+ private __transform_history: Array<string> = []
25
+ private __transform_current = ""
26
+
27
+ protected __svg: SVGElement
28
+ constructor(svg: SVGElement) {
29
+ this.__svg = svg
30
+ }
31
+
32
+ // 属性设置或获取
33
+ config(params: SVGConfigType) {
34
+ if (typeof params !== "object") {
35
+ return this.__config[params]
36
+ } else {
37
+ for (const key in params) {
38
+ (this.__config as any)[key] = (params as any)[key]
39
+ }
40
+ }
41
+ return this
42
+ }
43
+
44
+ reset(config: SVGConfigType = {}) {
45
+ this.config(initOption(config, defaultFactory()))
46
+ return this
47
+ }
48
+
49
+ /**
50
+ * 基础方法
51
+ * ---------------------------------
52
+ */
53
+
54
+ // 标记应用节点
55
+ // 也就是后续操作都会作用在此节点
56
+ useEl(el: SVGElement) {
57
+ this.__useEl = el
58
+ return this
59
+ }
60
+
61
+ // 获取当前应用的节点
62
+ getEl() {
63
+ return this.__useEl
64
+ }
65
+
66
+ // 追加节点
67
+ // el可以是结点或字符串,字符串的话表示节点名称
68
+ // context可选,表示追加位置,可选,默认根svg
69
+ // 此外,和appendBoard等操作一样,执行后新加入的结点会自动变成应用节点
70
+ appendEl(el: svgElType, context?: SVGElement) {
71
+ context = context || this.__svg
72
+
73
+ if (typeof el == "string") el = toNode(el)
74
+ context.appendChild(el as SVGElement)
75
+
76
+ this.__useEl = el as SVGElement
77
+ return this
78
+ }
79
+
80
+ // 追加绘制板
81
+ // 参数和appendEl类似,只是el如果是字符串的话,表示需要绘制对应什么内容,
82
+ // 比如el = “arc”,表示画弧(不是路径arc),那么我们会创建path节点,因为我们是使用path实现的
83
+ appendBoard(el: svgBoardType, context?: SVGElement) {
84
+ let _el: svgBoardType | string = el
85
+
86
+ if (typeof el == "string")
87
+ _el =
88
+ {
89
+ text: "text",
90
+ path: "path",
91
+ arc: "path",
92
+ circle: "circle",
93
+ rect: "path",
94
+ }[el] || ""
95
+
96
+ if (_el == "") throw new Error("Unsupported drawing method:" + el)
97
+ return this.appendEl(_el as svgElType, context)
98
+ }
99
+
100
+ // 删除当前维护的节点
101
+ remove() {
102
+ if (!this.__useEl) {
103
+ throw new Error("Currently, no node can be deleted.")
104
+ } else {
105
+ ((this.__useEl as SVGElement).parentNode as SVGElement).removeChild(
106
+ this.__useEl
107
+ )
108
+ }
109
+ return this
110
+ }
111
+
112
+ // 设置或获取节点属性
113
+ attr(params: any) {
114
+ if (!this.__useEl)
115
+ throw new Error("Currently, no node can be modified or viewed.")
116
+
117
+ if (typeof params !== "object") {
118
+ return getAttribute(this.__useEl, params)
119
+ } else {
120
+ for (const key in params) {
121
+ setAttribute(this.__useEl, key, params[key])
122
+ }
123
+ return this
124
+ }
125
+ }
126
+
127
+ /**
128
+ * 绘制方法
129
+ * ---------------------------------
130
+ */
131
+
132
+ // 文字
133
+ // deg表示文字旋转角度,是角度值,不是弧度
134
+ fillText(text: string, x: number, y: number, deg: number = 0) {
135
+ initText(this.__useEl, this.__config, x, y, deg)
136
+ this.attr({
137
+ transform: this.__transform_current
138
+ })
139
+ this.__useEl.textContent = text
140
+ fill(this.__useEl, this.__config)
141
+ return this
142
+ }
143
+ strokeText(text: string, x: number, y: number, deg: number = 0) {
144
+ initText(this.__useEl, this.__config, x, y, deg)
145
+ this.attr({
146
+ transform: this.__transform_current
147
+ })
148
+ this.__useEl.textContent = text
149
+ stroke(this.__useEl, this.__config)
150
+ return this
151
+ }
152
+ fullText(text: string, x: number, y: number, deg: number = 0) {
153
+ initText(this.__useEl, this.__config, x, y, deg)
154
+ this.attr({
155
+ transform: this.__transform_current
156
+ })
157
+ this.__useEl.textContent = text
158
+ full(this.__useEl, this.__config)
159
+ return this
160
+ }
161
+
162
+ // 弧
163
+ fillArc(
164
+ cx: number,
165
+ cy: number,
166
+ r1: number,
167
+ r2: number,
168
+ beginDeg: number,
169
+ deg: number
170
+ ) {
171
+ initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
172
+ this.attr({
173
+ transform: this.__transform_current
174
+ })
175
+ fill(this.__useEl, this.__config)
176
+ return this
177
+ }
178
+ strokeArc(
179
+ cx: number,
180
+ cy: number,
181
+ r1: number,
182
+ r2: number,
183
+ beginDeg: number,
184
+ deg: number
185
+ ) {
186
+ initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
187
+ this.attr({
188
+ transform: this.__transform_current
189
+ })
190
+ stroke(this.__useEl, this.__config)
191
+ return this
192
+ }
193
+ fullArc(
194
+ cx: number,
195
+ cy: number,
196
+ r1: number,
197
+ r2: number,
198
+ beginDeg: number,
199
+ deg: number
200
+ ) {
201
+ initArc(this.__useEl, this.__config, cx, cy, r1, r2, beginDeg, deg)
202
+ this.attr({
203
+ transform: this.__transform_current
204
+ })
205
+ full(this.__useEl, this.__config)
206
+ return this
207
+ }
208
+
209
+ // 圆形
210
+ fillCircle(cx: number, cy: number, r: number) {
211
+ initCircle(this.__useEl, cx, cy, r)
212
+ this.attr({
213
+ transform: this.__transform_current
214
+ })
215
+ fill(this.__useEl, this.__config)
216
+ return this
217
+ }
218
+ strokeCircle(cx: number, cy: number, r: number) {
219
+ initCircle(this.__useEl, cx, cy, r)
220
+ this.attr({
221
+ transform: this.__transform_current
222
+ })
223
+ stroke(this.__useEl, this.__config)
224
+ return this
225
+ }
226
+ fullCircle(cx: number, cy: number, r: number) {
227
+ initCircle(this.__useEl, cx, cy, r)
228
+ this.attr({
229
+ transform: this.__transform_current
230
+ })
231
+ full(this.__useEl, this.__config)
232
+ return this
233
+ }
234
+
235
+ // 矩形
236
+ fillRect(x: number, y: number, width: number, height: number) {
237
+ initRect(this.__useEl, this.__config, x, y, width, height)
238
+ this.attr({
239
+ transform: this.__transform_current
240
+ })
241
+ fill(this.__useEl, this.__config)
242
+ return this
243
+ }
244
+ strokeRect(x: number, y: number, width: number, height: number) {
245
+ initRect(this.__useEl, this.__config, x, y, width, height)
246
+ this.attr({
247
+ transform: this.__transform_current
248
+ })
249
+ stroke(this.__useEl, this.__config)
250
+ return this
251
+ }
252
+ fullRect(x: number, y: number, width: number, height: number) {
253
+ initRect(this.__useEl, this.__config, x, y, width, height)
254
+ this.attr({
255
+ transform: this.__transform_current
256
+ })
257
+ full(this.__useEl, this.__config)
258
+ return this
259
+ }
260
+
261
+ // 路径
262
+ beginPath() {
263
+ this.__currentPosition = []
264
+ this.__path = ""
265
+ return this
266
+ }
267
+ closePath() {
268
+ this.__path += "Z"
269
+ return this
270
+ }
271
+ moveTo(x: number, y: number) {
272
+ this.__currentPosition = [x, y]
273
+
274
+ this.__path += "M" + x + " " + y
275
+ return this
276
+ }
277
+ lineTo(x: number, y: number) {
278
+ this.__currentPosition = [x, y]
279
+
280
+ this.__path += (this.__path == "" ? "M" : "L") + x + " " + y
281
+ return this
282
+ }
283
+ fill() {
284
+ initPath(this.__useEl, this.__path)
285
+ this.attr({
286
+ transform: this.__transform_current
287
+ })
288
+ fill(this.__useEl, this.__config)
289
+ return this
290
+ }
291
+ stroke() {
292
+ initPath(this.__useEl, this.__path)
293
+ this.attr({
294
+ transform: this.__transform_current
295
+ })
296
+ stroke(this.__useEl, this.__config)
297
+ return this
298
+ }
299
+ full() {
300
+ initPath(this.__useEl, this.__path)
301
+ this.attr({
302
+ transform: this.__transform_current
303
+ })
304
+ full(this.__useEl, this.__config)
305
+ return this
306
+ }
307
+
308
+ save() {
309
+ this.__transform_history.push(this.__transform_current);
310
+ return this
311
+ }
312
+ restore() {
313
+ if (this.__transform_history.length > 0) this.__transform_current = this.__transform_history.pop() as string;
314
+ return this
315
+ }
316
+
317
+ arc(x: number, y: number, r: number, beginDeg: number, deg: number) {
318
+ const begPosition = rotate(x, y, (beginDeg / 180) * Math.PI, x + r, y)
319
+ const endPosition = rotate(
320
+ x,
321
+ y,
322
+ ((beginDeg + deg) / 180) * Math.PI,
323
+ x + r,
324
+ y
325
+ )
326
+ // 如果当前没有路径,说明是开始的,就移动到正确位置
327
+ if (this.__path == "") {
328
+ this.__path += "M" + begPosition[0] + "," + begPosition[1]
329
+ }
330
+ // 如果当前有路径,位置不正确,应该画到正确位置(和canvas保持一致)
331
+ else if (
332
+ begPosition[0] != this.__currentPosition[0] ||
333
+ begPosition[1] != this.__currentPosition[1]
334
+ ) {
335
+ this.__path += "L" + begPosition[0] + "," + begPosition[1]
336
+ }
337
+ this.__path +=
338
+ "A" +
339
+ r +
340
+ "," +
341
+ r +
342
+ " 0 " +
343
+ (deg > 180 || deg < -180 ? 1 : 0) +
344
+ "," +
345
+ (deg > 0 ? 1 : 0) +
346
+ " " +
347
+ endPosition[0] +
348
+ "," +
349
+ endPosition[1]
350
+ return this
351
+ }
352
+
353
+ // 路径 - 贝塞尔曲线
354
+ quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
355
+ this.__path += "Q" + cpx + " " + cpy + "," + x + " " + y
356
+ return this
357
+ }
358
+ bezierCurveTo(
359
+ cp1x: number,
360
+ cp1y: number,
361
+ cp2x: number,
362
+ cp2y: number,
363
+ x: number,
364
+ y: number
365
+ ) {
366
+ this.__path +=
367
+ "C" + cp1x + " " + cp1y + "," + cp2x + " " + cp2y + "," + x + " " + y
368
+ return this
369
+ }
370
+
371
+ // 绑定事件
372
+ bind(eventType: string, callback: (event: Event, target: SVGElement) => void) {
373
+ this.__useEl.addEventListener(eventType, function (event: Event) {
374
+ callback.call(this, event, this)
375
+ }, false)
376
+ return this
377
+ }
378
+
379
+ // 线性渐变
380
+ createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
381
+ return linearGradient(this.__svg, x0, y0, x1, y1)
382
+ }
383
+
384
+ // 环形渐变
385
+ createRadialGradient(cx: number, cy: number, r: number) {
386
+ return radialGradient(this.__svg, cx, cy, r)
387
+ }
388
+
389
+ // 转换画布
390
+ translate(dx: number, dy: number) {
391
+ this.__transform_current += ' translate(' + dx + ',' + dy + ')'
392
+ return this
393
+ }
394
+ rotate(deg: number) {
395
+ this.__transform_current += ' rotate(' + deg + ')'
396
+ return this
397
+ }
398
+
399
+ // 扩展绘制方法
400
+ install(methods: {
401
+ [key: string]: Function
402
+ }): any {
403
+ for (const key in methods) {
404
+
405
+ if (key in this) {
406
+ throw new Error("VISLite SVG:Method already exists and cannot be overwritten.")
407
+ } else {
408
+ (this as any)[key] = (...args: any) => {
409
+ const value = methods[key].apply(this, args)
410
+ if (value != void 0) return value
411
+ return this
412
+ }
413
+ }
414
+
415
+ }
416
+ return this
417
+ }
418
+ }
419
+
420
+ export default SVG