一文讲述G6实现流程图绘制的常用方法
摘要:G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。
本文分享自华为云社区《会用这些的api,轻松绘制流程图——antv.g6流程图入门》,作者:一枚搬砖工 。
常用graph属性和方法
graph属性
container
height
width
modes

graph = new G6.Graph({
container: "container",
height: 500,
width: 500,
modes: {
default: [
"drag-canvas",
"hover-node",
"select-node",
"hover-edge",
"keyboard",
"customer-events"
],
addEdge: ["add-edge"],
moveNode: ["drag-item"]
},
renderer: 'svg'
plugins: [grid]
});
graph方法
初始化数据
data(data)
const data = {
nodes: [
{
id: 'node1',
label: 'node1',
},
{
id: 'node2',
label: 'node2',
},
],
edges: [
{
source: 'node1',
target: 'node2',
},
],
};
// graph 是 Graph 的实例
graph.data(data);
节点和边的增删改查
add(type,model)
新增元素(节点和边)
如果是自定义节点或者边type为自定义节点或者边的名称
addItem(type, model, stack)
新增元素(节点和边)

this.edge = this.graph.addItem('edge', {
source: item,
target: item,
start: startPoint,
end: startPoint,
type: 'link-edge'
});
remove(node/edge)
移除节点或边
const node = this.graph.findById(item.id)
this.graph.remove(node)
removeItem(item, stack)
删除元素,当 item 为 group ID 时候,则删除分组

// 通过 ID 查询节点实例
const item = graph.findById('node');
graph.removeItem(item); // 该操作不会进入到 undo & redo 栈,即 redo & undo 操作会忽略该操作
graph.removeItem(item, false);
//删除边
graph.removeItem(edge)
update(node/edge,nodeModel/edgeModel)
更新某个节点或者边的属性

graph.update(node, {name:1});
graph.update(edge, {name:1});
updateItem(item, model, stack)
更新元素,包括更新数据、样式等。若图上有 combo,使用该函数更新一个节点位置后,需要调用 updateCombo(combo) 以更新相关 combo 的位置。

graph.updateItem(edge, {
routeName: response.routeName
});
find(type, fn)
根据具体规则查找单个元素。

const findNode = graph.find('node', (node) => {
return node.get('model').x === 100;
});
findById(id)
根据 ID,查询对应的元素实例

findAllByState(type,state)
查找所有处于指定状态的元素

graph.findAllByState('node', 'selected')
getNodes()
获取图中所有节点的实例。
️ 注意: 这里返回的是节点的实例,而不是节点的数据项。
返回值类型:Array;
节点和边的状态相关
setItemState(item, state, value)
设置元素状态,当你使用自定义node节点时,setItemState方法为该方法内的setState方法。

graph.setItemState(item, 'normal', true);
坐标转化
getPointByClient(clientX, clientY)
由于从屏幕获取的位置与canvas的位置不同,所以这个方法是减去了canvas的left和top后的位置

视野相关
getZoom()
获取当前视口的缩放比例
zoomTo(toRatio, center)

// 以 (100, 100) 为中心点,放大3倍
graph.zoomTo(3, { x: 100, y: 100 }); // 以当前元素位置为中心,缩小到 0.5
graph.zoomTo(0.5);
属性相关
get(key)

// 获取 group
const group = graph.get('group'); // 获取 canvas 实例
const canvas = graph.get('canvas'); // 获取 autoPaint 值
const autoPaint = graph.get('autoPaint');
const width = graph.get("width");
const height = graph.get("height");
画布相关
destroy()
删除画布就是canvas
graph.destroy()
setAutoPaint(auto)
设置是否在更新/删除后自动重绘,一般搭配 paint() 方法使用。与setItemState搭配使用,在改变元素状态前后调用,当你使用自定义node节点时,setItemState方法为该方法内的setState方法,调用setItemState其实就是调用该node的setState方法。

const item = e.item;
const graph = this.graph; const autoPaint = graph.get('autoPaint');
graph.setAutoPaint(false); graph.setItemState(item, 'selected', true); graph.paint();
graph.setAutoPaint(autoPaint);
paint()
仅重新绘制画布。当设置了元素样式或状态后,通过调用 paint() 方法,让修改生效。
refresh()
当源数据中现有节点/边/ Combo 的数据项发生配置的变更时,根据新数据刷新视图
graph.refresh();
setMode(mode)
切换模式,指的是在自定义行为中所定义的模式
这里的模式指的是graph的配置项modes

