@logicflow/extension 2.2.0 → 2.2.1

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 (201) hide show
  1. package/README.md +16 -0
  2. package/dist/index.css +1 -1
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/es/NodeResize/node/RectResize.d.ts +0 -6
  6. package/es/NodeResize/node/RectResize.js +2 -11
  7. package/es/bpmn-elements-adapter/json2xml.d.ts +2 -1
  8. package/es/bpmn-elements-adapter/json2xml.js +18 -4
  9. package/es/bpmn-elements-adapter/xml2json.js +2 -7
  10. package/es/components/control/index.d.ts +1 -0
  11. package/es/components/control/index.js +24 -11
  12. package/es/components/mini-map/index.js +1 -1
  13. package/es/dynamic-group/model.d.ts +2 -1
  14. package/es/dynamic-group/model.js +28 -11
  15. package/es/dynamic-group/node.js +1 -0
  16. package/es/index.css +1 -1
  17. package/es/index.d.ts +1 -0
  18. package/es/index.js +2 -0
  19. package/es/insert-node-in-polyline/index.js +11 -35
  20. package/es/materials/curved-edge/index.js +49 -21
  21. package/es/materials/group/GroupNode.d.ts +0 -6
  22. package/es/materials/group/GroupNode.js +1 -6
  23. package/es/pool/LaneModel.d.ts +90 -0
  24. package/es/pool/LaneModel.js +252 -0
  25. package/es/pool/LaneView.d.ts +40 -0
  26. package/es/pool/LaneView.js +202 -0
  27. package/es/pool/PoolModel.d.ts +120 -0
  28. package/es/pool/PoolModel.js +586 -0
  29. package/es/pool/PoolView.d.ts +17 -0
  30. package/es/pool/PoolView.js +76 -0
  31. package/es/pool/constant.d.ts +15 -0
  32. package/es/pool/constant.js +17 -0
  33. package/es/pool/index.d.ts +89 -0
  34. package/es/pool/index.js +524 -0
  35. package/es/pool/utils.d.ts +19 -0
  36. package/es/pool/utils.js +33 -0
  37. package/es/style/index.css +1 -1
  38. package/es/style/raw.d.ts +1 -1
  39. package/es/style/raw.js +1 -1
  40. package/es/tools/label/LabelOverlay.js +3 -3
  41. package/es/tools/label/mediumEditor.d.ts +1 -1
  42. package/es/tools/label/mediumEditor.js +89 -52
  43. package/es/tools/snapshot/index.d.ts +7 -3
  44. package/es/tools/snapshot/index.js +72 -77
  45. package/lib/NodeResize/node/RectResize.d.ts +0 -6
  46. package/lib/NodeResize/node/RectResize.js +1 -10
  47. package/lib/bpmn-elements-adapter/json2xml.d.ts +2 -1
  48. package/lib/bpmn-elements-adapter/json2xml.js +19 -4
  49. package/lib/bpmn-elements-adapter/xml2json.js +2 -7
  50. package/lib/components/control/index.d.ts +1 -0
  51. package/lib/components/control/index.js +24 -11
  52. package/lib/components/mini-map/index.js +1 -1
  53. package/lib/dynamic-group/model.d.ts +2 -1
  54. package/lib/dynamic-group/model.js +28 -11
  55. package/lib/dynamic-group/node.js +1 -0
  56. package/lib/index.css +1 -1
  57. package/lib/index.d.ts +1 -0
  58. package/lib/index.js +2 -0
  59. package/lib/insert-node-in-polyline/index.js +10 -34
  60. package/lib/materials/curved-edge/index.js +49 -21
  61. package/lib/materials/group/GroupNode.d.ts +0 -6
  62. package/lib/materials/group/GroupNode.js +1 -6
  63. package/lib/pool/LaneModel.d.ts +90 -0
  64. package/lib/pool/LaneModel.js +255 -0
  65. package/lib/pool/LaneView.d.ts +40 -0
  66. package/lib/pool/LaneView.js +205 -0
  67. package/lib/pool/PoolModel.d.ts +120 -0
  68. package/lib/pool/PoolModel.js +589 -0
  69. package/lib/pool/PoolView.d.ts +17 -0
  70. package/lib/pool/PoolView.js +79 -0
  71. package/lib/pool/constant.d.ts +15 -0
  72. package/lib/pool/constant.js +20 -0
  73. package/lib/pool/index.d.ts +89 -0
  74. package/lib/pool/index.js +527 -0
  75. package/lib/pool/utils.d.ts +19 -0
  76. package/lib/pool/utils.js +38 -0
  77. package/lib/style/index.css +1 -1
  78. package/lib/style/raw.d.ts +1 -1
  79. package/lib/style/raw.js +1 -1
  80. package/lib/tools/label/LabelOverlay.js +2 -2
  81. package/lib/tools/label/mediumEditor.d.ts +1 -1
  82. package/lib/tools/label/mediumEditor.js +91 -53
  83. package/lib/tools/snapshot/index.d.ts +7 -3
  84. package/lib/tools/snapshot/index.js +72 -77
  85. package/package.json +10 -7
  86. package/.turbo/turbo-build.log +0 -38
  87. package/CHANGELOG.md +0 -1766
  88. package/__test__/bpmn-adapter.test.js +0 -227
  89. package/es/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  90. package/es/materials/curved-edge/__test__/curved-edge.test.js +0 -18
  91. package/jest.config.js +0 -198
  92. package/lib/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  93. package/lib/materials/curved-edge/__test__/curved-edge.test.js +0 -20
  94. package/rollup.config.js +0 -52
  95. package/src/NodeResize/BasicShape/Ellipse.tsx +0 -22
  96. package/src/NodeResize/BasicShape/Polygon.tsx +0 -24
  97. package/src/NodeResize/BasicShape/Rect.tsx +0 -44
  98. package/src/NodeResize/control/Control.tsx +0 -537
  99. package/src/NodeResize/control/ControlGroup.tsx +0 -76
  100. package/src/NodeResize/control/Util.ts +0 -206
  101. package/src/NodeResize/index.ts +0 -26
  102. package/src/NodeResize/node/DiamondResize.tsx +0 -149
  103. package/src/NodeResize/node/EllipseResize.tsx +0 -140
  104. package/src/NodeResize/node/HtmlResize.tsx +0 -125
  105. package/src/NodeResize/node/RectResize.tsx +0 -146
  106. package/src/NodeResize/node/index.ts +0 -4
  107. package/src/bpmn/constant.ts +0 -56
  108. package/src/bpmn/events/EndEvent.ts +0 -73
  109. package/src/bpmn/events/StartEvent.ts +0 -52
  110. package/src/bpmn/events/index.ts +0 -2
  111. package/src/bpmn/flow/SequenceFlow.ts +0 -25
  112. package/src/bpmn/flow/index.ts +0 -1
  113. package/src/bpmn/gateways/ExclusiveGateway.ts +0 -71
  114. package/src/bpmn/gateways/index.ts +0 -1
  115. package/src/bpmn/getBpmnId.ts +0 -31
  116. package/src/bpmn/index.ts +0 -60
  117. package/src/bpmn/tasks/ServiceTask.ts +0 -63
  118. package/src/bpmn/tasks/UserTask.ts +0 -64
  119. package/src/bpmn/tasks/index.ts +0 -2
  120. package/src/bpmn-adapter/bpmnIds.ts +0 -31
  121. package/src/bpmn-adapter/index.ts +0 -835
  122. package/src/bpmn-adapter/json2xml.ts +0 -127
  123. package/src/bpmn-adapter/xml2json.ts +0 -544
  124. package/src/bpmn-elements/README.md +0 -223
  125. package/src/bpmn-elements/__tests__/definition.test.js +0 -72
  126. package/src/bpmn-elements/index.d.ts +0 -26
  127. package/src/bpmn-elements/index.ts +0 -107
  128. package/src/bpmn-elements/presets/Event/EndEventFactory.ts +0 -114
  129. package/src/bpmn-elements/presets/Event/IntermediateCatchEvent.ts +0 -108
  130. package/src/bpmn-elements/presets/Event/IntermediateThrowEvent.ts +0 -109
  131. package/src/bpmn-elements/presets/Event/StartEventFactory.ts +0 -114
  132. package/src/bpmn-elements/presets/Event/boundaryEventFactory.ts +0 -117
  133. package/src/bpmn-elements/presets/Event/index.ts +0 -14
  134. package/src/bpmn-elements/presets/Flow/flow.d.ts +0 -6
  135. package/src/bpmn-elements/presets/Flow/index.ts +0 -8
  136. package/src/bpmn-elements/presets/Flow/manhattan.ts +0 -691
  137. package/src/bpmn-elements/presets/Flow/sequenceFlow.ts +0 -65
  138. package/src/bpmn-elements/presets/Gateway/gateway.ts +0 -107
  139. package/src/bpmn-elements/presets/Gateway/index.ts +0 -23
  140. package/src/bpmn-elements/presets/Pool/Lane.ts +0 -211
  141. package/src/bpmn-elements/presets/Pool/Pool.ts +0 -284
  142. package/src/bpmn-elements/presets/Pool/index.ts +0 -89
  143. package/src/bpmn-elements/presets/Task/index.ts +0 -122
  144. package/src/bpmn-elements/presets/Task/subProcess.ts +0 -189
  145. package/src/bpmn-elements/presets/Task/task.ts +0 -193
  146. package/src/bpmn-elements/presets/icons.ts +0 -155
  147. package/src/bpmn-elements/utils.ts +0 -52
  148. package/src/bpmn-elements-adapter/README.md +0 -293
  149. package/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +0 -528
  150. package/src/bpmn-elements-adapter/__tests__/adapter_out.test.js +0 -569
  151. package/src/bpmn-elements-adapter/constant.ts +0 -76
  152. package/src/bpmn-elements-adapter/index.ts +0 -1134
  153. package/src/bpmn-elements-adapter/json2xml.ts +0 -91
  154. package/src/bpmn-elements-adapter/xml2json.ts +0 -548
  155. package/src/components/context-menu/index.ts +0 -253
  156. package/src/components/control/index.ts +0 -141
  157. package/src/components/dnd-panel/index.ts +0 -137
  158. package/src/components/highlight/index.ts +0 -227
  159. package/src/components/menu/index.ts +0 -748
  160. package/src/components/mini-map/index.ts +0 -686
  161. package/src/components/selection-select/index.ts +0 -387
  162. package/src/dynamic-group/index.ts +0 -775
  163. package/src/dynamic-group/model.ts +0 -562
  164. package/src/dynamic-group/node.ts +0 -288
  165. package/src/dynamic-group/utils.ts +0 -46
  166. package/src/index.less +0 -1
  167. package/src/index.ts +0 -45
  168. package/src/insert-node-in-polyline/edge.ts +0 -175
  169. package/src/insert-node-in-polyline/index.ts +0 -187
  170. package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
  171. package/src/materials/curved-edge/index.ts +0 -185
  172. package/src/materials/group/GroupNode.ts +0 -442
  173. package/src/materials/group/index.ts +0 -542
  174. package/src/materials/node-selection/index.ts +0 -380
  175. package/src/mindmap/fakerRoot.ts +0 -19
  176. package/src/mindmap/index.ts +0 -328
  177. package/src/mindmap/markContent.ts +0 -81
  178. package/src/mindmap/markContentOption.ts +0 -81
  179. package/src/mindmap/markEntity.ts +0 -82
  180. package/src/mindmap/markRoot.ts +0 -83
  181. package/src/mindmap/theme.ts +0 -11
  182. package/src/rect-label-node/RectLabelNodeView.ts +0 -33
  183. package/src/rect-label-node/index.ts +0 -15
  184. package/src/style/index.less +0 -342
  185. package/src/style/raw.ts +0 -295
  186. package/src/tools/auto-layout/index.ts +0 -282
  187. package/src/tools/flow-path/index.ts +0 -233
  188. package/src/tools/label/Label.tsx +0 -357
  189. package/src/tools/label/LabelModel.ts +0 -83
  190. package/src/tools/label/LabelOverlay.tsx +0 -158
  191. package/src/tools/label/algorithm.ts +0 -42
  192. package/src/tools/label/index.ts +0 -479
  193. package/src/tools/label/mediumEditor.ts +0 -94
  194. package/src/tools/label/utils.ts +0 -395
  195. package/src/tools/proximity-connect/index.ts +0 -435
  196. package/src/tools/snapshot/README.md +0 -145
  197. package/src/tools/snapshot/index.ts +0 -718
  198. package/src/tools/snapshot/utils.ts +0 -163
  199. package/src/turbo-adapter/index.ts +0 -212
  200. package/stats.html +0 -4842
  201. package/tsconfig.json +0 -18
