@logicflow/core 2.2.1 → 2.2.2

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 (126) hide show
  1. package/dist/docs/api/logicflow-constructor/index.en.md +106 -0
  2. package/dist/docs/api/logicflow-constructor/index.zh.md +106 -0
  3. package/dist/docs/api/logicflow-constructor/use.en.md +61 -0
  4. package/dist/docs/api/logicflow-constructor/use.zh.md +61 -0
  5. package/dist/docs/api/logicflow-instance/canvas.en.md +197 -0
  6. package/dist/docs/api/logicflow-instance/canvas.zh.md +199 -0
  7. package/dist/docs/api/logicflow-instance/edge.en.md +273 -0
  8. package/dist/docs/api/logicflow-instance/edge.zh.md +273 -0
  9. package/dist/docs/api/logicflow-instance/edit-config.en.md +59 -0
  10. package/dist/docs/api/logicflow-instance/edit-config.zh.md +59 -0
  11. package/dist/docs/api/logicflow-instance/element.en.md +375 -0
  12. package/dist/docs/api/logicflow-instance/element.zh.md +379 -0
  13. package/dist/docs/api/logicflow-instance/event.en.md +326 -0
  14. package/dist/docs/api/logicflow-instance/event.zh.md +406 -0
  15. package/dist/docs/api/logicflow-instance/history.en.md +38 -0
  16. package/dist/docs/api/logicflow-instance/history.zh.md +38 -0
  17. package/dist/docs/api/logicflow-instance/index.en.md +41 -0
  18. package/dist/docs/api/logicflow-instance/index.zh.md +41 -0
  19. package/dist/docs/api/logicflow-instance/node.en.md +308 -0
  20. package/dist/docs/api/logicflow-instance/node.zh.md +308 -0
  21. package/dist/docs/api/logicflow-instance/register.en.md +76 -0
  22. package/dist/docs/api/logicflow-instance/register.zh.md +76 -0
  23. package/dist/docs/api/logicflow-instance/render-and-data.en.md +179 -0
  24. package/dist/docs/api/logicflow-instance/render-and-data.zh.md +181 -0
  25. package/dist/docs/api/logicflow-instance/text.en.md +60 -0
  26. package/dist/docs/api/logicflow-instance/text.zh.md +60 -0
  27. package/dist/docs/api/logicflow-instance/theme.en.md +179 -0
  28. package/dist/docs/api/logicflow-instance/theme.zh.md +179 -0
  29. package/dist/docs/api/runtime-model/edgeModel.en.md +29 -0
  30. package/dist/docs/api/runtime-model/edgeModel.zh.md +325 -0
  31. package/dist/docs/api/runtime-model/graphModel.en.md +275 -0
  32. package/dist/docs/api/runtime-model/graphModel.zh.md +1153 -0
  33. package/dist/docs/api/runtime-model/nodeModel.en.md +37 -0
  34. package/dist/docs/api/runtime-model/nodeModel.zh.md +644 -0
  35. package/dist/docs/api/type/MainTypes.en.md +598 -0
  36. package/dist/docs/api/type/MainTypes.zh.md +867 -0
  37. package/dist/docs/api/type/Theme.en.md +187 -0
  38. package/dist/docs/api/type/Theme.zh.md +187 -0
  39. package/dist/docs/api/type/canvas-types.en.md +25 -0
  40. package/dist/docs/api/type/canvas-types.zh.md +25 -0
  41. package/dist/docs/api/type/index.en.md +96 -0
  42. package/dist/docs/api/type/index.zh.md +99 -0
  43. package/dist/docs/api/type/node-types.en.md +21 -0
  44. package/dist/docs/api/type/node-types.zh.md +21 -0
  45. package/dist/docs/api/type/plugin-types.en.md +24 -0
  46. package/dist/docs/api/type/plugin-types.zh.md +24 -0
  47. package/dist/docs/index.md +11 -0
  48. package/dist/docs/tutorial/about.en.md +38 -0
  49. package/dist/docs/tutorial/about.zh.md +65 -0
  50. package/dist/docs/tutorial/advanced/dnd.en.md +62 -0
  51. package/dist/docs/tutorial/advanced/dnd.zh.md +52 -0
  52. package/dist/docs/tutorial/advanced/edge.en.md +64 -0
  53. package/dist/docs/tutorial/advanced/edge.zh.md +66 -0
  54. package/dist/docs/tutorial/advanced/keyboard.en.md +70 -0
  55. package/dist/docs/tutorial/advanced/keyboard.zh.md +67 -0
  56. package/dist/docs/tutorial/advanced/node.en.md +338 -0
  57. package/dist/docs/tutorial/advanced/node.zh.md +338 -0
  58. package/dist/docs/tutorial/advanced/react.en.md +106 -0
  59. package/dist/docs/tutorial/advanced/react.zh.md +114 -0
  60. package/dist/docs/tutorial/advanced/silent-mode.en.md +75 -0
  61. package/dist/docs/tutorial/advanced/silent-mode.zh.md +71 -0
  62. package/dist/docs/tutorial/advanced/snapline.en.md +54 -0
  63. package/dist/docs/tutorial/advanced/vue.en.md +249 -0
  64. package/dist/docs/tutorial/advanced/vue.zh.md +248 -0
  65. package/dist/docs/tutorial/ai.en.md +64 -0
  66. package/dist/docs/tutorial/ai.zh.md +64 -0
  67. package/dist/docs/tutorial/basic/background.en.md +50 -0
  68. package/dist/docs/tutorial/basic/canvas.en.md +164 -0
  69. package/dist/docs/tutorial/basic/canvas.zh.md +183 -0
  70. package/dist/docs/tutorial/basic/class.en.md +106 -0
  71. package/dist/docs/tutorial/basic/class.zh.md +103 -0
  72. package/dist/docs/tutorial/basic/edge.en.md +151 -0
  73. package/dist/docs/tutorial/basic/edge.zh.md +152 -0
  74. package/dist/docs/tutorial/basic/event.en.md +70 -0
  75. package/dist/docs/tutorial/basic/event.zh.md +66 -0
  76. package/dist/docs/tutorial/basic/grid.en.md +77 -0
  77. package/dist/docs/tutorial/basic/node.en.md +358 -0
  78. package/dist/docs/tutorial/basic/node.zh.md +318 -0
  79. package/dist/docs/tutorial/basic/theme.en.md +154 -0
  80. package/dist/docs/tutorial/basic/theme.zh.md +157 -0
  81. package/dist/docs/tutorial/extension/adapter.en.md +446 -0
  82. package/dist/docs/tutorial/extension/adapter.zh.md +429 -0
  83. package/dist/docs/tutorial/extension/bpmn-element.en.md +1427 -0
  84. package/dist/docs/tutorial/extension/bpmn-element.zh.md +1472 -0
  85. package/dist/docs/tutorial/extension/control.en.md +117 -0
  86. package/dist/docs/tutorial/extension/control.zh.md +118 -0
  87. package/dist/docs/tutorial/extension/curved-edge.en.md +46 -0
  88. package/dist/docs/tutorial/extension/curved-edge.zh.md +46 -0
  89. package/dist/docs/tutorial/extension/custom.en.md +142 -0
  90. package/dist/docs/tutorial/extension/custom.zh.md +138 -0
  91. package/dist/docs/tutorial/extension/dnd-panel.en.md +109 -0
  92. package/dist/docs/tutorial/extension/dnd-panel.zh.md +109 -0
  93. package/dist/docs/tutorial/extension/dynamic-group.en.md +606 -0
  94. package/dist/docs/tutorial/extension/dynamic-group.zh.md +606 -0
  95. package/dist/docs/tutorial/extension/group.en.md +217 -0
  96. package/dist/docs/tutorial/extension/group.zh.md +209 -0
  97. package/dist/docs/tutorial/extension/highlight.en.md +50 -0
  98. package/dist/docs/tutorial/extension/highlight.zh.md +50 -0
  99. package/dist/docs/tutorial/extension/insert-node-in-polyline.en.md +52 -0
  100. package/dist/docs/tutorial/extension/insert-node-in-polyline.zh.md +47 -0
  101. package/dist/docs/tutorial/extension/intro.en.md +72 -0
  102. package/dist/docs/tutorial/extension/intro.zh.md +95 -0
  103. package/dist/docs/tutorial/extension/label.en.md +136 -0
  104. package/dist/docs/tutorial/extension/label.zh.md +135 -0
  105. package/dist/docs/tutorial/extension/layout.en.md +156 -0
  106. package/dist/docs/tutorial/extension/layout.zh.md +156 -0
  107. package/dist/docs/tutorial/extension/menu.en.md +319 -0
  108. package/dist/docs/tutorial/extension/menu.zh.md +377 -0
  109. package/dist/docs/tutorial/extension/minimap.en.md +164 -0
  110. package/dist/docs/tutorial/extension/minimap.zh.md +180 -0
  111. package/dist/docs/tutorial/extension/node-resize.en.md +199 -0
  112. package/dist/docs/tutorial/extension/node-resize.zh.md +221 -0
  113. package/dist/docs/tutorial/extension/pool.en.md +227 -0
  114. package/dist/docs/tutorial/extension/pool.zh.md +227 -0
  115. package/dist/docs/tutorial/extension/proximity-connect.en.md +104 -0
  116. package/dist/docs/tutorial/extension/proximity-connect.zh.md +107 -0
  117. package/dist/docs/tutorial/extension/selection.en.md +166 -0
  118. package/dist/docs/tutorial/extension/selection.zh.md +150 -0
  119. package/dist/docs/tutorial/extension/snapshot.en.md +276 -0
  120. package/dist/docs/tutorial/extension/snapshot.zh.md +276 -0
  121. package/dist/docs/tutorial/get-started.en.md +501 -0
  122. package/dist/docs/tutorial/get-started.zh.md +139 -0
  123. package/dist/docs/tutorial/update.en.md +213 -0
  124. package/dist/docs/tutorial/update.zh.md +212 -0
  125. package/package.json +5 -3
  126. package/scripts/postinstall-ai-prompt.js +67 -0
