logo

X6

  • 文档
  • API
  • 图表示例
  • 常见问题
  • 更新日志
  • XFlow
  • 所有产品antv logo arrow
  • 2.x
  • 画布
    • 画布
    • 网格
    • 背景
    • 画布平移
    • 画布缩放
    • 视口变换
    • 坐标系
  • 元素
    • 元素
    • 节点
    • 边
    • 标签
    • 箭头
    • 元素属性
    • 交互
  • MVC
    • 模型
    • 视图
  • 扩展
    • 节点工具
    • 边上工具
    • 路由
    • 连接器
    • 节点的锚点
    • 边的锚点
    • 连接点
    • 连接桩布局
    • 连接桩标签布局
    • 属性
    • 高亮器
    • 滤镜

路由

上一篇
边上工具
下一篇
连接器

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

路由将边的路径点 vertices 做进一步转换处理,并在必要时添加额外的点,然后返回处理后的点(不包含边的起点和终点)。例如,经过 orth 路由处理后,边的每一条线段都是水平或垂直的正交线段。

X6 中内置了以下几种路由。

路由名称说明
normal默认路由,原样返回路径点。
orth正交路由,由水平或垂直的正交线段组成。
oneSide受限正交路由,由受限的三段水平或垂直的正交线段组成。
manhattan智能正交路由,由水平或垂直的正交线段组成,并自动避开路径上的其他节点(障碍)。
metro智能地铁线路由,由水平或垂直的正交线段和斜角线段组成,类似地铁轨道图,并自动避开路径上的其他节点(障碍)。
er实体关系路由,由 Z 字形的斜角线段组成。

在使用时,可以为边设置路由:

const edge = graph.addEdge({
source,
target,
router: {
name: 'oneSide',
args: {
side: 'right',
},
},
})

当路由没有参数时,也可以简化为:

const edge = graph.addEdge({
source,
target,
router: 'oneSide',
})

也可以调用 方法来设置路由:

edge.setRouter('oneSide', { side: 'right' })

在创建画布时,可以通过 connecting 选项来设置全局默认路由(画布的默认路由是 'normal'):

new Graph({
connecting: {
router: {
name: 'oneSide',
args: {
side: 'right',
},
},
},
})

当路由没有参数时,也可以简化为:

new Graph({
connecting: {
router: 'orth',
},
})

下面我们一起来看看如何使用内置路由,以及如何自定并注册自定义路由。

内置路由

normal

系统的默认路由,该路由原样返回传入的 vertices 路径点。

orth

正交路由,该路由在路径上添加额外的一些点,使边的每一条线段都水平或垂直正交。

支持的参数如下表:

参数名参数类型是否必选默认值参数说明
paddingSideOptions否20设置锚点距离转角的最小距离。

SideOptions 定义如下:

export type SideOptions =
| number
| {
vertical?: number
horizontal?: number
left?: number
top?: number
right?: number
bottom?: number
}

例如:

graph.addEdge({
source,
target,
vertices: [
{ x: 100, y: 200 },
{ x: 300, y: 120 },
],
router: {
name: 'orth',
args: {
padding: {
left: 50,
},
},
},
})

oneSide

oneSide 路由是正交路由 orth 的受限版本,该路生成一个严格的三段路由:从起始节点的 side 侧开始,经过中间段,再从终止节点的 side 侧结束路由。需要特别注意的是,使用该路由时请不要同时指定 vertices,否则路由效果会非常差。

支持的参数如下表:

参数名参数类型是否必选默认值参数说明
side'left' | 'right' | 'top' | 'bottom'否'bottom'路由的起始/结束方向,默认值为 'bottom'。
paddingSideOptions否20设置锚点距离转角的最小距离。

例如:

graph.addEdge({
source,
target,
router: {
name: 'oneSide',
args: { side: 'right' },
},
})

manhattan

曼哈顿路由 'manhattan' 路由是正交路由 'orth' 的智能版本,该路由由水平或垂直的正交线段组成,并自动避开路径上的其他节点(障碍)。

我们为该路由算法提供了丰富的选项:

参数名参数类型是否必选默认值参数说明
stepnumber否10路由算法步进步长,其值越小计算量越大,推荐使用画布的网格大小。
excludeTerminals('source' | 'target')[]否[]忽略起始或终止节点,忽略后不参与障碍物计算。
excludeShapesstring[]否[]忽略指定形状的节点,忽略后不参与障碍物计算。
excludeNodes(Node | string)[]否[]忽略的节点,忽略后不参与障碍物计算。
startDirectionsstring[]否['top', 'right', 'bottom', 'left']支持从哪些方向开始路由。
endDirectionsstring[]否['top', 'right', 'bottom', 'left']支持从哪些方向结束路由。
paddingSideOptions否-设置锚点距离转角的最小距离。
fallbackRouterRouter否Registry.Router.presets.orth无法避开障碍物的场景,降级到指定路由。

例如:

graph.addEdge({
source,
target,
router: {
name: 'manhattan',
args: {
startDirections: ['top'],
endDirections: ['bottom'],
},
},
})

注意

manhattan 路由的特性是自动避开路径中的障碍物,如果出现无法避开的情况,就会自动降级到 orth 路由,此时为了让开发者能够发现问题,我们在控制台增加了 warn:Unable to execute manhattan algorithm, use orth instead。

metro

地铁路由 metro 是曼哈顿路由 manhattan 的一个变种,它由水平或垂直的正交线段和斜角线段组成,类似地铁轨道图,并自动避开路径上的其他节点(障碍)。其选项与 manhattan一样,但 maxDirectionChange 的默认值为 45,表示路由线段的最大倾斜角度为 45 度。

例如:

graph.addEdge({
source,
target,
router: {
name: 'metro',
args: {
startDirections: ['top'],
endDirections: ['bottom'],
},
},
})

er

实体关系路由 er 由 Z 字形的斜角线段组成,常用于表示 ER 图中的实体之间的连线。

支持的参数如下表:

参数名参数类型是否必选默认值参数说明
offsetnumber |'center'否32路由的第一个点和最后一个点与节点之间的距离。当取值为 'center' 时,节点距离的中心作为路由点坐标。
minnumber否16路由的第一个点和最后一个点与节点之间的最小距离。
direction'T'|'B'|'L'|'R'|'H'|'V'否-路由方向,缺省时将自动选择最优方向。

例如:

graph.addEdge({
source,
target,
router: {
name: 'er',
args: {
offset: 24,
},
},
})
Options
offset
32
min
16
direction

自定义路由

除了内置路由,我们还可以按照一定规则来创建自定义路由,例如,实现随机的路由:

// 路由参数
interface RandomRouterArgs {
bounces?: number
}
function randomRouter(
vertices: Point.PointLike[],
args: RandomRouterArgs,
view: EdgeView,
) {
const bounces = args.bounces || 20
const points = vertices.map((p) => Point.create(p))
for (var i = 0; i < bounces; i++) {
const sourceCorner = view.sourceBBox.getCenter()
const targetCorner = view.targetBBox.getCenter()
const randomPoint = Point.random(
sourceCorner.x,
targetCorner.x,
sourceCorner.y,
targetCorner.y,
)
points.push(randomPoint)
}
return points
}
Graph.registerRouter('random', randomRouter)
edge.setRouter('random', { bounces: 3 })