graph = new G6.Graph({
modes: {
default: [
"drag-canvas",
"hover-node",
"hover-edge",
"keyboard",
],
addEdge: ["add-edge"],
moveNode: ["drag-item"]
},
});
const behavors = {
'hover-node': hoverNode,
'add-edge': addLine,
'drag-item': dragItem,
'select-node': selectNode,
'hover-edge': hoverEdge,
'keyboard':keyboard
};
export function initBehavors() {
for (let key in behavors) {
G6.registerBehavior(key, behavors[key])
}
}
this.graph.setMode('default')
元素、节点和边
元素常用方法
概念:元素是包含节点和边的实例
getModel()
获取元素的数据模型
// 获取元素的数据模型
const model = item.getModel(); // 等价于
const model = item.get('model');
hasState(state)
判断元素是否具有某种指定的状态
item.hasState('normal')
getContainer()
获取group
// 获取元素的容器
const group = item.getContainer(); // 等价于
const group = item.get('group');
getType()
获取元素的类型
// 获取元素的类型
const type = item.getType(); // 等价于
const type = item.get('type');
getBBox()
获取元素的包围盒
item.getBBox();
节点常用方法
概念:节点继承至元素,元素所有的方法节点也有
getEdges()
获取与当前节点有关联的所有边
// 获取与 node 关联的所有边
const edges = node.getEdges();
getInEdges()
获取与当前节点关联的所有入边
getOutEdges()
获取与当前节点关联的所有出边
// 获取与 node 关联的所有出边
const edges = node.getOutEdges();
边常用方法
getModel()
获取边的model
get(key)
获取属性值
getSource()
获取当前边的起始节点
组(group)的使用
常用方法
addShape(type,cfgs)

自定义行为
G6 的自定义机制,包括自定义节点、自定义边、自定义 combo、自定义交互行为、自定义布局的相关方法。它们都被挂载在 G6 全局上,通过 G6.registerXXX 进行调用。
自定义节点
registerNode(nodeName, options, extendedNodeName)

G6.registerNode(
'nodeName',
{
/**
* 绘制节点,包含文本
* @param {Object} cfg 节点的配置项
* @param {G.Group} group 图形分组,节点中的图形对象的容器
* @return {G.Shape} 绘制的图形,通过 node.get('keyShape') 可以获取到
*/
draw(cfg, group) {},
/**
* 绘制后的附加操作,默认没有任何操作
* @param {Object} cfg 节点的配置项
* @param {G.Group} group 图形分组,节点中的图形对象的容器
*/
afterDraw(cfg, group) {},
/**
* 更新节点,包含文本
* @override
* @param {Object} cfg 节点的配置项
* @param {Node} node 节点
*/
update(cfg, node) {},
/**
* 更新节点后的操作,一般同 afterDraw 配合使用
* @override
* @param {Object} cfg 节点的配置项
* @param {Node} node 节点
*/
afterUpdate(cfg, node) {},
/**
* 设置节点的状态,主要是交互状态,业务状态请在 draw 方法中实现
* 单图形的节点仅考虑 selected、active 状态,有其他状态需求的用户自己复写这个方法
* @param {String} name 状态名称
* @param {Object} value 状态值
* @param {Node} node 节点
*/
setState(name, value, node) {},
/**
* 获取锚点(相关边的连入点)
* @param {Object} cfg 节点的配置项
* @return {Array|null} 锚点(相关边的连入点)的数组,如果为 null,则没有锚点
*/
getAnchorPoints(cfg) {},
},
'extendedNodeName',
);
注册自定义行为注意事项
- 必须有自定义文件
- 必须使用registerBehavior
- modes中添加注册的行为
自定义文件:selectNode.js,内容如下:
//自定义文件
let selectNode = {
getEvents(){
return {
'node:click':'onClick'
}
},
onClick(e){
console.log(e)
}
}
//注册自定义行为
this.behavors = {
'select-node':selectNode
} for(let key in this.behavors){
G6.registerBehavior(key,this.behavors[key])
}
//Graph对象中引用该行为
const graph = new G6.Graph({
container: 'flow_container',
width,
height,
fitCenter: true,
modes: {
default: ["select-node",],
}
});
自定义边
registerEdge(edgeName, options, extendedEdgeName)