@@ -0,0 +1,37 @@
1
+ ---
2
+ nav: API
3
+ group:
4
+ title: Runtime Model
5
+ order: 3
6
+ title: nodeModel
7
+ toc: content
8
+ order: 13
9
+ ---
10
+
11
+ Every diagram node has a `nodeModel` that owns serializable data and rendering hooks. Prefer `graphModel` APIs or documented model methods instead of assigning arbitrary fields.
12
+
13
+ :::error{title=Warning}
14
+ Writing fields without understanding history, edges, and text synchronization can break the diagram. Move nodes through `graphModel.moveNode` rather than mutating `x` / `y` directly unless you know the implications.
15
+ :::
16
+
17
+ ## Data properties {#data-properties}
18
+
19
+ `data` mirrors what you pass through [`NodeConfig`](../type/MainTypes.en.md#nodeconfig): identity (`id`, `type`), geometry (`x`, `y`, `width`, `height`, rotation flags), nested `text`, `properties`, `zIndex`, and extension-specific slots returned by `getData()`.
20
+
21
+ ## Shape attributes {#shape-attributes}
22
+
23
+ Geometry that participates in layout and edge routing—width, height, radius, etc.—must be updated inside `setAttributes()` (or equivalent lifecycle hooks). Changing them elsewhere may leave edges or anchors inconsistent.
24
+
25
+ ## Style attributes {#style-attributes}
26
+
27
+ Visual styling is resolved through model methods such as `getNodeStyle`, `getTextStyle`, `getAnchorStyle`, `getOutlineStyle`, and related hooks. Override those methods in custom models instead of mutating SVG props directly from `view`.
28
+
29
+ ## initNodeData {#initnodedata}
30
+
31
+ Called when the model instance is created; override to seed default geometry, text, or `properties` before the first render.
32
+
33
+ ## setAttributes {#setattributes}
34
+
35
+ Runs whenever the renderer reconciles shape-related fields. Put width, height, radius, and other layout-critical updates here (especially for resizable nodes) so edges and anchors stay aligned.
36
+
37
+ For additional APIs (anchors, movement rules, serialization, etc.), follow the TypeScript definitions on `BaseNodeModel` / `RectNodeModel` in `@logicflow/core`.
@@ -0,0 +1,644 @@
1
+ ---
2
+ nav: API
3
+ group:
4
+ title: 运行时 Model
5
+ order: 3
6
+ title: nodeModel
7
+ toc: content
8
+ order: 13
9
+ ---
10
+
11
+ <style>
12
+ table td:first-of-type {
13
+ word-break: normal;
14
+ }
15
+ </style>
16
+
17
+ LogicFlow 中所有的节点都会有一个 nodeModel 与其对应。由于数据驱动视图的机制,我们对节点的所有操作事实上就是对
18
+ model 的操作。大多数情况下,我们不建议直接对 nodeModel 的属性进行赋值操作,而是调用 model
19
+ 或者 [graphModel](./graphModel.zh.md) 上提供的方法。
20
+
21
+ :::error{title=警告}
22
+ 在对 LogicFlow 内部源码不熟悉的情况下,对 model 的属性进行赋值操作可能会引起很多不符合预期的问题。例如在
23
+ model 中`x`,`y`表示节点的位置,如果想要移动节点直接修改`x`,`y`
24
+ 的话,会出现节点被移动了,而节点上的文本、节点相连的边都没有动。所以想要移动节点,最好的方法还是调用`graphModel`
25
+ 上的`moveNode`方法来实现。
26
+ :::
27
+
28
+ nodeModel 上节点属性有很多,由于用途不一样,我们对其进行了分类。
29
+
30
+ ## 数据属性
31
+
32
+ 节点的数据属性是指 LogicFlow 图数据是用于标识节点的数据。在流程图保存时一般都只保存节点的数据属性。
33
+
34
+ | 名称 | 类型 | 是否必须 | 描述 |
35
+ |:-----------|:------------------|:-----|:--------------------|
36
+ | id | string | ✅ | 节点 id |
37
+ | type | string | ✅ | 节点类型 |
38
+ | x | number | ✅ | 节点中心 x 轴坐标 |
39
+ | y | number | ✅ | 节点中心 y 轴坐标 |
40
+ | text | TextObject/string | | 节点文本 |
41
+ | properties | Object | | 包含节点样式、形状属性和业务自定义属性 |
42
+
43
+ **TextObject**
44
+
45
+ | 名称 | 类型 | 是否必须 | 描述 |
46
+ |:----------|:--------|:-----|:-------------------------|
47
+ | value | string | | 文本内容 |
48
+ | x | number | ✅ | 文本中心 x 轴坐标 |
49
+ | y | number | ✅ | 文本中心 y 轴坐标 |
50
+ | draggable | boolean | ✅ | 文本是否允许被拖动调整位置,保存时不会保存此属性 |
51
+ | editable | boolean | ✅ | 文本是否允许被双击编辑,保存时不会保存此属性 |
52
+
53
+ ## 状态属性
54
+
55
+ 一般用于自定义节点的时候,基于状态属性进行更细粒度的样式显示。
56
+
57
+ | 名称 | 类型 | 是否必须 | 描述 |
58
+ |:-------------|:--------|:-----|:----------------|
59
+ | isSelected | boolean | ✅ | 节点是否被选中 |
60
+ | isHovered | boolean | ✅ | 节点是否在 hover 状态 |
61
+ | isHitable | boolean | ✅ | 节点是否可点击 |
62
+ | draggable | boolean | ✅ | 节点是否可拖动 |
63
+ | isShowAnchor | boolean | ✅ | 是否显示锚点 |
64
+ | isDragging | boolean | ✅ | 是否在拖动 |
65
+ | visible | boolean | ✅ | 是否显示, `1.1.0`新增 |
66
+
67
+ ## 形状属性
68
+
69
+ LogicFlow 的形状属性主要是控制基础节点的主要外观。形状属性可以通过`setAttributes`或者`initNodeData`
70
+ 来设置。具体设置方式见[自定义节点的形状属性](../../tutorial/basic/node.zh.md#2-形状属性)。
71
+
72
+ | 名称 | 类型 | 是否必须 | 描述 |
73
+ |:-------|:------------------|:-----|:--------------------------------------|
74
+ | width | number | ✅ | 节点的宽度 |
75
+ | height | number | ✅ | 高度的高度 |
76
+ | radius | number | | 矩形节点特有,节点的圆角 |
77
+ | r | number | | 圆形节点特有,圆的半径。对于圆形节点,会自动基于半径计算出节点的高度和宽度 |
78
+ | rx | number | | 椭圆节点和菱形节点存在,水平圆角的半径。会自动基于半径计算出节点的宽度 |
79
+ | ry | number | | 椭圆节点和菱形节点存在,垂直圆角的半径。会自动基于半径计算出节点的高度 |
80
+ | points | [number,number][] | | 多边形节点特有,多边形顶点。会自定基于顶点计算出节点的宽度和高度 |
81
+
82
+ ## 其它属性
83
+
84
+ LogicFlow 在`model`上还维护一些属性,开发者可以通过这些属性拿到一些信息。例如拿到`graphModel`,
85
+ 节点的基础`model`类型等。
86
+
87
+ | 名称 | 类型 | 是否必须 | 描述 |
88
+ |:------------|:-----------------------|:-----|:------------------------------------------------------------------------------------------------------------------------------------------|
89
+ | graphModel | GraphModel | ✅ | 整个画布对应的 model,详情见[graphModelApi](./graphModel.zh.md) |
90
+ | zIndex | number | ✅ | 节点在 z 轴的高度,元素重合时,zIndex 高的在上面, 默认为 1 |
91
+ | state | number | ✅ | 元素状态,不同的状态对应着元素显示效果。DEFAULT = 1 默认显示;TEXT_EDIT = 2 此元素正在进行文本编辑;ALLOW_CONNECT = 4, 此元素允许作为当前边的目标节点;NOT_ALLOW_CONNECT = 5, 此元素不允许作为当前边的目标节点 |
92
+ | BaseType | string | ✅ | 当前 model 的基础类型,对于节点,则固定为`node`。主要用在节点和边混合的时候识别此`model`是节点还是边。 |
93
+ | modelType | string | ✅ | 当前 model 的类型,可取值有`node`, `rect-node`,`circle-node`,`polygon-node`,`ellipse-node`,`diamond-node`, `html-node`,`text-node` |
94
+ | moveRules | `Model.NodeMoveRule[]` | | 节点被移动之前的校验规则 |
95
+ | sourceRules | `Model.ConnectRule[]` | | 节点连接其它节点时的校验规则 |
96
+ | targetRules | `Model.ConnectRule[]` | | 节点被其它节点连接时的校验规则 |
97
+ | autoToFront | boolean | ✅ | 控制节点选中时是否自动置顶,默认为 true. |
98
+ | incoming | object | ✅ | 进入当前节点的所有边和节点,`v1.1.4` |
99
+ | outgoing | object | ✅ | 离开当前节点的所有边和节点, `v1.1.4` |
100
+ | virtual | boolean | - | 是否为虚拟节点,默认 false。当为 true 时导出数据不会包含此元素。 `v1.1.24` |
101
+
102
+ :::info{title=modelType与type的区别是什么?}
103
+ 在自定义节点的时候,`type`可以是开发者自定义的任何值,但是在 LogicFlow
104
+ 内部,涉及到这个节点的计算时,我们需要感知到这个节点的具体形状,这个时候不能用`type`,
105
+ 而是要用`modelType`来判断。
106
+ :::
107
+
108
+ ## 样式属性
109
+
110
+ LogicFlow 所有的节点最终都是以 SVG DOM 的方式渲染。但是除了形状属性之外,所有的其他属于 svg
111
+ 的属性都不会直接存在`nodeModel`。当开发者想要对 SVG DOM
112
+ 添加更多的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute" target="_blank">svg 属性</a>
113
+ 时,可以通过重写`nodeModel`上获取节点样式属性方法来实现。
114
+
115
+ ## 方法
116
+
117
+ ### getNodeStyle
118
+
119
+ 支持重写,自定义节点样式属性,默认为[主题(Theme 类型说明)](../logicflow-instance/theme.zh.md)
120
+
121
+ ```tsx | pure
122
+ class UserTaskModel extends RectNodeModel {
123
+ getNodeStyle() {
124
+ const style = super.getNodeStyle();
125
+ style.stroke = "blue";
126
+ style.strokeDasharray = "3 3";
127
+ return style;
128
+ }
129
+ }
130
+ ```
131
+
132
+ ### getTextStyle
133
+
134
+ 支持重写,自定义节点文本样式属性,默认为[主题(Theme 类型说明)](../logicflow-instance/theme.zh.md)
135
+
136
+ ```tsx | pure
137
+ class UserTaskModel extends RectNodeModel {
138
+ getTextStyle() {
139
+ const style = super.getTextStyle();
140
+ style.fontSize = 16;
141
+ return style;
142
+ }
143
+ }
144
+ ```
145
+
146
+ ### getAnchorStyle
147
+
148
+ 支持重写,自定义节点锚点样式属性,默认为[主题(Theme 类型说明)](../logicflow-instance/theme.zh.md)
149
+
150
+ ```tsx | pure
151
+ class UserTaskModel extends RectNodeModel {
152
+ getAnchorStyle(anchorInfo) {
153
+ const style = super.getAnchorStyle(anchorInfo);
154
+ style.stroke = "rgb(24, 125, 255)";
155
+ style.r = 3;
156
+ style.hover.r = 8;
157
+ style.hover.fill = "rgb(24, 125, 255)";
158
+ style.hover.stroke = "rgb(24, 125, 255)";
159
+ return style;
160
+ }
161
+ }
162
+ ```
163
+
164
+ ### getAnchorLineStyle
165
+
166
+ 支持重写,自定义节点锚点拖出连接线的样式属性,默认为[主题(Theme 类型说明)](../logicflow-instance/theme.zh.md)
167
+
168
+ ```tsx | pure
169
+ class UserTaskModel extends RectNodeModel {
170
+ getAnchorLineStyle(anchorInfo) {
171
+ const style = super.getAnchorLineStyle();
172
+ style.stroke = "rgb(24, 125, 255)";
173
+ return style;
174
+ }
175
+ }
176
+ ```
177
+
178
+ ### getOutlineStyle
179
+
180
+ 支持重写,自定义节点轮廓框的样式属性,默认为[主题(Theme 类型说明)](../logicflow-instance/theme.zh.md)
181
+
182
+ ```tsx | pure
183
+ class UserTaskModel extends RectNodeModel {
184
+ getOutlineStyle() {
185
+ const style = super.getOutlineStyle();
186
+ style.stroke = "red";
187
+ style.hover.stroke = "red";
188
+ return style;
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### initNodeData
194
+
195
+ 支持重写,初始化节点数据,将传入的图数据(data)转换为节点属性, 所以需要调用`super.initNodeData`触发转换方法。
196
+
197
+ - 在`super.initNodeData`之前,对图数据进行处理。
198
+ - 在`super.initNodeData`之后,对节点属性进行初始化。
199
+
200
+ ```tsx | pure
201
+ class UserTaskModel extends RectResize.model {
202
+ initNodeData(data) {
203
+ // 可以在super之前,强制设置节点文本位置不居中,而且在节点下面
204
+ if (!data.text || typeof data.text === "string") {
205
+ data.text = {
206
+ value: data.text || "",
207
+ x: data.x,
208
+ y: data.y + 40,
209
+ };
210
+ }
211
+ super.initNodeData(data);
212
+ this.width = 100;
213
+ this.height = 80;
214
+ }
215
+ }
216
+ ```
217
+
218
+ :::info{title=提示}
219
+ initNodeData 和 setAttributes 都可以对 nodeModel 的属性进行赋值,但是两者的区别在于:<br>
220
+
221
+ - `initNodeData`只在节点初始化的时候调用,用于初始化节点的属性。
222
+ - `setAttributes`除了初始化调用外,还会在 properties 发生变化了调用。
223
+ :::
224
+
225
+ 以上面代码为例,由于节点缩放的时候,会更新 properties 中的缩放后的大小,也就会触发`setAttributes`
226
+ 。如果在`setAttributes`中定义节点的初始大小的话,会导致节点无法缩放。
227
+
228
+ ### setAttributes
229
+
230
+ 设置 model 形状属性,每次 properties 发生变化会触发
231
+
232
+ ```tsx | pure
233
+ class UserTaskModel extends RectNodeModel {
234
+ setAttributes() {
235
+ const size = this.properties.scale || 1;
236
+ this.width = 100 * size;
237
+ this.height = 80 * size;
238
+ }
239
+ }
240
+ ```
241
+
242
+ ### createId
243
+
244
+ 支持重写,自定义节点 id 的生成规则.
245
+
246
+ :::warning{title=注意}
247
+
248
+ 1. 请保证此方法返回 id 的唯一性。<br>
249
+ 2. 此方法为同步方法,如果想要异步修改节点 id,
250
+ 请参考 <a href="https://github.com/didi/LogicFlow/issues/272" target="_blank">issues</a>。
251
+ :::
252
+
253
+ ```tsx | pure
254
+ import { v4 as uuidv4 } from "uuid";
255
+
256
+ class UserTaskModel extends RectNodeModel {
257
+ createId() {
258
+ return uuidv4();
259
+ }
260
+ }
261
+ ```
262
+
263
+ ### formatText
264
+
265
+ 初始化文本
266
+
267
+ 参数 `data: LogicFlow.NodeConfig`
268
+
269
+ ```tsx | pure
270
+ class UserTaskModel extends RectNodeModel {
271
+ formatText(data: LogicFlow.NodeConfig) {
272
+ console.log('data', data);
273
+ const defaultText = {
274
+ value: '',
275
+ x: data.x,
276
+ y: data.y,
277
+ draggable: false,
278
+ editable: true,
279
+ }
280
+ if (!data.text) {
281
+ data.text = { ...defaultText }
282
+ } else {
283
+ if (typeof data.text === 'string') {
284
+ data.text = {
285
+ ...defaultText,
286
+ value: data.text,
287
+ }
288
+ }
289
+ // ...
290
+ }
291
+ }
292
+ }
293
+ ```
294
+
295
+ ### getData
296
+
297
+ 获取被保存时返回的数据。LogicFlow 有固定节点数据格式。如果期望在保存数据上添加数据,请添加到 properties
298
+ 上。
299
+
300
+ 不支持重写此方法
301
+
302
+ ```tsx | pure
303
+ const nodeModel = lf.getNodeModelById("node_1");
304
+ const nodeData = nodeModel.getData();
305
+ ```
306
+
307
+ ### getProperties
308
+
309
+ 获取节点属性
310
+
311
+ 不支持重写此方法
312
+
313
+ ```tsx | pure
314
+ const nodeModel = lf.getNodeModelById("node_1");
315
+ const properties = nodeModel.getProperties();
316
+ ```
317
+
318
+ ### getDefaultAnchor
319
+
320
+ 重新设置默认锚点, 可以给锚点加上 id 等自定义属性,用于对锚点的验证。
321
+
322
+ ```tsx | pure
323
+ class cNode extends RectNodeModel {
324
+ // 定义节点只有左右两个锚点. 锚点位置通过中心点和宽度算出来。
325
+ getDefaultAnchor() {
326
+ const { width, height, x, y, id } = this;
327
+ return [
328
+ {
329
+ x: x - width / 2,
330
+ y,
331
+ name: 'left',
332
+ id: `${id}_0`
333
+ },
334
+ {
335
+ x: x + width / 2,
336
+ y,
337
+ name: 'right',
338
+ id: `${id}_1`,
339
+ edgeAddable: false
340
+ },
341
+ ]
342
+ }
343
+ }
344
+ ```
345
+
346
+ 锚点属性
347
+
348
+ | 名称 | 类型 | 是否必须 | 描述 |
349
+ |:------------|:--------|:-----|:-----------------------|
350
+ | x | number | ✅ | 锚点 x 坐标 |
351
+ | y | number | ✅ | 锚点 y 坐标 |
352
+ | id | string | ✅ | 锚点 id |
353
+ | edgeAddable | boolean | ✅ | 是否允许此锚点手动创建连线,默认为 true |
354
+
355
+ ### getConnectedSourceRules
356
+
357
+ 获取当前节点作为边的起始节点规则。
358
+
359
+ 支持重写,重写的时候,可以自定义添加额外规则。所有的规则中,有任一规则不满足,则禁止连线。
360
+
361
+ ```tsx | pure
362
+ class EndNodeModel extends CircleNodeModel {
363
+ getConnectedSourceRules(): ConnectRule[] {
364
+ const rules = super.getConnectedSourceRules();
365
+ const geteWayOnlyAsTarget = {
366
+ message: "结束节点只能连入,不能连出!",
367
+ validate: (
368
+ source: BaseNodeModel,
369
+ target: BaseNodeModel,
370
+ sourceAnchor,
371
+ targetAnchor
372
+ ) => {
373
+ let isValid = true;
374
+ if (source) {
375
+ isValid = false;
376
+ }
377
+ return isValid;
378
+ },
379
+ };
380
+ rules.push(geteWayOnlyAsTarget);
381
+ return rules;
382
+ }
383
+ }
384
+ ```
385
+
386
+ ### getConnectedTargetRules
387
+
388
+ 获取当前节点作为边的目标节点规则。
389
+
390
+ 支持重写,重写的时候,可以自定义添加额外规则。所有的规则中,有任一规则不满足,则禁止连线。
391
+
392
+ ```tsx | pure
393
+ class StartEventModel extends CircleNodeModel {
394
+ getConnectedTargetRules() {
395
+ const rules = super.getConnectedTargetRules();
396
+ const notAsTarget = {
397
+ message: "起始节点不能作为边的终点",
398
+ validate: () => false,
399
+ };
400
+ rules.push(notAsTarget);
401
+ return rules;
402
+ }
403
+ }
404
+ ```
405
+
406
+ ### isAllowMoveNode
407
+
408
+ 是否允许移动节点
409
+
410
+ 参数 `deltaX: number, deltaY: number`
411
+
412
+ 返回值 `boolean | Model.IsAllowMove`
413
+
414
+ ```tsx | pure
415
+ class UserTaskModel extends RectNodeModel {
416
+ isAllowMoveNode(deltaX: number, deltaY: number) {
417
+ let isAllowMoveX = true
418
+ let isAllowMoveY = true
419
+ // 处理
420
+ return {
421
+ x: isAllowMoveX,
422
+ y: isAllowMoveY,
423
+ }
424
+ }
425
+ }
426
+
427
+ ```
428
+
429
+ ### isAllowConnectedAsSource
430
+
431
+ 在连接边时,是否允许这个节点为 source 节点,边到 target 节点
432
+
433
+ 参数
434
+ | 名称 | 类型 | 是否必填 | 描述 |
435
+ | ------| -------------- | --- | -- |
436
+ | target | `BaseNodeModel` | ✅ | 目标节点 |
437
+ | sourceAnchor | `Model.AnchorConfig` | ✅ | 源锚点 |
438
+ | targetAnchor | `Model.AnchorConfig` | ✅ | 目标锚点 |
439
+ | edgeId | `string` | - | 调整后边的 id |
440
+
441
+ 返回值 `LogicFlow.ConnectRuleResult` <a href="https://github.com/didi/LogicFlow/issues/926#issuecomment-1371823306" target="_blank">详见issues</a>
442
+
443
+ ### isAllowConnectedAsTarget
444
+
445
+ 在连线时,判断是否允许这个节点为 target 节点
446
+
447
+ 参数
448
+ | 名称 | 类型 | 是否必填 | 描述 |
449
+ | ------| -------------- | --- | -- |
450
+ | source | `BaseNodeModel` | ✅ | 源节点 |
451
+ | sourceAnchor | `Model.AnchorConfig` | ✅ | 源锚点 |
452
+ | targetAnchor | `Model.AnchorConfig` | ✅ | 目标锚点 |
453
+ | edgeId | `string` | - | 调整后边的 id |
454
+
455
+ 返回值 `LogicFlow.ConnectRuleResult`
456
+ <a href="https://github.com/didi/LogicFlow/issues/926#issuecomment-1371823306" target="_blank">详见issues</a>
457
+
458
+ ### getRotateControlStyle
459
+
460
+ 获取当前节点旋转控制点的样式
461
+
462
+ ```tsx | pure
463
+ getRotateControlStyle()
464
+ ```
465
+
466
+ ### getTargetAnchor
467
+
468
+ 获取目标锚点
469
+
470
+ 入参:`position: LogicFlow.Point`
471
+
472
+ 返回值:`BaseNodeModel.AnchorInfo`
473
+
474
+ ### anchors
475
+
476
+ 获取锚点
477
+
478
+ 返回值: `LogicFlow.Point[]`
479
+
480
+ ```tsx | pure
481
+ const { anchors } = node
482
+ ```
483
+
484
+ ### getAnchorInfo
485
+
486
+ 获取锚点信息
487
+
488
+ 入参:`anchorId?: string`
489
+
490
+ ### updateText
491
+
492
+ 修改节点文本内容
493
+
494
+ 参数
495
+
496
+ | 名称 | 类型 | 必传 | 默认值 | 描述 |
497
+ |:------|:-------|:-----|:----|:----|
498
+ | value | string | true | 无 | 文本值 |
499
+
500
+ ```tsx | pure
501
+ const nodeModel = lf.getNodeModelById("node_1");
502
+ nodeModel.updateText("hello world");
503
+ ```
504
+
505
+ ### setZIndex
506
+
507
+ 设置节点 zIndex
508
+
509
+ ```tsx | pure
510
+ const nodeModel = lf.getNodeModelById("node_1");
511
+ nodeModel.setZIndex(999);
512
+ ```
513
+
514
+ ### setProperties
515
+
516
+ 设置节点 properties
517
+
518
+ ```tsx | pure
519
+ lf.on("node:click", ({ data }) => {
520
+ lf.getNodeModelById(data.id).setProperties({
521
+ disabled: !data.properties.disabled,
522
+ scale: 2,
523
+ });
524
+ });
525
+ ```
526
+
527
+ ### setProperty
528
+
529
+ 设置节点 property
530
+
531
+ 入参 `key: string, value: unknown`
532
+
533
+ ### deleteProperty
534
+
535
+ 删除节点的某个属性
536
+
537
+ ```tsx | pure
538
+ lf.on("node:click", ({ data }) => {
539
+ lf.getNodeModelById(data.id).deleteProperty("disabled");
540
+ lf.getNodeModelById(data.id).deleteProperty("scale");
541
+ });
542
+ ```
543
+
544
+ ### moveText
545
+
546
+ 移动文本
547
+
548
+ 入参:`deltaX: number, deltaY: number`
549
+
550
+ ### moveTo
551
+
552
+ 移动到
553
+
554
+ 入参:`x: number, y: number, isIgnoreRule: boolean = false`
555
+
556
+ 返回值:`boolean`
557
+
558
+ ```tsx | pure
559
+ this.node.moveTo(200, 100)
560
+ ```
561
+
562
+ ### move
563
+
564
+ 移动
565
+
566
+ 入参:`deltaX: number, deltaY: number, isIgnoreRule: boolean = false`
567
+
568
+ 返回值:`boolean`
569
+
570
+ ```tsx | pure
571
+ this.move(0, 24 / 2);
572
+ ```
573
+
574
+ ### getMoveDistance
575
+
576
+ 获取移动距离
577
+
578
+ 入参:`deltaX: number, deltaY: number, isIgnoreRule: boolean = false`
579
+
580
+ 返回值:`Model.VectorType`
581
+
582
+ ### setSelected
583
+
584
+ 设置 Selected
585
+
586
+ 入参:`isSelected: boolean = true`
587
+
588
+ ```tsx | pure
589
+ this.node.setSelected(true);
590
+ ```
591
+
592
+ ### setHovered
593
+
594
+ 设置 Hovered
595
+
596
+ 入参:`isHovered: boolean = true`
597
+
598
+ ### setHittable
599
+
600
+ 设置 Hittable
601
+
602
+ 入参:`isHittable: boolean`
603
+
604
+ ### setIsShowAnchor
605
+
606
+ 设置是否显示锚点
607
+
608
+ 入参:`isShowAnchor: boolean = true`
609
+
610
+ ### updateAttributes
611
+
612
+ 更新属性
613
+
614
+ 入参:`attributes: LogicFlow.AttributesType`
615
+
616
+ ### setElementState
617
+
618
+ 设置 Node | Edge 等 model 的状态
619
+
620
+ 入参:`state: ElementState, additionStateData?: Model.AdditionStateDataType | undefined,`
621
+
622
+ ### setStyle
623
+
624
+ 设置 Style
625
+
626
+ 入参:`key: string, value: unknown`
627
+
628
+ ### setStyles
629
+
630
+ 设置 Styles
631
+
632
+ 入参:`styles: LogicFlow.CommonTheme`
633
+
634
+ ### updateStyles
635
+
636
+ 更新 Styles
637
+
638
+ 入参:`styles: LogicFlow.CommonTheme`
639
+
640
+ ### setEnableRotate
641
+
642
+ 设置启用旋转
643
+
644
+ 入参:`flag: boolean`