一、画布
### 属性设置
import { Graph } from '@antv/x6';
// JSON / JS 图像数据
const data = {
// 节点
nodes: [
{
id: 'node1', // String,可选,节点的唯一标识
x: 40, // Number,必选,节点位置的 x 值
y: 40, // Number,必选,节点位置的 y 值
width: 80, // Number,可选,节点大小的 width 值
height: 40, // Number,可选,节点大小的 height 值
label: 'hello', // String,节点标签
},
{
id: 'node2', // String,节点的唯一标识
x: 160, // Number,必选,节点位置的 x 值
y: 180, // Number,必选,节点位置的 y 值
width: 80, // Number,可选,节点大小的 width 值
height: 40, // Number,可选,节点大小的 height 值
label: 'world', // String,节点标签
},
],
// 边
edges: [
{
source: 'node1', // String,必须,起始节点 id
target: 'node2', // String,必须,目标节点 id
},
],
};
// 设置画布
const graph = new Graph({
container: document.getElementById('container'),
width: 800,
height: 600,
background: {
color: '#fffbe6', // 设置画布背景颜色 .//或image设置图片啥的
},
grid: {
size: 10, // 网格大小 10px
visible: true, // 渲染网格背景
},
});
// 通过数据渲染画布
graph.fromJSON(data)
### 方法操作
1、平移
const graph = new Graph({ panning: true, })
const graph = new Graph({ panning: { enabled: true, }, })
const graph = new Graph({ panning: { enabled: true, eventTypes: ['leftMouseDown', 'rightMouseDown', 'mouseWheel'] }, })
禁用平移
graph.isPannable() // 画布是否可以平移 graph.enablePanning() // 启用画布平移 graph.disablePanning() // 禁止画布平移 graph.togglePanning() // 切换画布平移状态
2、缩放
graph.zoom() // 获取缩放级别 graph.zoom(0.2) // 在原来缩放级别上增加 0.2 graph.zoom(-0.2) // 在原来缩放级别上减少 0.2
3、居中
graph.centerContent()
4、导出
a、svg
b、png
import { DataUri } from '@antv/x6' this.graph.toPNG((dataUri: string) => { // 下载 DataUri.downloadDataUri(dataUri, 'chart.png') }, { width?: number height?: number backgroundColor?: string padding: { top: 20, right: 30, bottom: 40, left: 50, }, quality?: number // 图片质量,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92 })
c、JSON
5、销毁
graph.dispose()
二、基类 以及 节点
### 基类设置
/*
Cell 类提供了一个静态方法 Cell.config(options) 来配置选项的默认值,选项默认值对自定义节点/边非常友好,可以为我们的自定义节点/边指定预设的默认值。例如,我们在定义矩形节点时,为其指定了默认 Markup、默认大小和默认样式。
*/
/*
Shape.Rect.config({
width: 80,
height: 40,
markup: [
{
tagName: 'rect',
selector: 'body',
},
{
tagName: 'text',
selector: 'label',
},
],
attrs: {
body: {
fill: '#fff',
stroke: '#000',
strokeWidth: 2,
},
label: {
fontSize: 14,
fill: '#333',
fontFamily: 'Arial, helvetica, sans-serif',
textAnchor: 'middle',
textVerticalAnchor: 'middle',
}
},
})
**/
import { Shape } from '@antv/x6'
const rect = new Shape.Rect({
id: 'node1', // 节点/边的唯一标识,默认使用自动生成的 UUID。
x: 40, // 特殊化设置
y: 40,
width: 100,
height: 40,
label: 'rect',
zIndex: 2,
})
const circle = new Shape.Circle({
id: 'node2',
x: 280,
y: 200,
width: 60,
height: 60,
label: 'circle',
zIndex: 2,
})
const edge = new Shape.Edge({
id: 'edge1',
source: rect,
target: circle,
zIndex: 1,
})
graph.addNode(rect)
graph.addNode(circle)
graph.addEdge(edge)
### 自定义节点注册
// 第一步
import { Node } from '@antv/x6'
class Rect extends Node {
// 省略实现细节
}
// 第二步
Rect.config({
width: 100,
height: 40,
markup: [
{
tagName: 'rect',
selector: 'body',
},
{
tagName: 'text',
selector: 'label',
},
],
attrs: {
body: {
fill: '#ffffff',
stroke: '#333333',
strokeWidth: 2,
},
label: {
fontSize: 14,
fill: '#333333',
refX: '50%',
refY: '50%',
textAnchor: 'middle',
textVerticalAnchor: 'middle',
},
},
// 通过钩子将自定义选项 label 应用到 'attrs/text/text' 属性上
propHooks(metadata) {
const { label, ...others } = metadata
if (label) {
ObjectExt.setByPath(others, 'attrs/text/text', label)
}
return others
},
})
// 第三部步
Graph.registerNode('rect', Rect)
// 第四步
### 节点添加
a、先创建再添加
const rect =