G6.registerEdge(
'edgeName',
{
/**
* 绘制边,包含文本
* @param {Object} cfg 边的配置项
* @param {G.Group} group 图形分组,边中的图形对象的容器
* @return {G.Shape} 绘制的图形,通过 node.get('keyShape') 可以获取到
*/
draw(cfg, group) {},
/**
* 绘制后的附加操作,默认没有任何操作
* @param {Object} cfg 边的配置项
* @param {G.Group} group 图形分组,边中的图形对象的容器
*/
afterDraw(cfg, group) {},
/**
* 更新边,包含文本
* @override
* @param {Object} cfg 边的配置项
* @param {Edge} edge 边
*/
update(cfg, edge) {},
/**
* 更新边后的操作,一般同 afterDraw 配合使用
* @override
* @param {Object} cfg 边的配置项
* @param {Edge} edge 边
*/
afterUpdate(cfg, edge) {},
/**
* 设置边的状态,主要是交互状态,业务状态请在 draw 方法中实现
* 单图形的边仅考虑 selected、active 状态,有其他状态需求的用户自己复写这个方法
* @param {String} name 状态名称
* @param {Object} value 状态值
* @param {Edge} edge 边
*/
setState(name, value, edge) {},
},
'extendedEdgeName',
);
以上就是通过G6绘制流程图相关的常用方法,希望对大家有所帮助~
想了解更多的AI技术干货,欢迎上华为云的AI专区,目前有AI编程Python等六大实战营供大家免费学习。(六大实战营link:http://su.modelarts.club/qQB9)
一文讲述G6实现流程图绘制的常用方法的更多相关文章
- atitit..代码生成流程图 流程图绘制解决方案 java c#.net php v2
atitit..代码生成流程图 流程图绘制解决方案 java c#.net php v2 1.1. Markdown 推荐,就是代码和flow都不能直接使用.1 1.2. Java code2fl ...
- 分享一个开源的流程图绘制软件--Diagram Designer
最近在写专利文件,在制作说明书附图时想到自己还只会用wps进行简单的绘制,于是想学习下,填补下这方面的短板.这两天查到了DiagramDesigner这个小工具,派上了大用场.用它写完了一个发明专利, ...
- 发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart
软件的可执行文件下载:PADFlowChart-exe.zip MD5校验码:91FCA9FEC9665FD09BEB3DA94ADC1CE6 SHA1校验码:ECD742AA3092A085AB07 ...
- 用HTML5构建一个流程图绘制工具
在我们的开发工程中经常会使用到各种图,所谓的图就是由节点和节点之间的连接所形成的系统,数学上专门有一个分支叫图论(Graph Theroy).利用图我们可以做很多工具,比如思维导图,流程图,状态机,组 ...
- 最好的原型和流程图绘制工具:OmniGraffle_交互设计
原文地址:http://www.shangxueba.com/jingyan/2230668.html 使用哪种原型设计工具"大概是设计师闲聊时出现频率最高的话题之一.据我了解一般以Visi ...
- Draw.io--自认为最好用的流程图绘制软件
draw.io 是一个强大简洁的在线的绘图网站,支持流程图,UML图,架构图,原型图等图标.支持Github,Google Drive, One drive等网盘同步,并且永久免费.如果觉得使用Web ...
- React使用AntV G6实现流程图
安装 npm install @antv/g6 --save 引用 import G6 from '@antv/g6' 自定义节点 /** * 方式一 */ G6.registerNode('rect ...
- vue + antV G6 实现流程图完整代码 (antv G6 流程图)
效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 框架流程图绘制工具OmniGraffle 7 for Mac
1.官网下载地址 https://www.omnigroup.com/omnigraffle 2.激活方法 Omnigraffle Pro 7注册码/许可证 名字:Appked 序列号:MFWG-GH ...
- 一文看懂String类中的常用方法
1.int length(): 返回字符串的长度: return value.length 2.char charAt(int index): 返回某索引处的字符return value[index] ...
随机推荐
- Splay 详细图解 & 轻量级代码实现
学 LCT 发现有点记不得 Splay 怎么写,又实在不知道这篇博客当时写了些什么东西(分段粘代码?),决定推倒重写. 好像高一学弟也在学平衡树,但相信大家都比樱雪喵强,都能一遍学会!/kel 写在前 ...
- 浅析Redis大Key
一.背景 在京东到家购物车系统中,用户基于门店能够对商品进行加车操作.用户与门店商品使用Redis的Hash类型存储,如下代码块所示.不知细心的你有没有发现,如果单门店加车商品过多,或者门店过多时,此 ...
- NativeBuffering,进一步提升字符串的序列化性能
在<NativeBuffering,一种高性能.零内存分配的序列化解决方案[性能测试篇]>我比较了NativeBuffering和System.Text.Json两种序列化方式的性能,通过 ...
- auto关键词
前言 这个东西在新版本的 C 语言中还是很常用的,尤其是用到 for 循环中.蒟蒻之前也是对这个了解不多,基本没用过(除非迫不得已,因为我的C++编译器太逊了,不支持此操作,用这个操作还得用在线 ID ...
- Static关键词
在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴.编译器一般不对普通局部变量进行初始化,也就是说它 ...
- 使用咱们公司的DataInside可视化产品配置了一个教育行业的大屏展示软件
今天在公司用配置了一个可视化大屏软件,大家觉得如何?
- ARM汇编指令实验
题目 地址为0x40008000起始的内存中存放了20个无符号的8位整数,请编写ARM汇编程序实现如下功能: 采用冒泡法将以上内存中的数据按照从小到大的顺序排列. 注意:在验收实验时,需要自己把具体的 ...
- 带你玩转 Vite + Vue3 高低版本常用玩法
一.首先来个 Vite 的通用简介 Vite 是一种新型前端构建工具,在我们保险前端项目中已经推动并应用很久了,Vite 能够显著降低构建时间,提升前端开发效率. 它主要由两部分组成: 一个开发服务器 ...
- 浅谈SQL优化小技巧
回顾MySQL的执行过程,帮助介绍如何进行sql优化. (1)客户端发送一条查询语句到服务器: (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据: (3)未命中缓存后,MySQL通过 ...
- .net 温故知新【16】:Asp.Net Core WebAPI 筛选器
一.筛选器 通过使用筛选器可在请求处理管道中的特定阶段之前或之后运行代码. 这即是我们经常听到的面向切面编程AOP(Aspect Oriented Programming)技术,AOP通过预编译方式和 ...