@meta2d/core 1.0.55 → 1.0.56

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 (302) hide show
  1. package/README.md +13 -0
  2. package/package.build.json +39 -0
  3. package/package.json +38 -38
  4. package/src/canvas/canvas.ts +8639 -0
  5. package/src/canvas/canvasImage.ts +525 -0
  6. package/src/canvas/canvasTemplate.ts +257 -0
  7. package/src/canvas/magnifierCanvas.ts +142 -0
  8. package/src/canvas/offscreen.ts +14 -0
  9. package/src/core.ts +5128 -0
  10. package/src/data.ts +86 -0
  11. package/src/diagrams/arrow.ts +50 -0
  12. package/src/diagrams/circle.ts +19 -0
  13. package/src/diagrams/cloud.ts +34 -0
  14. package/src/diagrams/cube.ts +94 -0
  15. package/src/diagrams/diamond.ts +14 -0
  16. package/src/diagrams/file.ts +19 -0
  17. package/src/diagrams/gif.ts +105 -0
  18. package/src/diagrams/{hexagon.js → hexagon.ts} +19 -14
  19. package/src/diagrams/iframe.ts +365 -0
  20. package/src/diagrams/{index.js → index.ts} +36 -34
  21. package/src/diagrams/line/arrow.ts +175 -0
  22. package/src/diagrams/line/curve.ts +260 -0
  23. package/src/diagrams/line/line.ts +409 -0
  24. package/src/diagrams/line/polyline.ts +676 -0
  25. package/src/diagrams/line/smooth.ts +133 -0
  26. package/src/diagrams/message.ts +17 -0
  27. package/src/diagrams/mindLine.ts +31 -0
  28. package/src/diagrams/mindNode.ts +177 -0
  29. package/src/diagrams/panel.ts +149 -0
  30. package/src/diagrams/pentagon.ts +48 -0
  31. package/src/diagrams/pentagram.ts +63 -0
  32. package/src/diagrams/people.ts +23 -0
  33. package/src/diagrams/rectangle.ts +29 -0
  34. package/src/diagrams/svg/parse.ts +319 -0
  35. package/src/diagrams/svgPath.ts +53 -0
  36. package/src/diagrams/triangle.ts +43 -0
  37. package/src/diagrams/video.ts +202 -0
  38. package/src/dialog/dialog.ts +177 -0
  39. package/src/event/event.ts +142 -0
  40. package/src/map/map.ts +239 -0
  41. package/src/options.ts +205 -0
  42. package/src/pen/arrow.ts +259 -0
  43. package/src/pen/math.ts +253 -0
  44. package/src/pen/model.ts +785 -0
  45. package/src/pen/plugin.ts +57 -0
  46. package/src/pen/render.ts +3725 -0
  47. package/src/pen/text.ts +341 -0
  48. package/src/pen/utils.ts +21 -0
  49. package/src/point/point.ts +232 -0
  50. package/src/rect/rect.ts +507 -0
  51. package/src/rect/triangle.ts +16 -0
  52. package/src/scroll/scroll.ts +277 -0
  53. package/src/store/global.ts +38 -0
  54. package/src/store/store.ts +293 -0
  55. package/src/theme.ts +35 -0
  56. package/src/title/title.ts +115 -0
  57. package/src/tooltip/tooltip.ts +199 -0
  58. package/src/utils/clone.ts +79 -0
  59. package/src/utils/color.ts +126 -0
  60. package/src/utils/error.ts +7 -0
  61. package/src/utils/file.ts +46 -0
  62. package/src/utils/{index.d.ts → index.ts} +1 -0
  63. package/src/utils/math.ts +120 -0
  64. package/src/utils/object.ts +23 -0
  65. package/src/utils/padding.ts +48 -0
  66. package/src/utils/time.ts +25 -0
  67. package/src/utils/url.ts +30 -0
  68. package/src/utils/uuid.ts +15 -0
  69. package/index.js +0 -10
  70. package/index.js.map +0 -1
  71. package/src/canvas/canvas.d.ts +0 -456
  72. package/src/canvas/canvas.js +0 -8187
  73. package/src/canvas/canvas.js.map +0 -1
  74. package/src/canvas/canvasImage.d.ts +0 -28
  75. package/src/canvas/canvasImage.js +0 -503
  76. package/src/canvas/canvasImage.js.map +0 -1
  77. package/src/canvas/canvasTemplate.d.ts +0 -19
  78. package/src/canvas/canvasTemplate.js +0 -229
  79. package/src/canvas/canvasTemplate.js.map +0 -1
  80. package/src/canvas/index.js +0 -3
  81. package/src/canvas/index.js.map +0 -1
  82. package/src/canvas/magnifierCanvas.d.ts +0 -20
  83. package/src/canvas/magnifierCanvas.js +0 -101
  84. package/src/canvas/magnifierCanvas.js.map +0 -1
  85. package/src/canvas/offscreen.d.ts +0 -2
  86. package/src/canvas/offscreen.js +0 -14
  87. package/src/canvas/offscreen.js.map +0 -1
  88. package/src/core.d.ts +0 -479
  89. package/src/core.js +0 -5199
  90. package/src/core.js.map +0 -1
  91. package/src/data.d.ts +0 -34
  92. package/src/data.js +0 -85
  93. package/src/data.js.map +0 -1
  94. package/src/diagrams/arrow.d.ts +0 -4
  95. package/src/diagrams/arrow.js +0 -47
  96. package/src/diagrams/arrow.js.map +0 -1
  97. package/src/diagrams/circle.d.ts +0 -2
  98. package/src/diagrams/circle.js +0 -9
  99. package/src/diagrams/circle.js.map +0 -1
  100. package/src/diagrams/cloud.d.ts +0 -2
  101. package/src/diagrams/cloud.js +0 -12
  102. package/src/diagrams/cloud.js.map +0 -1
  103. package/src/diagrams/cube.d.ts +0 -2
  104. package/src/diagrams/cube.js +0 -70
  105. package/src/diagrams/cube.js.map +0 -1
  106. package/src/diagrams/diamond.d.ts +0 -2
  107. package/src/diagrams/diamond.js +0 -13
  108. package/src/diagrams/diamond.js.map +0 -1
  109. package/src/diagrams/file.d.ts +0 -2
  110. package/src/diagrams/file.js +0 -18
  111. package/src/diagrams/file.js.map +0 -1
  112. package/src/diagrams/gif.d.ts +0 -5
  113. package/src/diagrams/gif.js +0 -90
  114. package/src/diagrams/gif.js.map +0 -1
  115. package/src/diagrams/hexagon.d.ts +0 -2
  116. package/src/diagrams/hexagon.js.map +0 -1
  117. package/src/diagrams/iframe.d.ts +0 -2
  118. package/src/diagrams/iframe.js +0 -356
  119. package/src/diagrams/iframe.js.map +0 -1
  120. package/src/diagrams/index.d.ts +0 -71
  121. package/src/diagrams/index.js.map +0 -1
  122. package/src/diagrams/line/arrow.d.ts +0 -2
  123. package/src/diagrams/line/arrow.js +0 -128
  124. package/src/diagrams/line/arrow.js.map +0 -1
  125. package/src/diagrams/line/curve.d.ts +0 -16
  126. package/src/diagrams/line/curve.js +0 -236
  127. package/src/diagrams/line/curve.js.map +0 -1
  128. package/src/diagrams/line/index.js +0 -6
  129. package/src/diagrams/line/index.js.map +0 -1
  130. package/src/diagrams/line/line.d.ts +0 -42
  131. package/src/diagrams/line/line.js +0 -431
  132. package/src/diagrams/line/line.js.map +0 -1
  133. package/src/diagrams/line/polyline.d.ts +0 -10
  134. package/src/diagrams/line/polyline.js +0 -657
  135. package/src/diagrams/line/polyline.js.map +0 -1
  136. package/src/diagrams/line/smooth.d.ts +0 -3
  137. package/src/diagrams/line/smooth.js +0 -174
  138. package/src/diagrams/line/smooth.js.map +0 -1
  139. package/src/diagrams/message.d.ts +0 -2
  140. package/src/diagrams/message.js +0 -15
  141. package/src/diagrams/message.js.map +0 -1
  142. package/src/diagrams/mindLine.d.ts +0 -3
  143. package/src/diagrams/mindLine.js +0 -31
  144. package/src/diagrams/mindLine.js.map +0 -1
  145. package/src/diagrams/mindNode.d.ts +0 -3
  146. package/src/diagrams/mindNode.js +0 -189
  147. package/src/diagrams/mindNode.js.map +0 -1
  148. package/src/diagrams/panel.d.ts +0 -2
  149. package/src/diagrams/panel.js +0 -131
  150. package/src/diagrams/panel.js.map +0 -1
  151. package/src/diagrams/pentagon.d.ts +0 -3
  152. package/src/diagrams/pentagon.js +0 -46
  153. package/src/diagrams/pentagon.js.map +0 -1
  154. package/src/diagrams/pentagram.d.ts +0 -3
  155. package/src/diagrams/pentagram.js +0 -77
  156. package/src/diagrams/pentagram.js.map +0 -1
  157. package/src/diagrams/people.d.ts +0 -2
  158. package/src/diagrams/people.js +0 -19
  159. package/src/diagrams/people.js.map +0 -1
  160. package/src/diagrams/rectangle.d.ts +0 -3
  161. package/src/diagrams/rectangle.js +0 -26
  162. package/src/diagrams/rectangle.js.map +0 -1
  163. package/src/diagrams/svg/parse.d.ts +0 -15
  164. package/src/diagrams/svg/parse.js +0 -326
  165. package/src/diagrams/svg/parse.js.map +0 -1
  166. package/src/diagrams/svgPath.d.ts +0 -2
  167. package/src/diagrams/svgPath.js +0 -30
  168. package/src/diagrams/svgPath.js.map +0 -1
  169. package/src/diagrams/triangle.d.ts +0 -3
  170. package/src/diagrams/triangle.js +0 -41
  171. package/src/diagrams/triangle.js.map +0 -1
  172. package/src/diagrams/video.d.ts +0 -5
  173. package/src/diagrams/video.js +0 -185
  174. package/src/diagrams/video.js.map +0 -1
  175. package/src/dialog/dialog.d.ts +0 -21
  176. package/src/dialog/dialog.js +0 -98
  177. package/src/dialog/dialog.js.map +0 -1
  178. package/src/dialog/index.js +0 -2
  179. package/src/dialog/index.js.map +0 -1
  180. package/src/event/event.d.ts +0 -102
  181. package/src/event/event.js +0 -22
  182. package/src/event/event.js.map +0 -1
  183. package/src/event/index.js +0 -2
  184. package/src/event/index.js.map +0 -1
  185. package/src/map/index.js +0 -2
  186. package/src/map/index.js.map +0 -1
  187. package/src/map/map.d.ts +0 -21
  188. package/src/map/map.js +0 -210
  189. package/src/map/map.js.map +0 -1
  190. package/src/options.d.ts +0 -130
  191. package/src/options.js +0 -80
  192. package/src/options.js.map +0 -1
  193. package/src/pen/arrow.d.ts +0 -4
  194. package/src/pen/arrow.js +0 -188
  195. package/src/pen/arrow.js.map +0 -1
  196. package/src/pen/index.js +0 -7
  197. package/src/pen/index.js.map +0 -1
  198. package/src/pen/math.d.ts +0 -28
  199. package/src/pen/math.js +0 -304
  200. package/src/pen/math.js.map +0 -1
  201. package/src/pen/model.d.ts +0 -514
  202. package/src/pen/model.js +0 -210
  203. package/src/pen/model.js.map +0 -1
  204. package/src/pen/plugin.d.ts +0 -5
  205. package/src/pen/plugin.js +0 -88
  206. package/src/pen/plugin.js.map +0 -1
  207. package/src/pen/render.d.ts +0 -147
  208. package/src/pen/render.js +0 -3236
  209. package/src/pen/render.js.map +0 -1
  210. package/src/pen/text.d.ts +0 -8
  211. package/src/pen/text.js +0 -375
  212. package/src/pen/text.js.map +0 -1
  213. package/src/pen/utils.d.ts +0 -2
  214. package/src/pen/utils.js +0 -41
  215. package/src/pen/utils.js.map +0 -1
  216. package/src/point/index.js +0 -2
  217. package/src/point/index.js.map +0 -1
  218. package/src/point/point.d.ts +0 -65
  219. package/src/point/point.js +0 -179
  220. package/src/point/point.js.map +0 -1
  221. package/src/rect/index.js +0 -2
  222. package/src/rect/index.js.map +0 -1
  223. package/src/rect/rect.d.ts +0 -52
  224. package/src/rect/rect.js +0 -486
  225. package/src/rect/rect.js.map +0 -1
  226. package/src/rect/triangle.d.ts +0 -2
  227. package/src/rect/triangle.js +0 -10
  228. package/src/rect/triangle.js.map +0 -1
  229. package/src/scroll/index.js +0 -2
  230. package/src/scroll/index.js.map +0 -1
  231. package/src/scroll/scroll.d.ts +0 -35
  232. package/src/scroll/scroll.js +0 -221
  233. package/src/scroll/scroll.js.map +0 -1
  234. package/src/store/global.d.ts +0 -25
  235. package/src/store/global.js +0 -18
  236. package/src/store/global.js.map +0 -1
  237. package/src/store/index.js +0 -3
  238. package/src/store/index.js.map +0 -1
  239. package/src/store/store.d.ts +0 -228
  240. package/src/store/store.js +0 -121
  241. package/src/store/store.js.map +0 -1
  242. package/src/theme.d.ts +0 -13
  243. package/src/theme.js +0 -23
  244. package/src/theme.js.map +0 -1
  245. package/src/title/index.js +0 -2
  246. package/src/title/index.js.map +0 -1
  247. package/src/title/title.d.ts +0 -30
  248. package/src/title/title.js +0 -99
  249. package/src/title/title.js.map +0 -1
  250. package/src/tooltip/index.js +0 -2
  251. package/src/tooltip/index.js.map +0 -1
  252. package/src/tooltip/tooltip.d.ts +0 -40
  253. package/src/tooltip/tooltip.js +0 -167
  254. package/src/tooltip/tooltip.js.map +0 -1
  255. package/src/utils/browser.d.ts +0 -1
  256. package/src/utils/browser.js +0 -4
  257. package/src/utils/browser.js.map +0 -1
  258. package/src/utils/clone.d.ts +0 -8
  259. package/src/utils/clone.js +0 -88
  260. package/src/utils/clone.js.map +0 -1
  261. package/src/utils/color.d.ts +0 -3
  262. package/src/utils/color.js +0 -126
  263. package/src/utils/color.js.map +0 -1
  264. package/src/utils/error.d.ts +0 -2
  265. package/src/utils/error.js +0 -6
  266. package/src/utils/error.js.map +0 -1
  267. package/src/utils/file.d.ts +0 -3
  268. package/src/utils/file.js +0 -92
  269. package/src/utils/file.js.map +0 -1
  270. package/src/utils/index.js +0 -9
  271. package/src/utils/index.js.map +0 -1
  272. package/src/utils/math.d.ts +0 -18
  273. package/src/utils/math.js +0 -152
  274. package/src/utils/math.js.map +0 -1
  275. package/src/utils/object.d.ts +0 -2
  276. package/src/utils/object.js +0 -21
  277. package/src/utils/object.js.map +0 -1
  278. package/src/utils/padding.d.ts +0 -7
  279. package/src/utils/padding.js +0 -47
  280. package/src/utils/padding.js.map +0 -1
  281. package/src/utils/time.d.ts +0 -1
  282. package/src/utils/time.js +0 -17
  283. package/src/utils/time.js.map +0 -1
  284. package/src/utils/url.d.ts +0 -4
  285. package/src/utils/url.js +0 -27
  286. package/src/utils/url.js.map +0 -1
  287. package/src/utils/uuid.d.ts +0 -4
  288. package/src/utils/uuid.js +0 -13
  289. package/src/utils/uuid.js.map +0 -1
  290. /package/{index.d.ts → index.ts} +0 -0
  291. /package/src/canvas/{index.d.ts → index.ts} +0 -0
  292. /package/src/diagrams/line/{index.d.ts → index.ts} +0 -0
  293. /package/src/dialog/{index.d.ts → index.ts} +0 -0
  294. /package/src/event/{index.d.ts → index.ts} +0 -0
  295. /package/src/map/{index.d.ts → index.ts} +0 -0
  296. /package/src/pen/{index.d.ts → index.ts} +0 -0
  297. /package/src/point/{index.d.ts → index.ts} +0 -0
  298. /package/src/rect/{index.d.ts → index.ts} +0 -0
  299. /package/src/scroll/{index.d.ts → index.ts} +0 -0
  300. /package/src/store/{index.d.ts → index.ts} +0 -0
  301. /package/src/title/{index.d.ts → index.ts} +0 -0
  302. /package/src/tooltip/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,133 @@
