画布(Canvas)

  1. let canvas = new Canvas({
  2. root: dom, //canvas的根节点(必传)
  3. layout: 'ForceLayout' //布局设置(可传),可使用集成的,也可自定义布局
  4. zoomable: true, //可缩放(可传)
  5. moveable: true, //可平移(可传)
  6. draggable: true, //节点可拖动(可传)
  7. linkable: true, //节点可连接(可传)
  8. disLinkable: true, //节点可取消连接(可传)
  9. theme: { //主题定制(可传)
  10. edge: {
  11. type: 'Bezier', //线条默认类型:贝塞尔曲线,折线,直线。分别为Bezier/Flow/Straight
  12. label: 'test', //线条默认label
  13. arrow: true, //线条默认是否带箭头
  14. arrowPosition: 0.5, //箭头位置(0 ~ 1)
  15. arrowOffset: 0.0, //箭头偏移
  16. Class: XXClass, //自己拓展的class,拖动连线的时候会采用该拓展类
  17. isExpandWidth: false //增加线条交互区域
  18. },
  19. endpoint: {
  20. position: [] //限制锚点位置['Top', 'Bottom', 'Left', 'Right']
  21. },
  22. zoomGap: 0.001 //鼠标放大缩小间隙设置
  23. },
  24. global: { //自定义配置,会贯穿所有canvas,group,node,edge,endpoint对象
  25. isScopeStrict: false //scope是否为严格模式(默认为false)
  26. }
  27. });

属性:

key 说明 类型 默认值
root 渲染画布的跟节点 Dom (Require) *这个dom必须设置position:relative
layout 自动布局 string/function (Option) null
zoomable 画布是否可缩放 boolean (Option) false
moveable 画布是否可移动 boolean (Option) false
draggable 画布节点是否可拖动 boolean (Option) false
linkable 画布节点是否可连接 boolean (Option) false
disLinkable 画布节点是否可取消连接 boolean (Option) false
theme 画布主题 object (Option) undefined
global 全局属性 object (Option) undefined

