@logicflow/core 1.2.27 → 2.0.0-beta.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 (804) hide show
  1. package/.turbo/turbo-build$colon$dev.log +10 -0
  2. package/.turbo/turbo-build.log +42 -0
  3. package/CHANGELOG.md +2114 -0
  4. package/LICENSE +206 -0
  5. package/__tests__/algorithm/egde.test.ts +118 -0
  6. package/__tests__/algorithm/index.test.ts +69 -0
  7. package/__tests__/algorithm/outline.test.ts +43 -0
  8. package/__tests__/bugs/1545-spec.test.ts +38 -0
  9. package/__tests__/event/event.test.ts +22 -0
  10. package/__tests__/history/history.test.ts +28 -0
  11. package/__tests__/logicflow.test.ts +567 -0
  12. package/__tests__/model/graphmodel.test.ts +67 -0
  13. package/__tests__/util/compatible.test.ts +48 -0
  14. package/__tests__/util/edge.test.ts +224 -0
  15. package/__tests__/util/geometry.test.ts +14 -0
  16. package/__tests__/util/graph.test.ts +16 -0
  17. package/__tests__/util/matrix.test.ts +41 -0
  18. package/__tests__/util/node.test.ts +68 -0
  19. package/__tests__/util/sampling.test.ts +16 -0
  20. package/__tests__/util/vector.test.ts +50 -0
  21. package/__tests__/util/zIndex.test.ts +10 -0
  22. package/dist/{style/index.css → index.css} +64 -52
  23. package/dist/index.js +26 -0
  24. package/dist/index.js.map +1 -0
  25. package/es/LogicFlow.d.ts +966 -0
  26. package/es/LogicFlow.js +1174 -0
  27. package/es/LogicFlow.js.map +1 -0
  28. package/es/algorithm/edge.d.ts +15 -0
  29. package/es/algorithm/edge.js +57 -0
  30. package/es/algorithm/edge.js.map +1 -0
  31. package/es/algorithm/index.js +71 -0
  32. package/es/algorithm/index.js.map +1 -0
  33. package/es/algorithm/outline.d.ts +7 -0
  34. package/es/algorithm/outline.js +61 -0
  35. package/es/algorithm/outline.js.map +1 -0
  36. package/{types/constant/constant.d.ts → es/constant/index.d.ts} +23 -22
  37. package/es/constant/index.js +117 -0
  38. package/es/constant/index.js.map +1 -0
  39. package/es/event/eventArgs.d.ts +428 -0
  40. package/es/event/eventArgs.js +2 -0
  41. package/es/event/eventArgs.js.map +1 -0
  42. package/es/event/eventEmitter.d.ts +48 -0
  43. package/es/event/eventEmitter.js +92 -0
  44. package/es/event/eventEmitter.js.map +1 -0
  45. package/es/history/index.d.ts +23 -0
  46. package/es/history/index.js +111 -0
  47. package/es/history/index.js.map +1 -0
  48. package/es/index.css +210 -0
  49. package/{types → es}/index.d.ts +4 -6
  50. package/es/index.js +16 -0
  51. package/es/index.js.map +1 -0
  52. package/es/index.less +1 -0
  53. package/{types → es}/keyboard/index.d.ts +7 -8
  54. package/es/keyboard/index.js +87 -0
  55. package/es/keyboard/index.js.map +1 -0
  56. package/es/keyboard/shortcut.js +116 -0
  57. package/es/keyboard/shortcut.js.map +1 -0
  58. package/es/model/BaseModel.d.ts +181 -0
  59. package/es/model/BaseModel.js +2 -0
  60. package/es/model/BaseModel.js.map +1 -0
  61. package/{types → es}/model/EditConfigModel.d.ts +13 -8
  62. package/es/model/EditConfigModel.js +192 -0
  63. package/es/model/EditConfigModel.js.map +1 -0
  64. package/{types → es}/model/GraphModel.d.ts +118 -178
  65. package/es/model/GraphModel.js +1473 -0
  66. package/es/model/GraphModel.js.map +1 -0
  67. package/es/model/SnaplineModel.d.ts +34 -0
  68. package/es/model/SnaplineModel.js +217 -0
  69. package/es/model/SnaplineModel.js.map +1 -0
  70. package/{types → es}/model/TransformModel.d.ts +21 -11
  71. package/es/model/TransformModel.js +240 -0
  72. package/es/model/TransformModel.js.map +1 -0
  73. package/{types → es}/model/edge/BaseEdgeModel.d.ts +82 -63
  74. package/es/model/edge/BaseEdgeModel.js +739 -0
  75. package/es/model/edge/BaseEdgeModel.js.map +1 -0
  76. package/es/model/edge/BezierEdgeModel.d.ts +63 -0
  77. package/es/model/edge/BezierEdgeModel.js +244 -0
  78. package/es/model/edge/BezierEdgeModel.js.map +1 -0
  79. package/es/model/edge/LineEdgeModel.d.ts +19 -0
  80. package/es/model/edge/LineEdgeModel.js +77 -0
  81. package/es/model/edge/LineEdgeModel.js.map +1 -0
  82. package/es/model/edge/PolylineEdgeModel.d.ts +85 -0
  83. package/es/model/edge/PolylineEdgeModel.js +593 -0
  84. package/es/model/edge/PolylineEdgeModel.js.map +1 -0
  85. package/es/model/edge/index.js +5 -0
  86. package/es/model/edge/index.js.map +1 -0
  87. package/es/model/index.js +8 -0
  88. package/es/model/index.js.map +1 -0
  89. package/es/model/node/BaseNodeModel.d.ts +260 -0
  90. package/es/model/node/BaseNodeModel.js +883 -0
  91. package/es/model/node/BaseNodeModel.js.map +1 -0
  92. package/es/model/node/CircleNodeModel.d.ts +40 -0
  93. package/es/model/node/CircleNodeModel.js +110 -0
  94. package/es/model/node/CircleNodeModel.js.map +1 -0
  95. package/es/model/node/DiamondNodeModel.d.ts +46 -0
  96. package/es/model/node/DiamondNodeModel.js +187 -0
  97. package/es/model/node/DiamondNodeModel.js.map +1 -0
  98. package/es/model/node/EllipseNodeModel.d.ts +42 -0
  99. package/es/model/node/EllipseNodeModel.js +118 -0
  100. package/es/model/node/EllipseNodeModel.js.map +1 -0
  101. package/es/model/node/HtmlNodeModel.d.ts +21 -0
  102. package/es/model/node/HtmlNodeModel.js +59 -0
  103. package/es/model/node/HtmlNodeModel.js.map +1 -0
  104. package/es/model/node/PolygonNodeModel.d.ts +50 -0
  105. package/es/model/node/PolygonNodeModel.js +196 -0
  106. package/es/model/node/PolygonNodeModel.js.map +1 -0
  107. package/es/model/node/RectNodeModel.d.ts +34 -0
  108. package/es/model/node/RectNodeModel.js +80 -0
  109. package/es/model/node/RectNodeModel.js.map +1 -0
  110. package/es/model/node/TextNodeModel.d.ts +27 -0
  111. package/es/model/node/TextNodeModel.js +113 -0
  112. package/es/model/node/TextNodeModel.js.map +1 -0
  113. package/es/model/node/index.js +9 -0
  114. package/es/model/node/index.js.map +1 -0
  115. package/es/options.d.ts +86 -0
  116. package/es/options.js +74 -0
  117. package/es/options.js.map +1 -0
  118. package/es/style/index.css +210 -0
  119. package/es/style/index.less +256 -0
  120. package/es/style/raw.d.ts +4 -0
  121. package/es/style/raw.js +6 -0
  122. package/es/style/raw.js.map +1 -0
  123. package/es/tool/MultipleSelectTool.d.ts +13 -0
  124. package/es/tool/MultipleSelectTool.js +159 -0
  125. package/es/tool/MultipleSelectTool.js.map +1 -0
  126. package/es/tool/TextEditTool.d.ts +26 -0
  127. package/es/tool/TextEditTool.js +187 -0
  128. package/es/tool/TextEditTool.js.map +1 -0
  129. package/es/tool/index.d.ts +2 -0
  130. package/es/tool/index.js +3 -0
  131. package/es/tool/index.js.map +1 -0
  132. package/{types/tool/SnaplineTool.d.ts → es/tool/snapline.d.ts} +1 -1
  133. package/es/tool/snapline.js +13 -0
  134. package/es/tool/snapline.js.map +1 -0
  135. package/es/tool/tool.d.ts +22 -0
  136. package/es/tool/tool.js +43 -0
  137. package/es/tool/tool.js.map +1 -0
  138. package/es/util/animation.d.ts +12 -0
  139. package/es/util/animation.js +20 -0
  140. package/es/util/animation.js.map +1 -0
  141. package/es/util/browser.js +3 -0
  142. package/es/util/browser.js.map +1 -0
  143. package/es/util/compatible.d.ts +6 -0
  144. package/es/util/compatible.js +17 -0
  145. package/es/util/compatible.js.map +1 -0
  146. package/es/util/drag.d.ts +47 -0
  147. package/es/util/drag.js +139 -0
  148. package/es/util/drag.js.map +1 -0
  149. package/es/util/edge.d.ts +94 -0
  150. package/es/util/edge.js +833 -0
  151. package/es/util/edge.js.map +1 -0
  152. package/es/util/geometry.d.ts +11 -0
  153. package/es/util/geometry.js +72 -0
  154. package/es/util/geometry.js.map +1 -0
  155. package/{types → es}/util/graph.d.ts +4 -3
  156. package/es/util/graph.js +54 -0
  157. package/es/util/graph.js.map +1 -0
  158. package/es/util/index.d.ts +16 -0
  159. package/es/util/index.js +17 -0
  160. package/es/util/index.js.map +1 -0
  161. package/{types → es}/util/matrix.d.ts +1 -1
  162. package/es/util/matrix.js +161 -0
  163. package/es/util/matrix.js.map +1 -0
  164. package/es/util/mobx.js +4 -0
  165. package/es/util/mobx.js.map +1 -0
  166. package/es/util/node.d.ts +69 -0
  167. package/es/util/node.js +402 -0
  168. package/es/util/node.js.map +1 -0
  169. package/es/util/raf.d.ts +2 -0
  170. package/es/util/raf.js +24 -0
  171. package/es/util/raf.js.map +1 -0
  172. package/{types → es}/util/sampling.d.ts +4 -2
  173. package/es/util/sampling.js +66 -0
  174. package/es/util/sampling.js.map +1 -0
  175. package/es/util/theme.d.ts +4 -0
  176. package/es/util/theme.js +156 -0
  177. package/es/util/theme.js.map +1 -0
  178. package/es/util/uuid.d.ts +7 -0
  179. package/es/util/uuid.js +20 -0
  180. package/es/util/uuid.js.map +1 -0
  181. package/{types → es}/util/vector.d.ts +2 -2
  182. package/es/util/vector.js +97 -0
  183. package/es/util/vector.js.map +1 -0
  184. package/es/util/zIndex.js +5 -0
  185. package/es/util/zIndex.js.map +1 -0
  186. package/es/view/Anchor.d.ts +47 -0
  187. package/es/view/Anchor.js +315 -0
  188. package/es/view/Anchor.js.map +1 -0
  189. package/es/view/Control.d.ts +100 -0
  190. package/es/view/Control.js +324 -0
  191. package/es/view/Control.js.map +1 -0
  192. package/es/view/Graph.d.ts +18 -0
  193. package/es/view/Graph.js +77 -0
  194. package/es/view/Graph.js.map +1 -0
  195. package/{types → es}/view/Rotate.d.ts +9 -9
  196. package/es/view/Rotate.js +108 -0
  197. package/es/view/Rotate.js.map +1 -0
  198. package/es/view/behavior/dnd.d.ts +27 -0
  199. package/es/view/behavior/dnd.js +110 -0
  200. package/es/view/behavior/dnd.js.map +1 -0
  201. package/es/view/edge/AdjustPoint.d.ts +50 -0
  202. package/es/view/edge/AdjustPoint.js +368 -0
  203. package/es/view/edge/AdjustPoint.js.map +1 -0
  204. package/es/view/edge/Arrow.d.ts +25 -0
  205. package/es/view/edge/Arrow.js +60 -0
  206. package/es/view/edge/Arrow.js.map +1 -0
  207. package/{types → es}/view/edge/BaseEdge.d.ts +25 -17
  208. package/es/view/edge/BaseEdge.js +381 -0
  209. package/es/view/edge/BaseEdge.js.map +1 -0
  210. package/es/view/edge/BezierEdge.d.ts +26 -0
  211. package/es/view/edge/BezierEdge.js +118 -0
  212. package/es/view/edge/BezierEdge.js.map +1 -0
  213. package/{types → es}/view/edge/LineEdge.d.ts +9 -4
  214. package/es/view/edge/LineEdge.js +78 -0
  215. package/es/view/edge/LineEdge.js.map +1 -0
  216. package/{types → es}/view/edge/PolylineEdge.d.ts +18 -8
  217. package/es/view/edge/PolylineEdge.js +274 -0
  218. package/es/view/edge/PolylineEdge.js.map +1 -0
  219. package/es/view/edge/index.d.ts +6 -0
  220. package/es/view/edge/index.js +7 -0
  221. package/es/view/edge/index.js.map +1 -0
  222. package/es/view/index.d.ts +7 -0
  223. package/es/view/index.js +8 -0
  224. package/es/view/index.js.map +1 -0
  225. package/es/view/node/BaseNode.d.ts +49 -0
  226. package/es/view/node/BaseNode.js +420 -0
  227. package/es/view/node/BaseNode.js.map +1 -0
  228. package/es/view/node/CircleNode.d.ts +10 -0
  229. package/es/view/node/CircleNode.js +45 -0
  230. package/es/view/node/CircleNode.js.map +1 -0
  231. package/es/view/node/DiamondNode.d.ts +10 -0
  232. package/es/view/node/DiamondNode.js +44 -0
  233. package/es/view/node/DiamondNode.js.map +1 -0
  234. package/es/view/node/EllipseNode.d.ts +10 -0
  235. package/es/view/node/EllipseNode.js +44 -0
  236. package/es/view/node/EllipseNode.js.map +1 -0
  237. package/{types → es}/view/node/HtmlNode.d.ts +15 -9
  238. package/es/view/node/HtmlNode.js +129 -0
  239. package/es/view/node/HtmlNode.js.map +1 -0
  240. package/es/view/node/PolygonNode.d.ts +10 -0
  241. package/es/view/node/PolygonNode.js +48 -0
  242. package/es/view/node/PolygonNode.js.map +1 -0
  243. package/es/view/node/RectNode.d.ts +11 -0
  244. package/es/view/node/RectNode.js +44 -0
  245. package/es/view/node/RectNode.js.map +1 -0
  246. package/es/view/node/TextNode.d.ts +12 -0
  247. package/es/view/node/TextNode.js +55 -0
  248. package/es/view/node/TextNode.js.map +1 -0
  249. package/es/view/node/index.d.ts +8 -0
  250. package/es/view/node/index.js +9 -0
  251. package/es/view/node/index.js.map +1 -0
  252. package/{types → es}/view/overlay/BackgroundOverlay.d.ts +7 -7
  253. package/es/view/overlay/BackgroundOverlay.js +31 -0
  254. package/es/view/overlay/BackgroundOverlay.js.map +1 -0
  255. package/es/view/overlay/BezierAdjustOverlay.d.ts +31 -0
  256. package/es/view/overlay/BezierAdjustOverlay.js +142 -0
  257. package/es/view/overlay/BezierAdjustOverlay.js.map +1 -0
  258. package/{types → es}/view/overlay/CanvasOverlay.d.ts +8 -11
  259. package/es/view/overlay/CanvasOverlay.js +172 -0
  260. package/es/view/overlay/CanvasOverlay.js.map +1 -0
  261. package/es/view/overlay/Grid.d.ts +30 -0
  262. package/es/view/overlay/Grid.js +118 -0
  263. package/es/view/overlay/Grid.js.map +1 -0
  264. package/es/view/overlay/ModificationOverlay.d.ts +9 -0
  265. package/es/view/overlay/ModificationOverlay.js +43 -0
  266. package/es/view/overlay/ModificationOverlay.js.map +1 -0
  267. package/es/view/overlay/OutlineOverlay.d.ts +14 -0
  268. package/es/view/overlay/OutlineOverlay.js +134 -0
  269. package/es/view/overlay/OutlineOverlay.js.map +1 -0
  270. package/es/view/overlay/SnaplineOverlay.d.ts +10 -0
  271. package/es/view/overlay/SnaplineOverlay.js +60 -0
  272. package/es/view/overlay/SnaplineOverlay.js.map +1 -0
  273. package/es/view/overlay/ToolOverlay.d.ts +19 -0
  274. package/es/view/overlay/ToolOverlay.js +76 -0
  275. package/es/view/overlay/ToolOverlay.js.map +1 -0
  276. package/{types → es}/view/overlay/getTransformHoc.d.ts +17 -14
  277. package/es/view/overlay/getTransformHoc.js +57 -0
  278. package/es/view/overlay/getTransformHoc.js.map +1 -0
  279. package/es/view/overlay/index.d.ts +8 -0
  280. package/es/view/overlay/index.js +9 -0
  281. package/es/view/overlay/index.js.map +1 -0
  282. package/es/view/shape/Circle.d.ts +2 -0
  283. package/es/view/shape/Circle.js +57 -0
  284. package/es/view/shape/Circle.js.map +1 -0
  285. package/es/view/shape/Ellipse.d.ts +2 -0
  286. package/es/view/shape/Ellipse.js +58 -0
  287. package/es/view/shape/Ellipse.js.map +1 -0
  288. package/es/view/shape/Line.d.ts +2 -0
  289. package/es/view/shape/Line.js +54 -0
  290. package/es/view/shape/Line.js.map +1 -0
  291. package/es/view/shape/Path.d.ts +6 -0
  292. package/es/view/shape/Path.js +43 -0
  293. package/es/view/shape/Path.js.map +1 -0
  294. package/es/view/shape/Polygon.d.ts +8 -0
  295. package/es/view/shape/Polygon.js +56 -0
  296. package/es/view/shape/Polygon.js.map +1 -0
  297. package/es/view/shape/Polyline.d.ts +2 -0
  298. package/es/view/shape/Polyline.js +49 -0
  299. package/es/view/shape/Polyline.js.map +1 -0
  300. package/es/view/shape/Rect.d.ts +15 -0
  301. package/es/view/shape/Rect.js +60 -0
  302. package/es/view/shape/Rect.js.map +1 -0
  303. package/es/view/shape/Text.d.ts +2 -0
  304. package/es/view/shape/Text.js +110 -0
  305. package/es/view/shape/Text.js.map +1 -0
  306. package/es/view/shape/index.d.ts +8 -0
  307. package/es/view/shape/index.js +9 -0
  308. package/es/view/shape/index.js.map +1 -0
  309. package/es/view/text/BaseText.d.ts +25 -0
  310. package/es/view/text/BaseText.js +114 -0
  311. package/es/view/text/BaseText.js.map +1 -0
  312. package/es/view/text/LineText.d.ts +9 -0
  313. package/es/view/text/LineText.js +149 -0
  314. package/es/view/text/LineText.js.map +1 -0
  315. package/es/view/text/index.d.ts +2 -0
  316. package/es/view/text/index.js +3 -0
  317. package/es/view/text/index.js.map +1 -0
  318. package/lib/LogicFlow.d.ts +966 -0
  319. package/lib/LogicFlow.js +1203 -0
  320. package/lib/LogicFlow.js.map +1 -0
  321. package/lib/algorithm/edge.d.ts +15 -0
  322. package/lib/algorithm/edge.js +62 -0
  323. package/lib/algorithm/edge.js.map +1 -0
  324. package/lib/algorithm/index.d.ts +6 -0
  325. package/lib/algorithm/index.js +75 -0
  326. package/lib/algorithm/index.js.map +1 -0
  327. package/lib/algorithm/outline.d.ts +7 -0
  328. package/lib/algorithm/outline.js +69 -0
  329. package/lib/algorithm/outline.js.map +1 -0
  330. package/lib/constant/index.d.ts +102 -0
  331. package/lib/constant/index.js +120 -0
  332. package/lib/constant/index.js.map +1 -0
  333. package/lib/event/eventArgs.d.ts +428 -0
  334. package/lib/event/eventArgs.js +3 -0
  335. package/lib/event/eventArgs.js.map +1 -0
  336. package/lib/event/eventEmitter.d.ts +48 -0
  337. package/lib/event/eventEmitter.js +95 -0
  338. package/lib/event/eventEmitter.js.map +1 -0
  339. package/lib/history/index.d.ts +23 -0
  340. package/lib/history/index.js +114 -0
  341. package/lib/history/index.js.map +1 -0
  342. package/lib/index.css +210 -0
  343. package/lib/index.d.ts +12 -0
  344. package/lib/index.js +58 -0
  345. package/lib/index.js.map +1 -0
  346. package/lib/index.less +1 -0
  347. package/lib/keyboard/index.d.ts +31 -0
  348. package/lib/keyboard/index.js +93 -0
  349. package/lib/keyboard/index.js.map +1 -0
  350. package/lib/keyboard/shortcut.d.ts +3 -0
  351. package/lib/keyboard/shortcut.js +120 -0
  352. package/lib/keyboard/shortcut.js.map +1 -0
  353. package/lib/model/BaseModel.d.ts +181 -0
  354. package/lib/model/BaseModel.js +3 -0
  355. package/lib/model/BaseModel.js.map +1 -0
  356. package/lib/model/EditConfigModel.d.ts +114 -0
  357. package/lib/model/EditConfigModel.js +195 -0
  358. package/lib/model/EditConfigModel.js.map +1 -0
  359. package/lib/model/GraphModel.d.ts +426 -0
  360. package/lib/model/GraphModel.js +1479 -0
  361. package/lib/model/GraphModel.js.map +1 -0
  362. package/lib/model/SnaplineModel.d.ts +34 -0
  363. package/lib/model/SnaplineModel.js +220 -0
  364. package/lib/model/SnaplineModel.js.map +1 -0
  365. package/lib/model/TransformModel.d.ts +101 -0
  366. package/lib/model/TransformModel.js +243 -0
  367. package/lib/model/TransformModel.js.map +1 -0
  368. package/lib/model/edge/BaseEdgeModel.d.ts +270 -0
  369. package/lib/model/edge/BaseEdgeModel.js +742 -0
  370. package/lib/model/edge/BaseEdgeModel.js.map +1 -0
  371. package/lib/model/edge/BezierEdgeModel.d.ts +63 -0
  372. package/lib/model/edge/BezierEdgeModel.js +250 -0
  373. package/lib/model/edge/BezierEdgeModel.js.map +1 -0
  374. package/lib/model/edge/LineEdgeModel.d.ts +19 -0
  375. package/lib/model/edge/LineEdgeModel.js +83 -0
  376. package/lib/model/edge/LineEdgeModel.js.map +1 -0
  377. package/lib/model/edge/PolylineEdgeModel.d.ts +85 -0
  378. package/lib/model/edge/PolylineEdgeModel.js +596 -0
  379. package/lib/model/edge/PolylineEdgeModel.js.map +1 -0
  380. package/lib/model/edge/index.d.ts +4 -0
  381. package/lib/model/edge/index.js +21 -0
  382. package/lib/model/edge/index.js.map +1 -0
  383. package/lib/model/index.d.ts +7 -0
  384. package/lib/model/index.js +24 -0
  385. package/lib/model/index.js.map +1 -0
  386. package/lib/model/node/BaseNodeModel.d.ts +260 -0
  387. package/lib/model/node/BaseNodeModel.js +886 -0
  388. package/lib/model/node/BaseNodeModel.js.map +1 -0
  389. package/lib/model/node/CircleNodeModel.d.ts +40 -0
  390. package/lib/model/node/CircleNodeModel.js +116 -0
  391. package/lib/model/node/CircleNodeModel.js.map +1 -0
  392. package/lib/model/node/DiamondNodeModel.d.ts +46 -0
  393. package/lib/model/node/DiamondNodeModel.js +193 -0
  394. package/lib/model/node/DiamondNodeModel.js.map +1 -0
  395. package/lib/model/node/EllipseNodeModel.d.ts +42 -0
  396. package/lib/model/node/EllipseNodeModel.js +124 -0
  397. package/lib/model/node/EllipseNodeModel.js.map +1 -0
  398. package/lib/model/node/HtmlNodeModel.d.ts +21 -0
  399. package/lib/model/node/HtmlNodeModel.js +65 -0
  400. package/lib/model/node/HtmlNodeModel.js.map +1 -0
  401. package/lib/model/node/PolygonNodeModel.d.ts +50 -0
  402. package/lib/model/node/PolygonNodeModel.js +202 -0
  403. package/lib/model/node/PolygonNodeModel.js.map +1 -0
  404. package/lib/model/node/RectNodeModel.d.ts +34 -0
  405. package/lib/model/node/RectNodeModel.js +86 -0
  406. package/lib/model/node/RectNodeModel.js.map +1 -0
  407. package/lib/model/node/TextNodeModel.d.ts +27 -0
  408. package/lib/model/node/TextNodeModel.js +119 -0
  409. package/lib/model/node/TextNodeModel.js.map +1 -0
  410. package/lib/model/node/index.d.ts +8 -0
  411. package/lib/model/node/index.js +25 -0
  412. package/lib/model/node/index.js.map +1 -0
  413. package/lib/options.d.ts +86 -0
  414. package/lib/options.js +77 -0
  415. package/lib/options.js.map +1 -0
  416. package/lib/style/index.css +210 -0
  417. package/lib/style/index.less +256 -0
  418. package/lib/style/raw.d.ts +4 -0
  419. package/lib/style/raw.js +9 -0
  420. package/lib/style/raw.js.map +1 -0
  421. package/lib/tool/MultipleSelectTool.d.ts +13 -0
  422. package/lib/tool/MultipleSelectTool.js +161 -0
  423. package/lib/tool/MultipleSelectTool.js.map +1 -0
  424. package/lib/tool/TextEditTool.d.ts +26 -0
  425. package/lib/tool/TextEditTool.js +190 -0
  426. package/lib/tool/TextEditTool.js.map +1 -0
  427. package/lib/tool/index.d.ts +2 -0
  428. package/lib/tool/index.js +19 -0
  429. package/lib/tool/index.js.map +1 -0
  430. package/lib/tool/snapline.d.ts +3 -0
  431. package/lib/tool/snapline.js +17 -0
  432. package/lib/tool/snapline.js.map +1 -0
  433. package/lib/tool/tool.d.ts +22 -0
  434. package/lib/tool/tool.js +49 -0
  435. package/lib/tool/tool.js.map +1 -0
  436. package/lib/util/animation.d.ts +12 -0
  437. package/lib/util/animation.js +24 -0
  438. package/lib/util/animation.js.map +1 -0
  439. package/lib/util/browser.d.ts +1 -0
  440. package/lib/util/browser.js +6 -0
  441. package/lib/util/browser.js.map +1 -0
  442. package/lib/util/compatible.d.ts +6 -0
  443. package/lib/util/compatible.js +21 -0
  444. package/lib/util/compatible.js.map +1 -0
  445. package/lib/util/drag.d.ts +47 -0
  446. package/lib/util/drag.js +142 -0
  447. package/lib/util/drag.js.map +1 -0
  448. package/lib/util/edge.d.ts +94 -0
  449. package/lib/util/edge.js +879 -0
  450. package/lib/util/edge.js.map +1 -0
  451. package/lib/util/geometry.d.ts +11 -0
  452. package/lib/util/geometry.js +78 -0
  453. package/lib/util/geometry.js.map +1 -0
  454. package/lib/util/graph.d.ts +13 -0
  455. package/lib/util/graph.js +59 -0
  456. package/lib/util/graph.js.map +1 -0
  457. package/lib/util/index.d.ts +16 -0
  458. package/lib/util/index.js +33 -0
  459. package/lib/util/index.js.map +1 -0
  460. package/lib/util/matrix.d.ts +32 -0
  461. package/lib/util/matrix.js +164 -0
  462. package/lib/util/matrix.js.map +1 -0
  463. package/lib/util/mobx.d.ts +2 -0
  464. package/lib/util/mobx.js +13 -0
  465. package/lib/util/mobx.js.map +1 -0
  466. package/lib/util/node.d.ts +69 -0
  467. package/lib/util/node.js +424 -0
  468. package/lib/util/node.js.map +1 -0
  469. package/lib/util/raf.d.ts +2 -0
  470. package/lib/util/raf.js +29 -0
  471. package/lib/util/raf.js.map +1 -0
  472. package/lib/util/sampling.d.ts +6 -0
  473. package/lib/util/sampling.js +72 -0
  474. package/lib/util/sampling.js.map +1 -0
  475. package/lib/util/theme.d.ts +4 -0
  476. package/lib/util/theme.js +160 -0
  477. package/lib/util/theme.js.map +1 -0
  478. package/lib/util/uuid.d.ts +7 -0
  479. package/lib/util/uuid.js +25 -0
  480. package/lib/util/uuid.js.map +1 -0
  481. package/lib/util/vector.d.ts +23 -0
  482. package/lib/util/vector.js +101 -0
  483. package/lib/util/vector.js.map +1 -0
  484. package/lib/util/zIndex.d.ts +2 -0
  485. package/lib/util/zIndex.js +10 -0
  486. package/lib/util/zIndex.js.map +1 -0
  487. package/lib/view/Anchor.d.ts +47 -0
  488. package/lib/view/Anchor.js +317 -0
  489. package/lib/view/Anchor.js.map +1 -0
  490. package/lib/view/Control.d.ts +100 -0
  491. package/lib/view/Control.js +327 -0
  492. package/lib/view/Control.js.map +1 -0
  493. package/lib/view/Graph.d.ts +18 -0
  494. package/lib/view/Graph.js +79 -0
  495. package/lib/view/Graph.js.map +1 -0
  496. package/lib/view/Rotate.d.ts +21 -0
  497. package/lib/view/Rotate.js +113 -0
  498. package/lib/view/Rotate.js.map +1 -0
  499. package/lib/view/behavior/dnd.d.ts +27 -0
  500. package/lib/view/behavior/dnd.js +113 -0
  501. package/lib/view/behavior/dnd.js.map +1 -0
  502. package/lib/view/edge/AdjustPoint.d.ts +50 -0
  503. package/lib/view/edge/AdjustPoint.js +371 -0
  504. package/lib/view/edge/AdjustPoint.js.map +1 -0
  505. package/lib/view/edge/Arrow.d.ts +25 -0
  506. package/lib/view/edge/Arrow.js +63 -0
  507. package/lib/view/edge/Arrow.js.map +1 -0
  508. package/lib/view/edge/BaseEdge.d.ts +148 -0
  509. package/lib/view/edge/BaseEdge.js +407 -0
  510. package/lib/view/edge/BaseEdge.js.map +1 -0
  511. package/lib/view/edge/BezierEdge.d.ts +26 -0
  512. package/lib/view/edge/BezierEdge.js +124 -0
  513. package/lib/view/edge/BezierEdge.js.map +1 -0
  514. package/{types/view/edge/BezierEdge.d.ts → lib/view/edge/LineEdge.d.ts} +9 -10
  515. package/lib/view/edge/LineEdge.js +84 -0
  516. package/lib/view/edge/LineEdge.js.map +1 -0
  517. package/lib/view/edge/PolylineEdge.d.ts +55 -0
  518. package/lib/view/edge/PolylineEdge.js +280 -0
  519. package/lib/view/edge/PolylineEdge.js.map +1 -0
  520. package/lib/view/edge/index.d.ts +6 -0
  521. package/lib/view/edge/index.js +23 -0
  522. package/lib/view/edge/index.js.map +1 -0
  523. package/lib/view/index.d.ts +7 -0
  524. package/lib/view/index.js +24 -0
  525. package/lib/view/index.js.map +1 -0
  526. package/lib/view/node/BaseNode.d.ts +49 -0
  527. package/lib/view/node/BaseNode.js +424 -0
  528. package/lib/view/node/BaseNode.js.map +1 -0
  529. package/lib/view/node/CircleNode.d.ts +10 -0
  530. package/lib/view/node/CircleNode.js +51 -0
  531. package/lib/view/node/CircleNode.js.map +1 -0
  532. package/lib/view/node/DiamondNode.d.ts +10 -0
  533. package/lib/view/node/DiamondNode.js +50 -0
  534. package/lib/view/node/DiamondNode.js.map +1 -0
  535. package/lib/view/node/EllipseNode.d.ts +10 -0
  536. package/lib/view/node/EllipseNode.js +50 -0
  537. package/lib/view/node/EllipseNode.js.map +1 -0
  538. package/lib/view/node/HtmlNode.d.ts +38 -0
  539. package/lib/view/node/HtmlNode.js +135 -0
  540. package/lib/view/node/HtmlNode.js.map +1 -0
  541. package/lib/view/node/PolygonNode.d.ts +10 -0
  542. package/lib/view/node/PolygonNode.js +54 -0
  543. package/lib/view/node/PolygonNode.js.map +1 -0
  544. package/lib/view/node/RectNode.d.ts +11 -0
  545. package/lib/view/node/RectNode.js +50 -0
  546. package/lib/view/node/RectNode.js.map +1 -0
  547. package/lib/view/node/TextNode.d.ts +12 -0
  548. package/lib/view/node/TextNode.js +61 -0
  549. package/lib/view/node/TextNode.js.map +1 -0
  550. package/lib/view/node/index.d.ts +8 -0
  551. package/lib/view/node/index.js +25 -0
  552. package/lib/view/node/index.js.map +1 -0
  553. package/lib/view/overlay/BackgroundOverlay.d.ts +28 -0
  554. package/lib/view/overlay/BackgroundOverlay.js +34 -0
  555. package/lib/view/overlay/BackgroundOverlay.js.map +1 -0
  556. package/lib/view/overlay/BezierAdjustOverlay.d.ts +31 -0
  557. package/lib/view/overlay/BezierAdjustOverlay.js +145 -0
  558. package/lib/view/overlay/BezierAdjustOverlay.js.map +1 -0
  559. package/lib/view/overlay/CanvasOverlay.d.ts +25 -0
  560. package/lib/view/overlay/CanvasOverlay.js +175 -0
  561. package/lib/view/overlay/CanvasOverlay.js.map +1 -0
  562. package/lib/view/overlay/Grid.d.ts +30 -0
  563. package/lib/view/overlay/Grid.js +121 -0
  564. package/lib/view/overlay/Grid.js.map +1 -0
  565. package/lib/view/overlay/ModificationOverlay.d.ts +9 -0
  566. package/lib/view/overlay/ModificationOverlay.js +46 -0
  567. package/lib/view/overlay/ModificationOverlay.js.map +1 -0
  568. package/lib/view/overlay/OutlineOverlay.d.ts +14 -0
  569. package/lib/view/overlay/OutlineOverlay.js +137 -0
  570. package/lib/view/overlay/OutlineOverlay.js.map +1 -0
  571. package/lib/view/overlay/SnaplineOverlay.d.ts +10 -0
  572. package/lib/view/overlay/SnaplineOverlay.js +66 -0
  573. package/lib/view/overlay/SnaplineOverlay.js.map +1 -0
  574. package/lib/view/overlay/ToolOverlay.d.ts +19 -0
  575. package/lib/view/overlay/ToolOverlay.js +79 -0
  576. package/lib/view/overlay/ToolOverlay.js.map +1 -0
  577. package/lib/view/overlay/getTransformHoc.d.ts +37 -0
  578. package/lib/view/overlay/getTransformHoc.js +61 -0
  579. package/lib/view/overlay/getTransformHoc.js.map +1 -0
  580. package/lib/view/overlay/index.d.ts +8 -0
  581. package/lib/view/overlay/index.js +25 -0
  582. package/lib/view/overlay/index.js.map +1 -0
  583. package/lib/view/shape/Circle.d.ts +2 -0
  584. package/lib/view/shape/Circle.js +61 -0
  585. package/lib/view/shape/Circle.js.map +1 -0
  586. package/lib/view/shape/Ellipse.d.ts +2 -0
  587. package/lib/view/shape/Ellipse.js +62 -0
  588. package/lib/view/shape/Ellipse.js.map +1 -0
  589. package/lib/view/shape/Line.d.ts +2 -0
  590. package/lib/view/shape/Line.js +58 -0
  591. package/lib/view/shape/Line.js.map +1 -0
  592. package/lib/view/shape/Path.d.ts +6 -0
  593. package/lib/view/shape/Path.js +47 -0
  594. package/lib/view/shape/Path.js.map +1 -0
  595. package/lib/view/shape/Polygon.d.ts +8 -0
  596. package/lib/view/shape/Polygon.js +60 -0
  597. package/lib/view/shape/Polygon.js.map +1 -0
  598. package/lib/view/shape/Polyline.d.ts +2 -0
  599. package/lib/view/shape/Polyline.js +53 -0
  600. package/lib/view/shape/Polyline.js.map +1 -0
  601. package/lib/view/shape/Rect.d.ts +15 -0
  602. package/lib/view/shape/Rect.js +64 -0
  603. package/lib/view/shape/Rect.js.map +1 -0
  604. package/lib/view/shape/Text.d.ts +2 -0
  605. package/lib/view/shape/Text.js +114 -0
  606. package/lib/view/shape/Text.js.map +1 -0
  607. package/lib/view/shape/index.d.ts +8 -0
  608. package/lib/view/shape/index.js +25 -0
  609. package/lib/view/shape/index.js.map +1 -0
  610. package/lib/view/text/BaseText.d.ts +25 -0
  611. package/lib/view/text/BaseText.js +117 -0
  612. package/lib/view/text/BaseText.js.map +1 -0
  613. package/lib/view/text/LineText.d.ts +9 -0
  614. package/lib/view/text/LineText.js +155 -0
  615. package/lib/view/text/LineText.js.map +1 -0
  616. package/lib/view/text/index.d.ts +2 -0
  617. package/lib/view/text/index.js +19 -0
  618. package/lib/view/text/index.js.map +1 -0
  619. package/package.json +41 -88
  620. package/rollup.config.js +15 -0
  621. package/src/LogicFlow.tsx +1831 -0
  622. package/src/algorithm/edge.ts +68 -0
  623. package/src/algorithm/index.ts +68 -0
  624. package/src/algorithm/outline.ts +77 -0
  625. package/src/constant/index.ts +127 -0
  626. package/src/event/event.md +66 -0
  627. package/src/event/eventArgs.ts +476 -0
  628. package/src/event/eventEmitter.ts +153 -0
  629. package/src/history/index.ts +112 -0
  630. package/src/index.less +1 -0
  631. package/src/index.ts +21 -0
  632. package/src/keyboard/index.ts +106 -0
  633. package/src/keyboard/shortcut.ts +123 -0
  634. package/src/model/BaseModel.ts +223 -0
  635. package/src/model/EditConfigModel.ts +215 -0
  636. package/src/model/GraphModel.ts +1516 -0
  637. package/src/model/SnaplineModel.ts +238 -0
  638. package/src/model/TransformModel.ts +258 -0
  639. package/src/model/edge/BaseEdgeModel.ts +688 -0
  640. package/src/model/edge/BezierEdgeModel.ts +196 -0
  641. package/src/model/edge/LineEdgeModel.ts +26 -0
  642. package/src/model/edge/PolylineEdgeModel.ts +656 -0
  643. package/src/model/edge/index.ts +4 -0
  644. package/src/model/index.ts +8 -0
  645. package/src/model/node/BaseNodeModel.ts +839 -0
  646. package/src/model/node/CircleNodeModel.ts +89 -0
  647. package/src/model/node/DiamondNodeModel.ts +128 -0
  648. package/src/model/node/EllipseNodeModel.ts +94 -0
  649. package/src/model/node/HtmlNodeModel.ts +49 -0
  650. package/src/model/node/PolygonNodeModel.ts +147 -0
  651. package/src/model/node/RectNodeModel.ts +57 -0
  652. package/src/model/node/TextNodeModel.ts +41 -0
  653. package/src/model/node/index.ts +8 -0
  654. package/src/options.ts +173 -0
  655. package/src/style/index.less +256 -0
  656. package/src/style/raw.ts +217 -0
  657. package/src/tool/MultipleSelectTool.tsx +132 -0
  658. package/src/tool/TextEditTool.tsx +193 -0
  659. package/src/tool/index.ts +2 -0
  660. package/src/tool/snapline.ts +17 -0
  661. package/src/tool/tool.ts +66 -0
  662. package/src/typings.d.ts +5 -0
  663. package/src/util/animation.ts +29 -0
  664. package/src/util/browser.ts +4 -0
  665. package/src/util/compatible.ts +15 -0
  666. package/src/util/drag.ts +186 -0
  667. package/src/util/edge.ts +1034 -0
  668. package/src/util/geometry.ts +53 -0
  669. package/src/util/graph.ts +46 -0
  670. package/src/util/index.ts +16 -0
  671. package/src/util/matrix.ts +129 -0
  672. package/src/util/mobx.ts +23 -0
  673. package/src/util/node.ts +519 -0
  674. package/src/util/raf.ts +28 -0
  675. package/src/util/sampling.ts +85 -0
  676. package/src/util/theme.ts +180 -0
  677. package/src/util/uuid.ts +26 -0
  678. package/src/util/vector.ts +93 -0
  679. package/src/util/zIndex.ts +6 -0
  680. package/src/view/Anchor.tsx +407 -0
  681. package/src/view/Control.tsx +446 -0
  682. package/src/view/Graph.tsx +104 -0
  683. package/src/view/Rotate.tsx +112 -0
  684. package/src/view/behavior/dnd.ts +116 -0
  685. package/src/view/edge/AdjustPoint.tsx +439 -0
  686. package/src/view/edge/Arrow.tsx +54 -0
  687. package/src/view/edge/BaseEdge.tsx +489 -0
  688. package/src/view/edge/BezierEdge.tsx +101 -0
  689. package/src/view/edge/LineEdge.tsx +81 -0
  690. package/src/view/edge/PolylineEdge.tsx +299 -0
  691. package/src/view/edge/index.ts +6 -0
  692. package/src/view/index.ts +8 -0
  693. package/src/view/node/BaseNode.tsx +494 -0
  694. package/src/view/node/CircleNode.tsx +19 -0
  695. package/src/view/node/DiamondNode.tsx +22 -0
  696. package/src/view/node/EllipseNode.tsx +20 -0
  697. package/src/view/node/HtmlNode.tsx +92 -0
  698. package/src/view/node/PolygonNode.tsx +26 -0
  699. package/src/view/node/RectNode.tsx +28 -0
  700. package/src/view/node/TextNode.tsx +37 -0
  701. package/src/view/node/index.ts +8 -0
  702. package/src/view/overlay/BackgroundOverlay.tsx +39 -0
  703. package/src/view/overlay/BezierAdjustOverlay.tsx +150 -0
  704. package/src/view/overlay/CanvasOverlay.tsx +180 -0
  705. package/src/view/overlay/Grid.tsx +135 -0
  706. package/src/view/overlay/ModificationOverlay.tsx +31 -0
  707. package/src/view/overlay/OutlineOverlay.tsx +170 -0
  708. package/src/view/overlay/SnaplineOverlay.tsx +44 -0
  709. package/src/view/overlay/ToolOverlay.tsx +65 -0
  710. package/src/view/overlay/getTransformHoc.tsx +50 -0
  711. package/src/view/overlay/index.ts +8 -0
  712. package/src/view/shape/Circle.tsx +27 -0
  713. package/src/view/shape/Ellipse.tsx +28 -0
  714. package/src/view/shape/Line.tsx +24 -0
  715. package/src/view/shape/Path.tsx +19 -0
  716. package/src/view/shape/Polygon.tsx +36 -0
  717. package/src/view/shape/Polyline.tsx +19 -0
  718. package/src/view/shape/Rect.tsx +44 -0
  719. package/src/view/shape/Text.tsx +138 -0
  720. package/src/view/shape/index.ts +8 -0
  721. package/src/view/text/BaseText.tsx +96 -0
  722. package/src/view/text/LineText.tsx +154 -0
  723. package/src/view/text/index.ts +2 -0
  724. package/tsconfig.json +18 -0
  725. package/dist/entry.js +0 -7
  726. package/dist/logic-flow.js +0 -23
  727. package/dist/logic-flow.min.js +0 -23
  728. package/types/LogicFlow.d.ts +0 -581
  729. package/types/algorithm/edge.d.ts +0 -6
  730. package/types/algorithm/outline.d.ts +0 -35
  731. package/types/constant/DefaultAnimation.d.ts +0 -12
  732. package/types/constant/DefaultTheme.d.ts +0 -270
  733. package/types/event/eventEmitter.d.ts +0 -36
  734. package/types/history/History.d.ts +0 -20
  735. package/types/model/BaseModel.d.ts +0 -99
  736. package/types/model/SnaplineModel.d.ts +0 -33
  737. package/types/model/edge/BezierEdgeModel.d.ts +0 -51
  738. package/types/model/edge/LineEdgeModel.d.ts +0 -14
  739. package/types/model/edge/PolylineEdgeModel.d.ts +0 -63
  740. package/types/model/node/BaseNodeModel.d.ts +0 -232
  741. package/types/model/node/CircleNodeModel.d.ts +0 -21
  742. package/types/model/node/DiamondNodeModel.d.ts +0 -25
  743. package/types/model/node/EllipseNodeModel.d.ts +0 -22
  744. package/types/model/node/HtmlNodeModel.d.ts +0 -12
  745. package/types/model/node/PolygonNodeModel.d.ts +0 -28
  746. package/types/model/node/RectNodeModel.d.ts +0 -19
  747. package/types/model/node/TextNodeModel.d.ts +0 -19
  748. package/types/options.d.ts +0 -240
  749. package/types/tool/MultipleSelectTool.d.ts +0 -20
  750. package/types/tool/TextEditTool.d.ts +0 -34
  751. package/types/tool/index.d.ts +0 -13
  752. package/types/type/index.d.ts +0 -429
  753. package/types/util/animation.d.ts +0 -2
  754. package/types/util/compatible.d.ts +0 -1
  755. package/types/util/drag.d.ts +0 -38
  756. package/types/util/edge.d.ts +0 -108
  757. package/types/util/geometry.d.ts +0 -2
  758. package/types/util/index.d.ts +0 -7
  759. package/types/util/node.d.ts +0 -66
  760. package/types/util/raf.d.ts +0 -2
  761. package/types/util/theme.d.ts +0 -2
  762. package/types/util/uuid.d.ts +0 -6
  763. package/types/view/Anchor.d.ts +0 -54
  764. package/types/view/Graph.d.ts +0 -21
  765. package/types/view/basic-shape/Circle.d.ts +0 -2
  766. package/types/view/basic-shape/Ellipse.d.ts +0 -2
  767. package/types/view/basic-shape/Line.d.ts +0 -3
  768. package/types/view/basic-shape/LinearGradient.d.ts +0 -1
  769. package/types/view/basic-shape/Path.d.ts +0 -7
  770. package/types/view/basic-shape/Polygon.d.ts +0 -2
  771. package/types/view/basic-shape/Polyline.d.ts +0 -3
  772. package/types/view/basic-shape/Rect.d.ts +0 -14
  773. package/types/view/basic-shape/Text.d.ts +0 -2
  774. package/types/view/behavior/DnD.d.ts +0 -35
  775. package/types/view/behavior/Transform.d.ts +0 -4
  776. package/types/view/edge/AdjustPoint.d.ts +0 -56
  777. package/types/view/edge/Arrow.d.ts +0 -24
  778. package/types/view/edge/index.d.ts +0 -6
  779. package/types/view/index.d.ts +0 -2
  780. package/types/view/node/BaseNode.d.ts +0 -57
  781. package/types/view/node/CircleNode.d.ts +0 -5
  782. package/types/view/node/DiamondNode.d.ts +0 -5
  783. package/types/view/node/EllipseNode.d.ts +0 -5
  784. package/types/view/node/PolygonNode.d.ts +0 -5
  785. package/types/view/node/RectNode.d.ts +0 -5
  786. package/types/view/node/TextNode.d.ts +0 -6
  787. package/types/view/node/index.d.ts +0 -9
  788. package/types/view/overlay/BezierAdjustOverlay.d.ts +0 -12
  789. package/types/view/overlay/Grid.d.ts +0 -30
  790. package/types/view/overlay/HtmlOverlay.d.ts +0 -15
  791. package/types/view/overlay/ModificationOverlay.d.ts +0 -9
  792. package/types/view/overlay/OutlineOverlay.d.ts +0 -17
  793. package/types/view/overlay/SnaplineOverlay.d.ts +0 -9
  794. package/types/view/overlay/ToolOverlay.d.ts +0 -17
  795. package/types/view/text/BaseText.d.ts +0 -29
  796. package/types/view/text/LineText.d.ts +0 -9
  797. /package/{types → es}/algorithm/index.d.ts +0 -0
  798. /package/{types → es}/keyboard/shortcut.d.ts +0 -0
  799. /package/{types → es}/model/edge/index.d.ts +0 -0
  800. /package/{types → es}/model/index.d.ts +0 -0
  801. /package/{types → es}/model/node/index.d.ts +0 -0
  802. /package/{types → es}/util/browser.d.ts +0 -0
  803. /package/{types → es}/util/mobx.d.ts +0 -0
  804. /package/{types → es}/util/zIndex.d.ts +0 -0
