因为本文档目录太多,建议安装Chrome插件 Smart TOC,可清晰一览文档层次结构,同时也方便按目录跳转查看。javascript
因本人仍在开发及探索中,目前此文档的层级结构还没有肯定,只能是碰到什么便整理总结什么,仍待更新完善。html
Github:https://github.com/blueju/vue...vue
g6-editor 做为图编辑器,根据官方文档提供的DEMO,主要能作如下三类图:java
但在实际使用中,对所提供 API 的了解,彷佛又不只能作如下三类图,还可作网络图/拓扑图
该目录主要整理 g6-editor 在HTML层面的术语解释、使用规范、示例和注意点。node
工具栏负责盛放一个操做按钮,相似 wangEditor 中顶部的操做工具按钮区域。git
g6-editor 已经为咱们作好了许多工做,咱们只须要按规范写好HTML标签,而后给它们配上合适的图标和标题。github
我使用的图标是 font-awesome
<div id="toolbar"> <i data-command="save" class="command fa fa-floppy-o" title="保存"></i> <i data-command="undo" class="command fa fa-undo" title="撤销"></i> <i data-command="redo" class="command fa fa-repeat" title="重作"></i> <i data-command="delete" class="command fa fa-trash-o" title="删除"></i> <i data-command="zoomOut" class="command fa fa-search-minus" title="缩小"></i> <i data-command="zoomIn" class="command fa fa-search-plus" title="放大"></i> <i data-command="clear" class="command fa fa-eraser" title="清除画布"></i> <i data-command="toFront" class="command fa fa-arrow-up" title="提高层级"></i> <i data-command="toBack" class="command fa fa-arrow-down" title="降低层级"></i> <i data-command="selectAll" class="command fa fa-check-square-o" title="全选"></i> <i data-command="copy" class="command fa fa-files-o" title="复制"></i> <i data-command="paste" class="command fa fa-clipboard" title="粘贴"></i> <i data-command="autoZoom" class="command fa fa-expand" title="实际大小"></i> <i data-command="resetZoom" class="command fa fa-compress" title="适应页面"></i> <i data-command="addGroup" class="command fa fa-object-group" title="组合"></i> <i data-command="unGroup" class="command fa fa-object-ungroup" title="取消组合"></i> .... </div>
元素面板负责盛放一些可拖拽的元素,供使用人员拖拽到画板中。web
元素仅仅是一个定义了一些属性和 class 的HTML标签,为了给予美观的效果,我通常会往元素标签中添加图片。chrome
g6-editor的官方文档中,并未说起元素图片,结合搜索引擎,我也仅搜索四种元素图片,格式为svg。canvas
若是你想本身自定义的元素图片,建议使用svg。
名称 | 地址 |
---|---|
起止节点 | https://gw.alipayobjects.com/... |
常规节点 | https://gw.alipayobjects.com/... |
分叉节点 | https://gw.alipayobjects.com/... |
模型节点 | https://gw.alipayobjects.com/... |
<div id="itempannel"> <div class="getItem" data-type="node" data-shape="flow-rect" data-size="120*48" data-label="常规节点" data-color="#1890FF" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/wHcJakkCXDrUUlNkNzSy.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-circle" data-size="72*72" data-label="起止节点" data-color="#FA8C16" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/ZnPxbVjKYADMYxkTQXRi.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-rhombus" data-size="80*72" data-label="分叉节点" data-color="#13C2C2" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/SnWIktArriZRWdGCnGfK.svg" /> </div> <div class="getItem" data-type="node" data-shape="flow-capsule" data-size="80*48" data-label="模型节点" data-color="#722ED1" > <img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/rQMUhHHSqwYsPwjXxcfP.svg" /> </div> </div>
以上示例中的 class 名称(getItem),不可删除,不可用其余 class 替换,不然会出现没法将元素拖拽入画板的问题。
元素标签中,全部带有 * 属性都会被添加进节点的数据模型。
以上示例中 HTML代码 和 data-* 属性,已经是本人在保证语义化和无bug出现状况下的最精简版本,可直接复制使用。
熟悉G6的同窗可能秒懂,但若是不清楚什么意思也不要紧,后续操做中你就会发现其联系。
元素图片必须设置为禁止拖拽,draggable="false",不然拖拽到画板后,须要二次点击才会取消元素选中状态。
<div id="page"></div>
画布标签的 id 必须为 page,不然控制台会报错,缘由不明,错误以下:
必须在CSS中为画布设定高度
属性栏通常在画布右侧,用于设置节点/边/画布等属性,相似这种:
我初次看 g6-editor 文档的示例DEMO时,看到属性栏的HTML标签中含有 data-status="node-selected" 等属性,觉得,可是在后续的操做,并未发现 data-status="*" 的属性的做用,也多是我暂时没有发现。
我在实践中感受这里 g6-editor 并无为咱们提供什么现成的东西,更可能是只是咱们须要在右侧这一块区域,建立一些表单,在进行一些操做时(好比选中一个节点),经过API获取数据并填充到表单中,以此来展现所选元素的属性。
<div id="detailpannel"> <!-- 节点属性栏 --> <div id="nodeAttributeBar" data-status="node-selected"> <div class="title">节点属性</div> <div class="main"> <el-form :model="nodeAttributeForm" label-position="top" label-width="80px"> <el-form-item label="节点文本"> <el-input v-model="nodeAttributeForm.label" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="宽度"> <el-input v-model="nodeAttributeForm.width" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model="nodeAttributeForm.height" @change="saveNodeAttribute"></el-input> </el-form-item> <el-form-item label="颜色"> <el-color-picker v-model="nodeAttributeForm.color" @change="saveNodeAttribute"></el-color-picker> </el-form-item> </el-form> </div> </div> <!-- 边属性栏 --> <div id="edgeAttributeBar" data-status="edge-selected"> <div class="title">边属性</div> <div class="main"> <el-form :model="edgeAttributeForm" label-position="top" label-width="80px"> <el-form-item label="边文本"> <el-input v-model="edgeAttributeForm.label" @change="saveEdgeAttribute"></el-input> </el-form-item> <el-form-item label="边文本"> <el-select v-model="edgeAttributeForm.shape" @change="saveEdgeAttribute"> <el-option label="流程图折线" value="flow-polyline"></el-option> <el-option label="流程图圆⻆折线" value="flow-polyline-round"></el-option> <el-option label="流程图曲线" value="flow-smooth"></el-option> </el-select> </el-form-item> </el-form> </div> </div> </div>
未免也太简陋了。。。
<div id="detailpannel"> <div data-status="node-selected">节点属性栏</div> <div data-status="edge-selected">边属性栏</div> <div data-status="group-selected">群组属性栏</div> <div data-status="canvas-selected">画布属性栏</div> <div data-status="multi-selected">多选时属性栏</div> </div>
该目录主要整理 g6-editor 在 JS 层面的术语解释、使用规范、示例和注意点。
为了更好服务⽤户,G6Editor 会将 URL 和版本信息发送回 AntV 服务器,除了 URL 与 G6 版本信息外,不会收集任何其余信息。
若有担⼼,能够经过下⾯的代码关闭:
G6Editor.track(false)
该类是整个 g6-editor 的主控类,其主要职责是将 g6-editor 的各个组件协同起来。(摘自官方文档并作了微调)
至于为何说是类,可能他们是用 ES6 语法 class 实现的吧。
使用须要实例化
import G6Editor from "@antv/g6-editor"; const editor = new G6Editor(); ...
可打印实例化后 editor,经过查看上一层原型链的方式查看更多方法。除下表方法之外,还有一些方法,但均以 _ 开头,可能为私有方法用得少,下表再也不列举,想看的可在控制台自行查看。
方法 | 名称 | 备注 |
---|---|---|
add | 添加组件 | |
commandEnable | ||
destroy | 销毁编辑器 | |
executeCommand | 执行命令 | 经过此方法执行的操做,均会进入队列,可撤销/重作,建议使用 |
getCommands | ||
getComponents | ||
getComponentsByType | ||
getCurrentCommand | ||
getCurrentPage | ||
getDefaultCfg | ||
setCommandDOMenable |
根据官网文档,事件包括鼠标事件、编辑器事件、数据变动事件、状态变动事件、控制事件这几类,官方文档仅仅只是作了模糊归纳,并未详细列出有哪些事件。
经过查阅原官方文档、查阅源码 和 实际操做,总结出如下事件列表:
import G6Editor from "@antv/g6-editor";const editor = new G6Editor();
const page = editor.getCurrentPage()
// 下表中,节点和边,一并简称为对象
事件 | 备注 | 提供者 |
---|---|---|
aftercommandexecute | editor 编辑器 | |
beforecommandexecute | editor 编辑器 | |
afterchange | 改变后 | page 画布 |
afterdelete | 删除后 | page 画布 |
afteritemactived | page 画布 | |
afteritemselected | 选择对象后 | page 画布 |
afteritemunactived | 取消激活后 | page 画布 |
afteritemunselected | page 画布 | |
anchor:mousedown | page 画布 | |
anchor:mouseenter | page 画布 | |
anchor:mouseleave | page 画布 | |
anchor:mouseup | page 画布 | |
beforechange | page 画布 | |
beforeitemactived | page 画布 | |
beforeitemselected | page 画布 | |
beforeitemunactived | page 画布 | |
beforeitemunselected | page 画布 | |
click | page 画布 | |
contextmenu | page 画布 | |
dragedge:beforeshowanchor | page 画布 | |
edge:mouseenter | page 画布 | |
edge:mouseleave | page 画布 | |
hoveranchor:beforeaddedge | page 画布 | |
hovernode:beforeshowanchor | page 画布 | |
keyup | page 画布 | |
mousedown | page 画布 | |
mouseenter | page 画布 | |
mouseleave | page 画布 | |
mouseup | page 画布 | |
node:click | page 画布 | |
node:mousedown | page 画布 | |
node:mouseenter | page 画布 | |
node:mouseleave | page 画布 | |
node:mouseup | page 画布 | |
statuschange | page 画布 | |
使用 on 方法
上面我发现整理的事件,可
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能没法当即查看,可设个定时器,1秒后查看 let events = editor.getCurrentPage()._events; console.log(events);
方法有不少,我可能没办法将所有都列出来并解释,在实际操做中,更多的是须要你们本身经过在控制台打印的方式,在原型链中查找符合需求的方法。
将画布数据保存为数据模型,执行该方法将返回一个包含节点数据和边数据的对象
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能没法当即查看,可设个定时器,1秒后查看 editor.getCurrentPage().save(); // {nodes: [...], edges: [...]}
将画布数据数据保存为图片,执行该方法将返回一个canvas
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); // 可能没法当即查看,可设个定时器,1秒后查看 editor.getCurrentPage().saveImage();
读取数据模型,并展现在画板中,入参是一个包含节点数据和边数据的对象
import G6Editor from "@antv/g6-editor"; let editor = new G6Editor(); let dataModel = {...} editor.getCurrentPage().read(dataModel);
共26个,按字母排序
命令 | 备注 | 适用页面 |
---|---|---|
add | 新增元素 | |
addGroup | 组合 | |
appendChild | 添加子节点 | 脑图 |
append | 添加相邻节点 | 脑图 |
autoZoom | 自适应尺寸 | 全部 |
clear | 清空画布 | 全部 |
collapse | 收缩 | |
collapseExpand | 折叠/展开 | |
common | ||
copy | 复制 | |
copyAdjacent | ||
delete | 删除 | |
expand | 展开 | |
move | 移动 | |
moveMindNode | 移动脑图节点 | |
multiSelect | 多选 | |
paste | 粘贴 | |
pasteHere | ||
redo | 重作 | |
resetZoom | 实际尺寸 | |
selectAll | 全选 | |
toBack | 下降层级 | |
toFront | 提高层级 | |
unGroup | 取消组合 | |
undo | 撤销 | |
update | 更新 | |
zoomIn | 放大 | |
zoomOut | 缩小 | |
zoomTo |
源码文件:g6Editor.js
源码对应位置:将 g6Editor.js 格式化后,检索关键词 registerCommand(",以下图:
我想经过点击工具栏中的保存图标来保存数据模型
<i data-command="save" class="command fa fa-floppy-o" title="保存"></i>
使用 editor.Command.registerCommand() 方法注册自定义命令save,在其正向命令中,添加本身须要的处理逻辑。
Command.registerCommand("save", { // 命令是否进入队列,进入队列可执行撤销/重作,默认是 true queue: false, // 命令是否可用 enable(eidtor) { return true; }, // 正向命令 execute(editor) { ... }, // 反向命令 back(editor) { ... }, // 快捷键:Ctrl + Shirt + S shortcutCodes: [["ctrlKey", "shiftKey", "s"]] });
固然咱们有另一种方式,即给保存图标添加点击事件,在方法中执行本身须要的处理逻辑。
注册的自定义命令中,即使你设置了快捷键,但仍是默认不启用的。
若是须要启用,须要按以下设置进行开启。
因为我本人使用的 Flow 流程图,因此在 Flow 中设置开启,若是你使用的是 MindMap 脑图,则可能在 new G6Editor.MindMap({}) 中设置开启。
const flow = new G6Editor.Flow({ graph: { container: "page" }, shortcut: { // 开启保存快捷键 save: true } });
经过快捷键,可快速执行一些命令,默认状况下,含快捷键的内置命令有:
下表中的"Mac快捷键" 和"适用页面",摘自官方文档,本人未验证源码文件:g6Editor.js
源码对应位置:将 g6Editor.js 格式化后,检索关键词 shortcutCodes: [
官方文档PDF中的快捷键表格,存在错误,由于在源码检索 copy/paste 等命令并未发现其有快捷键
共有10个,按字母排序
命令 | Win 快捷键 | Mac 快捷键 | 备注 | 适⽤⻚⾯ |
---|---|---|---|---|
append | Enter | Enter | 添加相邻节点 | 思惟导图 |
appendChild | Tab | Tab | 添加⼦节点 | 思惟导图 |
collapseExpand | Ctrl + / | ⌘/ | 折叠/展开 | 思惟导图 |
delete | Delete | Delete | 删除 | 全部页面 |
redo | Ctrl + Shift + Z | ⇧⌘Z | 重作 | 全部页面 |
resetZoom | Ctrl + 0 | ⌘0 | 实际尺⼨ | 全部页面 |
selectAll | Ctrl+A | ⌘A | 全选 | 全部页面 |
undo | Ctrl + Z | ⌘Z | 撤销 | 全部页面 |
zoomIn | Ctrl + = | ⌘= | 放大 | 全部页面 |
zoomOut | Ctrl + - | ⌘- | 缩小 | 全部页面 |
命令 | Win 快捷键 | Mac 快捷键 | 备注 | 适⽤⻚⾯ |
---|---|---|---|---|
clear | 清空画布 | 全部页面 | ||
selectAll | Ctrl+A | ⌘A | 全选 | 全部页面 |
undo | Ctrl + Z | ⌘Z | 撤销 | 全部页面 |
redo | Ctrl + Shift + Z | ⇧⌘Z | 重作 | 全部页面 |
delete | Delete | Delete | 删除 | 全部页面 |
zoomIn | Ctrl + = | ⌘= | 放大 | 全部页面 |
zoomOut | Ctrl + - | ⌘- | 缩小 | 全部页面 |
autoZoom | ⾃适应尺⼨ | 全部页面 | ||
resetZoom | Ctrl + 0 | ⌘0 | 实际尺⼨ | 全部页面 |
toFront | 提高层级 | 全部页面 | ||
toBack | 降低层级 | 全部页面 | ||
copy | Ctrl + C | ⌘C | 复制 | 流程图 |
paste | Ctrl + V | ⌘V | 粘贴 | 流程图 |
multiSelect | 多选模式 | 流程图 | ||
addGroup | Ctrl + G | ⌘G | 组合 | 流程图 |
unGroup | Ctrl + Shift + G | ⇧⌘G | 取消组合 | 流程图 |
append | Enter | Enter | 添加相邻节点 | 思惟导图 |
appendChild | Tab | Tab | 添加⼦节点 | 思惟导图 |
collapseExpand | Ctrl + / | ⌘/ | 折叠/展开 | 思惟导图 |
源码位置:
common | 直线,不带箭头 |
flow-base | 直线,带箭头 |
flow-polyline | 流程图折线 |
flow-polyline-round | 流程图圆角折线 |
flow-smooth | 流程图曲线 |
diagram-base | 直线,带箭头。 与 flow-base 的区别未知。 |
page-base | 仅在源码中发现其被注册为内置边,未实际操做,效果未知。 |
mind-placeholder-edge | 弧线,无锚点,线位于节点底部,更适用于思惟导图。 |
mind-edge | 弧线,更适用于思惟导图脑图。 |
koni-base | 拖拽target目标节点时,边会围绕source源节点,自动调整为最近的锚点。 直线,带箭头,更适用于⽹络图/拓扑图。 |
源码文件:g6Editor.js
源码对应位置:将 g6Editor.js 格式化后,检索关键词 registerCommand(",以下图: