@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.
- package/README.md +16 -0
- package/dist/index.css +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/NodeResize/node/RectResize.d.ts +0 -6
- package/es/NodeResize/node/RectResize.js +2 -11
- package/es/bpmn-elements-adapter/json2xml.d.ts +2 -1
- package/es/bpmn-elements-adapter/json2xml.js +18 -4
- package/es/bpmn-elements-adapter/xml2json.js +2 -7
- package/es/components/control/index.d.ts +1 -0
- package/es/components/control/index.js +24 -11
- package/es/components/mini-map/index.js +1 -1
- package/es/dynamic-group/model.d.ts +2 -1
- package/es/dynamic-group/model.js +28 -11
- package/es/dynamic-group/node.js +1 -0
- package/es/index.css +1 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +2 -0
- package/es/insert-node-in-polyline/index.js +11 -35
- package/es/materials/curved-edge/index.js +49 -21
- package/es/materials/group/GroupNode.d.ts +0 -6
- package/es/materials/group/GroupNode.js +1 -6
- package/es/pool/LaneModel.d.ts +90 -0
- package/es/pool/LaneModel.js +252 -0
- package/es/pool/LaneView.d.ts +40 -0
- package/es/pool/LaneView.js +202 -0
- package/es/pool/PoolModel.d.ts +120 -0
- package/es/pool/PoolModel.js +586 -0
- package/es/pool/PoolView.d.ts +17 -0
- package/es/pool/PoolView.js +76 -0
- package/es/pool/constant.d.ts +15 -0
- package/es/pool/constant.js +17 -0
- package/es/pool/index.d.ts +89 -0
- package/es/pool/index.js +524 -0
- package/es/pool/utils.d.ts +19 -0
- package/es/pool/utils.js +33 -0
- package/es/style/index.css +1 -1
- package/es/style/raw.d.ts +1 -1
- package/es/style/raw.js +1 -1
- package/es/tools/label/LabelOverlay.js +3 -3
- package/es/tools/label/mediumEditor.d.ts +1 -1
- package/es/tools/label/mediumEditor.js +89 -52
- package/es/tools/snapshot/index.d.ts +7 -3
- package/es/tools/snapshot/index.js +72 -77
- package/lib/NodeResize/node/RectResize.d.ts +0 -6
- package/lib/NodeResize/node/RectResize.js +1 -10
- package/lib/bpmn-elements-adapter/json2xml.d.ts +2 -1
- package/lib/bpmn-elements-adapter/json2xml.js +19 -4
- package/lib/bpmn-elements-adapter/xml2json.js +2 -7
- package/lib/components/control/index.d.ts +1 -0
- package/lib/components/control/index.js +24 -11
- package/lib/components/mini-map/index.js +1 -1
- package/lib/dynamic-group/model.d.ts +2 -1
- package/lib/dynamic-group/model.js +28 -11
- package/lib/dynamic-group/node.js +1 -0
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/insert-node-in-polyline/index.js +10 -34
- package/lib/materials/curved-edge/index.js +49 -21
- package/lib/materials/group/GroupNode.d.ts +0 -6
- package/lib/materials/group/GroupNode.js +1 -6
- package/lib/pool/LaneModel.d.ts +90 -0
- package/lib/pool/LaneModel.js +255 -0
- package/lib/pool/LaneView.d.ts +40 -0
- package/lib/pool/LaneView.js +205 -0
- package/lib/pool/PoolModel.d.ts +120 -0
- package/lib/pool/PoolModel.js +589 -0
- package/lib/pool/PoolView.d.ts +17 -0
- package/lib/pool/PoolView.js +79 -0
- package/lib/pool/constant.d.ts +15 -0
- package/lib/pool/constant.js +20 -0
- package/lib/pool/index.d.ts +89 -0
- package/lib/pool/index.js +527 -0
- package/lib/pool/utils.d.ts +19 -0
- package/lib/pool/utils.js +38 -0
- package/lib/style/index.css +1 -1
- package/lib/style/raw.d.ts +1 -1
- package/lib/style/raw.js +1 -1
- package/lib/tools/label/LabelOverlay.js +2 -2
- package/lib/tools/label/mediumEditor.d.ts +1 -1
- package/lib/tools/label/mediumEditor.js +91 -53
- package/lib/tools/snapshot/index.d.ts +7 -3
- package/lib/tools/snapshot/index.js +72 -77
- package/package.json +10 -7
- package/.turbo/turbo-build.log +0 -38
- package/CHANGELOG.md +0 -1766
- package/__test__/bpmn-adapter.test.js +0 -227
- package/es/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
- package/es/materials/curved-edge/__test__/curved-edge.test.js +0 -18
- package/jest.config.js +0 -198
- package/lib/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
- package/lib/materials/curved-edge/__test__/curved-edge.test.js +0 -20
- package/rollup.config.js +0 -52
- package/src/NodeResize/BasicShape/Ellipse.tsx +0 -22
- package/src/NodeResize/BasicShape/Polygon.tsx +0 -24
- package/src/NodeResize/BasicShape/Rect.tsx +0 -44
- package/src/NodeResize/control/Control.tsx +0 -537
- package/src/NodeResize/control/ControlGroup.tsx +0 -76
- package/src/NodeResize/control/Util.ts +0 -206
- package/src/NodeResize/index.ts +0 -26
- package/src/NodeResize/node/DiamondResize.tsx +0 -149
- package/src/NodeResize/node/EllipseResize.tsx +0 -140
- package/src/NodeResize/node/HtmlResize.tsx +0 -125
- package/src/NodeResize/node/RectResize.tsx +0 -146
- package/src/NodeResize/node/index.ts +0 -4
- package/src/bpmn/constant.ts +0 -56
- package/src/bpmn/events/EndEvent.ts +0 -73
- package/src/bpmn/events/StartEvent.ts +0 -52
- package/src/bpmn/events/index.ts +0 -2
- package/src/bpmn/flow/SequenceFlow.ts +0 -25
- package/src/bpmn/flow/index.ts +0 -1
- package/src/bpmn/gateways/ExclusiveGateway.ts +0 -71
- package/src/bpmn/gateways/index.ts +0 -1
- package/src/bpmn/getBpmnId.ts +0 -31
- package/src/bpmn/index.ts +0 -60
- package/src/bpmn/tasks/ServiceTask.ts +0 -63
- package/src/bpmn/tasks/UserTask.ts +0 -64
- package/src/bpmn/tasks/index.ts +0 -2
- package/src/bpmn-adapter/bpmnIds.ts +0 -31
- package/src/bpmn-adapter/index.ts +0 -835
- package/src/bpmn-adapter/json2xml.ts +0 -127
- package/src/bpmn-adapter/xml2json.ts +0 -544
- package/src/bpmn-elements/README.md +0 -223
- package/src/bpmn-elements/__tests__/definition.test.js +0 -72
- package/src/bpmn-elements/index.d.ts +0 -26
- package/src/bpmn-elements/index.ts +0 -107
- package/src/bpmn-elements/presets/Event/EndEventFactory.ts +0 -114
- package/src/bpmn-elements/presets/Event/IntermediateCatchEvent.ts +0 -108
- package/src/bpmn-elements/presets/Event/IntermediateThrowEvent.ts +0 -109
- package/src/bpmn-elements/presets/Event/StartEventFactory.ts +0 -114
- package/src/bpmn-elements/presets/Event/boundaryEventFactory.ts +0 -117
- package/src/bpmn-elements/presets/Event/index.ts +0 -14
- package/src/bpmn-elements/presets/Flow/flow.d.ts +0 -6
- package/src/bpmn-elements/presets/Flow/index.ts +0 -8
- package/src/bpmn-elements/presets/Flow/manhattan.ts +0 -691
- package/src/bpmn-elements/presets/Flow/sequenceFlow.ts +0 -65
- package/src/bpmn-elements/presets/Gateway/gateway.ts +0 -107
- package/src/bpmn-elements/presets/Gateway/index.ts +0 -23
- package/src/bpmn-elements/presets/Pool/Lane.ts +0 -211
- package/src/bpmn-elements/presets/Pool/Pool.ts +0 -284
- package/src/bpmn-elements/presets/Pool/index.ts +0 -89
- package/src/bpmn-elements/presets/Task/index.ts +0 -122
- package/src/bpmn-elements/presets/Task/subProcess.ts +0 -189
- package/src/bpmn-elements/presets/Task/task.ts +0 -193
- package/src/bpmn-elements/presets/icons.ts +0 -155
- package/src/bpmn-elements/utils.ts +0 -52
- package/src/bpmn-elements-adapter/README.md +0 -293
- package/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +0 -528
- package/src/bpmn-elements-adapter/__tests__/adapter_out.test.js +0 -569
- package/src/bpmn-elements-adapter/constant.ts +0 -76
- package/src/bpmn-elements-adapter/index.ts +0 -1134
- package/src/bpmn-elements-adapter/json2xml.ts +0 -91
- package/src/bpmn-elements-adapter/xml2json.ts +0 -548
- package/src/components/context-menu/index.ts +0 -253
- package/src/components/control/index.ts +0 -141
- package/src/components/dnd-panel/index.ts +0 -137
- package/src/components/highlight/index.ts +0 -227
- package/src/components/menu/index.ts +0 -748
- package/src/components/mini-map/index.ts +0 -686
- package/src/components/selection-select/index.ts +0 -387
- package/src/dynamic-group/index.ts +0 -775
- package/src/dynamic-group/model.ts +0 -562
- package/src/dynamic-group/node.ts +0 -288
- package/src/dynamic-group/utils.ts +0 -46
- package/src/index.less +0 -1
- package/src/index.ts +0 -45
- package/src/insert-node-in-polyline/edge.ts +0 -175
- package/src/insert-node-in-polyline/index.ts +0 -187
- package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
- package/src/materials/curved-edge/index.ts +0 -185
- package/src/materials/group/GroupNode.ts +0 -442
- package/src/materials/group/index.ts +0 -542
- package/src/materials/node-selection/index.ts +0 -380
- package/src/mindmap/fakerRoot.ts +0 -19
- package/src/mindmap/index.ts +0 -328
- package/src/mindmap/markContent.ts +0 -81
- package/src/mindmap/markContentOption.ts +0 -81
- package/src/mindmap/markEntity.ts +0 -82
- package/src/mindmap/markRoot.ts +0 -83
- package/src/mindmap/theme.ts +0 -11
- package/src/rect-label-node/RectLabelNodeView.ts +0 -33
- package/src/rect-label-node/index.ts +0 -15
- package/src/style/index.less +0 -342
- package/src/style/raw.ts +0 -295
- package/src/tools/auto-layout/index.ts +0 -282
- package/src/tools/flow-path/index.ts +0 -233
- package/src/tools/label/Label.tsx +0 -357
- package/src/tools/label/LabelModel.ts +0 -83
- package/src/tools/label/LabelOverlay.tsx +0 -158
- package/src/tools/label/algorithm.ts +0 -42
- package/src/tools/label/index.ts +0 -479
- package/src/tools/label/mediumEditor.ts +0 -94
- package/src/tools/label/utils.ts +0 -395
- package/src/tools/proximity-connect/index.ts +0 -435
- package/src/tools/snapshot/README.md +0 -145
- package/src/tools/snapshot/index.ts +0 -718
- package/src/tools/snapshot/utils.ts +0 -163
- package/src/turbo-adapter/index.ts +0 -212
- package/stats.html +0 -4842
- 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 }
|