API:

  1. /**
  2. * 渲染方法
  3. * @param {data} data - 里面包含分组,节点,连线
  4. * @param {function} callback - `*渲染过程是异步的过程,需要的用户请留意回调`
  5. */
  6. draw = (data, calllback) => {}
  7. /**
  8. * 添加分组
  9. * @param {object|Group} object - 分组的信息;Group - 分组的基类
  10. */
  11. addGroup = (object|Group) => {}
  12. /**
  13. * 根据id获取node
  14. * @param {string} id - node id
  15. * @return {Node} - 节点对象
  16. */
  17. getNode = (string) => {}
  18. /**
  19. * 根据id获取group
  20. * @param {string} id - group id
  21. * @return {Group} - 分组对象
  22. */
  23. getGroup = (string) => {}
  24. /**
  25. * 根据id获取相邻的edge
  26. * @param {string} id - node id
  27. * @return {Edges} - 相邻的连线
  28. */
  29. getNeighborEdges = (string) => {}
  30. /**
  31. * 添加节点
  32. * @param {object|Node} object - 节点的信息;Node - 节点的基类
  33. */
  34. addNode = (object|Node) => {}
  35. /**
  36. * 添加连线
  37. * @param {object|Edge} object - 连线的信息;Edge - 连线的基类
  38. */
  39. addEdge = (object|Edge) => {}
  40. /**
  41. * 删除节点
  42. * @param nodeId string - 节点id
  43. */
  44. removeNode = (string) => {}
  45. /**
  46. * 批量删除节点
  47. * @param nodeIds array - 批量节点id
  48. */
  49. removeNodes = (array) => {}
  50. /**
  51. * 根据id删除节点
  52. * @param {string} id - node id
  53. * @return {Node} - 删除的对象
  54. */
  55. removeGroup = (string) => {}
  56. /**
  57. * 根据id或者Edge对象来删除线
  58. * @param {string or Edge} id or Edge - 线的id或者Edge对象
  59. * @return {Edge} - 删除的线
  60. */
  61. removeEdge = (param) => {}
  62. /**
  63. * 根据id或者Edge对象来批量删除线
  64. * @param {array} string or Edge - 线的id或者Edge对象的数组
  65. * @return {array} Edge - 删除的线
  66. */
  67. removeEdges = (param) => {}
  68. /**
  69. * 根据id删除分组
  70. * @param {string} id - group id
  71. * @return {Node} - 删除的对象
  72. */
  73. setZoomable = (boolean) => {}
  74. /**
  75. * 设置画布平移
  76. * @param {true|false} boolean - 是否支持画布平移
  77. */
  78. setMoveable = (boolean) => {}
  79. /**
  80. * 聚焦某个节点/节点组
  81. * @param {string/function} nodeId/groupId or filter - 节点的id或者过滤器
  82. * @param {string} type - 节点的类型(node or group)
  83. * @param {object} options {offset: [0,0]} - 聚焦配置属性,如偏移值
  84. * @param {function} callback - 聚焦后的回调
  85. */
  86. focusNodeWithAnimate = (string, type, options, callback) => {}
  87. /**
  88. * 聚焦某多个节点/节点组
  89. * @param {object} {nodes: [], groups: []} - 节点和节点组的id数组
  90. * @param {array} type - 节点的类型(node or group)
  91. * @param {object} options {offset: [0,0]} - 聚焦配置属性,如偏移值
  92. * @param {function} callback - 聚焦后的回调
  93. */
  94. focusNodesWithAnimate = (objs, type, options, callback) => {}
  95. /**
  96. * 聚焦整个画布,会自动调整画布位置和缩放
  97. * @param {object} options {offset: [0,0]} - 聚焦配置属性,如偏移值
  98. * @param {function} callback - 聚焦后的回调
  99. */
  100. focusCenterWithAnimate = (options, callback) => {}
  101. /**
  102. * 设置框选模式
  103. * @param {true|false} boolean - 是否开启框选功能
  104. * @param {array} type - 可接受框选的内容(node/endpoint/edge,默认node)
  105. */
  106. setSelectMode = (boolean, type) => {}
  107. /**
  108. * 获取画布的缩放
  109. * @return {float} - 画布的缩放(0-1)
  110. */
  111. getZoom = () => {}
  112. /**
  113. * 获取画布的偏移值
  114. * @return {[x, y]} - 画布的偏移值
  115. */
  116. getOffset = () => {}
  117. /**
  118. * 获取画布的偏移值的中心点
  119. * @return {[x, y]} - 画布的偏移值的中心点(百分比)
  120. */
  121. getOrigin = () => {}
  122. /**
  123. * 获取画布的数据模型
  124. * @return {data} - 画布的数据
  125. */
  126. getDataMap = () => {}
  127. /**
  128. * 手动设置画布缩放的中心点
  129. * @param {[x, y]} array - x,y的中心点坐标
  130. */
  131. setOrigin = ([x ,y]) => {}
  132. /**
  133. * 手动设置画布偏移
  134. * @param {[x, y]} array - x,y坐标
  135. */
  136. move = (postion) => {}
  137. /**
  138. * 手动设置画布缩放
  139. * @param {scale} float - 0-1之间的缩放值
  140. * @param {function} callback - 缩放后的回调
  141. */
  142. zoom = (postion) => {}
  143. /**
  144. * 获取聚合组
  145. * @param {name} string - 聚合组的名称
  146. */
  147. getUnion = (name) => {}
  148. /**
  149. * 获取所有聚合组
  150. */
  151. getAllUnion = () => {}
  152. /**
  153. * 添加聚合组 || 添加聚合组元素
  154. * @param {name} string - 聚合组的名称
  155. * @param {obj} object - 聚合组的元素
  156. */
  157. add2Union = (name, obj) => {}
  158. /**
  159. * 去除聚合组
  160. * @param {name} string - 聚合组的名称
  161. */
  162. removeUnion = (name) => {}
  163. /**
  164. * 去除所有聚合组
  165. */
  166. removeAllUnion = () => {}
  167. /**
  168. * 发送事件
  169. */
  170. emit = (string, obj) => {}
  171. /**
  172. * 接受事件
  173. */
  174. on = (string, callback) => {}
  175. /**
  176. * 设置网格布局
  177. * @param {true|false} boolean - 是否开启网格布局功能
  178. * @param {array} options - 网格布局的定制化参数
  179. */
  180. setGirdMode = (show, options) => {}
  181. /**
  182. * 把画布上的节点,节点组自动对齐(必须在网格布局下才生效)
  183. */
  184. justifyCoordinate = () => {}
  185. /**
  186. * 设置辅助线
  187. * @param {true|false} boolean - 是否开启辅助线功能
  188. * @param {array} options - 辅助线的定制化参数
  189. */
  190. setGuideLine = (show, options) => {}
  191. /**
  192. * 屏幕转换为画布的坐标
  193. * @param {array[number]} coordinates - 需要换算的坐标([x,y])
  194. * @return {number} - 转换后的坐标
  195. */
  196. terminal2canvas = (coordinates) => {}
  197. /**
  198. * 画布转换为屏幕的坐标
  199. * @param {array[number]} coordinates - 需要换算的坐标([x,y])
  200. * @return {number} - 转换后的坐标
  201. */
  202. canvas2terminal = (coordinates) => {}
  203. /**
  204. * 画布保存为图片
  205. * @param {object=} options - 保存的图片参数,可选
  206. * @param {string=} options.type - 图片格式(png/jpeg/svg,默认png),可选
  207. * @param {number=} options.quality - 图片质量(0~1,默认为1),可选
  208. * @param {number=} options.width - 图片宽度(默认为画布宽度),可选
  209. * @param {number=} options.height - 图片高度(默认为画布高度),可选
  210. * @return {Promise}
  211. */
  212. save2img = (options) => {}
  213. /**
  214. * 当root移动或者大小发生变化时需要更新位置
  215. */
  216. updateRootResize = () => {}
  217. /**
  218. * 查找 N 层关联节点和边
  219. * @param {Object} options - 参数
  220. * @param {Node} options.node - 起始节点
  221. * @param {Endpoint} options.endpoint - 起始锚点,可选
  222. * @param {String} options.type - 查找方向,可选值为 all\in\out,默认all,可选
  223. * @param {Number} options.level - 层数,起始节点为第 0 层,默认 Infinity
  224. * @param {Function} options.iteratee - 是否继续遍历判定函数,返回 boolean 值
  225. * @returns {Object<nodes: Node, edges: Edge>} filteredGraph - 查找结果
  226. */
  227. getNeighborNodesAndEdgesByLevel = (options) => {}

