@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
@@ -1,113 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import { map, reduce } from 'lodash-es'
3
- import Circle from './shape/Circle'
4
- import LogicFlow from '../LogicFlow'
5
- import { EventType } from '../constant'
6
- import EventEmitter from '../event/eventEmitter'
7
- import { GraphModel, BaseNodeModel } from '../model'
8
- import { StepDrag, TranslateMatrix, Vector } from '../util'
9
-
10
- interface IRotateControlProps {
11
- graphModel: GraphModel
12
- nodeModel: BaseNodeModel
13
- eventCenter: EventEmitter
14
- style: LogicFlow.CommonTheme
15
- }
16
-
17
- class RotateControlPoint extends Component<IRotateControlProps> {
18
- readonly style = {}
19
- private defaultAngle!: number
20
- normal!: Vector
21
- stepperDrag: any
22
-
23
- constructor(props: IRotateControlProps) {
24
- super(props)
25
- this.style = props.style
26
- this.stepperDrag = new StepDrag({
27
- onDragging: this.onDragging,
28
- })
29
- }
30
-
31
- onDragging = ({ event }: any) => {
32
- const { graphModel, nodeModel, eventCenter } = this.props
33
- const { selectNodes } = graphModel
34
- const { x, y } = nodeModel
35
- const { clientX, clientY } = event
36
- const {
37
- canvasOverlayPosition: { x: cx, y: cy },
38
- } = graphModel.getPointByClient({
39
- x: clientX,
40
- y: clientY,
41
- })
42
- const v = new Vector(cx - x, cy - y)
43
- const angle = this.normal?.angle(v) - this.defaultAngle
44
- const matrix = new TranslateMatrix(-x, -y)
45
- .rotate(angle)
46
- .translate(x, y)
47
- .toString()
48
- nodeModel.transform = matrix
49
- nodeModel.rotate = angle
50
-
51
- let nodeIds = map(selectNodes, (node) => node.id)
52
- if (nodeIds.indexOf(nodeModel.id) === -1) {
53
- nodeIds = [nodeModel.id]
54
- }
55
- const nodeIdMap = reduce(
56
- nodeIds,
57
- (acc, nodeId) => {
58
- const node = graphModel.getNodeModelById(nodeId)
59
- acc[nodeId] = node?.getMoveDistance(0, 0, false)
60
- return acc
61
- },
62
- {},
63
- )
64
- nodeIds.forEach((nodeId) => {
65
- const edges = graphModel.getNodeEdges(nodeId)
66
- edges.forEach((edge) => {
67
- if (nodeIdMap[edge.sourceNodeId]) {
68
- const model = graphModel.getNodeModelById(edge.sourceNodeId)
69
- const anchor = model!.anchors.find(
70
- (item) => item.id === edge.sourceAnchorId,
71
- )!
72
- edge.updateStartPoint(anchor)
73
- }
74
- if (nodeIdMap[edge.targetNodeId]) {
75
- const model = graphModel.getNodeModelById(edge.targetNodeId)
76
- const anchor = model!.anchors.find(
77
- (item) => item.id === edge.targetAnchorId,
78
- )!
79
- edge.updateEndPoint(anchor)
80
- }
81
- })
82
- })
83
-
84
- eventCenter.emit(EventType.NODE_ROTATE, {
85
- e: event,
86
- model: nodeModel,
87
- data: nodeModel.getData(),
88
- })
89
- }
90
-
91
- render() {
92
- const { nodeModel } = this.props
93
- const { x, y, width, height } = nodeModel
94
- const cx = x + width / 2 + 20
95
- const cy = y - height / 2 - 20
96
- this.normal = new Vector(1, 0)
97
- this.defaultAngle = this.normal.angle(new Vector(cx - x, cy - y))
98
- nodeModel.defaultAngle = this.defaultAngle
99
- return (
100
- <g className="lf-rotate-control">
101
- <g
102
- onPointerDown={(ev) => {
103
- this.stepperDrag.handleMouseDown(ev)
104
- }}
105
- >
106
- <Circle {...this.style} cx={cx} cy={cy} />
107
- </g>
108
- </g>
109
- )
110
- }
111
- }
112
-
113
- export default RotateControlPoint
@@ -1,162 +0,0 @@
1
- import { get } from 'lodash-es'
2
- import LogicFlow from '../../LogicFlow'
3
- import { BaseNodeModel } from '../../model'
4
- import { snapToGrid } from '../../util'
5
- import { EventType } from '../../constant'
6
-
7
- import Position = LogicFlow.Position
8
- import OnDragNodeConfig = LogicFlow.OnDragNodeConfig
9
-
10
- export class Dnd {
11
- nodeConfig: OnDragNodeConfig | null = null
12
- lf: LogicFlow
13
- fakeNode: BaseNodeModel | null = null
14
- docPointerMove?: (e: PointerEvent) => void
15
- docPointerUp?: (e: PointerEvent) => void
16
-
17
- constructor(params: { lf: LogicFlow }) {
18
- const { lf } = params
19
- this.lf = lf
20
- }
21
-
22
- clientToLocalPoint({ x, y }: Position): Position {
23
- const gridSize = get(this.lf.options, ['grid', 'size'])
24
- // 处理 container 的 offset 等
25
- const position = this.lf.graphModel.getPointByClient({
26
- x,
27
- y,
28
- })
29
- // 处理缩放和偏移
30
- const { x: x1, y: y1 } = position.canvasOverlayPosition
31
- const {
32
- editConfigModel: { snapGrid },
33
- } = this.lf.graphModel
34
- // x, y 对齐到网格的 size
35
- return {
36
- x: snapToGrid(x1, gridSize, snapGrid),
37
- y: snapToGrid(y1, gridSize, snapGrid),
38
- }
39
- }
40
-
41
- isInsideCanvas(e: PointerEvent): boolean {
42
- const overlay = this.lf.graphModel.rootEl.querySelector(
43
- '[name="canvas-overlay"]',
44
- ) as HTMLElement | null
45
- const topEl = window.document.elementFromPoint(
46
- e.clientX,
47
- e.clientY,
48
- ) as HTMLElement | null
49
- return (
50
- topEl === overlay ||
51
- (topEl !== null && !!overlay && overlay.contains(topEl))
52
- )
53
- }
54
- startDrag(nodeConfig: OnDragNodeConfig) {
55
- const { editConfigModel } = this.lf.graphModel
56
- if (editConfigModel?.isSilentMode) return
57
- this.nodeConfig = nodeConfig
58
- // 指针移动:根据命中结果判断是否在画布覆盖层上,驱动假节点创建/移动或清理
59
- this.docPointerMove = (e: PointerEvent) => {
60
- if (!this.nodeConfig) return
61
- // 离开画布:清理吸附线与假节点
62
- if (!this.isInsideCanvas(e)) {
63
- this.onDragLeave()
64
- return
65
- }
66
- // 首次进入画布:创建假节点并初始化位置
67
- if (!this.fakeNode) {
68
- this.dragEnter(e)
69
- return
70
- }
71
- // 在画布内移动:更新假节点位置与吸附线
72
- this.onDragOver(e)
73
- }
74
- // 指针抬起:在画布内落点生成节点,否则清理假节点
75
- this.docPointerUp = (e: PointerEvent) => {
76
- if (!this.nodeConfig) return
77
- if (this.isInsideCanvas(e)) {
78
- this.onDrop(e)
79
- } else {
80
- this.onDragLeave()
81
- }
82
- // 阻止默认行为与冒泡,避免滚动/点击穿透
83
- e.preventDefault()
84
- e.stopPropagation()
85
- // 结束拖拽并移除监听
86
- this.stopDrag()
87
- }
88
- window.document.addEventListener('pointermove', this.docPointerMove)
89
- window.document.addEventListener('pointerup', this.docPointerUp)
90
- }
91
-
92
- stopDrag = () => {
93
- this.nodeConfig = null
94
- if (this.docPointerMove) {
95
- window.document.removeEventListener('pointermove', this.docPointerMove)
96
- }
97
- if (this.docPointerUp) {
98
- window.document.removeEventListener('pointerup', this.docPointerUp)
99
- }
100
- }
101
- dragEnter = (e: PointerEvent) => {
102
- if (!this.nodeConfig || this.fakeNode) return
103
- this.fakeNode = this.lf.createFakeNode({
104
- ...this.nodeConfig,
105
- ...this.clientToLocalPoint({
106
- x: e.clientX,
107
- y: e.clientY,
108
- }),
109
- })
110
- }
111
- onDragOver = (e: MouseEvent) => {
112
- this.lf.graphModel.eventCenter.emit(EventType.BLANK_CANVAS_MOUSEMOVE, {
113
- e,
114
- })
115
- e.preventDefault()
116
- if (this.fakeNode) {
117
- const { x, y } = this.clientToLocalPoint({
118
- x: e.clientX,
119
- y: e.clientY,
120
- })
121
- this.fakeNode.moveTo(x, y)
122
- const nodeData = this.fakeNode.getData()
123
- this.lf.setNodeSnapLine(nodeData)
124
- this.lf.graphModel.eventCenter.emit(EventType.NODE_DND_DRAG, {
125
- data: nodeData,
126
- e,
127
- })
128
- }
129
- return false
130
- }
131
- onDragLeave = () => {
132
- if (this.fakeNode) {
133
- this.lf.removeNodeSnapLine()
134
- this.lf.graphModel.removeFakeNode()
135
- this.fakeNode = null
136
- }
137
- }
138
- onDrop = (e: MouseEvent) => {
139
- if (!this.lf.graphModel || !e || !this.nodeConfig) {
140
- return
141
- }
142
- this.lf.addNode(
143
- {
144
- ...this.nodeConfig,
145
- ...this.clientToLocalPoint({
146
- x: e.clientX,
147
- y: e.clientY,
148
- }),
149
- },
150
- EventType.NODE_DND_ADD,
151
- e,
152
- )
153
- e.preventDefault()
154
- e.stopPropagation()
155
- this.nodeConfig = null
156
- this.lf.removeNodeSnapLine()
157
- this.lf.graphModel.removeFakeNode()
158
- this.fakeNode = null
159
- }
160
- }
161
-
162
- export default Dnd
@@ -1,2 +0,0 @@
1
- export * from './dnd'
2
- export * from './snapline'
@@ -1,16 +0,0 @@
1
- import EventEmitter from '../../event/eventEmitter'
2
- import SnaplineModel from '../../model/SnaplineModel'
3
-
4
- export function snapline(
5
- eventCenter: EventEmitter,
6
- snaplineModel: SnaplineModel,
7
- ): void {
8
- // 节点拖动时启动对齐线计算
9
- eventCenter.on('node:mousemove', ({ data }) => {
10
- snaplineModel.setNodeSnapLine(data)
11
- })
12
- // 节点拖动结束时,对齐线消失
13
- eventCenter.on('node:mouseup', () => {
14
- snaplineModel.clearSnapline()
15
- })
16
- }