画布(Canvas)

    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. /**
    87. * @param {object} {nodes: [], groups: []} - 节点和节点组的id数组
    88. * @param {array} type - 节点的类型(node or group)
    89. * @param {object} options {offset: [0,0]} - 聚焦配置属性,如偏移值
    90. * @param {function} callback - 聚焦后的回调
    91. */
    92. focusNodesWithAnimate = (objs, type, options, callback) => {}
    93. /**
    94. * 聚焦整个画布,会自动调整画布位置和缩放
    95. * @param {object} options {offset: [0,0]} - 聚焦配置属性,如偏移值
    96. * @param {function} callback - 聚焦后的回调
    97. */
    98. focusCenterWithAnimate = (options, callback) => {}
    99. /**
    100. * 设置框选模式
    101. * @param {true|false} boolean - 是否开启框选功能
    102. * @param {array} type - 可接受框选的内容(node/endpoint/edge,默认node)
    103. */
    104. setSelectMode = (boolean, type) => {}
    105. /**
    106. * 获取画布的缩放
    107. * @return {float} - 画布的缩放(0-1)
    108. */
    109. getZoom = () => {}
    110. /**
    111. * 获取画布的偏移值
    112. * @return {[x, y]} - 画布的偏移值
    113. */
    114. getOffset = () => {}
    115. /**
    116. * 获取画布的偏移值的中心点
    117. * @return {[x, y]} - 画布的偏移值的中心点(百分比)
    118. */
    119. getOrigin = () => {}
    120. /**
    121. * 获取画布的数据模型
    122. * @return {data} - 画布的数据
    123. */
    124. getDataMap = () => {}
    125. /**
    126. * 手动设置画布缩放的中心点
    127. * @param {[x, y]} array - x,y的中心点坐标
    128. */
    129. setOrigin = ([x ,y]) => {}
    130. /**
    131. * 手动设置画布偏移
    132. * @param {[x, y]} array - x,y坐标
    133. */
    134. move = (postion) => {}
    135. /**
    136. * 手动设置画布缩放
    137. * @param {scale} float - 0-1之间的缩放值
    138. * @param {function} callback - 缩放后的回调
    139. */
    140. zoom = (postion) => {}
    141. /**
    142. * 获取聚合组
    143. * @param {name} string - 聚合组的名称
    144. */
    145. getUnion = (name) => {}
    146. /**
    147. * 获取所有聚合组
    148. */
    149. getAllUnion = () => {}
    150. /**
    151. * 添加聚合组 || 添加聚合组元素
    152. * @param {name} string - 聚合组的名称
    153. * @param {obj} object - 聚合组的元素
    154. */
    155. add2Union = (name, obj) => {}
    156. /**
    157. * 去除聚合组
    158. * @param {name} string - 聚合组的名称
    159. */
    160. removeUnion = (name) => {}
    161. /**
    162. * 去除所有聚合组
    163. */
    164. removeAllUnion = () => {}
    165. /**
    166. * 发送事件
    167. */
    168. emit = (string, obj) => {}
    169. /**
    170. * 接受事件
    171. */
    172. on = (string, callback) => {}
    173. /**
    174. * @param {true|false} boolean - 是否开启网格布局功能
    175. * @param {array} options - 网格布局的定制化参数
    176. */
    177. setGirdMode = (show, options) => {}
    178. /**
    179. * 把画布上的节点,节点组自动对齐(必须在网格布局下才生效)
    180. */
    181. justifyCoordinate = () => {}
    182. /**
    183. * 设置辅助线
    184. * @param {true|false} boolean - 是否开启辅助线功能
    185. * @param {array} options - 辅助线的定制化参数
    186. */
    187. setGuideLine = (show, options) => {}
    188. /**
    189. * 屏幕转换为画布的坐标
    190. * @param {array[number]} coordinates - 需要换算的坐标([x,y])
    191. * @return {number} - 转换后的坐标
    192. */
    193. terminal2canvas = (coordinates) => {}
    194. /**
    195. * 画布转换为屏幕的坐标
    196. * @param {array[number]} coordinates - 需要换算的坐标([x,y])
    197. * @return {number} - 转换后的坐标
    198. */
    199. canvas2terminal = (coordinates) => {}
    200. /**
    201. * 画布保存为图片
    202. * @param {object=} options - 保存的图片参数,可选
    203. * @param {string=} options.type - 图片格式(png/jpeg/svg,默认png),可选
    204. * @param {number=} options.quality - 图片质量(0~1,默认为1),可选
    205. * @param {number=} options.width - 图片宽度(默认为画布宽度),可选
    206. * @param {number=} options.height - 图片高度(默认为画布高度),可选
    207. * @return {Promise}
    208. */
    209. save2img = (options) => {}
    210. /**
    211. * 当root移动或者大小发生变化时需要更新位置
    212. */
    213. updateRootResize = () => {}
    214. /**
    215. * 查找 N 层关联节点和边
    216. * @param {Object} options - 参数
    217. * @param {Node} options.node - 起始节点
    218. * @param {Endpoint} options.endpoint - 起始锚点,可选
    219. * @param {String} options.type - 查找方向,可选值为 all\in\out,默认all,可选
    220. * @param {Number} options.level - 层数,起始节点为第 0 层,默认 Infinity
    221. * @param {Function} options.iteratee - 是否继续遍历判定函数,返回 boolean 值
    222. * @returns {Object<nodes: Node, edges: Edge>} filteredGraph - 查找结果
    223. */
    224. getNeighborNodesAndEdgesByLevel = (options) => {}
    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 拖动结束 -

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

    • 重力布局,传入'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,设置网格布局的参数,如下注释所示
    • setGuideLine
      • show,设置是否开启辅助线
      • options,设置辅助线的参数,如下注释所示
    1. this.canvas.setGuideLine(true, {
    2. limit: 1, // 限制辅助线条数
    3. theme: {
    4. lineColor: 'red', // 网格线条颜色
    5. lineWidth: 1, // 网格粗细
    6. }
    7. });
    • add2Union
      • name,聚合组名称。假如不存在,则添加聚合组;假如已存在,则添加聚合组元素
      • object,聚合组的元素
      • 如图所示,画布缩放,移动后的坐标和原来画布的坐标并不匹配,需要此方法来转换。特别注意:有拖动添加节点的用户们注意这两个e.clientXe.clientY,需要调用此方法进行转换。
      • canvas2terminal的逆转转换
      • 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. });