事件

  1. let canvas = new Canvas({...});
  2. canvas.on('type', (data) => {
  3. //data 数据
  4. });
key 说明 返回
system.canvas.click 点击画布空白处 -
system.canvas.zoom 画布缩放 -
system.node.delete 删除节点 -
system.node.move 移动节点 -
system.nodes.add 批量节点添加 -
system.link.delete 删除连线 -
system.link.connect 连线成功 -
system.link.click 点击事件 -
system.group.delete 删除节点组 -
system.group.move 移动节点组 -
system.group.addMembers 节点组添加节点 -
system.group.removeMembers 节点组删除节点 -
system.multiple.select 框选结果 -
system.drag.start 拖动开始 -
system.drag.move 拖动 -
system.drag.end 拖动结束 -

详细说明

属性说明

global

  • isScopeStrict,用于设置全局scope严格模式
    • 默认为false。假如该值设置为true,当scope必须完全一致才能匹配;假如该值为false,当scope为undefined时,都能匹配所有值。

layout

  • 重力布局,传入'ForceLayout'即可,小蝴蝶内置布局
  • 自定义布局,传入一个方法,里面可以按照用户需求进行布局。注:除此之外,记得把Edge的calcPath的方法复写掉,不然会由小蝴蝶的内置计算线段的方法代替,无法实现所得的线段
  1. let canvas = new Canvas({
  2. layout: (opts) => {
  3. // 画布长宽
  4. let width = opts.width;
  5. let height = opts. height;
  6. // 即将渲染的节点,节点组,以及线段数据
  7. let data = opts.data;
  8. // 布局逻辑,把节点,节点组的left和top值赋值即可
  9. ......
  10. }
  11. })

方法说明

  • setGirdMode,设置网格布局
    • show,设置是否开启网格布局
    • options,设置网格布局的参数,如下注释所示
  1. this.canvas.setGirdMode(true, {
  2. isAdsorb: false, // 是否自动吸附,默认关闭
  3. theme: {
  4. shapeType: 'line', // 展示的类型,支持line & circle
  5. gap: 23, // 网格间隙
  6. adsorbGap: 8, // 吸附间距
  7. backgroud: '#fff', // 网格背景颜色
  8. lineColor: '#000', // 网格线条颜色
  9. lineWidth: 1, // 网格粗细
  10. circleRadiu: 1, // 圆点半径
  11. circleColor: '#000' // 断电颜色
  12. }
  13. });
  • setGuideLine
    • show,设置是否开启辅助线
    • options,设置辅助线的参数,如下注释所示
  1. this.canvas.setGuideLine(true, {
  2. limit: 1, // 限制辅助线条数
  3. theme: {
  4. lineColor: 'red', // 网格线条颜色
  5. lineWidth: 1, // 网格粗细
  6. }
  7. });
  • add2Union
    • name,聚合组名称。假如不存在,则添加聚合组;假如已存在,则添加聚合组元素
    • object,聚合组的元素
  1. this.canvas.add2Union('我的聚合组', {
  2. nodes: [] // Node对象或者nodeId
  3. groups: [] // Group对象或者groupId
  4. edges: [] // Edge对象或者edgeId
  5. endpoints: [] // Endpoint对象
  6. });
  • canvas2terminal,屏幕转换为画布的坐标

    • 如图所示,画布缩放,移动后的坐标和原来画布的坐标并不匹配,需要此方法来转换。特别注意:有拖动添加节点的用户们注意这两个e.clientXe.clientY,需要调用此方法进行转换。 画布(canvas) - 图1
  • terminal2canvas,画布转换为屏幕的坐标

    • canvas2terminal的逆转转换
  • save2img,画布保存为图片

    • options,图片参数
    • options.type,图片类型
    • options.quality,图片质量
    • options.width,图片宽度
    • options.height,图片高度
  1. this.canvas.save2img({type: 'png', width: 1920, height: 1080, quality: 1})
  2. .then(dataUrl => {
  3. var link = document.createElement('a');
  4. link.download = 'XXX.png';
  5. link.href = dataUrl;
  6. link.click();
  7. });