@@ -1,187 +0,0 @@
1
- import LogicFlow, {
2
- BaseNodeModel,
3
- PolylineEdgeModel,
4
- EventType,
5
- formatAnchorConnectValidateData,
6
- } from '@logicflow/core'
7
- import { cloneDeep } from 'lodash-es'
8
- import { isNodeInSegment } from './edge'
9
-
10
- import NodeData = LogicFlow.NodeData
11
-
12
- export class InsertNodeInPolyline {
13
- static pluginName = 'insertNodeInPolyline'
14
- _lf: LogicFlow
15
- dndAdd: boolean // dnd 添加节点到折线上的开关
16
- dropAdd: boolean // 移动节点到折线上的开关
17
- deviation: number // 节点中心距离直接距离小于该值时,认为节点在折线上
18
- constructor({ lf }) {
19
- this._lf = lf
20
- // fix https://github.com/didi/LogicFlow/issues/754
21
- this.deviation = 20
22
- this.dndAdd = true
23
- this.dropAdd = true
24
- this.eventHandler()
25
- }
26
-
27
- eventHandler() {
28
- // 监听事件
29
- if (this.dndAdd) {
30
- this._lf.on('node:dnd-add', ({ data }: { data: NodeData }) => {
31
- this.insetNode(data)
32
- })
33
- }
34
- if (this.dropAdd) {
35
- this._lf.on('node:drop', ({ data }: { data: NodeData }) => {
36
- const { edges } = this._lf.graphModel
37
- const { id } = data
38
- // 只有游离节点才能插入到连线上
39
- let pureNode = true
40
- for (let i = 0; i < edges.length; i++) {
41
- if (edges[i].sourceNodeId === id || edges[i].targetNodeId === id) {
42
- pureNode = false
43
- break
44
- }
45
- }
46
- if (pureNode) {
47
- this.insetNode(data)
48
- }
49
- })
50
- }
51
- }
52
-
53
- /**
54
- * 插入节点前校验规则
55
- * @param sourceNodeId
56
- * @param targetNodeId
57
- * @param sourceAnchorId
58
- * @param targetAnchorId
59
- * @param nodeData
60
- */
61
- // fix: https://github.com/didi/LogicFlow/issues/1078
62
- checkRuleBeforeInsetNode(
63
- sourceNodeId: string,
64
- targetNodeId: string,
65
- sourceAnchorId: string,
66
- targetAnchorId: string,
67
- nodeData: NodeData,
68
- ) {
69
- const sourceNodeModel = this._lf.getNodeModelById(sourceNodeId)!
70
- const targetNodeModel = this._lf.getNodeModelById(targetNodeId)!
71
-
72
- const sourceAnchorInfo = sourceNodeModel.getAnchorInfo(sourceAnchorId)!
73
- const targetAnchorInfo = targetNodeModel.getAnchorInfo(targetAnchorId)!
74
-
75
- // TODO: nodeData 与 isAllowConnectedAsSource 方法需要的类型 BaseNodeModel 不一致,少了 target 属性等,需要验证是否可用。
76
- const sourceRuleResultData = sourceNodeModel.isAllowConnectedAsSource(
77
- nodeData as BaseNodeModel,
78
- sourceAnchorInfo,
79
- targetAnchorInfo,
80
- )
81
- const targetRuleResultData = targetNodeModel.isAllowConnectedAsTarget(
82
- nodeData as BaseNodeModel,
83
- sourceAnchorInfo,
84
- targetAnchorInfo,
85
- )
86
-
87
- const { isAllPass: isSourcePass, msg: sourceMsg } =
88
- formatAnchorConnectValidateData(sourceRuleResultData)
89
- const { isAllPass: isTargetPass, msg: targetMsg } =
90
- formatAnchorConnectValidateData(targetRuleResultData)
91
-
92
- return {
93
- isPass: isSourcePass && isTargetPass,
94
- sourceMsg,
95
- targetMsg,
96
- }
97
- }
98
-
99
- insetNode(nodeData: NodeData): void {
100
- const { edges } = this._lf.graphModel
101
- const nodeModel = this._lf.getNodeModelById(nodeData.id)
102
-
103
- // fix: https://github.com/didi/LogicFlow/issues/1077
104
- // 参照https://github.com/didi/LogicFlow/issues/454=>当getDefaultAnchor(){return []}表示:不显示锚点,也不允许其他节点连接到此节点
105
- // 当getDefaultAnchor=[],直接阻止下面进行edges的截断插入node相关逻辑
106
- const anchorArray = nodeModel?.getDefaultAnchor()
107
- const isNotAllowConnect = !anchorArray || anchorArray.length === 0
108
- if (isNotAllowConnect) {
109
- this._lf.graphModel.eventCenter.emit(EventType.CONNECTION_NOT_ALLOWED, {
110
- data: nodeData,
111
- msg: '自定义类型节点不显示锚点,也不允许其他节点连接到此节点',
112
- })
113
- return
114
- }
115
-
116
- if (!nodeModel) return
117
- for (let i = 0; i < edges.length; i++) {
118
- const { crossIndex, crossPoints } = isNodeInSegment(
119
- nodeModel,
120
- edges[i] as PolylineEdgeModel,
121
- this.deviation,
122
- )
123
- if (crossIndex >= 0) {
124
- const {
125
- sourceNodeId,
126
- targetNodeId,
127
- id,
128
- type,
129
- pointsList,
130
- sourceAnchorId,
131
- targetAnchorId,
132
- } = edges[i]
133
- // fix https://github.com/didi/LogicFlow/issues/996
134
- const startPoint = cloneDeep(pointsList[0])
135
- const endPoint = cloneDeep(crossPoints.startCrossPoint)
136
- this._lf.deleteEdge(id)
137
- const checkResult = this.checkRuleBeforeInsetNode(
138
- sourceNodeId,
139
- targetNodeId,
140
- sourceAnchorId!,
141
- targetAnchorId!,
142
- nodeData,
143
- )
144
- this._lf.addEdge({
145
- type,
146
- sourceNodeId,
147
- targetNodeId: nodeData.id,
148
- startPoint,
149
- endPoint,
150
- pointsList: [
151
- ...pointsList.slice(0, crossIndex),
152
- crossPoints.startCrossPoint,
153
- ],
154
- })
155
- this._lf.addEdge({
156
- type,
157
- sourceNodeId: nodeData.id,
158
- targetNodeId,
159
- startPoint: cloneDeep(crossPoints.endCrossPoint),
160
- endPoint: cloneDeep(pointsList[pointsList.length - 1]),
161
- pointsList: [
162
- crossPoints.endCrossPoint,
163
- ...pointsList.slice(crossIndex),
164
- ],
165
- })
166
- if (!checkResult.isPass) {
167
- this._lf.graphModel.eventCenter.emit(
168
- EventType.CONNECTION_NOT_ALLOWED,
169
- {
170
- data: nodeData,
171
- msg: checkResult.targetMsg || checkResult.sourceMsg,
172
- },
173
- )
174
- // FIXME:在关闭了历史记录的情况下,撤销操作会不生效。
175
- setTimeout(() => {
176
- this._lf.undo()
177
- }, 200)
178
- break
179
- } else {
180
- break
181
- }
182
- }
183
- }
184
- }
185
- }
186
-
187
- export default InsertNodeInPolyline
@@ -1,46 +0,0 @@
1
- import { getCurvedEdgePath } from '../index'
2
-
3
- describe('test curved edge ', () => {
4
- test('path calculation', () => {
5
- const radius = 5
6
-
7
- const points1 = '460,150 670,150'
8
- const path1 = 'M460 150 L 670 150'
9
- expect(
10
- getCurvedEdgePath(
11
- points1.split(' ').map((p) => p.split(',').map((a) => +a)),
12
- radius,
13
- ),
14
- ).toBe(path1)
15
-
16
- const points2 = '510,250 540,250 540,175 490,175 490,100 520,100'
17
- const path2 =
18
- 'M510 250L 510 250L 535 250 Q 540 250 540 245L 540 245L 540 180 Q 540 175 535 175L 535 175L 495 175 Q 490 175 490 170L 490 170L 490 105 Q 490 100 495 100L 520 100'
19
- expect(
20
- getCurvedEdgePath(
21
- points2.split(' ').map((p) => p.split(',').map((a) => +a)),
22
- radius,
23
- ),
24
- ).toBe(path2)
25
-
26
- const points3 = '690,120 720,120 720,50 560,50 560,260 690,260'
27
- const path3 =
28
- 'M690 120L 690 120L 715 120 Q 720 120 720 115L 720 115L 720 55 Q 720 50 715 50L 715 50L 565 50 Q 560 50 560 55L 560 55L 560 255 Q 560 260 565 260L 690 260'
29
- expect(
30
- getCurvedEdgePath(
31
- points3.split(' ').map((p) => p.split(',').map((a) => +a)),
32
- radius,
33
- ),
34
- ).toBe(path3)
35
-
36
- const point4 = '690,180 690,210 660,210 660,190 630,190 630,220'
37
- const path4 =
38
- 'M690 180L 690 180L 690 205 Q 690 210 685 210L 685 210L 665 210 Q 660 210 660 205L 660 205L 660 195 Q 660 190 655 190L 655 190L 635 190 Q 630 190 630 195L 630 220'
39
- expect(
40
- getCurvedEdgePath(
41
- point4.split(' ').map((p) => p.split(',').map((a) => +a)),
42
- radius,
43
- ),
44
- ).toBe(path4)
45
- })
46
- })
@@ -1,185 +0,0 @@
1
- import { PolylineEdge, PolylineEdgeModel, h, LogicFlow } from '@logicflow/core'
2
- import PointTuple = LogicFlow.PointTuple
3
-
4
- type DirectionType = 't' | 'b' | 'l' | 'r' | ''
5
- type ArcQuadrantType = 'tl' | 'tr' | 'bl' | 'br' | '-'
6
-
7
- const directionMap: {
8
- [key: string]: ArcQuadrantType
9
- } = {
10
- tr: 'tl',
11
- lb: 'tl',
12
- tl: 'tr',
13
- rb: 'tr',
14
- br: 'bl',
15
- lt: 'bl',
16
- bl: 'br',
17
- rt: 'br',
18
- }
19
-
20
- function pointFilter(points: number[][]) {
21
- const all = points
22
- let i = 1
23
- while (i < all.length - 1) {
24
- const [x, y] = all[i - 1]
25
- const [x1, y1] = all[i]
26
- const [x2, y2] = all[i + 1]
27
- if ((x === x1 && x1 === x2) || (y === y1 && y1 === y2)) {
28
- all.splice(i, 1)
29
- } else {
30
- i++
31
- }
32
- }
33
- return all
34
- }
35
-
36
- function getMidPoints(
37
- cur: PointTuple,
38
- key: string,
39
- orientation: ArcQuadrantType,
40
- radius: number,
41
- ) {
42
- const mid1 = [cur[0], cur[1]]
43
- const mid2 = [cur[0], cur[1]]
44
- switch (orientation) {
45
- case 'tl': {
46
- if (key === 'tr') {
47
- mid1[1] += radius
48
- mid2[0] += radius
49
- } else if (key === 'lb') {
50
- mid1[0] += radius
51
- mid2[1] += radius
52
- }
53
- return [mid1, mid2]
54
- }
55
- case 'tr': {
56
- if (key === 'tl') {
57
- mid1[1] += radius
58
- mid2[0] -= radius
59
- } else if (key === 'rb') {
60
- mid1[0] -= radius
61
- mid2[1] += radius
62
- }
63
- return [mid1, mid2]
64
- }
65
- case 'bl': {
66
- if (key === 'br') {
67
- mid1[1] -= radius
68
- mid2[0] += radius
69
- } else if (key === 'lt') {
70
- mid1[0] += radius
71
- mid2[1] -= radius
72
- }
73
- return [mid1, mid2]
74
- }
75
- case 'br': {
76
- if (key === 'bl') {
77
- mid1[1] -= radius
78
- mid2[0] -= radius
79
- } else if (key === 'rt') {
80
- mid1[0] -= radius
81
- mid2[1] -= radius
82
- }
83
- return [mid1, mid2]
84
- }
85
- default:
86
- return []
87
- }
88
- }
89
-
90
- function getPartialPath(
91
- prev: PointTuple,
92
- cur: PointTuple,
93
- next: PointTuple,
94
- radius: number,
95
- ): string {
96
- let dir1: DirectionType = ''
97
- let dir2: DirectionType = ''
98
-
99
- if (prev[0] === cur[0]) {
100
- dir1 = prev[1] > cur[1] ? 't' : 'b'
101
- } else if (prev[1] === cur[1]) {
102
- dir1 = prev[0] > cur[0] ? 'l' : 'r'
103
- }
104
-
105
- if (cur[0] === next[0]) {
106
- dir2 = cur[1] > next[1] ? 't' : 'b'
107
- } else if (cur[1] === next[1]) {
108
- dir2 = cur[0] > next[0] ? 'l' : 'r'
109
- }
110
-
111
- const r =
112
- Math.min(
113
- Math.hypot(cur[0] - prev[0], cur[1] - prev[1]) / 2,
114
- Math.hypot(next[0] - cur[0], next[1] - cur[1]) / 2,
115
- radius,
116
- ) || (1 / 5) * radius
117
-
118
- const key = `${dir1}${dir2}`
119
- const orientation: ArcQuadrantType = directionMap[key] || '-'
120
- let path = `L ${prev[0]} ${prev[1]}`
121
-
122
- if (orientation === '-') {
123
- path += `L ${cur[0]} ${cur[1]} L ${next[0]} ${next[1]}`
124
- } else {
125
- const [mid1, mid2] = getMidPoints(cur, key, orientation, r)
126
- if (mid1 && mid2) {
127
- path += `L ${mid1[0]} ${mid1[1]} Q ${cur[0]} ${cur[1]} ${mid2[0]} ${mid2[1]}`
128
- ;[cur[0], cur[1]] = mid2
129
- }
130
- }
131
- return path
132
- }
133
-
134
- function getCurvedEdgePath(points: number[][], radius: number): string {
135
- let i = 0
136
- let d = ''
137
- if (points.length === 2) {
138
- d += `M${points[i][0]} ${points[i++][1]} L ${points[i][0]} ${points[i][1]}`
139
- } else {
140
- d += `M${points[i][0]} ${points[i++][1]}`
141
- for (; i + 1 < points.length; ) {
142
- const prev = points[i - 1] as PointTuple
143
- const cur = points[i] as PointTuple
144
- const next = points[i++ + 1] as PointTuple
145
- d += getPartialPath(prev, cur, next, radius as number)
146
- }
147
- d += `L ${points[i][0]} ${points[i][1]}`
148
- }
149
- return d
150
- }
151
-
152
- class CurvedEdge extends PolylineEdge {
153
- getEdge(): h.JSX.Element {
154
- const { model } = this.props
155
- const { points: pointsStr, isAnimation, arrowConfig, radius = 5 } = model
156
- const style = model.getEdgeStyle()
157
- const animationStyle = model.getEdgeAnimationStyle()
158
- const points = pointFilter(
159
- pointsStr.split(' ').map((p) => p.split(',').map((a) => +a)),
160
- )
161
- const d = getCurvedEdgePath(points, radius as number)
162
- const attrs = {
163
- style: isAnimation ? animationStyle : {},
164
- ...style,
165
- ...arrowConfig,
166
- fill: 'none',
167
- }
168
- return h('path', {
169
- d,
170
- ...attrs,
171
- })
172
- }
173
- }
174
-
175
- class CurvedEdgeModel extends PolylineEdgeModel {}
176
-
177
- const defaultCurvedEdge = {
178
- type: 'curved-edge',
179
- view: CurvedEdge,
180
- model: CurvedEdgeModel,
181
- }
182
-
183
- export default defaultCurvedEdge
184
-
185
- export { CurvedEdge, CurvedEdgeModel, getCurvedEdgePath }