@@ -0,0 +1,1034 @@
1
+ import { pick } from 'lodash-es'
2
+ import { getNodeBBox, isInNode, distance, sampleCubic } from '.'
3
+ import LogicFlow from '../LogicFlow'
4
+ import { Options } from '../options'
5
+ import { SegmentDirection } from '../constant'
6
+ import { getVerticalPointOfLine } from '../algorithm'
7
+ import { getCrossPointOfLine, isInSegment } from '../algorithm/edge'
8
+ import {
9
+ Model,
10
+ BaseNodeModel,
11
+ BaseEdgeModel,
12
+ LineEdgeModel,
13
+ PolylineEdgeModel,
14
+ GraphModel,
15
+ } from '../model'
16
+
17
+ import Point = LogicFlow.Point
18
+ import Direction = LogicFlow.Direction
19
+ import LineSegment = LogicFlow.LineSegment
20
+ import NodeData = LogicFlow.NodeData
21
+ import EdgeConfig = LogicFlow.EdgeConfig
22
+ import Position = LogicFlow.Position
23
+ import BoxBounds = Model.BoxBounds
24
+
25
+ type PolyPointMap = Record<string, Point>
26
+ type PolyPointLink = Record<string, string>
27
+
28
+ /* 手动创建边时 edge -> edgeModel */
29
+ export const setupEdgeModel = (edge: EdgeConfig, graphModel: GraphModel) => {
30
+ let model: BaseEdgeModel
31
+ switch (edge.type) {
32
+ case 'line':
33
+ model = new LineEdgeModel(edge, graphModel)
34
+ break
35
+ case 'polyline':
36
+ model = new PolylineEdgeModel(edge, graphModel)
37
+ break
38
+ default:
39
+ model = new LineEdgeModel(edge, graphModel)
40
+ break
41
+ }
42
+ return model
43
+ }
44
+
45
+ /* 判断两个Bbox是否重合 */
46
+ export const isBboxOverLapping = (b1: BoxBounds, b2: BoxBounds): boolean =>
47
+ Math.abs(b1.centerX - b2.centerX) * 2 < b1.width + b2.width &&
48
+ Math.abs(b1.centerY - b2.centerY) * 2 < b1.height + b2.height
49
+
50
+ /* 连接点去重,去掉x,y位置重复的点 */
51
+ export const filterRepeatPoints = (points: Point[]): Point[] => {
52
+ const result: Point[] = []
53
+ const pointsMap: Record<string, Point> = {}
54
+ points.forEach((p) => {
55
+ const id = `${p.x}-${p.y}`
56
+ p.id = id
57
+ pointsMap[id] = p
58
+ })
59
+ Object.keys(pointsMap).forEach((p) => {
60
+ result.push(pointsMap[p])
61
+ })
62
+ return result
63
+ }
64
+
65
+ /* 获取简单边:边之间除了起始点,只有1个中间点 */
66
+ export const getSimplePolyline = (sPoint: Point, tPoint: Point): Point[] => {
67
+ const points = [
68
+ sPoint,
69
+ {
70
+ x: sPoint.x,
71
+ y: tPoint.y,
72
+ },
73
+ tPoint,
74
+ ]
75
+ return filterRepeatPoints(points)
76
+ }
77
+
78
+ /* 扩展的bbox,保证起始点的下一个点一定在node的垂直方向,不会与线重合, offset是点与线的垂直距离 */
79
+ export const getExpandedBBox = (bbox: BoxBounds, offset: number): BoxBounds => {
80
+ if (bbox.width === 0 && bbox.height === 0) {
81
+ return bbox
82
+ }
83
+ return {
84
+ x: bbox.x,
85
+ y: bbox.y,
86
+ centerX: bbox.centerX,
87
+ centerY: bbox.centerY,
88
+ minX: bbox.minX - offset,
89
+ minY: bbox.minY - offset,
90
+ maxX: bbox.maxX + offset,
91
+ maxY: bbox.maxY + offset,
92
+ height: bbox.height + 2 * offset,
93
+ width: bbox.width + 2 * offset,
94
+ }
95
+ }
96
+
97
+ /* 判断点与中心点边的方向:是否水平,true水平,false垂直 */
98
+ export const pointDirection = (point: Point, bbox: BoxBounds): Direction => {
99
+ const dx = Math.abs(point.x - bbox.centerX)
100
+ const dy = Math.abs(point.y - bbox.centerY)
101
+ return dx / bbox.width > dy / bbox.height
102
+ ? SegmentDirection.HORIZONTAL
103
+ : SegmentDirection.VERTICAL
104
+ }
105
+
106
+ /* 获取扩展图形上的点,即起始终点相邻的点,上一个或者下一个节点 */
107
+ export const getExpandedBBoxPoint = (
108
+ expendBBox: BoxBounds,
109
+ bbox: BoxBounds,
110
+ point: Point,
111
+ ): Point => {
112
+ // https://github.com/didi/LogicFlow/issues/817
113
+ // 没有修复前传入的参数bbox实际是expendBBox
114
+ // 由于pointDirection使用的是dx / bbox.width > dy / bbox.height判定方向
115
+ // 此时的bbox.width是增加了offset后的宽度,bbox.height同理
116
+ // 这导致了部分极端情况(宽度很大或者高度很小),计算出来的方向错误
117
+ const direction = pointDirection(point, bbox)
118
+ if (direction === SegmentDirection.HORIZONTAL) {
119
+ return {
120
+ x: point.x > expendBBox.centerX ? expendBBox.maxX : expendBBox.minX,
121
+ y: point.y,
122
+ }
123
+ }
124
+ return {
125
+ x: point.x,
126
+ y: point.y > expendBBox.centerY ? expendBBox.maxY : expendBBox.minY,
127
+ }
128
+ }
129
+
130
+ /* 获取包含2个图形的外层box */
131
+ export const mergeBBox = (b1: BoxBounds, b2: BoxBounds): BoxBounds => {
132
+ const minX = Math.min(b1.minX, b2.minX)
133
+ const minY = Math.min(b1.minY, b2.minY)
134
+ const maxX = Math.max(b1.maxX, b2.maxX)
135
+ const maxY = Math.max(b1.maxY, b2.maxY)
136
+
137
+ return {
138
+ x: (minX + maxX) / 2,
139
+ y: (minY + maxY) / 2,
140
+ centerX: (minX + maxX) / 2,
141
+ centerY: (minY + maxY) / 2,
142
+ minX,
143
+ minY,
144
+ maxX,
145
+ maxY,
146
+ height: maxY - minY,
147
+ width: maxX - minX,
148
+ }
149
+ }
150
+
151
+ /* 获取多个点的外层bbox
152
+ * 这个函数的用处
153
+ * 1、获取起始终点相邻点(expendBboxPoint)的bbox
154
+ * 2、polylineEdge, bezierEdge,获取outline边框,这种情况传入offset
155
+ */
156
+ export const getBBoxOfPoints = (
157
+ points: Point[] = [],
158
+ offset?: number,
159
+ ): BoxBounds => {
160
+ const xList: number[] = []
161
+ const yList: number[] = []
162
+ points.forEach((p) => {
163
+ xList.push(p.x)
164
+ yList.push(p.y)
165
+ })
166
+ const minX = Math.min(...xList)
167
+ const maxX = Math.max(...xList)
168
+ const minY = Math.min(...yList)
169
+ const maxY = Math.max(...yList)
170
+ let width = maxX - minX
171
+ let height = maxY - minY
172
+ if (offset) {
173
+ width += offset
174
+ height += offset
175
+ }
176
+ return {
177
+ centerX: (minX + maxX) / 2,
178
+ centerY: (minY + maxY) / 2,
179
+ maxX,
180
+ maxY,
181
+ minX,
182
+ minY,
183
+ x: (minX + maxX) / 2,
184
+ y: (minY + maxY) / 2,
185
+ height,
186
+ width,
187
+ }
188
+ }
189
+ /* 获取box四个角上的点 */
190
+ export const getPointsFromBBox = (
191
+ bbox: BoxBounds,
192
+ ): [Point, Point, Point, Point] => {
193
+ const { minX, minY, maxX, maxY } = bbox
194
+ return [
195
+ {
196
+ x: minX,
197
+ y: minY,
198
+ },
199
+ {
200
+ x: maxX,
201
+ y: minY,
202
+ },
203
+ {
204
+ x: maxX,
205
+ y: maxY,
206
+ },
207
+ {
208
+ x: minX,
209
+ y: maxY,
210
+ },
211
+ ]
212
+ }
213
+ /* 判断某一点是否在box中 */
214
+ export const isPointOutsideBBox = (point: Point, bbox: BoxBounds): boolean => {
215
+ const { x, y } = point
216
+ return x < bbox.minX || x > bbox.maxX || y < bbox.minY || y > bbox.maxY
217
+ }
218
+
219
+ /* 获取点的x方向上与box的交点 */
220
+ export const getBBoxXCrossPoints = (
221
+ bbox: BoxBounds,
222
+ x: number,
223
+ ): [Point, Point] | [] => {
224
+ if (x < bbox.minX || x > bbox.maxX) {
225
+ return []
226
+ }
227
+ return [
228
+ {
229
+ x,
230
+ y: bbox.minY,
231
+ },
232
+ {
233
+ x,
234
+ y: bbox.maxY,
235
+ },
236
+ ]
237
+ }
238
+
239
+ /* 获取点的y方向上与box的交点 */
240
+ export const getBBoxYCrossPoints = (
241
+ bbox: BoxBounds,
242
+ y: number,
243
+ ): [Point, Point] | [] => {
244
+ if (y < bbox.minY || y > bbox.maxY) {
245
+ return []
246
+ }
247
+ return [
248
+ {
249
+ x: bbox.minX,
250
+ y,
251
+ },
252
+ {
253
+ x: bbox.maxX,
254
+ y,
255
+ },
256
+ ]
257
+ }
258
+
259
+ /* 获取点的x,y方向上与box的交点 */
260
+ export const getBBoxCrossPointsByPoint = (
261
+ bbox: BoxBounds,
262
+ point: Point,
263
+ ): [Point, Point, Point, Point] | [Point, Point] | [] => [
264
+ ...getBBoxXCrossPoints(bbox, point.x),
265
+ ...getBBoxYCrossPoints(bbox, point.y),
266
+ ]
267
+
268
+ /* 计算两点之间的预测距离(非直线距离) */
269
+ export const estimateDistance = (p1: Point, p2: Point): number =>
270
+ Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y)
271
+
272
+ /* 减少点别重复计算进距离的误差 */
273
+ export const costByPoints = (p: Point, points: Point[]): number => {
274
+ const offset = -2
275
+ let result = 0
276
+ points.forEach((point) => {
277
+ if (point) {
278
+ if (p.x === point.x) {
279
+ result += offset
280
+ }
281
+ if (p.y === point.y) {
282
+ result += offset
283
+ }
284
+ }
285
+ })
286
+ return result
287
+ }
288
+
289
+ /* 预估距离 */
290
+ export const heuristicCostEstimate = (
291
+ p: Point,
292
+ ps: Point,
293
+ pt: Point,
294
+ source?: Point,
295
+ target?: Point,
296
+ ): number =>
297
+ estimateDistance(p, ps) +
298
+ estimateDistance(p, pt) +
299
+ costByPoints(p, [ps, pt, source!, target!])
300
+
301
+ /* 重建路径,根据cameFrom属性计算出从起始到结束的路径 */
302
+ export const rebuildPath = (
303
+ pathPoints: Point[],
304
+ pointById: PolyPointMap,
305
+ cameFrom: PolyPointLink,
306
+ currentId: string,
307
+ iterator?: number,
308
+ ): void => {
309
+ if (!iterator) {
310
+ iterator = 0
311
+ }
312
+ pathPoints.unshift(pointById[currentId])
313
+ if (
314
+ cameFrom[currentId] &&
315
+ cameFrom[currentId] !== currentId &&
316
+ iterator <= 100
317
+ ) {
318
+ rebuildPath(
319
+ pathPoints,
320
+ pointById,
321
+ cameFrom,
322
+ cameFrom[currentId],
323
+ iterator + 1,
324
+ )
325
+ }
326
+ }
327
+
328
+ /* 把计算完毕的点从开放列表中删除 */
329
+ export const removeClosePointFromOpenList = (
330
+ arr: Point[],
331
+ item: Point,
332
+ ): void => {
333
+ const index = arr.indexOf(item)
334
+ if (index > -1) {
335
+ arr.splice(index, 1)
336
+ }
337
+ }
338
+
339
+ /* 通过向量判断线段之间是否是相交的 */
340
+ export const isSegmentsIntersected = (
341
+ p0: Point,
342
+ p1: Point,
343
+ p2: Point,
344
+ p3: Point,
345
+ ): boolean => {
346
+ const s1x = p1.x - p0.x
347
+ const s1y = p1.y - p0.y
348
+ const s2x = p3.x - p2.x
349
+ const s2y = p3.y - p2.y
350
+
351
+ const s =
352
+ (-s1y * (p0.x - p2.x) + s1x * (p0.y - p2.y)) / (-s2x * s1y + s1x * s2y)
353
+ const t =
354
+ (s2x * (p0.y - p2.y) - s2y * (p0.x - p2.x)) / (-s2x * s1y + s1x * s2y)
355
+
356
+ return s >= 0 && s <= 1 && t >= 0 && t <= 1
357
+ }
358
+
359
+ /* 判断线段与bbox是否是相交的,保证节点之间的边不会穿过节点自身 */
360
+ export const isSegmentCrossingBBox = (
361
+ p1: Point,
362
+ p2: Point,
363
+ bbox: BoxBounds,
364
+ ): boolean => {
365
+ if (bbox.width === 0 && bbox.height === 0) {
366
+ return false
367
+ }
368
+ const [pa, pb, pc, pd] = getPointsFromBBox(bbox)
369
+ return (
370
+ isSegmentsIntersected(p1, p2, pa, pb) ||
371
+ isSegmentsIntersected(p1, p2, pa, pd) ||
372
+ isSegmentsIntersected(p1, p2, pb, pc) ||
373
+ isSegmentsIntersected(p1, p2, pc, pd)
374
+ )
375
+ }
376
+
377
+ /* 获取下一个相邻的点 */
378
+ export const getNextNeighborPoints = (
379
+ points: Point[],
380
+ point: Point,
381
+ bbox1: BoxBounds,
382
+ bbox2: BoxBounds,
383
+ ): Point[] => {
384
+ const neighbors: Point[] = []
385
+ points.forEach((p) => {
386
+ if (p !== point) {
387
+ if (p.x === point.x || p.y === point.y) {
388
+ if (
389
+ !isSegmentCrossingBBox(p, point, bbox1) &&
390
+ !isSegmentCrossingBBox(p, point, bbox2)
391
+ ) {
392
+ neighbors.push(p)
393
+ }
394
+ }
395
+ }
396
+ })
397
+ return filterRepeatPoints(neighbors)
398
+ }
399
+
400
+ /* 路径查找,Astart查找+曼哈顿距离
401
+ * 算法wiki:https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95
402
+ * 方法无法复用,且调用了很多polyline相关的方法,暂不抽离到src/algorithm中
403
+ */
404
+ export const pathFinder = (
405
+ points: Point[],
406
+ start: Point,
407
+ goal: Point,
408
+ sBBox: BoxBounds,
409
+ tBBox: BoxBounds,
410
+ os: Point,
411
+ ot: Point,
412
+ ): Point[] => {
413
+ // 定义已经遍历过的点
414
+ const closedSet: Point[] = []
415
+ // 定义需要遍历的店
416
+ const openSet = [start]
417
+ // 定义节点的上一个节点
418
+ const cameFrom: PolyPointLink = {}
419
+
420
+ const gScore: {
421
+ [key: string]: number
422
+ } = {}
423
+
424
+ const fScore: {
425
+ [key: string]: number
426
+ } = {}
427
+
428
+ if (start.id) {
429
+ gScore[start.id] = 0
430
+ fScore[start.id] = heuristicCostEstimate(start, goal, start)
431
+ }
432
+
433
+ const pointById: PolyPointMap = {}
434
+
435
+ points.forEach((p) => {
436
+ if (p.id) {
437
+ pointById[p.id] = p
438
+ }
439
+ })
440
+
441
+ while (openSet.length) {
442
+ let current: Point | undefined
443
+ let lowestFScore = Infinity
444
+ openSet.forEach((p: Point) => {
445
+ if (p.id && fScore[p.id] < lowestFScore) {
446
+ lowestFScore = fScore[p.id]
447
+ current = p
448
+ }
449
+ })
450
+
451
+ if (current === goal && goal.id) {
452
+ const pathPoints: Point[] = []
453
+ rebuildPath(pathPoints, pointById, cameFrom, goal.id)
454
+ return pathPoints
455
+ }
456
+
457
+ if (!current) {
458
+ return [start, goal]
459
+ }
460
+
461
+ removeClosePointFromOpenList(openSet, current)
462
+ closedSet.push(current)
463
+
464
+ getNextNeighborPoints(points, current, sBBox, tBBox).forEach((neighbor) => {
465
+ if (closedSet.indexOf(neighbor) !== -1) {
466
+ return
467
+ }
468
+
469
+ if (openSet.indexOf(neighbor) === -1) {
470
+ openSet.push(neighbor)
471
+ }
472
+
473
+ if (current?.id && neighbor?.id) {
474
+ const tentativeGScore =
475
+ fScore[current.id] + estimateDistance(current, neighbor)
476
+ if (gScore[neighbor.id] && tentativeGScore >= gScore[neighbor.id]) {
477
+ return
478
+ }
479
+
480
+ cameFrom[neighbor.id] = current.id
481
+ gScore[neighbor.id] = tentativeGScore
482
+ fScore[neighbor.id] =
483
+ gScore[neighbor.id] +
484
+ heuristicCostEstimate(neighbor, goal, start, os, ot)
485
+ }
486
+ })
487
+ }
488
+ return [start, goal]
489
+ }
490
+
491
+ export const getBoxByOriginNode = (node: BaseNodeModel): BoxBounds => {
492
+ return getNodeBBox(node)
493
+ }
494
+ /* 保证一条直线上只有2个节点: 删除x/y相同的中间节点 */
495
+ export const pointFilter = (points: Point[]): Point[] => {
496
+ let i = 1
497
+ while (i < points.length - 1) {
498
+ const pre = points[i - 1]
499
+ const current = points[i]
500
+ const next = points[i + 1]
501
+ if (
502
+ (pre.x === current.x && current.x === next.x) ||
503
+ (pre.y === current.y && current.y === next.y)
504
+ ) {
505
+ points.splice(i, 1)
506
+ } else {
507
+ i++
508
+ }
509
+ }
510
+ return points
511
+ }
512
+
513
+ /* 计算折线点 */
514
+ export const getPolylinePoints = (
515
+ start: Point,
516
+ end: Point,
517
+ sNode: BaseNodeModel,
518
+ tNode: BaseNodeModel,
519
+ offset: number,
520
+ ): Point[] => {
521
+ const sBBox = getBoxByOriginNode(sNode)
522
+ const tBBox = getBoxByOriginNode(tNode)
523
+ const sxBBox = getExpandedBBox(sBBox, offset)
524
+ const txBBox = getExpandedBBox(tBBox, offset)
525
+ const sPoint = getExpandedBBoxPoint(sxBBox, sBBox, start)
526
+ const tPoint = getExpandedBBoxPoint(txBBox, tBBox, end)
527
+ // 当加上offset后的bbox有重合,直接简单计算节点
528
+ if (isBboxOverLapping(sxBBox, txBBox)) {
529
+ const points = getSimplePoints(start, end, sPoint, tPoint)
530
+ return [start, sPoint, ...points, tPoint, end]
531
+ }
532
+ const lineBBox = getBBoxOfPoints([sPoint, tPoint])
533
+ const sMixBBox = mergeBBox(sxBBox, lineBBox)
534
+ const tMixBBox = mergeBBox(txBBox, lineBBox)
535
+ let connectPoints: Point[] = []
536
+ connectPoints = connectPoints.concat(getPointsFromBBox(sMixBBox))
537
+ connectPoints = connectPoints.concat(getPointsFromBBox(tMixBBox))
538
+ // 中心点
539
+ const centerPoint = {
540
+ x: (start.x + end.x) / 2,
541
+ y: (start.y + end.y) / 2,
542
+ }
543
+ // 获取中心点与其他box的交点
544
+ ;[lineBBox, sMixBBox, tMixBBox].forEach((bbox: BoxBounds) => {
545
+ connectPoints = connectPoints.concat(
546
+ getBBoxCrossPointsByPoint(bbox, centerPoint).filter(
547
+ (p) => isPointOutsideBBox(p, sxBBox) && isPointOutsideBBox(p, txBBox),
548
+ ),
549
+ )
550
+ })
551
+ // 与起止终点相邻的两的,在x,y方向上的交点,这四个点组成了矩形 。。。解释图中在不中这两个点,
552
+ ;[
553
+ {
554
+ x: sPoint.x,
555
+ y: tPoint.y,
556
+ },
557
+ {
558
+ x: tPoint.x,
559
+ y: sPoint.y,
560
+ },
561
+ ].forEach((p) => {
562
+ if (isPointOutsideBBox(p, sxBBox) && isPointOutsideBBox(p, txBBox)) {
563
+ connectPoints.push(p)
564
+ }
565
+ })
566
+ connectPoints.unshift(sPoint)
567
+ connectPoints.push(tPoint)
568
+ connectPoints = filterRepeatPoints(connectPoints)
569
+ // 路径查找-最关键的步骤
570
+ let pathPoints = pathFinder(
571
+ connectPoints,
572
+ sPoint,
573
+ tPoint,
574
+ sBBox,
575
+ tBBox,
576
+ start,
577
+ end,
578
+ )
579
+ pathPoints.unshift(start)
580
+ pathPoints.push(end)
581
+ // 删除一条直线上的多余节点
582
+ if (pathPoints.length > 2) {
583
+ pathPoints = pointFilter(pathPoints)
584
+ }
585
+ return filterRepeatPoints(pathPoints)
586
+ }
587
+
588
+ /**
589
+ * 获取折线中最长的一个线
590
+ * @param pointsList 多个点组成的数组
591
+ */
592
+ export const getLongestEdge = (pointsList: Point[]): [Point, Point] => {
593
+ let points
594
+ if (pointsList.length === 1) {
595
+ points = [pointsList[0], pointsList[0]]
596
+ } else if (pointsList.length >= 2) {
597
+ let point1 = pointsList[0]
598
+ let point2 = pointsList[1]
599
+ let edgeLength = distance(point1.x, point1.y, point2.x, point2.y)
600
+ for (let i = 1; i < pointsList.length - 1; i++) {
601
+ const newPoint1 = pointsList[i]
602
+ const newPoint2 = pointsList[i + 1]
603
+ const newEdgeLength = distance(
604
+ newPoint1.x,
605
+ newPoint1.y,
606
+ newPoint2.x,
607
+ newPoint2.y,
608
+ )
609
+ if (newEdgeLength > edgeLength) {
610
+ edgeLength = newEdgeLength
611
+ point1 = newPoint1
612
+ point2 = newPoint2
613
+ }
614
+ }
615
+ points = [point1, point2]
616
+ }
617
+ return points
618
+ }
619
+
620
+ /* 线段是否在节点内部,被包含了 */
621
+ export const isSegmentsInNode = (
622
+ start: Point,
623
+ end: Point,
624
+ node: BaseNodeModel,
625
+ ): boolean => {
626
+ const startInNode = isInNode(start, node)
627
+ const endInNode = isInNode(end, node)
628
+ return startInNode && endInNode
629
+ }
630
+
631
+ /* 线段是否与节点相交 */
632
+ export const isSegmentsCrossNode = (
633
+ start: Point,
634
+ end: Point,
635
+ node: BaseNodeModel,
636
+ ): boolean => {
637
+ const startInNode = isInNode(start, node)
638
+ const endInNode = isInNode(end, node)
639
+ // bothInNode,线段两个端点都在节点内
640
+ const bothInNode = startInNode && endInNode
641
+ // cross,线段有端点在节点内
642
+ const inNode = startInNode || endInNode
643
+ // 有且只有一个点在节点内部
644
+ return !bothInNode && inNode
645
+ }
646
+
647
+ /* 获取线段在矩形内部的交点
648
+ */
649
+ export const getCrossPointInRect = (
650
+ start: Point,
651
+ end: Point,
652
+ node: BaseNodeModel,
653
+ ): Point => {
654
+ let point
655
+ let crossSegments: [Point, Point] | undefined = undefined
656
+ const nodeBox = getNodeBBox(node)
657
+ const points = getPointsFromBBox(nodeBox)
658
+ for (let i = 0; i < points.length; i++) {
659
+ const isCross = isSegmentsIntersected(
660
+ start,
661
+ end,
662
+ points[i],
663
+ points[(i + 1) % points.length],
664
+ )
665
+ if (isCross) {
666
+ crossSegments = [points[i], points[(i + 1) % points.length]]
667
+ }
668
+ }
669
+ if (crossSegments) {
670
+ point = getCrossPointOfLine(start, end, crossSegments[0], crossSegments[1])
671
+ }
672
+ return point
673
+ }
674
+ /* 判断线段的方向 */
675
+ export const segmentDirection = (
676
+ start: Point,
677
+ end: Point,
678
+ ): Direction | undefined => {
679
+ let direction: Direction | undefined = undefined
680
+ if (start.x === end.x) {
681
+ direction = SegmentDirection.VERTICAL
682
+ } else if (start.y === end.y) {
683
+ direction = SegmentDirection.HORIZONTAL
684
+ }
685
+ return direction
686
+ }
687
+
688
+ export const points2PointsList = (points: string): Point[] => {
689
+ const currentPositionList = points.split(' ')
690
+ const pointsList: LogicFlow.Position[] = []
691
+ currentPositionList &&
692
+ currentPositionList.forEach((item) => {
693
+ const [x, y] = item.split(',')
694
+ pointsList.push({
695
+ x: Number(x),
696
+ y: Number(y),
697
+ })
698
+ })
699
+ return pointsList
700
+ }
701
+
702
+ export const getSimplePoints = (
703
+ start: Point,
704
+ end: Point,
705
+ sPoint: Point,
706
+ tPoint: Point,
707
+ ): Point[] => {
708
+ const points: LogicFlow.Position[] = []
709
+ // start,sPoint的方向,水平或者垂直,即路径第一条线段的方向
710
+ const startDirection = segmentDirection(start, sPoint)!
711
+ // end,tPoint的方向,水平或者垂直,即路径最后一条条线段的方向
712
+ const endDirection = segmentDirection(end, tPoint)!
713
+ // 根据两条线段的方向作了计算,调整线段经验所得,非严格最优计算,能保证不出现折线
714
+ // 方向相同,添加两个点,两条平行线垂直距离一半的两个端点
715
+ if (startDirection === endDirection) {
716
+ if (start.y === sPoint.y) {
717
+ points.push({
718
+ x: sPoint.x,
719
+ y: (sPoint.y + tPoint.y) / 2,
720
+ })
721
+ points.push({
722
+ x: tPoint.x,
723
+ y: (sPoint.y + tPoint.y) / 2,
724
+ })
725
+ } else {
726
+ points.push({
727
+ x: (sPoint.x + tPoint.x) / 2,
728
+ y: sPoint.y,
729
+ })
730
+ points.push({
731
+ x: (sPoint.x + tPoint.x) / 2,
732
+ y: tPoint.y,
733
+ })
734
+ }
735
+ } else {
736
+ // 方向不同,添加一个点,保证不在当前线段上(会出现重合),且不能有折线
737
+ let point = {
738
+ x: sPoint.x,
739
+ y: tPoint.y,
740
+ }
741
+ const inStart = isInSegment(point, start, sPoint)
742
+ const inEnd = isInSegment(point, end, tPoint)
743
+ if (inStart || inEnd) {
744
+ point = {
745
+ x: tPoint.x,
746
+ y: sPoint.y,
747
+ }
748
+ } else {
749
+ const onStart = isOnLine(point, start, sPoint)
750
+ const onEnd = isOnLine(point, end, tPoint)
751
+ if (onStart && onEnd) {
752
+ point = {
753
+ x: tPoint.x,
754
+ y: sPoint.y,
755
+ }
756
+ }
757
+ }
758
+ points.push(point)
759
+ }
760
+ return points
761
+ }
762
+
763
+ const isOnLine = (point: Point, start: Point, end: Point) =>
764
+ (point.x === start.x && point.x === end.x) ||
765
+ (point.y === start.y && point.y === end.y)
766
+
767
+ /* 求字符串的字节长度 */
768
+ export const getBytesLength = (word: string): number => {
769
+ if (!word) {
770
+ return 0
771
+ }
772
+ let totalLength = 0
773
+ for (let i = 0; i < word.length; i++) {
774
+ const c = word.charCodeAt(i)
775
+ if (word.match(/[A-Z]/)) {
776
+ totalLength += 1.5
777
+ } else if ((c >= 0x0001 && c <= 0x007e) || (c >= 0xff60 && c <= 0xff9f)) {
778
+ totalLength += 1
779
+ } else {
780
+ totalLength += 2
781
+ }
782
+ }
783
+ return totalLength
784
+ }
785
+
786
+ /**
787
+ * Uses canvas.measureText to compute
788
+ * and return the width of the given text of given font in pixels.
789
+ * @param {String} text The text to be rendered.
790
+ * @param {String} font The css font descriptor
791
+ * that text is to be rendered with (e.g. "bold 14px verdana").
792
+ * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393
793
+ */
794
+ let canvas: HTMLCanvasElement | undefined = undefined
795
+ export const getTextWidth = (text: string, font: string) => {
796
+ if (!canvas) {
797
+ canvas = document.createElement('canvas')
798
+ }
799
+ const context = canvas.getContext('2d')
800
+ context!.font = font
801
+ const metrics = context!.measureText(text)
802
+ return metrics.width
803
+ }
804
+
805
+ type AppendAttributesType = {
806
+ d: string
807
+ fill: string
808
+ stroke: string
809
+ strokeWidth: number
810
+ strokeDasharray: string
811
+ }
812
+ // 扩大边可点区域,获取边append的信息
813
+ export const getAppendAttributes = (
814
+ appendInfo: Record<'start' | 'end', Point>,
815
+ ): AppendAttributesType => {
816
+ const { start, end } = appendInfo
817
+ let d: string
818
+ if (start.x === end.x && start.y === end.y) {
819
+ // 拖拽过程中会出现起终点重合的情况,这时候append无法计算
820
+ d = ''
821
+ } else {
822
+ const config = {
823
+ start,
824
+ end,
825
+ offset: 10,
826
+ verticalLength: 5,
827
+ }
828
+ const startPosition = getVerticalPointOfLine({
829
+ ...config,
830
+ type: 'start',
831
+ })
832
+ const endPosition = getVerticalPointOfLine({
833
+ ...config,
834
+ type: 'end',
835
+ })
836
+ d = `M${startPosition.leftX} ${startPosition.leftY}
837
+ L${startPosition.rightX} ${startPosition.rightY}
838
+ L${endPosition.rightX} ${endPosition.rightY}
839
+ L${endPosition.leftX} ${endPosition.leftY} z`
840
+ }
841
+ return {
842
+ d,
843
+ fill: 'transparent',
844
+ stroke: 'transparent',
845
+ strokeWidth: 1,
846
+ strokeDasharray: '4, 4',
847
+ }
848
+ }
849
+ export type IBezierControls = {
850
+ sNext: Point
851
+ ePre: Point
852
+ }
853
+
854
+ // bezier曲线
855
+ export const getBezierControlPoints = ({
856
+ start,
857
+ end,
858
+ sourceNode,
859
+ targetNode,
860
+ offset,
861
+ }: {
862
+ start: Point
863
+ end: Point
864
+ sourceNode: BaseNodeModel
865
+ targetNode: BaseNodeModel
866
+ offset: number
867
+ }): IBezierControls => {
868
+ const sBBox = getNodeBBox(sourceNode)
869
+ const tBBox = getNodeBBox(targetNode)
870
+ const sExpendBBox = getExpandedBBox(sBBox, offset)
871
+ const tExpendBBox = getExpandedBBox(tBBox, offset)
872
+ const sNext = getExpandedBBoxPoint(sExpendBBox, sBBox, start)
873
+ const ePre = getExpandedBBoxPoint(tExpendBBox, tBBox, end)
874
+ return {
875
+ sNext,
876
+ ePre,
877
+ }
878
+ }
879
+
880
+ export type IBezierPoints = {
881
+ start: Point
882
+ sNext: Point
883
+ ePre: Point
884
+ end: Point
885
+ }
886
+ // 根据bezier曲线path求出Points
887
+ export const getBezierPoints = (path: string): [Point, Point, Point, Point] => {
888
+ const list = path.replace(/M/g, '').replace(/C/g, ',').split(',')
889
+ const start = getBezierPoint(list[0])
890
+ const sNext = getBezierPoint(list[1])
891
+ const ePre = getBezierPoint(list[2])
892
+ const end = getBezierPoint(list[3])
893
+ return [start, sNext, ePre, end]
894
+ }
895
+ // 根据bezier曲线path求出Point坐标
896
+ const getBezierPoint = (positionStr: string): Point => {
897
+ const [x, y] = positionStr.replace(/(^\s*)/g, '').split(' ')
898
+ return {
899
+ x: +x,
900
+ y: +y,
901
+ }
902
+ }
903
+ // 根据bezier曲线path求出结束切线的两点坐标
904
+ export const getEndTangent = (
905
+ pointsList: Point[],
906
+ offset: number,
907
+ ): [Point, Point] => {
908
+ // const bezierPoints = getBezierPoints(path)
909
+ const [p1, cp1, cp2, p2] = pointsList
910
+ const start = sampleCubic(p1, cp1, cp2, p2, offset)
911
+ return [start, pointsList[3]]
912
+ }
913
+
914
+ /**
915
+ * 获取移动边后,文本位置距离边上的最近的一点
916
+ * @param point 边上文本的位置
917
+ * @param points 边的各个拐点
918
+ */
919
+ export const getClosestPointOfPolyline = (
920
+ point: Point,
921
+ points: string,
922
+ ): Point => {
923
+ const { x, y } = point
924
+ const pointsPosition = points2PointsList(points)
925
+ let minDistance = Number.MAX_SAFE_INTEGER
926
+ let crossPoint: Point
927
+ const segments: LineSegment[] = []
928
+ for (let i = 0; i < pointsPosition.length; i++) {
929
+ segments.push({
930
+ start: pointsPosition[i],
931
+ end: pointsPosition[(i + 1) % pointsPosition.length],
932
+ })
933
+ }
934
+ segments.forEach((item) => {
935
+ const { start, end } = item
936
+ // 若线段垂直,则crossPoint的横坐标与线段一致
937
+ if (start.x === end.x) {
938
+ const pointXY = {
939
+ x: start.x,
940
+ y,
941
+ }
942
+ const inSegment = isInSegment(pointXY, start, end)
943
+ if (inSegment) {
944
+ const currentDistance = Math.abs(start.x - x)
945
+ if (currentDistance < minDistance) {
946
+ minDistance = currentDistance
947
+ crossPoint = pointXY
948
+ }
949
+ }
950
+ } else if (start.y === end.y) {
951
+ const pointXY = {
952
+ x,
953
+ y: start.y,
954
+ }
955
+ const inSegment = isInSegment(pointXY, start, end)
956
+ if (inSegment) {
957
+ const currentDistance = Math.abs(start.y - y)
958
+ if (currentDistance < minDistance) {
959
+ minDistance = currentDistance
960
+ crossPoint = pointXY
961
+ }
962
+ }
963
+ }
964
+ })
965
+ // 边界:只有一条线段时,沿线段移动节点,当文本超出边后,文本没有可供参考的线段
966
+ if (!crossPoint!) {
967
+ const { start, end } = segments[0]
968
+ crossPoint = {
969
+ x: start.x + (end.x - start.x) / 2,
970
+ y: start.y + (end.y - start.y) / 2,
971
+ }
972
+ }
973
+ return crossPoint
974
+ }
975
+
976
+ // 规范边初始化数据
977
+ export const pickEdgeConfig = (data: EdgeConfig): EdgeConfig =>
978
+ pick(data, [
979
+ 'id',
980
+ 'type',
981
+ 'sourceNodeId',
982
+ 'sourceAnchorId',
983
+ 'targetNodeId',
984
+ 'targetAnchorId',
985
+ 'pointsList',
986
+ 'startPoint',
987
+ 'endPoint',
988
+ 'properties',
989
+ ])
990
+
991
+ export const twoPointDistance = (source: Position, target: Position) => {
992
+ // fix: 修复坐标存在负值时计算错误的问题。
993
+ // const source = {
994
+ // x: p1.x,
995
+ // y: Math.abs(p1.y),
996
+ // }
997
+ // const target = {
998
+ // x: Math.abs(p2.x),
999
+ // y: Math.abs(p2.y),
1000
+ // }
1001
+ return Math.sqrt((source.x - target.x) ** 2 + (source.y - target.y) ** 2)
1002
+ }
1003
+
1004
+ /**
1005
+ * 包装边生成函数
1006
+ * @param graphModel graph model
1007
+ * @param generator 用户自定义的边生成函数
1008
+ */
1009
+ export function createEdgeGenerator(
1010
+ graphModel: GraphModel,
1011
+ generator?: Options.EdgeGeneratorType | unknown,
1012
+ ): any {
1013
+ // TODO: 定义返回值类型,保证 GraphModel 中类型的正确性
1014
+ if (typeof generator !== 'function') {
1015
+ return (
1016
+ _sourceNode: NodeData,
1017
+ _targetNode: NodeData,
1018
+ currentEdge?: EdgeConfig,
1019
+ ) => Object.assign({ type: graphModel.edgeType }, currentEdge)
1020
+ }
1021
+ return (
1022
+ sourceNode: NodeData,
1023
+ targetNode: NodeData,
1024
+ currentEdge?: EdgeConfig,
1025
+ ) => {
1026
+ const result = generator(sourceNode, targetNode, currentEdge)
1027
+ // 无结果使用默认类型
1028
+ if (!result) return { type: graphModel.edgeType }
1029
+ if (typeof result === 'string') {
1030
+ return Object.assign({}, currentEdge, { type: result })
1031
+ }
1032
+ return Object.assign({ type: result }, currentEdge)
1033
+ }
1034
+ }