@logicflow/core 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 (236) hide show
  1. package/dist/index.css +3 -2
  2. package/dist/index.min.js +1 -1
  3. package/dist/index.min.js.map +1 -1
  4. package/es/LogicFlow.d.ts +9 -0
  5. package/es/LogicFlow.js +0 -1
  6. package/es/constant/index.d.ts +1 -1
  7. package/es/constant/index.js +1 -1
  8. package/es/constant/theme.d.ts +136 -0
  9. package/es/constant/theme.js +680 -0
  10. package/es/index.css +3 -2
  11. package/es/model/GraphModel.d.ts +10 -2
  12. package/es/model/GraphModel.js +48 -14
  13. package/es/model/TransformModel.js +9 -9
  14. package/es/model/edge/BaseEdgeModel.js +7 -2
  15. package/es/model/edge/PolylineEdgeModel.d.ts +7 -0
  16. package/es/model/edge/PolylineEdgeModel.js +136 -7
  17. package/es/model/node/BaseNodeModel.d.ts +12 -1
  18. package/es/model/node/BaseNodeModel.js +9 -2
  19. package/es/model/node/HtmlNodeModel.d.ts +12 -0
  20. package/es/model/node/HtmlNodeModel.js +19 -0
  21. package/es/model/node/PolygonNodeModel.js +3 -3
  22. package/es/options.d.ts +4 -2
  23. package/es/style/index.css +3 -2
  24. package/es/style/index.less +3 -2
  25. package/es/style/raw.d.ts +1 -1
  26. package/es/style/raw.js +1 -1
  27. package/es/tool/MultipleSelectTool.js +10 -5
  28. package/es/util/drag.js +0 -1
  29. package/es/util/edge.d.ts +40 -1
  30. package/es/util/edge.js +43 -9
  31. package/es/util/geometry.d.ts +8 -0
  32. package/es/util/geometry.js +79 -0
  33. package/es/util/theme.d.ts +2 -65
  34. package/es/util/theme.js +4 -281
  35. package/es/view/Anchor.d.ts +1 -0
  36. package/es/view/Anchor.js +24 -21
  37. package/es/view/Control.d.ts +5 -0
  38. package/es/view/Control.js +44 -57
  39. package/es/view/edge/BaseEdge.js +9 -0
  40. package/es/view/edge/PolylineEdge.js +13 -2
  41. package/es/view/node/BaseNode.d.ts +1 -0
  42. package/es/view/node/BaseNode.js +23 -11
  43. package/es/view/node/HtmlNode.js +2 -4
  44. package/es/view/overlay/CanvasOverlay.js +5 -2
  45. package/es/view/overlay/Grid.d.ts +12 -1
  46. package/es/view/overlay/Grid.js +85 -23
  47. package/es/view/overlay/OutlineOverlay.d.ts +1 -0
  48. package/es/view/overlay/OutlineOverlay.js +18 -17
  49. package/es/view/overlay/gridConfig.d.ts +46 -0
  50. package/es/view/overlay/gridConfig.js +99 -0
  51. package/es/view/shape/Polygon.d.ts +0 -7
  52. package/es/view/shape/Polygon.js +12 -43
  53. package/lib/LogicFlow.d.ts +9 -0
  54. package/lib/LogicFlow.js +0 -1
  55. package/lib/constant/index.d.ts +1 -1
  56. package/lib/constant/index.js +16 -2
  57. package/lib/constant/theme.d.ts +136 -0
  58. package/lib/constant/theme.js +683 -0
  59. package/lib/index.css +3 -2
  60. package/lib/model/GraphModel.d.ts +10 -2
  61. package/lib/model/GraphModel.js +49 -15
  62. package/lib/model/TransformModel.js +9 -9
  63. package/lib/model/edge/BaseEdgeModel.js +7 -2
  64. package/lib/model/edge/PolylineEdgeModel.d.ts +7 -0
  65. package/lib/model/edge/PolylineEdgeModel.js +136 -7
  66. package/lib/model/node/BaseNodeModel.d.ts +12 -1
  67. package/lib/model/node/BaseNodeModel.js +9 -2
  68. package/lib/model/node/HtmlNodeModel.d.ts +12 -0
  69. package/lib/model/node/HtmlNodeModel.js +19 -0
  70. package/lib/model/node/PolygonNodeModel.js +3 -3
  71. package/lib/options.d.ts +4 -2
  72. package/lib/style/index.css +3 -2
  73. package/lib/style/index.less +3 -2
  74. package/lib/style/raw.d.ts +1 -1
  75. package/lib/style/raw.js +1 -1
  76. package/lib/tool/MultipleSelectTool.js +10 -5
  77. package/lib/util/drag.js +0 -1
  78. package/lib/util/edge.d.ts +40 -1
  79. package/lib/util/edge.js +43 -9
  80. package/lib/util/geometry.d.ts +8 -0
  81. package/lib/util/geometry.js +81 -1
  82. package/lib/util/theme.d.ts +2 -65
  83. package/lib/util/theme.js +15 -292
  84. package/lib/view/Anchor.d.ts +1 -0
  85. package/lib/view/Anchor.js +24 -21
  86. package/lib/view/Control.d.ts +5 -0
  87. package/lib/view/Control.js +44 -57
  88. package/lib/view/edge/BaseEdge.js +9 -0
  89. package/lib/view/edge/PolylineEdge.js +13 -2
  90. package/lib/view/node/BaseNode.d.ts +1 -0
  91. package/lib/view/node/BaseNode.js +22 -10
  92. package/lib/view/node/HtmlNode.js +1 -3
  93. package/lib/view/overlay/CanvasOverlay.js +5 -2
  94. package/lib/view/overlay/Grid.d.ts +12 -1
  95. package/lib/view/overlay/Grid.js +83 -21
  96. package/lib/view/overlay/OutlineOverlay.d.ts +1 -0
  97. package/lib/view/overlay/OutlineOverlay.js +18 -17
  98. package/lib/view/overlay/gridConfig.d.ts +46 -0
  99. package/lib/view/overlay/gridConfig.js +104 -0
  100. package/lib/view/shape/Polygon.d.ts +0 -7
  101. package/lib/view/shape/Polygon.js +13 -45
  102. package/package.json +6 -1
  103. package/.turbo/turbo-build$colon$dev.log +0 -10
  104. package/.turbo/turbo-build.log +0 -33
  105. package/CHANGELOG.md +0 -1849
  106. package/__tests__/algorithm/egde.test.ts +0 -131
  107. package/__tests__/algorithm/index.test.ts +0 -74
  108. package/__tests__/algorithm/outline.test.ts +0 -43
  109. package/__tests__/bugs/1545-spec.test.ts +0 -42
  110. package/__tests__/event/event.test.ts +0 -22
  111. package/__tests__/history/history.test.ts +0 -28
  112. package/__tests__/logicflow.test.ts +0 -575
  113. package/__tests__/model/graphmodel.test.ts +0 -87
  114. package/__tests__/util/compatible.test.ts +0 -48
  115. package/__tests__/util/edge.test.ts +0 -224
  116. package/__tests__/util/geometry.test.ts +0 -14
  117. package/__tests__/util/graph.test.ts +0 -16
  118. package/__tests__/util/matrix.test.ts +0 -41
  119. package/__tests__/util/node.test.ts +0 -68
  120. package/__tests__/util/sampling.test.ts +0 -12
  121. package/__tests__/util/vector.test.ts +0 -50
  122. package/__tests__/util/zIndex.test.ts +0 -10
  123. package/src/LogicFlow.tsx +0 -2008
  124. package/src/algorithm/edge.ts +0 -67
  125. package/src/algorithm/index.ts +0 -70
  126. package/src/algorithm/outline.ts +0 -77
  127. package/src/algorithm/rotate.ts +0 -55
  128. package/src/common/drag.ts +0 -219
  129. package/src/common/history.ts +0 -108
  130. package/src/common/index.ts +0 -6
  131. package/src/common/keyboard.ts +0 -108
  132. package/src/common/matrix.ts +0 -122
  133. package/src/common/vector.ts +0 -93
  134. package/src/constant/index.ts +0 -179
  135. package/src/event/event.md +0 -66
  136. package/src/event/eventArgs.ts +0 -643
  137. package/src/event/eventEmitter.ts +0 -156
  138. package/src/history/index.ts +0 -119
  139. package/src/index.less +0 -1
  140. package/src/index.ts +0 -26
  141. package/src/keyboard/index.ts +0 -112
  142. package/src/keyboard/shortcut.ts +0 -200
  143. package/src/model/BaseModel.ts +0 -250
  144. package/src/model/EditConfigModel.ts +0 -334
  145. package/src/model/GraphModel.ts +0 -1788
  146. package/src/model/NestedTransformModel.ts +0 -121
  147. package/src/model/SnaplineModel.ts +0 -256
  148. package/src/model/TransformModel.ts +0 -258
  149. package/src/model/edge/BaseEdgeModel.ts +0 -777
  150. package/src/model/edge/BezierEdgeModel.ts +0 -197
  151. package/src/model/edge/LineEdgeModel.ts +0 -36
  152. package/src/model/edge/PolylineEdgeModel.ts +0 -672
  153. package/src/model/edge/index.ts +0 -4
  154. package/src/model/index.ts +0 -9
  155. package/src/model/node/BaseNodeModel.ts +0 -949
  156. package/src/model/node/CircleNodeModel.ts +0 -91
  157. package/src/model/node/DiamondNodeModel.ts +0 -132
  158. package/src/model/node/EllipseNodeModel.ts +0 -98
  159. package/src/model/node/HtmlNodeModel.ts +0 -50
  160. package/src/model/node/PolygonNodeModel.ts +0 -150
  161. package/src/model/node/RectNodeModel.ts +0 -69
  162. package/src/model/node/TextNodeModel.ts +0 -54
  163. package/src/model/node/index.ts +0 -8
  164. package/src/options.ts +0 -145
  165. package/src/style/index.less +0 -261
  166. package/src/style/raw.ts +0 -220
  167. package/src/tool/MultipleSelectTool.tsx +0 -132
  168. package/src/tool/TextEditTool.tsx +0 -193
  169. package/src/tool/index.ts +0 -101
  170. package/src/typings.d.ts +0 -5
  171. package/src/util/animation.ts +0 -29
  172. package/src/util/browser.ts +0 -4
  173. package/src/util/compatible.ts +0 -15
  174. package/src/util/drag.ts +0 -220
  175. package/src/util/edge.ts +0 -1060
  176. package/src/util/geometry.ts +0 -55
  177. package/src/util/graph.ts +0 -46
  178. package/src/util/index.ts +0 -17
  179. package/src/util/matrix.ts +0 -129
  180. package/src/util/mobx.ts +0 -23
  181. package/src/util/node.ts +0 -543
  182. package/src/util/raf.ts +0 -28
  183. package/src/util/resize.ts +0 -606
  184. package/src/util/sampling.ts +0 -85
  185. package/src/util/theme.ts +0 -375
  186. package/src/util/uuid.ts +0 -26
  187. package/src/util/vector.ts +0 -93
  188. package/src/util/zIndex.ts +0 -6
  189. package/src/view/Anchor.tsx +0 -445
  190. package/src/view/Control.tsx +0 -512
  191. package/src/view/Graph.tsx +0 -141
  192. package/src/view/Rotate.tsx +0 -113
  193. package/src/view/behavior/dnd.ts +0 -162
  194. package/src/view/behavior/index.ts +0 -2
  195. package/src/view/behavior/snapline.ts +0 -16
  196. package/src/view/edge/AdjustPoint.tsx +0 -425
  197. package/src/view/edge/Arrow.tsx +0 -54
  198. package/src/view/edge/BaseEdge.tsx +0 -650
  199. package/src/view/edge/BezierEdge.tsx +0 -101
  200. package/src/view/edge/LineEdge.tsx +0 -81
  201. package/src/view/edge/PolylineEdge.tsx +0 -299
  202. package/src/view/edge/index.ts +0 -6
  203. package/src/view/index.ts +0 -8
  204. package/src/view/node/BaseNode.tsx +0 -571
  205. package/src/view/node/CircleNode.tsx +0 -21
  206. package/src/view/node/DiamondNode.tsx +0 -24
  207. package/src/view/node/EllipseNode.tsx +0 -22
  208. package/src/view/node/HtmlNode.tsx +0 -95
  209. package/src/view/node/PolygonNode.tsx +0 -28
  210. package/src/view/node/RectNode.tsx +0 -30
  211. package/src/view/node/TextNode.tsx +0 -39
  212. package/src/view/node/index.ts +0 -8
  213. package/src/view/overlay/BackgroundOverlay.tsx +0 -34
  214. package/src/view/overlay/BezierAdjustOverlay.tsx +0 -150
  215. package/src/view/overlay/CanvasOverlay.tsx +0 -288
  216. package/src/view/overlay/Grid.tsx +0 -162
  217. package/src/view/overlay/ModificationOverlay.tsx +0 -31
  218. package/src/view/overlay/OutlineOverlay.tsx +0 -170
  219. package/src/view/overlay/SnaplineOverlay.tsx +0 -44
  220. package/src/view/overlay/ToolOverlay.tsx +0 -65
  221. package/src/view/overlay/getTransformHoc.tsx +0 -50
  222. package/src/view/overlay/index.ts +0 -8
  223. package/src/view/shape/Circle.tsx +0 -41
  224. package/src/view/shape/Ellipse.tsx +0 -42
  225. package/src/view/shape/Line.tsx +0 -39
  226. package/src/view/shape/Path.tsx +0 -22
  227. package/src/view/shape/Polygon.tsx +0 -91
  228. package/src/view/shape/Polyline.tsx +0 -31
  229. package/src/view/shape/Rect.tsx +0 -44
  230. package/src/view/shape/Text.tsx +0 -169
  231. package/src/view/shape/index.ts +0 -8
  232. package/src/view/text/BaseText.tsx +0 -134
  233. package/src/view/text/LineText.tsx +0 -168
  234. package/src/view/text/index.ts +0 -2
  235. package/stats.html +0 -4842
  236. package/tsconfig.json +0 -18