1
+ import { Point, PrevNextType } from '../../point';
2
+
3
+ export function simplify(points: Point[], length: number, start: number, end: number) {
4
+ const newPoints: Point[] = [];
5
+ let maxDist, index, xx, yy, dx, dy, ddx, ddy, p1, p2, p, t, dist, dist1;
6
+ p1 = points[start];
7
+ p2 = points[end];
8
+ xx = p1.x;
9
+ yy = p1.y;
10
+ ddx = p2.x - xx;
11
+ ddy = p2.y - yy;
12
+ dist1 = ddx * ddx + ddy * ddy;
13
+ maxDist = length;
14
+ for (let i = start + 1; i < end; i++) {
15
+ p = points[i];
16
+ if (ddx !== 0 || ddy !== 0) {
17
+ t = ((p.x - xx) * ddx + (p.y - yy) * ddy) / dist1;
18
+ if (t > 1) {
19
+ dx = p.x - p2.x;
20
+ dy = p.y - p2.y;
21
+ } else if (t > 0) {
22
+ dx = p.x - (xx + ddx * t);
23
+ dy = p.y - (yy + ddy * t);
24
+ } else {
25
+ dx = p.x - xx;
26
+ dy = p.y - yy;
27
+ }
28
+ } else {
29
+ dx = p.x - xx;
30
+ dy = p.y - yy;
31
+ }
32
+ dist = dx * dx + dy * dy;
33
+ if (dist > maxDist) {
34
+ index = i;
35
+ maxDist = dist;
36
+ }
37
+ }
38
+
39
+ if (maxDist > length) {
40
+ // continue simplification while maxDist > length
41
+ if (index - start > 1) {
42
+ newPoints.push(...simplify(points, length, start, index));
43
+ }
44
+ newPoints.push({
45
+ id: points[index].id,
46
+ penId: points[index].penId,
47
+ x: points[index].x,
48
+ y: points[index].y,
49
+ });
50
+ if (end - index > 1) {
51
+ newPoints.push(...simplify(points, length, index, end));
52
+ }
53
+ }
54
+
55
+ return newPoints;
56
+ }
57
+
58
+ export function smoothLine(points: Point[], cornerThres = 0.8, match = false) {
59
+ if (points.length < 3) {
60
+ return points;
61
+ }
62
+
63
+ // adds bezier control points at points if lines have angle less than thres
64
+ let p1, p2, p3, dist1, dist2, x, y, endP, len, angle, newPoints, aLen, nx1, nx2, ny1, ny2;
65
+ const dot = (x, y, xx, yy) => {
66
+ dist1 = Math.sqrt(x * x + y * y);
67
+ if (dist1 > 0) {
68
+ // normalise
69
+ nx1 = x / dist1;
70
+ ny1 = y / dist1;
71
+ } else {
72
+ nx1 = 1; // need to have something so this will do as good as anything
73
+ ny1 = 0;
74
+ }
75
+ dist2 = Math.sqrt(xx * xx + yy * yy);
76
+ if (dist2 > 0) {
77
+ nx2 = xx / dist2;
78
+ ny2 = yy / dist2;
79
+ } else {
80
+ nx2 = 1;
81
+ ny2 = 0;
82
+ }
83
+ return Math.acos(nx1 * nx2 + ny1 * ny2);
84
+ };
85
+ newPoints = [];
86
+ aLen = points.length;
87
+ p1 = points[0];
88
+ endP = points[aLen - 1];
89
+ newPoints.push({ ...points[0] });
90
+ for (let i = 0; i < aLen - 1; i++) {
91
+ p2 = points[i];
92
+ p3 = points[i + 1];
93
+ angle = Math.abs(dot(p2.x - p1.x, p2.y - p1.y, p3.x - p2.x, p3.y - p2.y));
94
+ if (dist1) {
95
+ // dist1 and dist2 come from dot function
96
+ if (angle < cornerThres * 3.14) {
97
+ // bend it if angle between lines is small
98
+ if (match) {
99
+ dist1 = Math.min(dist1, dist2);
100
+ dist2 = dist1;
101
+ }
102
+ // use the two normalized vectors along the lines to create the tangent vector
103
+ x = (nx1 + nx2) / 2;
104
+ y = (ny1 + ny2) / 2;
105
+ len = Math.sqrt(x * x + y * y); // normalise the tangent
106
+ if (len === 0) {
107
+ newPoints.push({ ...p2 });
108
+ } else {
109
+ x /= len;
110
+ y /= len;
111
+ const pt: Point = { ...p2 };
112
+ pt.prevNextType = PrevNextType.Bilateral;
113
+ pt.prev = {
114
+ penId: pt.penId,
115
+ x: p2.x - x * dist1 * 0.25,
116
+ y: p2.y - y * dist1 * 0.25,
117
+ };
118
+ pt.next = {
119
+ penId: pt.penId,
120
+ x: p2.x + x * dist2 * 0.25,
121
+ y: p2.y + y * dist2 * 0.25,
122
+ };
123
+ newPoints.push(pt);
124
+ }
125
+ } else {
126
+ newPoints.push({ ...p2 });
127
+ }
128
+ }
129
+ p1 = p2;
130
+ }
131
+ newPoints.push({ ...points[points.length - 1] });
132
+ return newPoints;
133
+ }
@@ -0,0 +1,17 @@
1
+ import { Pen } from '../pen';
2
+
3
+ export function message(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
4
+ const path = !ctx ? new Path2D() : ctx;
5
+ const { x, y, width, height, ey } = pen.calculative.worldRect;
6
+
7
+ path.moveTo(x, y);
8
+ path.lineTo(x + width, y);
9
+ path.lineTo(x + width, y + (height * 3) / 4);
10
+ path.lineTo(x + (width * 8) / 16, y + (height * 3) / 4);
11
+ path.lineTo(x + width / 4, ey);
12
+ path.lineTo(x + (width * 5) / 16, y + (height * 3) / 4);
13
+ path.lineTo(x, y + (height * 3) / 4);
14
+
15
+ path.closePath();
16
+ if (path instanceof Path2D) return path;
17
+ }
@@ -0,0 +1,31 @@
1
+ import { Pen } from '../pen';
2
+
3
+ export function mindLine(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
4
+ const path = !ctx ? new Path2D() : ctx;
5
+ const { x, y, width, height } = pen.calculative.worldRect;
6
+ path.moveTo(x, y + height);
7
+ path.lineTo(x + width, y + height);
8
+ path.closePath();
9
+ if (path instanceof Path2D) return path;
10
+ }
11
+
12
+ export function mindLineAnchors(pen: Pen) {
13
+ const points = [
14
+ {
15
+ x: 0,
16
+ y: 1,
17
+ },
18
+ {
19
+ x: 1,
20
+ y: 1,
21
+ },
22
+ ] as const;
23
+ pen.anchors = points.map(({ x, y }, index) => {
24
+ return {
25
+ id: index + '',
26
+ x,
27
+ y,
28
+ penId: pen.id,
29
+ };
30
+ });
31
+ }
@@ -0,0 +1,177 @@
1
+ import { calcWorldAnchors, Pen } from '../pen';
2
+ import { Point } from '../point';
3
+ import { rectangle } from '.';
4
+
5
+ export function mindNode(pen: Pen, ctx?: CanvasRenderingContext2D) {
6
+ if (!pen.onResize) {
7
+ pen.onResize = resize;
8
+ pen.onValue = value;
9
+ }
10
+
11
+ return rectangle(pen, ctx);
12
+ }
13
+
14
+ function resize(pen: Pen) {
15
+ // 过滤出非默认锚点,即自定义锚点
16
+ const manualPoints = pen.anchors.filter((point: Point) => point.flag !== 1);
17
+ mindNodeAnchors(pen);
18
+ pen.anchors = pen.anchors.concat(...manualPoints);
19
+ }
20
+
21
+ function value(pen: Pen) {
22
+ resize(pen);
23
+ calcWorldAnchors(pen);
24
+ }
25
+
26
+ export function mindNodeAnchors(pen: Pen) {
27
+ // TODO: 组合状态下的 width height 成了固定的百分比
28
+ const anchors: Point[] = [];
29
+ const { x: rectX, y: rectY, width, height } = pen;
30
+ const r = borderRadius(pen);
31
+ // 上四
32
+ const topN = 5; // 上方节点个数,控制位置,实际节点数依然是 4 个
33
+ for (let i = 0; i < topN; i++) {
34
+ if (i === 2) {
35
+ continue;
36
+ }
37
+ let x = rectX + (width * (i + 1)) / (topN + 1);
38
+ let y = rectY;
39
+ if (x < rectX + r) {
40
+ // 在左侧圆角
41
+ y = getYByCircle(rectX + r, y + r, x, r, -1);
42
+ } else if (x > rectX + width - r) {
43
+ // 在右侧圆角
44
+ y = getYByCircle(rectX + width - r, y + r, x, r, -1);
45
+ }
46
+ anchors.push({
47
+ id: String(anchors.length),
48
+ flag: 1,
49
+ penId: pen.id,
50
+ x: (x - rectX) / width,
51
+ y: (y - rectY) / height,
52
+ });
53
+ }
54
+ // 右三
55
+ const rightN = 3; // 右侧节点数
56
+ for (let i = 0; i < rightN; i++) {
57
+ let y = rectY + (height * (i + 1)) / (rightN + 1);
58
+ let x = rectX + width;
59
+ if (y < rectY + r) {
60
+ // 在上侧圆角以内
61
+ x = getXByCircle(x - r, rectY + r, y, r);
62
+ } else if (y > rectY + height - r) {
63
+ // 下侧圆角
64
+ x = getXByCircle(x - r, rectY + height - r, y, r);
65
+ }
66
+ anchors.push({
67
+ id: String(anchors.length),
68
+ flag: 1,
69
+ penId: pen.id,
70
+ x: (x - rectX) / width,
71
+ y: (y - rectY) / height,
72
+ });
73
+ }
74
+ // 下四
75
+ const bottomN = 5; // 下侧节点数
76
+ for (let i = 0; i < bottomN; i++) {
77
+ if (i === 2) {
78
+ continue;
79
+ }
80
+ let x = rectX + (width * (i + 1)) / (bottomN + 1);
81
+ let y = rectY + height;
82
+ if (x < rectX + r) {
83
+ // 在左侧圆角
84
+ y = getYByCircle(rectX + r, y - r, x, r);
85
+ } else if (x > rectX + width - r) {
86
+ // 在右侧圆角
87
+ y = getYByCircle(rectX + width - r, y - r, x, r);
88
+ }
89
+ anchors.push({
90
+ id: String(anchors.length),
91
+ flag: 1,
92
+ penId: pen.id,
93
+ x: (x - rectX) / width,
94
+ y: (y - rectY) / height,
95
+ });
96
+ }
97
+ // 左三
98
+ const leftN = 3; // 左侧节点数
99
+ for (let i = 0; i < leftN; i++) {
100
+ let y = rectY + (height * (i + 1)) / (leftN + 1);
101
+ let x = rectX;
102
+ if (y < rectY + r) {
103
+ // 在上侧圆角以内
104
+ x = getXByCircle(x + r, rectY + r, y, r, -1);
105
+ } else if (y > rectY + height - r) {
106
+ // 下侧圆角
107
+ x = getXByCircle(x + r, rectY + height - r, y, r, -1);
108
+ }
109
+ anchors.push({
110
+ id: String(anchors.length),
111
+ flag: 1,
112
+ penId: pen.id,
113
+ x: (x - rectX) / width,
114
+ y: (y - rectY) / height,
115
+ });
116
+ }
117
+ pen.anchors = anchors;
118
+ }
119
+
120
+ /**
121
+ * 得到元素实际计算半径
122
+ * @param node 元素
123
+ * @returns 元素实际半径
124
+ */
125
+ function borderRadius(pen: Pen): number {
126
+ let wr = pen.calculative.borderRadius || 0;
127
+ let hr = pen.calculative.borderRadius || 0;
128
+ const { width, height } = pen;
129
+ if (pen.calculative.borderRadius < 1) {
130
+ wr = width * pen.calculative.borderRadius;
131
+ hr = height * pen.calculative.borderRadius;
132
+ }
133
+ let r = wr < hr ? wr : hr;
134
+ if (width < 2 * r) {
135
+ r = width / 2;
136
+ }
137
+ if (height < 2 * r) {
138
+ r = height / 2;
139
+ }
140
+ return r;
141
+ }
142
+
143
+ /**
144
+ * 获取圆的 x 坐标
145
+ * @param ox 圆心x
146
+ * @param oy 圆心y
147
+ * @param y y
148
+ * @param r 半径
149
+ * @param sqrt 点可能在左侧,左侧填-1,右侧1(默认值)
150
+ */
151
+ function getXByCircle(
152
+ ox: number,
153
+ oy: number,
154
+ y: number,
155
+ r: number,
156
+ sqrt: number = 1
157
+ ): number {
158
+ return sqrt * Math.sqrt(r ** 2 - (y - oy) ** 2) + ox;
159
+ }
160
+
161
+ /**
162
+ * 获取圆的 y 坐标
163
+ * @param ox 圆心x
164
+ * @param oy 圆心y
165
+ * @param y y
166
+ * @param r 半径
167
+ * @param sqrt 点可以在上侧,也可能在下侧,上侧-1,下侧1(默认)
168
+ */
169
+ function getYByCircle(
170
+ ox: number,
171
+ oy: number,
172
+ x: number,
173
+ r: number,
174
+ sqrt: number = 1
175
+ ): number {
176
+ return sqrt * Math.sqrt(r ** 2 - (x - ox) ** 2) + oy;
177
+ }
@@ -0,0 +1,149 @@
1
+ import { movingSuffix } from '../canvas';
2
+ import { Pen } from '../pen';
3
+ import { Point } from '../point';
4
+ import { rectInRect } from '../rect';
5
+ import { deepClone } from '../utils';
6
+
7
+ export function panel(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
8
+ const path = !ctx ? new Path2D() : ctx;
9
+ if (!pen.onDestroy) {
10
+ pen.onDestroy = destory;
11
+ pen.onMove = move;
12
+ pen.onRotate = move;
13
+ pen.onMouseEnter = mouseEnter;
14
+ pen.onMouseLeave = mouseLeave;
15
+ pen.onMouseMove = mouseMove;
16
+ pen.onMouseUp = mouseUp;
17
+ pen.onInput = input;
18
+ }
19
+ let wr = pen.calculative.borderRadius || 0,
20
+ hr = wr;
21
+ const { x, y, width, height, ex, ey } = pen.calculative.worldRect;
22
+ const { x: textX } = pen.calculative.worldTextRect;
23
+ if (wr < 1) {
24
+ wr = width * wr;
25
+ hr = height * hr;
26
+ }
27
+ let r = wr < hr ? wr : hr;
28
+ if (width < 2 * r) {
29
+ r = width / 2;
30
+ }
31
+ if (height < 2 * r) {
32
+ r = height / 2;
33
+ }
34
+ const textWidth = getTextWidth(pen.text, pen.calculative.fontSize);
35
+ path.moveTo(x + r, y);
36
+ path.lineTo(textX - 5, y);
37
+ path.moveTo(textX + textWidth + 5, y);
38
+ path.lineTo(textX + textWidth + 5, y);
39
+ path.arcTo(ex, y, ex, ey, r);
40
+ path.arcTo(ex, ey, x, ey, r);
41
+ path.arcTo(x, ey, x, y, r);
42
+ path.arcTo(x, y, ex, y, r);
43
+ if (path instanceof Path2D) {
44
+ return path;
45
+ }
46
+ }
47
+
48
+ function getTextWidth(text: string, fontSize: number) {
49
+ // 近似计算
50
+ const chinese = text.match(/[^\x00-\xff]/g) || '';
51
+ const chineseWidth = chinese.length * fontSize; // 中文占用的宽度
52
+ const spaces = text.match(/\s/g) || '';
53
+ const spaceWidth = spaces.length * fontSize * 0.3; // 空格占用的宽度
54
+ const otherWidth =
55
+ (text.length - chinese.length - spaces.length) * fontSize * 0.6; // 其他字符占用的宽度
56
+ const currentWidth = chineseWidth + spaceWidth + otherWidth;
57
+ return currentWidth;
58
+ }
59
+
60
+ function input(pen: Pen, text: string) {
61
+ pen.text = text;
62
+ pen.calculative.text = pen.text;
63
+ // this.inputDiv.dataset.penId = undefined;
64
+ pen.calculative.canvas.updatePenRect(pen);
65
+ // this.patchFlags = true;
66
+ // this.store.emitter.emit('valueUpdate', pen);
67
+ }
68
+
69
+ function destory(pen: Pen) {}
70
+
71
+ function move(pen: Pen) {}
72
+
73
+ function mouseEnter(pen: Pen) {
74
+ // const activePens = pen.calculative.canvas.store.active;
75
+ // if(activePens&&activePens.length){
76
+ // activePens.forEach((activePen:Pen)=>{
77
+ // if(rectInRect(activePen.calculative.worldRect,pen.calculative.worldRect,true)){
78
+ // if(!pen.followers){
79
+ // pen.followers =[];
80
+ // }
81
+ // if(!pen.followers.includes(activePen.id)){
82
+ // pen.followers.push(activePen.id);
83
+ // }
84
+ // }
85
+ // })
86
+ // }
87
+ }
88
+
89
+ function mouseLeave(pen: Pen) {
90
+ const activePens = pen.calculative.canvas.store.active;
91
+ if (activePens && activePens.length) {
92
+ activePens.forEach((activePen: Pen) => {
93
+ // if(!rectInRect(activePen.calculative.worldRect,pen.calculative.worldRect,true)){
94
+ // if(!pen.followers){
95
+ // pen.followers =[];
96
+ // }
97
+ // if(!pen.followers.includes(activePen.id)){
98
+ // pen.followers.push(activePen.id);
99
+ // }
100
+ // }
101
+ if (pen.followers) {
102
+ let idx = pen.followers.findIndex((id: string) => id === activePen.id);
103
+ if (idx !== -1) {
104
+ const movingPen =
105
+ pen.calculative.canvas.store.pens[activePen.id + movingSuffix];
106
+ if (movingPen && movingPen.calculative) {
107
+ let isIn = rectInRect(
108
+ movingPen.calculative.worldRect,
109
+ pen.calculative.worldRect,
110
+ true
111
+ );
112
+ if (!isIn) {
113
+ pen.followers.splice(idx, 1);
114
+ }
115
+ }
116
+ }
117
+ }
118
+ });
119
+ }
120
+ }
121
+
122
+ function mouseUp(pen: Pen) {
123
+ const activePens = pen.calculative.canvas.store.active;
124
+ if (activePens && activePens.length) {
125
+ activePens.forEach((activePen: Pen) => {
126
+ const movingPen =
127
+ pen.calculative.canvas.store.pens[activePen.id + movingSuffix];
128
+ if (movingPen && movingPen.calculative) {
129
+ let inRect = deepClone(pen.calculative.worldRect);
130
+ inRect.x -= 1;
131
+ inRect.y -= 1;
132
+ inRect.width += 2;
133
+ inRect.height += 2;
134
+ if (rectInRect(movingPen.calculative.worldRect, inRect, true)) {
135
+ if (!pen.followers) {
136
+ pen.followers = [];
137
+ }
138
+ if (!pen.followers.includes(activePen.id)) {
139
+ pen.followers.push(activePen.id);
140
+ }
141
+ }
142
+ }
143
+ });
144
+ }
145
+ }
146
+
147
+ function mouseMove(pen: Pen, e: Point) {
148
+ // console.log(e,pen.calculative.canvas.store.active);
149
+ }
@@ -0,0 +1,48 @@
1
+ import { Pen } from '../pen';
2
+ import { Point } from '../point';
3
+ export function pentagon(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
4
+ const path = !ctx ? new Path2D() : ctx;
5
+ const { x, y, width, height } = pen.calculative.worldRect;
6
+
7
+ path.moveTo(x + width / 2, y);
8
+ path.lineTo(x + width, y + (height * 2) / 5);
9
+ path.lineTo(x + (width * 4) / 5, y + height);
10
+ path.lineTo(x + width / 5, y + height);
11
+ path.lineTo(x, y + (height * 2) / 5);
12
+
13
+ path.closePath();
14
+ if (path instanceof Path2D) return path;
15
+ }
16
+
17
+ export function pentagonAnchors(pen: Pen) {
18
+ const points = [
19
+ {
20
+ x: 0.5,
21
+ y: 0,
22
+ },
23
+ {
24
+ x: 1,
25
+ y: 0.4,
26
+ },
27
+ {
28
+ x: 0.8,
29
+ y: 1,
30
+ },
31
+ {
32
+ x: 0.2,
33
+ y: 1,
34
+ },
35
+ {
36
+ x: 0,
37
+ y: 0.4,
38
+ },
39
+ ] as const;
40
+ pen.anchors = points.map(({ x, y }, index) => {
41
+ return {
42
+ id: `${index}`,
43
+ penId: pen.id,
44
+ x,
45
+ y,
46
+ };
47
+ });
48
+ }
@@ -0,0 +1,63 @@
1
+ import { Pen } from '../pen';
2
+ import { Point } from '../point';
3
+
4
+ export function pentagram(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
5
+ if (!pen.onResize) {
6
+ pen.onResize = resize;
7
+ }
8
+ const path = !ctx ? new Path2D() : ctx;
9
+ const { width, height, center } = pen.calculative.worldRect;
10
+
11
+ const r = width > height ? height : width;
12
+ //旋转中心点
13
+ const centerx = center.x;
14
+ const centery = center.y;
15
+ const basey = centery - r / 2;
16
+ const baseyi = centery - r / 4;
17
+
18
+ const lx = -(baseyi - centery) * Math.sin((Math.PI / 180) * 324) + centerx;
19
+ const ly = (baseyi - centery) * Math.cos((Math.PI / 180) * 324) + centery;
20
+ path.moveTo(lx, ly);
21
+ for (let i = 0; i < 5; ++i) {
22
+ // TODO: Math.sin Math.cos 考虑优化下
23
+ path.lineTo(
24
+ -(basey - centery) * Math.sin((Math.PI / 180) * 72 * i) + centerx,
25
+ (basey - centery) * Math.cos((Math.PI / 180) * 72 * i) + centery
26
+ );
27
+ path.lineTo(
28
+ (lx - centerx) * Math.cos((Math.PI / 180) * 72 * (i + 1)) -
29
+ (ly - centery) * Math.sin((Math.PI / 180) * 72 * (i + 1)) +
30
+ centerx,
31
+ (lx - centerx) * Math.sin((Math.PI / 180) * 72 * (i + 1)) +
32
+ (ly - centery) * Math.cos((Math.PI / 180) * 72 * (i + 1)) +
33
+ centery
34
+ );
35
+ }
36
+ path.closePath();
37
+ if (path instanceof Path2D) return path;
38
+ }
39
+
40
+ export function pentagramAnchors(pen: Pen) {
41
+ // TODO: 组合状态下的 width height 成了固定的百分比
42
+ const { width, height } = pen;
43
+ const r = width > height ? height : width;
44
+ const anchors: Point[] = [];
45
+
46
+ for (let i = 0; i < 5; ++i) {
47
+ anchors.push({
48
+ flag: 1, // 默认锚点
49
+ id: String(i),
50
+ penId: pen.id,
51
+ x: 0.5 + ((r / 2) * Math.sin((Math.PI / 180) * 72 * i)) / width,
52
+ y: ((-r / 2) * Math.cos((Math.PI / 180) * 72 * i)) / height + 0.5,
53
+ });
54
+ }
55
+ pen.anchors = anchors;
56
+ }
57
+
58
+ function resize(pen: Pen) {
59
+ // 过滤出非默认锚点,即自定义锚点
60
+ const manualPoints = pen.anchors.filter((point: Point) => point.flag !== 1);
61
+ pentagramAnchors(pen);
62
+ pen.anchors = pen.anchors.concat(...manualPoints);
63
+ }
@@ -0,0 +1,23 @@
1
+ import { Pen } from '../pen';
2
+
3
+ export function people(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
4
+ const path = !ctx ? new Path2D() : ctx;
5
+ const { x, y, width, ex, ey } = pen.calculative.worldRect;
6
+ const r = width / 4;
7
+ const middle = x + width / 2;
8
+ path.arc(middle, y + r, r, 0, Math.PI * 2);
9
+
10
+ path.moveTo(x, y + r * 3);
11
+ path.lineTo(ex, y + r * 3);
12
+
13
+ path.moveTo(middle, y + r * 2);
14
+ path.lineTo(middle, y + r * 4);
15
+
16
+ path.moveTo(middle, y + r * 4);
17
+ path.lineTo(x, ey);
18
+
19
+ path.moveTo(middle, y + r * 4);
20
+ path.lineTo(ex, ey);
21
+ path.closePath();
22
+ if (path instanceof Path2D) return path;
23
+ }
@@ -0,0 +1,29 @@
1
+ import { Pen } from '../pen';
2
+
3
+ export function rectangle(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
4
+ const path = !ctx ? new Path2D() : ctx;
5
+ let wr = pen.calculative.borderRadius || 0,
6
+ hr = wr;
7
+ const { x, y, width, height, ex, ey } = pen.calculative.worldRect;
8
+ if (wr < 1) {
9
+ wr = width * wr;
10
+ hr = height * hr;
11
+ }
12
+ let r = wr < hr ? wr : hr;
13
+ if (width < 2 * r) {
14
+ r = width / 2;
15
+ }
16
+ if (height < 2 * r) {
17
+ r = height / 2;
18
+ }
19
+
20
+ path.moveTo(x + r, y);
21
+ path.arcTo(ex, y, ex, ey, r);
22
+ path.arcTo(ex, ey, x, ey, r);
23
+ path.arcTo(x, ey, x, y, r);
24
+ path.arcTo(x, y, ex, y, r);
25
+ if (path instanceof Path2D) {
26
+ return path;
27
+ }
28
+ }
29
+ export const square = rectangle;