@plait/draw 0.62.0-next.0 → 0.62.0-next.10
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/arrow-line.component.d.ts +26 -0
- package/constants/geometry.d.ts +1 -0
- package/constants/pointer.d.ts +3 -3
- package/esm2022/arrow-line.component.mjs +157 -0
- package/esm2022/constants/geometry.mjs +10 -3
- package/esm2022/constants/pointer.mjs +4 -4
- package/esm2022/engines/basic-shapes/ellipse.mjs +5 -3
- package/esm2022/engines/basic-shapes/round-comment.mjs +5 -3
- package/esm2022/engines/flowchart/note-curly-left.mjs +2 -2
- package/esm2022/engines/flowchart/note-curly-right.mjs +7 -7
- package/esm2022/engines/flowchart/note-square.mjs +2 -2
- package/esm2022/engines/flowchart/or.mjs +5 -3
- package/esm2022/engines/flowchart/summing-junction.mjs +5 -3
- package/esm2022/engines/table/table.mjs +48 -26
- package/esm2022/engines/uml/deletion.mjs +3 -2
- package/esm2022/engines/uml/required-interface.mjs +3 -2
- package/esm2022/generators/arrow-line-active.generator.mjs +81 -0
- package/esm2022/generators/arrow-line-auto-complete.generator.mjs +46 -0
- package/esm2022/generators/arrow-line.generator.mjs +13 -0
- package/esm2022/generators/index.mjs +3 -3
- package/esm2022/generators/table.generator.mjs +8 -4
- package/esm2022/geometry.component.mjs +4 -4
- package/esm2022/image.component.mjs +4 -4
- package/esm2022/interfaces/arrow-line.mjs +70 -0
- package/esm2022/interfaces/element.mjs +2 -2
- package/esm2022/interfaces/index.mjs +14 -7
- package/esm2022/interfaces/vector-line.mjs +6 -0
- package/esm2022/plugins/with-arrow-line-auto-complete-reaction.mjs +41 -0
- package/esm2022/plugins/with-arrow-line-auto-complete.mjs +74 -0
- package/esm2022/plugins/with-arrow-line-bound-reaction.mjs +53 -0
- package/esm2022/plugins/with-arrow-line-create.mjs +53 -0
- package/esm2022/plugins/with-arrow-line-resize.mjs +158 -0
- package/esm2022/plugins/with-arrow-line-text-move.mjs +53 -0
- package/esm2022/plugins/with-arrow-line-text.mjs +63 -0
- package/esm2022/plugins/with-draw-fragment.mjs +13 -13
- package/esm2022/plugins/with-draw-resize.mjs +12 -5
- package/esm2022/plugins/with-draw.mjs +27 -20
- package/esm2022/plugins/with-geometry-resize.mjs +1 -1
- package/esm2022/plugins/with-swimlane-create.mjs +4 -7
- package/esm2022/plugins/with-swimlane.mjs +1 -20
- package/esm2022/plugins/with-table.mjs +34 -7
- package/esm2022/public-api.mjs +3 -3
- package/esm2022/table.component.mjs +6 -6
- package/esm2022/transforms/arrow-line.mjs +66 -0
- package/esm2022/transforms/common.mjs +36 -0
- package/esm2022/transforms/geometry.mjs +6 -28
- package/esm2022/transforms/index.mjs +15 -13
- package/esm2022/transforms/swimlane.mjs +1 -29
- package/esm2022/transforms/table-text.mjs +5 -5
- package/esm2022/transforms/table.mjs +30 -0
- package/esm2022/utils/arrow-line/arrow-line-arrow.mjs +123 -0
- package/esm2022/utils/arrow-line/arrow-line-basic.mjs +257 -0
- package/esm2022/utils/arrow-line/arrow-line-common.mjs +162 -0
- package/esm2022/utils/arrow-line/arrow-line-resize.mjs +309 -0
- package/esm2022/utils/arrow-line/elbow.mjs +114 -0
- package/esm2022/utils/arrow-line/index.mjs +6 -0
- package/esm2022/utils/clipboard.mjs +10 -10
- package/esm2022/utils/common.mjs +14 -5
- package/esm2022/utils/geometry.mjs +17 -14
- package/esm2022/utils/hit.mjs +67 -44
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/memorize.mjs +4 -5
- package/esm2022/utils/position/arrow-line.mjs +67 -0
- package/esm2022/utils/position/geometry.mjs +1 -1
- package/esm2022/utils/selected.mjs +3 -3
- package/esm2022/utils/style/stroke.mjs +4 -4
- package/esm2022/utils/swimlane.mjs +17 -8
- package/esm2022/utils/table-selected.mjs +3 -4
- package/esm2022/utils/table.mjs +28 -5
- package/fesm2022/plait-draw.mjs +673 -514
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/arrow-line-active.generator.d.ts +13 -0
- package/generators/{line-auto-complete.generator.d.ts → arrow-line-auto-complete.generator.d.ts} +1 -1
- package/generators/arrow-line.generator.d.ts +8 -0
- package/generators/index.d.ts +2 -2
- package/geometry.component.d.ts +2 -2
- package/image.component.d.ts +2 -2
- package/interfaces/arrow-line.d.ts +75 -0
- package/interfaces/element.d.ts +1 -1
- package/interfaces/index.d.ts +6 -4
- package/interfaces/vector-line.d.ts +16 -0
- package/package.json +12 -4
- package/plugins/with-arrow-line-auto-complete-reaction.d.ts +2 -0
- package/plugins/with-arrow-line-auto-complete.d.ts +7 -0
- package/plugins/with-arrow-line-bound-reaction.d.ts +2 -0
- package/plugins/with-arrow-line-create.d.ts +2 -0
- package/plugins/with-arrow-line-resize.d.ts +2 -0
- package/plugins/with-arrow-line-text-move.d.ts +2 -0
- package/plugins/with-arrow-line-text.d.ts +2 -0
- package/plugins/with-draw-fragment.d.ts +2 -2
- package/plugins/with-swimlane.d.ts +1 -2
- package/public-api.d.ts +2 -2
- package/table.component.d.ts +2 -2
- package/transforms/arrow-line.d.ts +8 -0
- package/transforms/common.d.ts +3 -0
- package/transforms/geometry.d.ts +1 -2
- package/transforms/index.d.ts +9 -9
- package/transforms/swimlane.d.ts +1 -3
- package/transforms/table-text.d.ts +2 -3
- package/transforms/table.d.ts +3 -0
- package/utils/arrow-line/arrow-line-arrow.d.ts +4 -0
- package/utils/arrow-line/arrow-line-basic.d.ts +13 -0
- package/utils/{line/line-common.d.ts → arrow-line/arrow-line-common.d.ts} +8 -4
- package/utils/{line/line-resize.d.ts → arrow-line/arrow-line-resize.d.ts} +3 -3
- package/utils/{line → arrow-line}/elbow.d.ts +7 -7
- package/utils/arrow-line/index.d.ts +5 -0
- package/utils/clipboard.d.ts +4 -4
- package/utils/common.d.ts +1 -0
- package/utils/geometry.d.ts +2 -1
- package/utils/hit.d.ts +7 -4
- package/utils/index.d.ts +1 -1
- package/utils/position/arrow-line.d.ts +16 -0
- package/utils/selected.d.ts +2 -2
- package/utils/style/stroke.d.ts +3 -4
- package/utils/swimlane.d.ts +3 -2
- package/utils/table.d.ts +2 -0
- package/esm2022/generators/line-active.generator.mjs +0 -81
- package/esm2022/generators/line-auto-complete.generator.mjs +0 -46
- package/esm2022/generators/line.generator.mjs +0 -13
- package/esm2022/interfaces/line.mjs +0 -70
- package/esm2022/line.component.mjs +0 -155
- package/esm2022/plugins/with-line-auto-complete-reaction.mjs +0 -41
- package/esm2022/plugins/with-line-auto-complete.mjs +0 -75
- package/esm2022/plugins/with-line-bound-reaction.mjs +0 -53
- package/esm2022/plugins/with-line-create.mjs +0 -53
- package/esm2022/plugins/with-line-resize.mjs +0 -158
- package/esm2022/plugins/with-line-text-move.mjs +0 -53
- package/esm2022/plugins/with-line-text.mjs +0 -62
- package/esm2022/transforms/line.mjs +0 -100
- package/esm2022/utils/line/elbow.mjs +0 -114
- package/esm2022/utils/line/index.mjs +0 -6
- package/esm2022/utils/line/line-arrow.mjs +0 -123
- package/esm2022/utils/line/line-basic.mjs +0 -257
- package/esm2022/utils/line/line-common.mjs +0 -123
- package/esm2022/utils/line/line-resize.mjs +0 -309
- package/esm2022/utils/position/line.mjs +0 -67
- package/generators/line-active.generator.d.ts +0 -13
- package/generators/line.generator.d.ts +0 -8
- package/interfaces/line.d.ts +0 -75
- package/line.component.d.ts +0 -26
- package/plugins/with-line-auto-complete-reaction.d.ts +0 -2
- package/plugins/with-line-auto-complete.d.ts +0 -7
- package/plugins/with-line-bound-reaction.d.ts +0 -2
- package/plugins/with-line-create.d.ts +0 -2
- package/plugins/with-line-resize.d.ts +0 -2
- package/plugins/with-line-text-move.d.ts +0 -2
- package/plugins/with-line-text.d.ts +0 -2
- package/transforms/line.d.ts +0 -12
- package/utils/line/index.d.ts +0 -5
- package/utils/line/line-arrow.d.ts +0 -4
- package/utils/line/line-basic.d.ts +0 -13
- package/utils/position/line.d.ts +0 -16
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Point, idCreator, PlaitBoard, createG, RectangleClient, findElements, drawLinearPath, createMask, createRect, distanceBetweenPointAndPoint, catmullRomFitting, setStrokeLinecap } from '@plait/core';
|
|
2
|
+
import { pointsOnBezierCurves } from 'points-on-curve';
|
|
3
|
+
import { getPointOnPolyline, getPointByVectorComponent, removeDuplicatePoints, getExtendPoint } from '@plait/common';
|
|
4
|
+
import { ArrowLineMarkerType, ArrowLineShape, PlaitArrowLine, PlaitDrawElement, StrokeStyle } from '../../interfaces';
|
|
5
|
+
import { getLineDashByElement, getStrokeColorByElement } from '../style/stroke';
|
|
6
|
+
import { getEngine } from '../../engines';
|
|
7
|
+
import { getElementShape } from '../shape';
|
|
8
|
+
import { DefaultLineStyle, LINE_TEXT_SPACE } from '../../constants/line';
|
|
9
|
+
import { ArrowLineShapeGenerator } from '../../generators/arrow-line.generator';
|
|
10
|
+
import { LINE_SNAPPING_CONNECTOR_BUFFER } from '../../constants';
|
|
11
|
+
import { getLineMemorizedLatest } from '../memorize';
|
|
12
|
+
import { alignPoints } from './arrow-line-resize';
|
|
13
|
+
import { getElbowLineRouteOptions, getArrowLineHandleRefPair } from './arrow-line-common';
|
|
14
|
+
import { getElbowPoints, getNextSourceAndTargetPoints, isUseDefaultOrthogonalRoute } from './elbow';
|
|
15
|
+
import { drawArrowLineArrow } from './arrow-line-arrow';
|
|
16
|
+
import { getSnappingRef, getSnappingShape, getStrokeWidthByElement } from '../common';
|
|
17
|
+
export const createArrowLineElement = (shape, points, source, target, texts, options) => {
|
|
18
|
+
return {
|
|
19
|
+
id: idCreator(),
|
|
20
|
+
type: 'arrow-line',
|
|
21
|
+
shape,
|
|
22
|
+
source,
|
|
23
|
+
texts: texts ? texts : [],
|
|
24
|
+
target,
|
|
25
|
+
opacity: 1,
|
|
26
|
+
points,
|
|
27
|
+
...options
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const getArrowLinePoints = (board, element) => {
|
|
31
|
+
switch (element.shape) {
|
|
32
|
+
case ArrowLineShape.elbow: {
|
|
33
|
+
return getElbowPoints(board, element);
|
|
34
|
+
}
|
|
35
|
+
case ArrowLineShape.curve: {
|
|
36
|
+
return getCurvePoints(board, element);
|
|
37
|
+
}
|
|
38
|
+
default: {
|
|
39
|
+
const points = PlaitArrowLine.getPoints(board, element);
|
|
40
|
+
const handleRefPair = getArrowLineHandleRefPair(board, element);
|
|
41
|
+
points[0] = handleRefPair.source.point;
|
|
42
|
+
points[points.length - 1] = handleRefPair.target.point;
|
|
43
|
+
return points;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export const getCurvePoints = (board, element) => {
|
|
48
|
+
if (element.points.length === 2) {
|
|
49
|
+
const handleRefPair = getArrowLineHandleRefPair(board, element);
|
|
50
|
+
const { source, target } = handleRefPair;
|
|
51
|
+
const sourceBoundElement = handleRefPair.source.boundElement;
|
|
52
|
+
const targetBoundElement = handleRefPair.target.boundElement;
|
|
53
|
+
let curvePoints = [source.point];
|
|
54
|
+
const sumDistance = distanceBetweenPointAndPoint(...source.point, ...target.point);
|
|
55
|
+
const offset = 12 + sumDistance / 3;
|
|
56
|
+
if (sourceBoundElement) {
|
|
57
|
+
curvePoints.push(getPointByVectorComponent(source.point, source.vector, offset));
|
|
58
|
+
}
|
|
59
|
+
if (targetBoundElement) {
|
|
60
|
+
curvePoints.push(getPointByVectorComponent(target.point, target.vector, offset));
|
|
61
|
+
}
|
|
62
|
+
const isSingleBound = (sourceBoundElement && !targetBoundElement) || (!sourceBoundElement && targetBoundElement);
|
|
63
|
+
if (isSingleBound) {
|
|
64
|
+
curvePoints.push(target.point);
|
|
65
|
+
const points = Q2C(curvePoints);
|
|
66
|
+
return pointsOnBezierCurves(points);
|
|
67
|
+
}
|
|
68
|
+
if (!sourceBoundElement && !targetBoundElement) {
|
|
69
|
+
curvePoints.push(getPointByVectorComponent(source.point, source.vector, offset));
|
|
70
|
+
curvePoints.push(getPointByVectorComponent(target.point, target.vector, offset));
|
|
71
|
+
}
|
|
72
|
+
curvePoints.push(target.point);
|
|
73
|
+
return pointsOnBezierCurves(curvePoints);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
let dataPoints = PlaitArrowLine.getPoints(board, element);
|
|
77
|
+
dataPoints = removeDuplicatePoints(dataPoints);
|
|
78
|
+
const points = catmullRomFitting(dataPoints);
|
|
79
|
+
return pointsOnBezierCurves(points);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
export function getMiddlePoints(board, element) {
|
|
83
|
+
const result = [];
|
|
84
|
+
const shape = element.shape;
|
|
85
|
+
const hideBuffer = 10;
|
|
86
|
+
if (shape === ArrowLineShape.straight) {
|
|
87
|
+
const points = PlaitArrowLine.getPoints(board, element);
|
|
88
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
89
|
+
const distance = distanceBetweenPointAndPoint(...points[i], ...points[i + 1]);
|
|
90
|
+
if (distance < hideBuffer)
|
|
91
|
+
continue;
|
|
92
|
+
result.push([(points[i][0] + points[i + 1][0]) / 2, (points[i][1] + points[i + 1][1]) / 2]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (shape === ArrowLineShape.curve) {
|
|
96
|
+
const points = PlaitArrowLine.getPoints(board, element);
|
|
97
|
+
const pointsOnBezier = getCurvePoints(board, element);
|
|
98
|
+
if (points.length === 2) {
|
|
99
|
+
const start = 0;
|
|
100
|
+
const endIndex = pointsOnBezier.length - 1;
|
|
101
|
+
const middleIndex = Math.round((start + endIndex) / 2);
|
|
102
|
+
result.push(pointsOnBezier[middleIndex]);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
106
|
+
const startIndex = pointsOnBezier.findIndex(point => point[0] === points[i][0] && point[1] === points[i][1]);
|
|
107
|
+
const endIndex = pointsOnBezier.findIndex(point => point[0] === points[i + 1][0] && point[1] === points[i + 1][1]);
|
|
108
|
+
const middleIndex = Math.round((startIndex + endIndex) / 2);
|
|
109
|
+
const distance = distanceBetweenPointAndPoint(...points[i], ...points[i + 1]);
|
|
110
|
+
if (distance < hideBuffer)
|
|
111
|
+
continue;
|
|
112
|
+
result.push(pointsOnBezier[middleIndex]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (shape === ArrowLineShape.elbow) {
|
|
117
|
+
const renderPoints = getElbowPoints(board, element);
|
|
118
|
+
const options = getElbowLineRouteOptions(board, element);
|
|
119
|
+
if (!isUseDefaultOrthogonalRoute(element, options)) {
|
|
120
|
+
const [nextSourcePoint, nextTargetPoint] = getNextSourceAndTargetPoints(board, element);
|
|
121
|
+
for (let i = 0; i < renderPoints.length - 1; i++) {
|
|
122
|
+
if ((i == 0 && Point.isEquals(renderPoints[i + 1], nextSourcePoint)) ||
|
|
123
|
+
(i === renderPoints.length - 2 && Point.isEquals(renderPoints[renderPoints.length - 2], nextTargetPoint))) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const [currentX, currentY] = renderPoints[i];
|
|
127
|
+
const [nextX, nextY] = renderPoints[i + 1];
|
|
128
|
+
const middlePoint = [(currentX + nextX) / 2, (currentY + nextY) / 2];
|
|
129
|
+
result.push(middlePoint);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
export const drawArrowLine = (board, element) => {
|
|
136
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
137
|
+
const strokeColor = getStrokeColorByElement(board, element);
|
|
138
|
+
const strokeLineDash = getLineDashByElement(element);
|
|
139
|
+
const options = { stroke: strokeColor, strokeWidth, strokeLineDash };
|
|
140
|
+
const lineG = createG();
|
|
141
|
+
let points = getArrowLinePoints(board, element);
|
|
142
|
+
let line;
|
|
143
|
+
if (element.shape === ArrowLineShape.curve) {
|
|
144
|
+
line = PlaitBoard.getRoughSVG(board).curve(points, options);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
line = drawLinearPath(points, options);
|
|
148
|
+
}
|
|
149
|
+
const id = idCreator();
|
|
150
|
+
line.setAttribute('mask', `url(#${id})`);
|
|
151
|
+
if (element.strokeStyle === StrokeStyle.dotted) {
|
|
152
|
+
setStrokeLinecap(line, 'round');
|
|
153
|
+
}
|
|
154
|
+
lineG.appendChild(line);
|
|
155
|
+
const { mask, maskTargetFillRect } = drawArrowLineMask(board, element, id);
|
|
156
|
+
lineG.appendChild(mask);
|
|
157
|
+
line.appendChild(maskTargetFillRect);
|
|
158
|
+
const arrow = drawArrowLineArrow(element, points, { stroke: strokeColor, strokeWidth });
|
|
159
|
+
arrow && lineG.appendChild(arrow);
|
|
160
|
+
return lineG;
|
|
161
|
+
};
|
|
162
|
+
export const getHitConnection = (board, point, hitElement) => {
|
|
163
|
+
let rectangle = RectangleClient.getRectangleByPoints(hitElement.points);
|
|
164
|
+
const ref = getSnappingRef(board, hitElement, point);
|
|
165
|
+
const connectionPoint = ref.connectorPoint || ref.edgePoint;
|
|
166
|
+
return [(connectionPoint[0] - rectangle.x) / rectangle.width, (connectionPoint[1] - rectangle.y) / rectangle.height];
|
|
167
|
+
};
|
|
168
|
+
export const getHitConnectorPoint = (point, hitElement) => {
|
|
169
|
+
const rectangle = RectangleClient.getRectangleByPoints(hitElement.points);
|
|
170
|
+
const shape = getElementShape(hitElement);
|
|
171
|
+
const connectorPoints = getEngine(shape).getConnectorPoints(rectangle);
|
|
172
|
+
return connectorPoints.find(connectorPoint => {
|
|
173
|
+
return distanceBetweenPointAndPoint(...connectorPoint, ...point) <= LINE_SNAPPING_CONNECTOR_BUFFER;
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
export const getArrowLineTextRectangle = (board, element, index) => {
|
|
177
|
+
const text = element.texts[index];
|
|
178
|
+
const elbowPoints = getArrowLinePoints(board, element);
|
|
179
|
+
const point = getPointOnPolyline(elbowPoints, text.position);
|
|
180
|
+
return {
|
|
181
|
+
x: point[0] - text.width / 2,
|
|
182
|
+
y: point[1] - text.height / 2,
|
|
183
|
+
width: text.width,
|
|
184
|
+
height: text.height
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
export const getArrowLines = (board) => {
|
|
188
|
+
return findElements(board, {
|
|
189
|
+
match: (element) => PlaitDrawElement.isArrowLine(element),
|
|
190
|
+
recursion: (element) => PlaitDrawElement.isDrawElement(element)
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
// quadratic Bezier to cubic Bezier
|
|
194
|
+
export const Q2C = (points) => {
|
|
195
|
+
const result = [];
|
|
196
|
+
const numSegments = points.length / 3;
|
|
197
|
+
for (let i = 0; i < numSegments; i++) {
|
|
198
|
+
const start = points[i];
|
|
199
|
+
const qControl = points[i + 1];
|
|
200
|
+
const end = points[i + 2];
|
|
201
|
+
const startDistance = distanceBetweenPointAndPoint(...start, ...qControl);
|
|
202
|
+
const endDistance = distanceBetweenPointAndPoint(...end, ...qControl);
|
|
203
|
+
const cControl1 = getExtendPoint(start, qControl, (startDistance * 2) / 3);
|
|
204
|
+
const cControl2 = getExtendPoint(end, qControl, (endDistance * 2) / 3);
|
|
205
|
+
result.push(start, cControl1, cControl2, end);
|
|
206
|
+
}
|
|
207
|
+
return result;
|
|
208
|
+
};
|
|
209
|
+
export const handleArrowLineCreating = (board, lineShape, sourcePoint, movingPoint, sourceElement, lineShapeG) => {
|
|
210
|
+
const hitElement = getSnappingShape(board, movingPoint);
|
|
211
|
+
const targetConnection = hitElement ? getHitConnection(board, movingPoint, hitElement) : undefined;
|
|
212
|
+
const sourceConnection = sourceElement ? getHitConnection(board, sourcePoint, sourceElement) : undefined;
|
|
213
|
+
const targetBoundId = hitElement ? hitElement.id : undefined;
|
|
214
|
+
const lineGenerator = new ArrowLineShapeGenerator(board);
|
|
215
|
+
const memorizedLatest = getLineMemorizedLatest();
|
|
216
|
+
let sourceMarker, targetMarker;
|
|
217
|
+
sourceMarker = memorizedLatest.source;
|
|
218
|
+
targetMarker = memorizedLatest.target;
|
|
219
|
+
sourceMarker && delete memorizedLatest.source;
|
|
220
|
+
targetMarker && delete memorizedLatest.target;
|
|
221
|
+
const temporaryLineElement = createArrowLineElement(lineShape, [sourcePoint, movingPoint], { marker: sourceMarker || ArrowLineMarkerType.none, connection: sourceConnection, boundId: sourceElement?.id }, { marker: targetMarker || ArrowLineMarkerType.arrow, connection: targetConnection, boundId: targetBoundId }, [], {
|
|
222
|
+
strokeWidth: DefaultLineStyle.strokeWidth,
|
|
223
|
+
...memorizedLatest
|
|
224
|
+
});
|
|
225
|
+
const linePoints = getArrowLinePoints(board, temporaryLineElement);
|
|
226
|
+
const otherPoint = linePoints[0];
|
|
227
|
+
temporaryLineElement.points[1] = alignPoints(otherPoint, movingPoint);
|
|
228
|
+
lineGenerator.processDrawing(temporaryLineElement, lineShapeG);
|
|
229
|
+
PlaitBoard.getElementActiveHost(board).append(lineShapeG);
|
|
230
|
+
return temporaryLineElement;
|
|
231
|
+
};
|
|
232
|
+
function drawArrowLineMask(board, element, id) {
|
|
233
|
+
const mask = createMask();
|
|
234
|
+
mask.setAttribute('id', id);
|
|
235
|
+
const points = getArrowLinePoints(board, element);
|
|
236
|
+
let rectangle = RectangleClient.getRectangleByPoints(points);
|
|
237
|
+
rectangle = RectangleClient.getOutlineRectangle(rectangle, -30);
|
|
238
|
+
const maskFillRect = createRect(rectangle, {
|
|
239
|
+
fill: 'white'
|
|
240
|
+
});
|
|
241
|
+
mask.appendChild(maskFillRect);
|
|
242
|
+
const texts = element.texts;
|
|
243
|
+
texts.forEach((text, index) => {
|
|
244
|
+
let textRectangle = getArrowLineTextRectangle(board, element, index);
|
|
245
|
+
textRectangle = RectangleClient.inflate(textRectangle, LINE_TEXT_SPACE * 2);
|
|
246
|
+
const rect = createRect(textRectangle, {
|
|
247
|
+
fill: 'black'
|
|
248
|
+
});
|
|
249
|
+
mask.appendChild(rect);
|
|
250
|
+
});
|
|
251
|
+
// open line
|
|
252
|
+
const maskTargetFillRect = createRect(rectangle);
|
|
253
|
+
maskTargetFillRect.setAttribute('opacity', '0');
|
|
254
|
+
maskTargetFillRect.setAttribute('fill', 'none');
|
|
255
|
+
return { mask, maskTargetFillRect };
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3ctbGluZS1iYXNpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2Fycm93LWxpbmUvYXJyb3ctbGluZS1iYXNpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBRVosY0FBYyxFQUNkLFVBQVUsRUFDVixVQUFVLEVBQ1YsNEJBQTRCLEVBQzVCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDbkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBRUgsbUJBQW1CLEVBQ25CLGNBQWMsRUFFZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBRWhCLFdBQVcsRUFDZCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIs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QUMsYUFBYSxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ25DLElBQUksRUFBRSxPQUFPO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxZQUFZO0lBQ1osTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakQsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQb2ludCxcbiAgICBpZENyZWF0b3IsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBjcmVhdGVHLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBmaW5kRWxlbWVudHMsXG4gICAgUGxhaXRFbGVtZW50LFxuICAgIGRyYXdMaW5lYXJQYXRoLFxuICAgIGNyZWF0ZU1hc2ssXG4gICAgY3JlYXRlUmVjdCxcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50LFxuICAgIGNhdG11bGxSb21GaXR0aW5nLFxuICAgIHNldFN0cm9rZUxpbmVjYXBcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgcG9pbnRzT25CZXppZXJDdXJ2ZXMgfSBmcm9tICdwb2ludHMtb24tY3VydmUnO1xuaW1wb3J0IHsgZ2V0UG9pbnRPblBvbHlsaW5lLCBnZXRQb2ludEJ5VmVjdG9yQ29tcG9uZW50LCByZW1vdmVEdXBsaWNhdGVQb2ludHMsIGdldEV4dGVuZFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFycm93TGluZUhhbmRsZSxcbiAgICBBcnJvd0xpbmVNYXJrZXJUeXBlLFxuICAgIEFycm93TGluZVNoYXBlLFxuICAgIEFycm93TGluZVRleHQsXG4gICAgUGxhaXRBcnJvd0xpbmUsXG4gICAgUGxhaXREcmF3RWxlbWVudCxcbiAgICBQbGFpdFNoYXBlRWxlbWVudCxcbiAgICBTdHJva2VTdHlsZVxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldExpbmVEYXNoQnlFbGVtZW50LCBnZXRTdHJva2VDb2xvckJ5RWxlbWVudCB9IGZyb20gJy4uL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi8uLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldEVsZW1lbnRTaGFwZSB9IGZyb20gJy4uL3NoYXBlJztcbmltcG9ydCB7IERlZmF1bHRMaW5lU3R5bGUsIExJTkVfVEVYVF9TUEFDRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IEFycm93TGluZVNoYXBlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9ycy9hcnJvdy1saW5lLmdlbmVyYXRvcic7XG5pbXBvcnQgeyBMSU5FX1NOQVBQSU5HX0NPTk5FQ1RPUl9CVUZGRVIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0TGluZU1lbW9yaXplZExhdGVzdCB9IGZyb20gJy4uL21lbW9yaXplJztcbmltcG9ydCB7IGFsaWduUG9pbnRzIH0gZnJvbSAnLi9hcnJvdy1saW5lLXJlc2l6ZSc7XG5pbXBvcnQgeyBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2Fycm93LWxpbmUtY29tbW9uJztcbmltcG9ydCB7IGdldEVsYm93UG9pbnRzLCBnZXROZXh0U291cmNlQW5kVGFyZ2V0UG9pbnRzLCBpc1VzZURlZmF1bHRPcnRob2dvbmFsUm91dGUgfSBmcm9tICcuL2VsYm93JztcbmltcG9ydCB7IGRyYXdBcnJvd0xpbmVBcnJvdyB9IGZyb20gJy4vYXJyb3ctbGluZS1hcnJvdyc7XG5pbXBvcnQgeyBnZXRTbmFwcGluZ1JlZiwgZ2V0U25hcHBpbmdTaGFwZSwgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuLi9jb21tb24nO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQXJyb3dMaW5lRWxlbWVudCA9IChcbiAgICBzaGFwZTogQXJyb3dMaW5lU2hhcGUsXG4gICAgcG9pbnRzOiBbUG9pbnQsIFBvaW50XSxcbiAgICBzb3VyY2U6IEFycm93TGluZUhhbmRsZSxcbiAgICB0YXJnZXQ6IEFycm93TGluZUhhbmRsZSxcbiAgICB0ZXh0cz86IEFycm93TGluZVRleHRbXSxcbiAgICBvcHRpb25zPzogUGljazxQbGFpdEFycm93TGluZSwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+XG4pOiBQbGFpdEFycm93TGluZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkQ3JlYXRvcigpLFxuICAgICAgICB0eXBlOiAnYXJyb3ctbGluZScsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRleHRzOiB0ZXh0cyA/IHRleHRzIDogW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJvd0xpbmVQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lKSA9PiB7XG4gICAgc3dpdGNoIChlbGVtZW50LnNoYXBlKSB7XG4gICAgICAgIGNhc2UgQXJyb3dMaW5lU2hhcGUuZWxib3c6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBBcnJvd0xpbmVTaGFwZS5jdXJ2ZToge1xuICAgICAgICAgICAgcmV0dXJuIGdldEN1cnZlUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludHMgPSBQbGFpdEFycm93TGluZS5nZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcG9pbnRzWzBdID0gaGFuZGxlUmVmUGFpci5zb3VyY2UucG9pbnQ7XG4gICAgICAgICAgICBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdID0gaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQ7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnZlUG9pbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEFycm93TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCB7IHNvdXJjZSwgdGFyZ2V0IH0gPSBoYW5kbGVSZWZQYWlyO1xuICAgICAgICBjb25zdCBzb3VyY2VCb3VuZEVsZW1lbnQgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZS5ib3VuZEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldEJvdW5kRWxlbWVudCA9IGhhbmRsZVJlZlBhaXIudGFyZ2V0LmJvdW5kRWxlbWVudDtcbiAgICAgICAgbGV0IGN1cnZlUG9pbnRzOiBQb2ludFtdID0gW3NvdXJjZS5wb2ludF07XG4gICAgICAgIGNvbnN0IHN1bURpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zb3VyY2UucG9pbnQsIC4uLnRhcmdldC5wb2ludCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDEyICsgc3VtRGlzdGFuY2UgLyAzO1xuICAgICAgICBpZiAoc291cmNlQm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3JDb21wb25lbnQoc291cmNlLnBvaW50LCBzb3VyY2UudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3JDb21wb25lbnQodGFyZ2V0LnBvaW50LCB0YXJnZXQudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1NpbmdsZUJvdW5kID0gKHNvdXJjZUJvdW5kRWxlbWVudCAmJiAhdGFyZ2V0Qm91bmRFbGVtZW50KSB8fCAoIXNvdXJjZUJvdW5kRWxlbWVudCAmJiB0YXJnZXRCb3VuZEVsZW1lbnQpO1xuICAgICAgICBpZiAoaXNTaW5nbGVCb3VuZCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaCh0YXJnZXQucG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gUTJDKGN1cnZlUG9pbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhwb2ludHMpIGFzIFBvaW50W107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VCb3VuZEVsZW1lbnQgJiYgIXRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaChnZXRQb2ludEJ5VmVjdG9yQ29tcG9uZW50KHNvdXJjZS5wb2ludCwgc291cmNlLnZlY3Rvciwgb2Zmc2V0KSk7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3JDb21wb25lbnQodGFyZ2V0LnBvaW50LCB0YXJnZXQudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKHRhcmdldC5wb2ludCk7XG4gICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhjdXJ2ZVBvaW50cykgYXMgUG9pbnRbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZGF0YVBvaW50cyA9IFBsYWl0QXJyb3dMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGRhdGFQb2ludHMgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMoZGF0YVBvaW50cyk7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGNhdG11bGxSb21GaXR0aW5nKGRhdGFQb2ludHMpO1xuICAgICAgICByZXR1cm4gcG9pbnRzT25CZXppZXJDdXJ2ZXMocG9pbnRzKSBhcyBQb2ludFtdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWRkbGVQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lKSB7XG4gICAgY29uc3QgcmVzdWx0OiBQb2ludFtdID0gW107XG4gICAgY29uc3Qgc2hhcGUgPSBlbGVtZW50LnNoYXBlO1xuICAgIGNvbnN0IGhpZGVCdWZmZXIgPSAxMDtcbiAgICBpZiAoc2hhcGUgPT09IEFycm93TGluZVNoYXBlLnN0cmFpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IFBsYWl0QXJyb3dMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnBvaW50c1tpXSwgLi4ucG9pbnRzW2kgKyAxXSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBoaWRlQnVmZmVyKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFsocG9pbnRzW2ldWzBdICsgcG9pbnRzW2kgKyAxXVswXSkgLyAyLCAocG9pbnRzW2ldWzFdICsgcG9pbnRzW2kgKyAxXVsxXSkgLyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlID09PSBBcnJvd0xpbmVTaGFwZS5jdXJ2ZSkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBQbGFpdEFycm93TGluZS5nZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBwb2ludHNPbkJlemllciA9IGdldEN1cnZlUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcG9pbnRzT25CZXppZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gTWF0aC5yb3VuZCgoc3RhcnQgKyBlbmRJbmRleCkgLyAyKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50c09uQmV6aWVyW21pZGRsZUluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gcG9pbnRzT25CZXppZXIuZmluZEluZGV4KHBvaW50ID0+IHBvaW50WzBdID09PSBwb2ludHNbaV1bMF0gJiYgcG9pbnRbMV0gPT09IHBvaW50c1tpXVsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwb2ludHNPbkJlemllci5maW5kSW5kZXgocG9pbnQgPT4gcG9pbnRbMF0gPT09IHBvaW50c1tpICsgMV1bMF0gJiYgcG9pbnRbMV0gPT09IHBvaW50c1tpICsgMV1bMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gTWF0aC5yb3VuZCgoc3RhcnRJbmRleCArIGVuZEluZGV4KSAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5wb2ludHNbaV0sIC4uLnBvaW50c1tpICsgMV0pO1xuICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGhpZGVCdWZmZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50c09uQmV6aWVyW21pZGRsZUluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlID09PSBBcnJvd0xpbmVTaGFwZS5lbGJvdykge1xuICAgICAgICBjb25zdCByZW5kZXJQb2ludHMgPSBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBpZiAoIWlzVXNlRGVmYXVsdE9ydGhvZ29uYWxSb3V0ZShlbGVtZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgW25leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50XSA9IGdldE5leHRTb3VyY2VBbmRUYXJnZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoaSA9PSAwICYmIFBvaW50LmlzRXF1YWxzKHJlbmRlclBvaW50c1tpICsgMV0sIG5leHRTb3VyY2VQb2ludCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpID09PSByZW5kZXJQb2ludHMubGVuZ3RoIC0gMiAmJiBQb2ludC5pc0VxdWFscyhyZW5kZXJQb2ludHNbcmVuZGVyUG9pbnRzLmxlbmd0aCAtIDJdLCBuZXh0VGFyZ2V0UG9pbnQpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW2N1cnJlbnRYLCBjdXJyZW50WV0gPSByZW5kZXJQb2ludHNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgW25leHRYLCBuZXh0WV0gPSByZW5kZXJQb2ludHNbaSArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZVBvaW50ID0gWyhjdXJyZW50WCArIG5leHRYKSAvIDIsIChjdXJyZW50WSArIG5leHRZKSAvIDJdIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1pZGRsZVBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgZHJhd0Fycm93TGluZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRBcnJvd0xpbmUpID0+IHtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gZ2V0U3Ryb2tlQ29sb3JCeUVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHN0cm9rZUxpbmVEYXNoID0gZ2V0TGluZURhc2hCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGgsIHN0cm9rZUxpbmVEYXNoIH07XG4gICAgY29uc3QgbGluZUcgPSBjcmVhdGVHKCk7XG4gICAgbGV0IHBvaW50cyA9IGdldEFycm93TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgbGV0IGxpbmU7XG4gICAgaWYgKGVsZW1lbnQuc2hhcGUgPT09IEFycm93TGluZVNoYXBlLmN1cnZlKSB7XG4gICAgICAgIGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5jdXJ2ZShwb2ludHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmUgPSBkcmF3TGluZWFyUGF0aChwb2ludHMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGlkQ3JlYXRvcigpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtpZH0pYCk7XG4gICAgaWYgKGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFN0cm9rZVN0eWxlLmRvdHRlZCkge1xuICAgICAgICBzZXRTdHJva2VMaW5lY2FwKGxpbmUsICdyb3VuZCcpO1xuICAgIH1cbiAgICBsaW5lRy5hcHBlbmRDaGlsZChsaW5lKTtcblxuICAgIGNvbnN0IHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH0gPSBkcmF3QXJyb3dMaW5lTWFzayhib2FyZCwgZWxlbWVudCBhcyBQbGFpdEFycm93TGluZSwgaWQpO1xuICAgIGxpbmVHLmFwcGVuZENoaWxkKG1hc2spO1xuICAgIGxpbmUuYXBwZW5kQ2hpbGQobWFza1RhcmdldEZpbGxSZWN0KTtcbiAgICBjb25zdCBhcnJvdyA9IGRyYXdBcnJvd0xpbmVBcnJvdyhlbGVtZW50IGFzIFBsYWl0QXJyb3dMaW5lLCBwb2ludHMsIHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGggfSk7XG4gICAgYXJyb3cgJiYgbGluZUcuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIHJldHVybiBsaW5lRztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRDb25uZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50KTogUG9pbnQgPT4ge1xuICAgIGxldCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoaGl0RWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IHJlZiA9IGdldFNuYXBwaW5nUmVmKGJvYXJkLCBoaXRFbGVtZW50LCBwb2ludCk7XG4gICAgY29uc3QgY29ubmVjdGlvblBvaW50ID0gcmVmLmNvbm5lY3RvclBvaW50IHx8IHJlZi5lZGdlUG9pbnQ7XG4gICAgcmV0dXJuIFsoY29ubmVjdGlvblBvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAoY29ubmVjdGlvblBvaW50WzFdIC0gcmVjdGFuZ2xlLnkpIC8gcmVjdGFuZ2xlLmhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0Q29ubmVjdG9yUG9pbnQgPSAocG9pbnQ6IFBvaW50LCBoaXRFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhoaXRFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRFbGVtZW50U2hhcGUoaGl0RWxlbWVudCk7XG4gICAgY29uc3QgY29ubmVjdG9yUG9pbnRzID0gZ2V0RW5naW5lKHNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlKTtcbiAgICByZXR1cm4gY29ubmVjdG9yUG9pbnRzLmZpbmQoY29ubmVjdG9yUG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5jb25uZWN0b3JQb2ludCwgLi4ucG9pbnQpIDw9IExJTkVfU05BUFBJTkdfQ09OTkVDVE9SX0JVRkZFUjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJvd0xpbmVUZXh0UmVjdGFuZ2xlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEFycm93TGluZSwgaW5kZXg6IG51bWJlcik6IFJlY3RhbmdsZUNsaWVudCA9PiB7XG4gICAgY29uc3QgdGV4dCA9IGVsZW1lbnQudGV4dHNbaW5kZXhdO1xuICAgIGNvbnN0IGVsYm93UG9pbnRzID0gZ2V0QXJyb3dMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50T25Qb2x5bGluZShlbGJvd1BvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9pbnRbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgIHk6IHBvaW50WzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3dMaW5lcyA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiBmaW5kRWxlbWVudHMoYm9hcmQsIHtcbiAgICAgICAgbWF0Y2g6IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IFBsYWl0RHJhd0VsZW1lbnQuaXNBcnJvd0xpbmUoZWxlbWVudCksXG4gICAgICAgIHJlY3Vyc2lvbjogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4gUGxhaXREcmF3RWxlbWVudC5pc0RyYXdFbGVtZW50KGVsZW1lbnQpXG4gICAgfSkgYXMgUGxhaXRBcnJvd0xpbmVbXTtcbn07XG5cbi8vIHF1YWRyYXRpYyBCZXppZXIgdG8gY3ViaWMgQmV6aWVyXG5leHBvcnQgY29uc3QgUTJDID0gKHBvaW50czogUG9pbnRbXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IG51bVNlZ21lbnRzID0gcG9pbnRzLmxlbmd0aCAvIDM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TZWdtZW50czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBxQ29udHJvbCA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IGVuZCA9IHBvaW50c1tpICsgMl07XG4gICAgICAgIGNvbnN0IHN0YXJ0RGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnN0YXJ0LCAuLi5xQ29udHJvbCk7XG4gICAgICAgIGNvbnN0IGVuZERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5lbmQsIC4uLnFDb250cm9sKTtcbiAgICAgICAgY29uc3QgY0NvbnRyb2wxID0gZ2V0RXh0ZW5kUG9pbnQoc3RhcnQsIHFDb250cm9sLCAoc3RhcnREaXN0YW5jZSAqIDIpIC8gMyk7XG4gICAgICAgIGNvbnN0IGNDb250cm9sMiA9IGdldEV4dGVuZFBvaW50KGVuZCwgcUNvbnRyb2wsIChlbmREaXN0YW5jZSAqIDIpIC8gMyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHN0YXJ0LCBjQ29udHJvbDEsIGNDb250cm9sMiwgZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVBcnJvd0xpbmVDcmVhdGluZyA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBsaW5lU2hhcGU6IEFycm93TGluZVNoYXBlLFxuICAgIHNvdXJjZVBvaW50OiBQb2ludCxcbiAgICBtb3ZpbmdQb2ludDogUG9pbnQsXG4gICAgc291cmNlRWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQgfCBudWxsLFxuICAgIGxpbmVTaGFwZUc6IFNWR0dFbGVtZW50XG4pID0+IHtcbiAgICBjb25zdCBoaXRFbGVtZW50ID0gZ2V0U25hcHBpbmdTaGFwZShib2FyZCwgbW92aW5nUG9pbnQpO1xuICAgIGNvbnN0IHRhcmdldENvbm5lY3Rpb24gPSBoaXRFbGVtZW50ID8gZ2V0SGl0Q29ubmVjdGlvbihib2FyZCwgbW92aW5nUG9pbnQsIGhpdEVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNvdXJjZUNvbm5lY3Rpb24gPSBzb3VyY2VFbGVtZW50ID8gZ2V0SGl0Q29ubmVjdGlvbihib2FyZCwgc291cmNlUG9pbnQsIHNvdXJjZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kSWQgPSBoaXRFbGVtZW50ID8gaGl0RWxlbWVudC5pZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gbmV3IEFycm93TGluZVNoYXBlR2VuZXJhdG9yKGJvYXJkKTtcbiAgICBjb25zdCBtZW1vcml6ZWRMYXRlc3QgPSBnZXRMaW5lTWVtb3JpemVkTGF0ZXN0KCk7XG4gICAgbGV0IHNvdXJjZU1hcmtlciwgdGFyZ2V0TWFya2VyO1xuICAgIHNvdXJjZU1hcmtlciA9IG1lbW9yaXplZExhdGVzdC5zb3VyY2U7XG4gICAgdGFyZ2V0TWFya2VyID0gbWVtb3JpemVkTGF0ZXN0LnRhcmdldDtcbiAgICBzb3VyY2VNYXJrZXIgJiYgZGVsZXRlIG1lbW9yaXplZExhdGVzdC5zb3VyY2U7XG4gICAgdGFyZ2V0TWFya2VyICYmIGRlbGV0ZSBtZW1vcml6ZWRMYXRlc3QudGFyZ2V0O1xuICAgIGNvbnN0IHRlbXBvcmFyeUxpbmVFbGVtZW50ID0gY3JlYXRlQXJyb3dMaW5lRWxlbWVudChcbiAgICAgICAgbGluZVNoYXBlLFxuICAgICAgICBbc291cmNlUG9pbnQsIG1vdmluZ1BvaW50XSxcbiAgICAgICAgeyBtYXJrZXI6IHNvdXJjZU1hcmtlciB8fCBBcnJvd0xpbmVNYXJrZXJUeXBlLm5vbmUsIGNvbm5lY3Rpb246IHNvdXJjZUNvbm5lY3Rpb24sIGJvdW5kSWQ6IHNvdXJjZUVsZW1lbnQ/LmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiB0YXJnZXRNYXJrZXIgfHwgQXJyb3dMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogdGFyZ2V0Q29ubmVjdGlvbiwgYm91bmRJZDogdGFyZ2V0Qm91bmRJZCB9LFxuICAgICAgICBbXSxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IERlZmF1bHRMaW5lU3R5bGUuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAuLi5tZW1vcml6ZWRMYXRlc3RcbiAgICAgICAgfVxuICAgICk7XG4gICAgY29uc3QgbGluZVBvaW50cyA9IGdldEFycm93TGluZVBvaW50cyhib2FyZCwgdGVtcG9yYXJ5TGluZUVsZW1lbnQpO1xuICAgIGNvbnN0IG90aGVyUG9pbnQgPSBsaW5lUG9pbnRzWzBdO1xuICAgIHRlbXBvcmFyeUxpbmVFbGVtZW50LnBvaW50c1sxXSA9IGFsaWduUG9pbnRzKG90aGVyUG9pbnQsIG1vdmluZ1BvaW50KTtcbiAgICBsaW5lR2VuZXJhdG9yLnByb2Nlc3NEcmF3aW5nKHRlbXBvcmFyeUxpbmVFbGVtZW50LCBsaW5lU2hhcGVHKTtcbiAgICBQbGFpdEJvYXJkLmdldEVsZW1lbnRBY3RpdmVIb3N0KGJvYXJkKS5hcHBlbmQobGluZVNoYXBlRyk7XG4gICAgcmV0dXJuIHRlbXBvcmFyeUxpbmVFbGVtZW50O1xufTtcblxuZnVuY3Rpb24gZHJhd0Fycm93TGluZU1hc2soYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFzayA9IGNyZWF0ZU1hc2soKTtcbiAgICBtYXNrLnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7XG4gICAgY29uc3QgcG9pbnRzID0gZ2V0QXJyb3dMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBsZXQgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG4gICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldE91dGxpbmVSZWN0YW5nbGUocmVjdGFuZ2xlLCAtMzApO1xuICAgIGNvbnN0IG1hc2tGaWxsUmVjdCA9IGNyZWF0ZVJlY3QocmVjdGFuZ2xlLCB7XG4gICAgICAgIGZpbGw6ICd3aGl0ZSdcbiAgICB9KTtcbiAgICBtYXNrLmFwcGVuZENoaWxkKG1hc2tGaWxsUmVjdCk7XG5cbiAgICBjb25zdCB0ZXh0cyA9IGVsZW1lbnQudGV4dHM7XG4gICAgdGV4dHMuZm9yRWFjaCgodGV4dCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHRleHRSZWN0YW5nbGUgPSBnZXRBcnJvd0xpbmVUZXh0UmVjdGFuZ2xlKGJvYXJkLCBlbGVtZW50LCBpbmRleCk7XG4gICAgICAgIHRleHRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZSh0ZXh0UmVjdGFuZ2xlLCBMSU5FX1RFWFRfU1BBQ0UgKiAyKTtcbiAgICAgICAgY29uc3QgcmVjdCA9IGNyZWF0ZVJlY3QodGV4dFJlY3RhbmdsZSwge1xuICAgICAgICAgICAgZmlsbDogJ2JsYWNrJ1xuICAgICAgICB9KTtcbiAgICAgICAgbWFzay5hcHBlbmRDaGlsZChyZWN0KTtcbiAgICB9KTtcbiAgICAvLyBvcGVuIGxpbmVcbiAgICBjb25zdCBtYXNrVGFyZ2V0RmlsbFJlY3QgPSBjcmVhdGVSZWN0KHJlY3RhbmdsZSk7XG4gICAgbWFza1RhcmdldEZpbGxSZWN0LnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsICcwJyk7XG4gICAgbWFza1RhcmdldEZpbGxSZWN0LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgcmV0dXJuIHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH07XG59XG4iXX0=
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { PlaitBoard, getElementById, RectangleClient, Direction, hasValidAngle, rotatePointsByElement, findElements, Path } from '@plait/core';
|
|
2
|
+
import { getDirectionFactor, rotateVectorAnti90, getDirectionByVector, getOppositeDirection, getDirectionByPointOfRectangle, getSourceAndTargetOuterRectangle, getNextPoint, rotateVector } from '@plait/common';
|
|
3
|
+
import { BasicShapes, ArrowLineHandleKey, ArrowLineMarkerType, PlaitArrowLine, PlaitDrawElement } from '../../interfaces';
|
|
4
|
+
import { getEngine } from '../../engines';
|
|
5
|
+
import { getElementShape } from '../shape';
|
|
6
|
+
import { getSourceAndTargetRectangle } from './elbow';
|
|
7
|
+
import { getStrokeWidthByElement } from '../common';
|
|
8
|
+
import { getArrowLinePoints, getHitConnection } from './arrow-line-basic';
|
|
9
|
+
export const getArrowLineHandleRefPair = (board, element) => {
|
|
10
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
11
|
+
const sourceBoundElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
|
|
12
|
+
const targetBoundElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
|
|
13
|
+
let sourcePoint = sourceBoundElement ? getConnectionPoint(sourceBoundElement, element.source.connection) : element.points[0];
|
|
14
|
+
let targetPoint = targetBoundElement
|
|
15
|
+
? getConnectionPoint(targetBoundElement, element.target.connection)
|
|
16
|
+
: element.points[element.points.length - 1];
|
|
17
|
+
let sourceDirection = getDirectionByVector([targetPoint[0] - sourcePoint[0], targetPoint[1] - sourcePoint[1]]) || Direction.right;
|
|
18
|
+
let targetDirection = getOppositeDirection(sourceDirection);
|
|
19
|
+
const sourceFactor = getDirectionFactor(sourceDirection);
|
|
20
|
+
const targetFactor = getDirectionFactor(targetDirection);
|
|
21
|
+
const sourceHandleRef = {
|
|
22
|
+
key: ArrowLineHandleKey.source,
|
|
23
|
+
point: sourcePoint,
|
|
24
|
+
direction: sourceDirection,
|
|
25
|
+
vector: [sourceFactor.x, sourceFactor.y]
|
|
26
|
+
};
|
|
27
|
+
const targetHandleRef = {
|
|
28
|
+
key: ArrowLineHandleKey.target,
|
|
29
|
+
point: targetPoint,
|
|
30
|
+
direction: targetDirection,
|
|
31
|
+
vector: [targetFactor.x, targetFactor.y]
|
|
32
|
+
};
|
|
33
|
+
if (sourceBoundElement) {
|
|
34
|
+
const connectionOffset = PlaitArrowLine.isSourceMarkOrTargetMark(element, ArrowLineMarkerType.none, ArrowLineHandleKey.source)
|
|
35
|
+
? 0
|
|
36
|
+
: strokeWidth;
|
|
37
|
+
const sourceVector = getVectorByConnection(sourceBoundElement, element.source.connection);
|
|
38
|
+
sourceHandleRef.vector = sourceVector;
|
|
39
|
+
sourceHandleRef.boundElement = sourceBoundElement;
|
|
40
|
+
if (hasValidAngle(sourceBoundElement)) {
|
|
41
|
+
const direction = getDirectionByVector(rotateVector(sourceVector, sourceBoundElement.angle));
|
|
42
|
+
sourceDirection = direction ? direction : sourceDirection;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const direction = getDirectionByVector(sourceVector);
|
|
46
|
+
sourceDirection = direction ? direction : sourceDirection;
|
|
47
|
+
}
|
|
48
|
+
sourceHandleRef.direction = sourceDirection;
|
|
49
|
+
sourcePoint = getConnectionPoint(sourceBoundElement, element.source.connection, sourceDirection, connectionOffset);
|
|
50
|
+
sourceHandleRef.point = rotatePointsByElement(sourcePoint, sourceBoundElement) || sourcePoint;
|
|
51
|
+
}
|
|
52
|
+
if (targetBoundElement) {
|
|
53
|
+
const connectionOffset = PlaitArrowLine.isSourceMarkOrTargetMark(element, ArrowLineMarkerType.none, ArrowLineHandleKey.target)
|
|
54
|
+
? 0
|
|
55
|
+
: strokeWidth;
|
|
56
|
+
const targetVector = getVectorByConnection(targetBoundElement, element.target.connection);
|
|
57
|
+
targetHandleRef.vector = targetVector;
|
|
58
|
+
targetHandleRef.boundElement = targetBoundElement;
|
|
59
|
+
if (hasValidAngle(targetBoundElement)) {
|
|
60
|
+
const direction = getDirectionByVector(rotateVector(targetVector, targetBoundElement.angle));
|
|
61
|
+
targetDirection = direction ? direction : targetDirection;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const direction = getDirectionByVector(targetVector);
|
|
65
|
+
targetDirection = direction ? direction : targetDirection;
|
|
66
|
+
}
|
|
67
|
+
targetHandleRef.direction = targetDirection;
|
|
68
|
+
targetPoint = getConnectionPoint(targetBoundElement, element.target.connection, targetDirection, connectionOffset);
|
|
69
|
+
targetHandleRef.point = rotatePointsByElement(targetPoint, targetBoundElement) || targetPoint;
|
|
70
|
+
}
|
|
71
|
+
return { source: sourceHandleRef, target: targetHandleRef };
|
|
72
|
+
};
|
|
73
|
+
export const getConnectionPoint = (geometry, connection, direction, delta) => {
|
|
74
|
+
const rectangle = RectangleClient.getRectangleByPoints(geometry.points);
|
|
75
|
+
if (direction && delta) {
|
|
76
|
+
const directionFactor = getDirectionFactor(direction);
|
|
77
|
+
const point = RectangleClient.getConnectionPoint(rectangle, connection);
|
|
78
|
+
return [point[0] + directionFactor.x * delta, point[1] + directionFactor.y * delta];
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return RectangleClient.getConnectionPoint(rectangle, connection);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
export const getVectorByConnection = (boundElement, connection) => {
|
|
85
|
+
const rectangle = RectangleClient.getRectangleByPoints(boundElement.points);
|
|
86
|
+
const shape = getElementShape(boundElement);
|
|
87
|
+
const engine = getEngine(shape);
|
|
88
|
+
let vector = [0, 0];
|
|
89
|
+
const direction = getDirectionByPointOfRectangle(connection);
|
|
90
|
+
if (direction && boundElement.shape !== BasicShapes.ellipse) {
|
|
91
|
+
const factor = getDirectionFactor(direction);
|
|
92
|
+
return [factor.x, factor.y];
|
|
93
|
+
}
|
|
94
|
+
if (engine.getEdgeByConnectionPoint) {
|
|
95
|
+
const edge = engine.getEdgeByConnectionPoint(rectangle, connection);
|
|
96
|
+
if (edge) {
|
|
97
|
+
const lineVector = [edge[1][0] - edge[0][0], edge[1][1] - edge[0][1]];
|
|
98
|
+
return rotateVectorAnti90(lineVector);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (engine.getTangentVectorByConnectionPoint) {
|
|
102
|
+
const lineVector = engine.getTangentVectorByConnectionPoint(rectangle, connection);
|
|
103
|
+
if (lineVector) {
|
|
104
|
+
return rotateVectorAnti90(lineVector);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return vector;
|
|
108
|
+
};
|
|
109
|
+
export const getElbowLineRouteOptions = (board, element, handleRefPair) => {
|
|
110
|
+
handleRefPair = handleRefPair ?? getArrowLineHandleRefPair(board, element);
|
|
111
|
+
const { sourceRectangle, targetRectangle } = getSourceAndTargetRectangle(board, element, handleRefPair);
|
|
112
|
+
const { sourceOuterRectangle, targetOuterRectangle } = getSourceAndTargetOuterRectangle(sourceRectangle, targetRectangle);
|
|
113
|
+
const sourcePoint = handleRefPair.source.point;
|
|
114
|
+
const targetPoint = handleRefPair.target.point;
|
|
115
|
+
const nextSourcePoint = getNextPoint(sourcePoint, sourceOuterRectangle, handleRefPair.source.direction);
|
|
116
|
+
const nextTargetPoint = getNextPoint(targetPoint, targetOuterRectangle, handleRefPair.target.direction);
|
|
117
|
+
return {
|
|
118
|
+
sourcePoint,
|
|
119
|
+
nextSourcePoint,
|
|
120
|
+
sourceRectangle,
|
|
121
|
+
sourceOuterRectangle,
|
|
122
|
+
targetPoint,
|
|
123
|
+
nextTargetPoint,
|
|
124
|
+
targetRectangle,
|
|
125
|
+
targetOuterRectangle
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export const collectArrowLineUpdatedRefsByGeometry = (board, element, refs) => {
|
|
129
|
+
const lines = findElements(board, {
|
|
130
|
+
match: (element) => {
|
|
131
|
+
if (PlaitDrawElement.isArrowLine(element)) {
|
|
132
|
+
return element.source.boundId === element.id || element.target.boundId === element.id;
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
},
|
|
136
|
+
recursion: element => true
|
|
137
|
+
});
|
|
138
|
+
if (lines.length) {
|
|
139
|
+
lines.forEach(line => {
|
|
140
|
+
const isSourceBound = line.source.boundId === element.id;
|
|
141
|
+
const handle = isSourceBound ? 'source' : 'target';
|
|
142
|
+
const object = { ...line[handle] };
|
|
143
|
+
const linePoints = getArrowLinePoints(board, line);
|
|
144
|
+
const point = isSourceBound ? linePoints[0] : linePoints[linePoints.length - 1];
|
|
145
|
+
object.connection = getHitConnection(board, point, element);
|
|
146
|
+
const path = PlaitBoard.findPath(board, line);
|
|
147
|
+
const index = refs.findIndex(obj => Path.equals(obj.path, path));
|
|
148
|
+
if (index === -1) {
|
|
149
|
+
refs.push({
|
|
150
|
+
property: {
|
|
151
|
+
[handle]: object
|
|
152
|
+
},
|
|
153
|
+
path
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
refs[index].property = { ...refs[index].property, [handle]: object };
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3ctbGluZS1jb21tb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9hcnJvdy1saW5lL2Fycm93LWxpbmUtY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGVBQWUsRUFFZixTQUFTLEVBRVQsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixZQUFZLEVBRVosSUFBSSxFQUNQLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsa0JBQWtCLEVBR2xCLG1CQUFtQixFQUNuQixjQUFjLEVBR2QsZ0JBQWdCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQXVCLEVBQTBCLEVBQUU7SUFDNUcsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENB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QUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNOLFFBQVEsRUFBRTt3QkFDTixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU07cUJBQ25CO29CQUNELElBQUk7aUJBQ1AsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQb2ludCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIGdldEVsZW1lbnRCeUlkLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBQb2ludE9mUmVjdGFuZ2xlLFxuICAgIERpcmVjdGlvbixcbiAgICBWZWN0b3IsXG4gICAgaGFzVmFsaWRBbmdsZSxcbiAgICByb3RhdGVQb2ludHNCeUVsZW1lbnQsXG4gICAgZmluZEVsZW1lbnRzLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQYXRoXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIHJvdGF0ZVZlY3RvckFudGk5MCxcbiAgICBnZXREaXJlY3Rpb25CeVZlY3RvcixcbiAgICBnZXRPcHBvc2l0ZURpcmVjdGlvbixcbiAgICBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUsXG4gICAgZ2V0U291cmNlQW5kVGFyZ2V0T3V0ZXJSZWN0YW5nbGUsXG4gICAgZ2V0TmV4dFBvaW50LFxuICAgIHJvdGF0ZVZlY3RvclxufSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQmFzaWNTaGFwZXMsXG4gICAgQXJyb3dMaW5lSGFuZGxlS2V5LFxuICAgIEFycm93TGluZUhhbmRsZVJlZixcbiAgICBBcnJvd0xpbmVIYW5kbGVSZWZQYWlyLFxuICAgIEFycm93TGluZU1hcmtlclR5cGUsXG4gICAgUGxhaXRBcnJvd0xpbmUsXG4gICAgUGxhaXRHZW9tZXRyeSxcbiAgICBQbGFpdFNoYXBlRWxlbWVudCxcbiAgICBQbGFpdERyYXdFbGVtZW50XG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBnZXRFbGVtZW50U2hhcGUgfSBmcm9tICcuLi9zaGFwZSc7XG5pbXBvcnQgeyBnZXRTb3VyY2VBbmRUYXJnZXRSZWN0YW5nbGUgfSBmcm9tICcuL2VsYm93JztcbmltcG9ydCB7IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IGdldEFycm93TGluZVBvaW50cywgZ2V0SGl0Q29ubmVjdGlvbiB9IGZyb20gJy4vYXJyb3ctbGluZS1iYXNpYyc7XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJvd0xpbmVIYW5kbGVSZWZQYWlyID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEFycm93TGluZSk6IEFycm93TGluZUhhbmRsZVJlZlBhaXIgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc291cmNlQm91bmRFbGVtZW50ID0gZWxlbWVudC5zb3VyY2UuYm91bmRJZCA/IGdldEVsZW1lbnRCeUlkPFBsYWl0U2hhcGVFbGVtZW50Pihib2FyZCwgZWxlbWVudC5zb3VyY2UuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0Qm91bmRFbGVtZW50ID0gZWxlbWVudC50YXJnZXQuYm91bmRJZCA/IGdldEVsZW1lbnRCeUlkPFBsYWl0U2hhcGVFbGVtZW50Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHNvdXJjZVBvaW50ID0gc291cmNlQm91bmRFbGVtZW50ID8gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpIDogZWxlbWVudC5wb2ludHNbMF07XG4gICAgbGV0IHRhcmdldFBvaW50ID0gdGFyZ2V0Qm91bmRFbGVtZW50XG4gICAgICAgID8gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpXG4gICAgICAgIDogZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKFt0YXJnZXRQb2ludFswXSAtIHNvdXJjZVBvaW50WzBdLCB0YXJnZXRQb2ludFsxXSAtIHNvdXJjZVBvaW50WzFdXSkgfHwgRGlyZWN0aW9uLnJpZ2h0O1xuICAgIGxldCB0YXJnZXREaXJlY3Rpb24gPSBnZXRPcHBvc2l0ZURpcmVjdGlvbihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHRhcmdldEZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXREaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUhhbmRsZVJlZjogQXJyb3dMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IEFycm93TGluZUhhbmRsZUtleS5zb3VyY2UsXG4gICAgICAgIHBvaW50OiBzb3VyY2VQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uOiBzb3VyY2VEaXJlY3Rpb24sXG4gICAgICAgIHZlY3RvcjogW3NvdXJjZUZhY3Rvci54LCBzb3VyY2VGYWN0b3IueV1cbiAgICB9O1xuICAgIGNvbnN0IHRhcmdldEhhbmRsZVJlZjogQXJyb3dMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IEFycm93TGluZUhhbmRsZUtleS50YXJnZXQsXG4gICAgICAgIHBvaW50OiB0YXJnZXRQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uOiB0YXJnZXREaXJlY3Rpb24sXG4gICAgICAgIHZlY3RvcjogW3RhcmdldEZhY3Rvci54LCB0YXJnZXRGYWN0b3IueV1cbiAgICB9O1xuICAgIGlmIChzb3VyY2VCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbk9mZnNldCA9IFBsYWl0QXJyb3dMaW5lLmlzU291cmNlTWFya09yVGFyZ2V0TWFyayhcbiAgICAgICAgICAgIGVsZW1lbnQgYXMgUGxhaXRBcnJvd0xpbmUsXG4gICAgICAgICAgICBBcnJvd0xpbmVNYXJrZXJUeXBlLm5vbmUsXG4gICAgICAgICAgICBBcnJvd0xpbmVIYW5kbGVLZXkuc291cmNlXG4gICAgICAgIClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3Qgc291cmNlVmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYudmVjdG9yID0gc291cmNlVmVjdG9yO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYuYm91bmRFbGVtZW50ID0gc291cmNlQm91bmRFbGVtZW50O1xuICAgICAgICBpZiAoaGFzVmFsaWRBbmdsZShzb3VyY2VCb3VuZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihyb3RhdGVWZWN0b3Ioc291cmNlVmVjdG9yLCBzb3VyY2VCb3VuZEVsZW1lbnQuYW5nbGUhKSk7XG4gICAgICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihzb3VyY2VWZWN0b3IpO1xuICAgICAgICAgICAgc291cmNlRGlyZWN0aW9uID0gZGlyZWN0aW9uID8gZGlyZWN0aW9uIDogc291cmNlRGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5kaXJlY3Rpb24gPSBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZVBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEsIHNvdXJjZURpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5wb2ludCA9IHJvdGF0ZVBvaW50c0J5RWxlbWVudChzb3VyY2VQb2ludCwgc291cmNlQm91bmRFbGVtZW50KSB8fCBzb3VyY2VQb2ludDtcbiAgICB9XG4gICAgaWYgKHRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uT2Zmc2V0ID0gUGxhaXRBcnJvd0xpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKFxuICAgICAgICAgICAgZWxlbWVudCBhcyBQbGFpdEFycm93TGluZSxcbiAgICAgICAgICAgIEFycm93TGluZU1hcmtlclR5cGUubm9uZSxcbiAgICAgICAgICAgIEFycm93TGluZUhhbmRsZUtleS50YXJnZXRcbiAgICAgICAgKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHN0cm9rZVdpZHRoO1xuICAgICAgICBjb25zdCB0YXJnZXRWZWN0b3IgPSBnZXRWZWN0b3JCeUNvbm5lY3Rpb24odGFyZ2V0Qm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISk7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi52ZWN0b3IgPSB0YXJnZXRWZWN0b3I7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSB0YXJnZXRCb3VuZEVsZW1lbnQ7XG4gICAgICAgIGlmIChoYXNWYWxpZEFuZ2xlKHRhcmdldEJvdW5kRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKHJvdGF0ZVZlY3Rvcih0YXJnZXRWZWN0b3IsIHRhcmdldEJvdW5kRWxlbWVudC5hbmdsZSEpKTtcbiAgICAgICAgICAgIHRhcmdldERpcmVjdGlvbiA9IGRpcmVjdGlvbiA/IGRpcmVjdGlvbiA6IHRhcmdldERpcmVjdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKHRhcmdldFZlY3Rvcik7XG4gICAgICAgICAgICB0YXJnZXREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0SGFuZGxlUmVmLmRpcmVjdGlvbiA9IHRhcmdldERpcmVjdGlvbjtcbiAgICAgICAgdGFyZ2V0UG9pbnQgPSBnZXRDb25uZWN0aW9uUG9pbnQodGFyZ2V0Qm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISwgdGFyZ2V0RGlyZWN0aW9uLCBjb25uZWN0aW9uT2Zmc2V0KTtcbiAgICAgICAgdGFyZ2V0SGFuZGxlUmVmLnBvaW50ID0gcm90YXRlUG9pbnRzQnlFbGVtZW50KHRhcmdldFBvaW50LCB0YXJnZXRCb3VuZEVsZW1lbnQpIHx8IHRhcmdldFBvaW50O1xuICAgIH1cbiAgICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZUhhbmRsZVJlZiwgdGFyZ2V0OiB0YXJnZXRIYW5kbGVSZWYgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uUG9pbnQgPSAoZ2VvbWV0cnk6IFBsYWl0U2hhcGVFbGVtZW50LCBjb25uZWN0aW9uOiBQb2ludCwgZGlyZWN0aW9uPzogRGlyZWN0aW9uLCBkZWx0YT86IG51bWJlcik6IFBvaW50ID0+IHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZ2VvbWV0cnkucG9pbnRzKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSArIGRpcmVjdGlvbkZhY3Rvci54ICogZGVsdGEsIHBvaW50WzFdICsgZGlyZWN0aW9uRmFjdG9yLnkgKiBkZWx0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmVjdG9yQnlDb25uZWN0aW9uID0gKGJvdW5kRWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsIGNvbm5lY3Rpb246IFBvaW50T2ZSZWN0YW5nbGUpOiBWZWN0b3IgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhib3VuZEVsZW1lbnQucG9pbnRzKTtcbiAgICBjb25zdCBzaGFwZSA9IGdldEVsZW1lbnRTaGFwZShib3VuZEVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShzaGFwZSk7XG4gICAgbGV0IHZlY3RvcjogVmVjdG9yID0gWzAsIDBdO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnRPZlJlY3RhbmdsZShjb25uZWN0aW9uKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGJvdW5kRWxlbWVudC5zaGFwZSAhPT0gQmFzaWNTaGFwZXMuZWxsaXBzZSkge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoZGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtmYWN0b3IueCwgZmFjdG9yLnldO1xuICAgIH1cbiAgICBpZiAoZW5naW5lLmdldEVkZ2VCeUNvbm5lY3Rpb25Qb2ludCkge1xuICAgICAgICBjb25zdCBlZGdlID0gZW5naW5lLmdldEVkZ2VCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoZWRnZSkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZlY3RvciA9IFtlZGdlWzFdWzBdIC0gZWRnZVswXVswXSwgZWRnZVsxXVsxXSAtIGVkZ2VbMF1bMV1dIGFzIFZlY3RvcjtcbiAgICAgICAgICAgIHJldHVybiByb3RhdGVWZWN0b3JBbnRpOTAobGluZVZlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZ2luZS5nZXRUYW5nZW50VmVjdG9yQnlDb25uZWN0aW9uUG9pbnQpIHtcbiAgICAgICAgY29uc3QgbGluZVZlY3RvciA9IGVuZ2luZS5nZXRUYW5nZW50VmVjdG9yQnlDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGxpbmVWZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiByb3RhdGVWZWN0b3JBbnRpOTAobGluZVZlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lLCBoYW5kbGVSZWZQYWlyPzogQXJyb3dMaW5lSGFuZGxlUmVmUGFpcikgPT4ge1xuICAgIGhhbmRsZVJlZlBhaXIgPSBoYW5kbGVSZWZQYWlyID8/IGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHsgc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGUgfSA9IGdldFNvdXJjZUFuZFRhcmdldFJlY3RhbmdsZShib2FyZCwgZWxlbWVudCwgaGFuZGxlUmVmUGFpcik7XG4gICAgY29uc3QgeyBzb3VyY2VPdXRlclJlY3RhbmdsZSwgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUgfSA9IGdldFNvdXJjZUFuZFRhcmdldE91dGVyUmVjdGFuZ2xlKHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IGhhbmRsZVJlZlBhaXIuc291cmNlLnBvaW50O1xuICAgIGNvbnN0IHRhcmdldFBvaW50ID0gaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQ7XG4gICAgY29uc3QgbmV4dFNvdXJjZVBvaW50ID0gZ2V0TmV4dFBvaW50KHNvdXJjZVBvaW50LCBzb3VyY2VPdXRlclJlY3RhbmdsZSwgaGFuZGxlUmVmUGFpci5zb3VyY2UuZGlyZWN0aW9uKTtcbiAgICBjb25zdCBuZXh0VGFyZ2V0UG9pbnQgPSBnZXROZXh0UG9pbnQodGFyZ2V0UG9pbnQsIHRhcmdldE91dGVyUmVjdGFuZ2xlLCBoYW5kbGVSZWZQYWlyLnRhcmdldC5kaXJlY3Rpb24pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZVBvaW50LFxuICAgICAgICBuZXh0U291cmNlUG9pbnQsXG4gICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUsXG4gICAgICAgIHRhcmdldFBvaW50LFxuICAgICAgICBuZXh0VGFyZ2V0UG9pbnQsXG4gICAgICAgIHRhcmdldFJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0T3V0ZXJSZWN0YW5nbGVcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RBcnJvd0xpbmVVcGRhdGVkUmVmc0J5R2VvbWV0cnkgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsXG4gICAgcmVmczogeyBwcm9wZXJ0eTogUGFydGlhbDxQbGFpdEFycm93TGluZT47IHBhdGg6IFBhdGggfVtdXG4pID0+IHtcbiAgICBjb25zdCBsaW5lcyA9IGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNBcnJvd0xpbmUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zb3VyY2UuYm91bmRJZCA9PT0gZWxlbWVudC5pZCB8fCBlbGVtZW50LnRhcmdldC5ib3VuZElkID09PSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICByZWN1cnNpb246IGVsZW1lbnQgPT4gdHJ1ZVxuICAgIH0pIGFzIFBsYWl0QXJyb3dMaW5lW107XG4gICAgaWYgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNTb3VyY2VCb3VuZCA9IGxpbmUuc291cmNlLmJvdW5kSWQgPT09IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBpc1NvdXJjZUJvdW5kID8gJ3NvdXJjZScgOiAndGFyZ2V0JztcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHsgLi4ubGluZVtoYW5kbGVdIH07XG4gICAgICAgICAgICBjb25zdCBsaW5lUG9pbnRzID0gZ2V0QXJyb3dMaW5lUG9pbnRzKGJvYXJkLCBsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gaXNTb3VyY2VCb3VuZCA/IGxpbmVQb2ludHNbMF0gOiBsaW5lUG9pbnRzW2xpbmVQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBvYmplY3QuY29ubmVjdGlvbiA9IGdldEhpdENvbm5lY3Rpb24oYm9hcmQsIHBvaW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVmcy5maW5kSW5kZXgob2JqID0+IFBhdGguZXF1YWxzKG9iai5wYXRoLCBwYXRoKSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoYW5kbGVdOiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWZzW2luZGV4XS5wcm9wZXJ0eSA9IHsgLi4ucmVmc1tpbmRleF0ucHJvcGVydHksIFtoYW5kbGVdOiBvYmplY3QgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ==
|