@@ -57,6 +57,10 @@ var MultipleSelect = /** @class */ (function (_super) {
57
57
  function MultipleSelect(props) {
58
58
  var _this = _super.call(this, props) || this;
59
59
  _this.handleMouseDown = function (ev) {
60
+ // 多选区域的拖拽步长随缩放变化
61
+ var _a = _this.props, gridSize = _a.graphModel.gridSize, lf = _a.lf;
62
+ var SCALE_X = lf.getTransform().SCALE_X;
63
+ _this.stepDrag.setStep(gridSize * SCALE_X);
60
64
  _this.stepDrag.handleMouseDown(ev);
61
65
  };
62
66
  // 使多选区域的滚轮事件可以触发画布的滚轮事件
@@ -117,8 +121,9 @@ var MultipleSelect = /** @class */ (function (_super) {
117
121
  }
118
122
  MultipleSelect.prototype.render = function () {
119
123
  var _a, _b;
120
- var _c = this.props.graphModel, selectElements = _c.selectElements, transformModel = _c.transformModel;
124
+ var _c = this.props.graphModel, selectElements = _c.selectElements, transformModel = _c.transformModel, theme = _c.theme;
121
125
  var _d = this.props.lf.getTransform(), SCALE_X = _d.SCALE_X, SCALE_Y = _d.SCALE_Y;
126
+ var _e = theme.multiSelect || {}, _f = _e.xPadding, xPadding = _f === void 0 ? 8 : _f, _g = _e.yPadding, yPadding = _g === void 0 ? 8 : _g;
122
127
  if (selectElements.size <= 1)
123
128
  return;
124
129
  var x = Number.MAX_SAFE_INTEGER;
@@ -143,10 +148,10 @@ var MultipleSelect = /** @class */ (function (_super) {
143
148
  _a = __read(transformModel.CanvasPointToHtmlPoint([x, y]), 2), x = _a[0], y = _a[1];
144
149
  _b = __read(transformModel.CanvasPointToHtmlPoint([x1, y1]), 2), x1 = _b[0], y1 = _b[1];
145
150
  var style = {
146
- left: "".concat(x - (20 * SCALE_X) / 2, "px"),
147
- top: "".concat(y - (20 * SCALE_Y) / 2, "px"),
148
- width: "".concat(x1 - x + 20 * SCALE_X, "px"),
149
- height: "".concat(y1 - y + 20 * SCALE_Y, "px"),
151
+ left: "".concat(x - (20 * SCALE_X) / 2 - xPadding / 2, "px"),
152
+ top: "".concat(y - (20 * SCALE_Y) / 2 - yPadding / 2, "px"),
153
+ width: "".concat(x1 - x + 20 * SCALE_X + xPadding, "px"),
154
+ height: "".concat(y1 - y + 20 * SCALE_Y + yPadding, "px"),
150
155
  'border-width': "".concat(2 * SCALE_X, "px"),
151
156
  };
152
157
  return ((0, jsx_runtime_1.jsx)("div", { className: "lf-multiple-select", style: style, onPointerDown: this.handleMouseDown, onContextMenu: this.handleContextMenu, onWheel: this.handleWheelEvent }));
package/lib/util/drag.js CHANGED
@@ -26,7 +26,6 @@ var StepDrag = /** @class */ (function () {
26
26
  return;
27
27
  if (_this.isStopPropagation)
28
28
  e.stopPropagation();
29
- e.preventDefault();
30
29
  _this.isStartDragging = true;
31
30
  _this.startX = e.clientX;
32
31
  _this.startY = e.clientY;
@@ -14,9 +14,18 @@ export declare const filterRepeatPoints: (points: Point[]) => Point[];
14
14
  export declare const getSimplePolyline: (sPoint: Point, tPoint: Point) => Point[];
15
15
  export declare const getExpandedBBox: (bbox: BoxBounds, offset: number) => BoxBounds;
16
16
  export declare const pointDirection: (point: Point, bbox: BoxBounds) => Direction;
17
+ /**
18
+ * 计算扩展包围盒上的相邻点(起点或终点的下一个/上一个拐点)
19
+ * - 使用原始节点 bbox 来判定点相对中心的方向,避免 offset 扩展后宽高改变导致方向误判
20
+ * - 若 start 相对中心为水平方向,则返回扩展盒在 x 上的边界,y 保持不变
21
+ * - 若为垂直方向,则返回扩展盒在 y 上的边界,x 保持不变
22
+ * @param expendBBox 扩展后的包围盒(包含 offset)
23
+ * @param bbox 原始节点包围盒(用于正确的方向判定)
24
+ * @param point 起点或终点坐标
25
+ */
17
26
  export declare const getExpandedBBoxPoint: (expendBBox: BoxBounds, bbox: BoxBounds, point: Point) => Point;
18
27
  export declare const mergeBBox: (b1: BoxBounds, b2: BoxBounds) => BoxBounds;
19
- export declare const getBBoxOfPoints: (points?: Point[], offset?: number) => BoxBounds;
28
+ export declare const getBBoxOfPoints: (points?: Point[], offset?: number, heightOffset?: number) => BoxBounds;
20
29
  export declare const getPointsFromBBox: (bbox: BoxBounds) => [Point, Point, Point, Point];
21
30
  export declare const isPointOutsideBBox: (point: Point, bbox: BoxBounds) => boolean;
22
31
  export declare const getBBoxXCrossPoints: (bbox: BoxBounds, x: number) => [Point, Point] | [
@@ -32,10 +41,36 @@ export declare const rebuildPath: (pathPoints: Point[], pointById: PolyPointMap,
32
41
  export declare const removeClosePointFromOpenList: (arr: Point[], item: Point) => void;
33
42
  export declare const isSegmentsIntersected: (p0: Point, p1: Point, p2: Point, p3: Point) => boolean;
34
43
  export declare const isSegmentCrossingBBox: (p1: Point, p2: Point, bbox: BoxBounds) => boolean;
44
+ /**
45
+ * 基于轴对齐规则获取某点的相邻可连通点(不穿越节点)
46
+ * - 仅考虑 x 或 y 相同的候选点,保证严格水平/垂直
47
+ * - 使用 isSegmentCrossingBBox 校验线段不穿越源/目标节点
48
+ */
35
49
  export declare const getNextNeighborPoints: (points: Point[], point: Point, bbox1: BoxBounds, bbox2: BoxBounds) => Point[];
50
+ /**
51
+ * 使用 A* + 曼哈顿启发式在候选点图上查找正交路径
52
+ * - 开放集/关闭集管理遍历
53
+ * - gScore 为累计实际代价,fScore = gScore + 启发式
54
+ * - 邻居仅为与当前点 x 或 y 相同且不穿越节点的点
55
+ * 参考:https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95
56
+ */
36
57
  export declare const pathFinder: (points: Point[], start: Point, goal: Point, sBBox: BoxBounds, tBBox: BoxBounds, os: Point, ot: Point) => Point[];
37
58
  export declare const getBoxByOriginNode: (node: BaseNodeModel) => BoxBounds;
59
+ /**
60
+ * 去除共线冗余中间点,保持每条直线段仅保留两端点
61
+ * - 若三点在同一水平线或同一垂直线,移除中间点
62
+ */
38
63
  export declare const pointFilter: (points: Point[]) => Point[];
64
+ /**
65
+ * 计算折线点(正交候选点 + A* 路径)
66
+ * 步骤:
67
+ * 1) 取源/目标节点的扩展包围盒与相邻点 sPoint/tPoint
68
+ * 2) 若两个扩展盒重合,使用简单路径 getSimplePoints
69
+ * 3) 构造 lineBBox/sMixBBox/tMixBBox,并收集其角点与中心交点
70
+ * 4) 过滤掉落在两个扩展盒内部的点,形成 connectPoints
71
+ * 5) 以 sPoint/tPoint 为起止,用 A* 查找路径
72
+ * 6) 拼入原始 start/end,并用 pointFilter 去除冗余共线点
73
+ */
39
74
  export declare const getPolylinePoints: (start: Point, end: Point, sNode: BaseNodeModel, tNode: BaseNodeModel, offset: number) => Point[];
40
75
  /**
41
76
  * 获取折线中最长的一个线
@@ -47,6 +82,10 @@ export declare const isSegmentsCrossNode: (start: Point, end: Point, node: BaseN
47
82
  export declare const getCrossPointInRect: (start: Point, end: Point, node: BaseNodeModel) => Point | false | undefined;
48
83
  export declare const segmentDirection: (start: Point, end: Point) => Direction | undefined;
49
84
  export declare const points2PointsList: (points: string) => Point[];
85
+ /**
86
+ * 当扩展 bbox 重合时的简化拐点计算
87
+ * - 根据起止段的方向(水平/垂直)插入 1~2 个中间点,避免折线重合与穿越
88
+ */
50
89
  export declare const getSimplePoints: (start: Point, end: Point, sPoint: Point, tPoint: Point) => Point[];
51
90
  export declare const getBytesLength: (word: string) => number;
52
91
  export declare const getTextWidth: (text: string, font: string) => number;
package/lib/util/edge.js CHANGED
@@ -122,6 +122,15 @@ var pointDirection = function (point, bbox) {
122
122
  };
123
123
  exports.pointDirection = pointDirection;
124
124
  /* 获取扩展图形上的点,即起始终点相邻的点,上一个或者下一个节点 */
125
+ /**
126
+ * 计算扩展包围盒上的相邻点(起点或终点的下一个/上一个拐点)
127
+ * - 使用原始节点 bbox 来判定点相对中心的方向,避免 offset 扩展后宽高改变导致方向误判
128
+ * - 若 start 相对中心为水平方向,则返回扩展盒在 x 上的边界,y 保持不变
129
+ * - 若为垂直方向,则返回扩展盒在 y 上的边界,x 保持不变
130
+ * @param expendBBox 扩展后的包围盒(包含 offset)
131
+ * @param bbox 原始节点包围盒(用于正确的方向判定)
132
+ * @param point 起点或终点坐标
133
+ */
125
134
  var getExpandedBBoxPoint = function (expendBBox, bbox, point) {
126
135
  // https://github.com/didi/LogicFlow/issues/817
127
136
  // 没有修复前传入的参数bbox实际是expendBBox
@@ -166,7 +175,7 @@ exports.mergeBBox = mergeBBox;
166
175
  * 1、获取起始终点相邻点(expendBboxPoint)的bbox
167
176
  * 2、polylineEdge, bezierEdge,获取outline边框,这种情况传入offset
168
177
  */
169
- var getBBoxOfPoints = function (points, offset) {
178
+ var getBBoxOfPoints = function (points, offset, heightOffset) {
170
179
  if (points === void 0) { points = []; }
171
180
  var xList = [];
172
181
  var yList = [];
@@ -182,7 +191,7 @@ var getBBoxOfPoints = function (points, offset) {
182
191
  var height = maxY - minY;
183
192
  if (offset) {
184
193
  width += offset;
185
- height += offset;
194
+ height += heightOffset || offset;
186
195
  }
187
196
  return {
188
197
  centerX: (minX + maxX) / 2,
@@ -337,7 +346,11 @@ var isSegmentCrossingBBox = function (p1, p2, bbox) {
337
346
  (0, exports.isSegmentsIntersected)(p1, p2, pc, pd));
338
347
  };
339
348
  exports.isSegmentCrossingBBox = isSegmentCrossingBBox;
340
- /* 获取下一个相邻的点 */
349
+ /**
350
+ * 基于轴对齐规则获取某点的相邻可连通点(不穿越节点)
351
+ * - 仅考虑 x 或 y 相同的候选点,保证严格水平/垂直
352
+ * - 使用 isSegmentCrossingBBox 校验线段不穿越源/目标节点
353
+ */
341
354
  var getNextNeighborPoints = function (points, point, bbox1, bbox2) {
342
355
  var neighbors = [];
343
356
  points.forEach(function (p) {
@@ -353,9 +366,12 @@ var getNextNeighborPoints = function (points, point, bbox1, bbox2) {
353
366
  return (0, exports.filterRepeatPoints)(neighbors);
354
367
  };
355
368
  exports.getNextNeighborPoints = getNextNeighborPoints;
356
- /* 路径查找,AStar查找+曼哈顿距离
357
- * 算法wiki:https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95
358
- * 方法无法复用,且调用了很多polyline相关的方法,暂不抽离到src/algorithm中
369
+ /**
370
+ * 使用 A* + 曼哈顿启发式在候选点图上查找正交路径
371
+ * - 开放集/关闭集管理遍历
372
+ * - gScore 为累计实际代价,fScore = gScore + 启发式
373
+ * - 邻居仅为与当前点 x 或 y 相同且不穿越节点的点
374
+ * 参考:https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95
359
375
  */
360
376
  var pathFinder = function (points, start, goal, sBBox, tBBox, os, ot) {
361
377
  // 定义已经遍历过的点
@@ -396,6 +412,7 @@ var pathFinder = function (points, start, goal, sBBox, tBBox, os, ot) {
396
412
  (0, exports.removeClosePointFromOpenList)(openSet, current);
397
413
  closedSet.push(current);
398
414
  (0, exports.getNextNeighborPoints)(points, current, sBBox, tBBox).forEach(function (neighbor) {
415
+ var _a;
399
416
  if (closedSet.indexOf(neighbor) !== -1) {
400
417
  return;
401
418
  }
@@ -403,7 +420,8 @@ var pathFinder = function (points, start, goal, sBBox, tBBox, os, ot) {
403
420
  openSet.push(neighbor);
404
421
  }
405
422
  if ((current === null || current === void 0 ? void 0 : current.id) && (neighbor === null || neighbor === void 0 ? void 0 : neighbor.id)) {
406
- var tentativeGScore = fScore[current.id] + (0, exports.estimateDistance)(current, neighbor);
423
+ // 修复:累计代价应基于 gScore[current] 而非 fScore[current]
424
+ var tentativeGScore = ((_a = gScore[current.id]) !== null && _a !== void 0 ? _a : 0) + (0, exports.estimateDistance)(current, neighbor);
407
425
  if (gScore[neighbor.id] && tentativeGScore >= gScore[neighbor.id]) {
408
426
  return;
409
427
  }
@@ -427,7 +445,10 @@ var getBoxByOriginNode = function (node) {
427
445
  return (0, _1.getNodeBBox)(node);
428
446
  };
429
447
  exports.getBoxByOriginNode = getBoxByOriginNode;
430
- /* 保证一条直线上只有2个节点: 删除x/y相同的中间节点 */
448
+ /**
449
+ * 去除共线冗余中间点,保持每条直线段仅保留两端点
450
+ * - 若三点在同一水平线或同一垂直线,移除中间点
451
+ */
431
452
  var pointFilter = function (points) {
432
453
  var i = 1;
433
454
  while (i < points.length - 1) {
@@ -445,7 +466,16 @@ var pointFilter = function (points) {
445
466
  return points;
446
467
  };
447
468
  exports.pointFilter = pointFilter;
448
- /* 计算折线点 */
469
+ /**
470
+ * 计算折线点(正交候选点 + A* 路径)
471
+ * 步骤:
472
+ * 1) 取源/目标节点的扩展包围盒与相邻点 sPoint/tPoint
473
+ * 2) 若两个扩展盒重合,使用简单路径 getSimplePoints
474
+ * 3) 构造 lineBBox/sMixBBox/tMixBBox,并收集其角点与中心交点
475
+ * 4) 过滤掉落在两个扩展盒内部的点,形成 connectPoints
476
+ * 5) 以 sPoint/tPoint 为起止,用 A* 查找路径
477
+ * 6) 拼入原始 start/end,并用 pointFilter 去除冗余共线点
478
+ */
449
479
  var getPolylinePoints = function (start, end, sNode, tNode, offset) {
450
480
  var sBBox = (0, exports.getBoxByOriginNode)(sNode);
451
481
  var tBBox = (0, exports.getBoxByOriginNode)(tNode);
@@ -589,6 +619,10 @@ var points2PointsList = function (points) {
589
619
  return pointsList;
590
620
  };
591
621
  exports.points2PointsList = points2PointsList;
622
+ /**
623
+ * 当扩展 bbox 重合时的简化拐点计算
624
+ * - 根据起止段的方向(水平/垂直)插入 1~2 个中间点,避免折线重合与穿越
625
+ */
592
626
  var getSimplePoints = function (start, end, sPoint, tPoint) {
593
627
  var points = [];
594
628
  // start,sPoint的方向,水平或者垂直,即路径第一条线段的方向
@@ -1,5 +1,6 @@
1
1
  import LogicFlow from '../LogicFlow';
2
2
  import PointTuple = LogicFlow.PointTuple;
3
+ import Point = LogicFlow.Point;
3
4
  export declare function snapToGrid(point: number, gridSize: number, snapGrid: boolean): number;
4
5
  export declare function getGridOffset(distance: number, gridSize: number): number;
5
6
  /**
@@ -9,3 +10,10 @@ export declare function getGridOffset(distance: number, gridSize: number): numbe
9
10
  * @param height
10
11
  */
11
12
  export declare function normalizePolygon(points?: PointTuple[], width?: number, height?: number): PointTuple[];
13
+ /**
14
+ * 通用圆角生成:为菱形、多边形、折线在转折处生成与矩形视觉一致的圆角
15
+ * - 圆角基于角平分线,切点距顶点的距离 t = r * tan(theta/2)
16
+ * - 半径会根据相邻边长度进行钳制,避免超过边长造成断裂
17
+ * - 多边形/菱形保持闭合;折线保持开口
18
+ */
19
+ export declare const generateRoundedCorners: (points: Point[], radius: number, isClosedShape: boolean) => Point[];
@@ -25,7 +25,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
25
25
  return to.concat(ar || Array.prototype.slice.call(from));
26
26
  };
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.normalizePolygon = exports.getGridOffset = exports.snapToGrid = void 0;
28
+ exports.generateRoundedCorners = exports.normalizePolygon = exports.getGridOffset = exports.snapToGrid = void 0;
29
29
  function snapToGrid(point, gridSize, snapGrid) {
30
30
  // 开启节网格对齐时才根据网格尺寸校准坐标
31
31
  if (!snapGrid)
@@ -78,3 +78,83 @@ function normalizePolygon(points, width, height) {
78
78
  });
79
79
  }
80
80
  exports.normalizePolygon = normalizePolygon;
81
+ /**
82
+ * 通用圆角生成:为菱形、多边形、折线在转折处生成与矩形视觉一致的圆角
83
+ * - 圆角基于角平分线,切点距顶点的距离 t = r * tan(theta/2)
84
+ * - 半径会根据相邻边长度进行钳制,避免超过边长造成断裂
85
+ * - 多边形/菱形保持闭合;折线保持开口
86
+ */
87
+ var generateRoundedCorners = function (points, radius, isClosedShape) {
88
+ var n = points.length;
89
+ if (n < 2 || radius <= 0)
90
+ return points.slice();
91
+ var toVec = function (a, b) { return ({ x: b.x - a.x, y: b.y - a.y }); };
92
+ var len = function (v) { return Math.hypot(v.x, v.y); };
93
+ var norm = function (v) {
94
+ var l = len(v) || 1;
95
+ return { x: v.x / l, y: v.y / l };
96
+ };
97
+ var result = [];
98
+ // 用二次贝塞尔近似圆角,控制点取角点,避免复杂圆心计算
99
+ var makeRoundCorner = function (prev, curr, next) {
100
+ var vPrev = toVec(curr, prev);
101
+ var vNext = toVec(curr, next);
102
+ var dPrev = len(vPrev);
103
+ var dNext = len(vNext);
104
+ if (dPrev < 1e-6 || dNext < 1e-6)
105
+ return [curr];
106
+ var uPrev = norm(vPrev);
107
+ var uNext = norm(vNext);
108
+ var t = Math.min(radius, dPrev * 0.45, dNext * 0.45);
109
+ var start = { x: curr.x + uPrev.x * t, y: curr.y + uPrev.y * t };
110
+ var end = { x: curr.x + uNext.x * t, y: curr.y + uNext.y * t };
111
+ // 二次贝塞尔采样:B(s) = (1-s)^2*start + 2(1-s)s*curr + s^2*end
112
+ var steps = 10; // 3段近似,简洁且效果稳定
113
+ var pts = [start];
114
+ for (var k = 1; k < steps; k++) {
115
+ var s = k / steps;
116
+ var a = 1 - s;
117
+ pts.push({
118
+ x: a * a * start.x + 2 * a * s * curr.x + s * s * end.x,
119
+ y: a * a * start.y + 2 * a * s * curr.y + s * s * end.y,
120
+ });
121
+ }
122
+ pts.push(end);
123
+ return pts;
124
+ };
125
+ for (var i = 0; i < n; i++) {
126
+ var prevIdx = i === 0 ? (isClosedShape ? n - 1 : 0) : i - 1;
127
+ var nextIdx = i === n - 1 ? (isClosedShape ? 0 : n - 1) : i + 1;
128
+ var prev = points[prevIdx];
129
+ var curr = points[i];
130
+ var next = points[nextIdx];
131
+ var isEndpoint = !isClosedShape && (i === 0 || i === n - 1);
132
+ if (isEndpoint) {
133
+ // 折线两端不处理圆角
134
+ result.push(curr);
135
+ }
136
+ else {
137
+ var arc = makeRoundCorner(prev, curr, next);
138
+ arc.forEach(function (p) { return result.push(p); });
139
+ }
140
+ }
141
+ // 去重处理:避免连续重复点
142
+ var dedup = [];
143
+ for (var i = 0; i < result.length; i++) {
144
+ var p = result[i];
145
+ if (dedup.length === 0 ||
146
+ Math.hypot(p.x - dedup[dedup.length - 1].x, p.y - dedup[dedup.length - 1].y) > 1e-6) {
147
+ dedup.push(p);
148
+ }
149
+ }
150
+ // 闭合图形:确保首尾不重复闭合
151
+ if (isClosedShape && dedup.length > 1) {
152
+ var first = dedup[0];
153
+ var last = dedup[dedup.length - 1];
154
+ if (Math.hypot(first.x - last.x, first.y - last.y) < 1e-6) {
155
+ dedup.pop();
156
+ }
157
+ }
158
+ return dedup;
159
+ };
160
+ exports.generateRoundedCorners = generateRoundedCorners;
@@ -1,69 +1,6 @@
1
1
  import LogicFlow from '../LogicFlow';
2
- export declare const defaultTheme: LogicFlow.Theme;
3
- export declare const radiusMode: any;
4
- export declare const darkMode: any;
5
- export declare const colorfulMode: any;
6
- export declare const themeModeMap: {
7
- colorful: any;
8
- dark: any;
9
- radius: any;
10
- default: LogicFlow.Theme;
11
- };
12
- export declare const darkBackground: {
13
- background: string;
14
- };
15
- export declare const colorfulBackground: {
16
- background: string;
17
- };
18
- export declare const defaultBackground: {
19
- background: string;
20
- };
21
- export declare const backgroundModeMap: {
22
- colorful: {
23
- background: string;
24
- };
25
- dark: {
26
- background: string;
27
- };
28
- radius: {
29
- background: string;
30
- };
31
- default: {
32
- background: string;
33
- };
34
- };
35
- export declare const darkGrid: {
36
- color: string;
37
- thickness: number;
38
- };
39
- export declare const colorfulGrid: {
40
- color: string;
41
- thickness: number;
42
- };
43
- export declare const defaultGrid: {
44
- color: string;
45
- thickness: number;
46
- };
47
- export declare const gridModeMap: {
48
- colorful: {
49
- color: string;
50
- thickness: number;
51
- };
52
- dark: {
53
- color: string;
54
- thickness: number;
55
- };
56
- radius: {
57
- color: string;
58
- thickness: number;
59
- };
60
- default: {
61
- color: string;
62
- thickness: number;
63
- };
64
- };
65
- export declare const setupTheme: (customTheme?: Partial<LogicFlow.Theme>, themeMode?: 'radius' | 'dark' | 'colorful' | 'default' | string) => LogicFlow.Theme;
2
+ export declare const setupTheme: (customTheme?: Partial<LogicFlow.Theme>, themeMode?: LogicFlow.ThemeMode | string) => LogicFlow.Theme;
66
3
  export declare const addThemeMode: (themeMode: string, style: Partial<LogicFlow.Theme>) => void;
67
4
  export declare const removeThemeMode: (themeMode: string) => void;
68
5
  export declare const clearThemeMode: () => void;
69
- export declare const updateTheme: (customTheme?: Partial<LogicFlow.Theme>, themeMode?: 'radius' | 'dark' | 'colorful' | 'default' | string) => LogicFlow.Theme;
6
+ export declare const updateTheme: (customTheme?: Partial<LogicFlow.Theme>, themeMode?: LogicFlow.ThemeMode | string) => LogicFlow.Theme;