JavaScript is required

连线数据模型(JsonLine / RGLine

连线用于描述两个端点之间的关系。普通连线的两个端点必须是节点 id;如果端点不是节点,应使用 虚拟连线 FakeLine

实际开发中会遇到两种连线对象:

  • JsonLine:你传入图谱的连线数据。
  • RGLine:图谱运行时生成的连线对象。

1. 最小可用连线

普通连线最少需要 fromto

const line = {
  from: 'node-a',
  to: 'node-b'
};

推荐显式提供 idtext

const line = {
  id: 'line-a-b',
  from: 'node-a',
  to: 'node-b',
  text: '调用'
};

字段规则:

  • from 是起点节点 id。
  • to 是终点节点 id。
  • id 在源码类型中是必填,但新增普通连线时如果未提供,运行时会生成类似 L-xxxxxx 的 id。为了后续更新、删除和持久化稳定,业务代码应主动设置 id
  • 当前源码兼容历史字段:如果没有 from 但有 source,会把 source 当作 from;如果没有 to 但有 target,会把 target 当作 to;如果没有 text 但有 label,会把 label 当作 text。新代码应使用 from/to/text

2. JsonLine 字段说明

标识、关系与业务字段

字段 类型 默认值 说明
id string 新增时可自动生成,但强烈建议显式设置 连线唯一标识。查询、更新、删除、RGLink 关联都依赖它。
from string 必填 起点节点 id。普通连线必须能找到对应节点。
to string 必填 终点节点 id。普通连线必须能找到对应节点。
text string '' 连线文本。默认连线组件会渲染它;自定义连线插槽也通常读取它。
type string '' 业务类型。可用于插槽模板分发或 CSS 分类。
data Record<string, any> {} 业务扩展数据。推荐把权重、状态、描述等业务属性放在这里。
selected boolean false 多选/编辑状态字段。和 checkedLineId 管理的单个 checked 状态不同。

连线路径字段

字段 类型 默认值 说明
lineShape RGLineShape options.defaultLineShape,默认 RGLineShape.StandardStraight 连线路径形状。影响 SVG path 生成方式。
lineDirection `‘h’ ‘v’ string`
fromJunctionPoint RGJunctionPoint options.defaultJunctionPoint,默认 border 起点与节点相交的位置计算方式。
toJunctionPoint RGJunctionPoint options.defaultJunctionPoint,默认 border 终点与节点相交的位置计算方式。
junctionOffset number options.defaultLineJunctionOffset,默认 3 节点边界外扩距离。可让线条起止点离节点边缘更远或更近。
fromJunctionPointOffsetX number 0 起点交点 X 方向额外偏移。
fromJunctionPointOffsetY number 0 起点交点 Y 方向额外偏移。
toJunctionPointOffsetX number 0 终点交点 X 方向额外偏移。
toJunctionPointOffsetY number 0 终点交点 Y 方向额外偏移。
lineRadius number options.defaultPolyLineRadius,默认 5 折线圆角半径,主要影响正交/折线路径。
polyLineStartDistance number 未设置 简易折线起始段距离,主要用于 SimpleOrthogonal 类路径。

RGLineShape 可选值:

枚举 数值 说明
RGLineShape.StandardStraight 1 标准直线。路径最简单,适合密度高、关系简单的图。
RGLineShape.Curve2 2 曲线变体。使用通用曲线生成器,视觉上比直线更柔和。
RGLineShape.Curve3 3 曲线变体。适合需要与其他曲线区分的场景。
RGLineShape.Curve5 5 曲线变体。
RGLineShape.StandardCurve 6 标准曲线。也是自环或同点连线在部分情况下的回退形状。
RGLineShape.Curve7 7 曲线变体。
RGLineShape.Curve8 8 特殊曲线生成器。
RGLineShape.SimpleOrthogonal 4 简易正交折线。常用于树图、流程图。
RGLineShape.StandardOrthogonal 44 标准正交线,支持更完整的正交路径和编辑控制点。
RGLineShape.HardOrthogonal 49 强制/固定控制点正交线,常由路径编辑操作生成或使用。

RGJunctionPoint 可选值:

枚举 说明
RGJunctionPoint.border 'border' 自动计算节点边界交点。默认值,适合多数场景。
RGJunctionPoint.ltrb 'ltrb' 从左、上、右、下边界中选择矩形交点。
RGJunctionPoint.tb 'tb' 只在上/下边界中选择交点,适合纵向树图。
RGJunctionPoint.lr 'lr' 只在左/右边界中选择交点,适合横向树图。
RGJunctionPoint.left 'left' 固定连接到左边。
RGJunctionPoint.right 'right' 固定连接到右边。
RGJunctionPoint.top 'top' 固定连接到上边。
RGJunctionPoint.bottom 'bottom' 固定连接到下边。

源码中还存在内部使用的 'horizontalLine''verticalLine' 分支,用于特殊线/点场景,不建议作为公开业务配置依赖。

颜色、宽度与文本样式字段

字段 类型 默认值 说明
color string options.defaultLineColor,默认 #cccccc 连线颜色。会影响 SVG stroke 和默认箭头颜色。
lineWidth number options.defaultLineWidth,默认 2 连线宽度。
opacity number 1 连线透明度,建议取值 01
className string undefined 附加到连线 DOM 的类名。适合主题样式或状态样式扩展。
fontColor string CSS 默认或继承线条颜色 连线文本颜色。
fontSize number CSS 默认,通常 12px 连线文本字号。
textOffsetX number options.defaultLineTextOffsetX0 连线文本 X 偏移。
textOffsetY number options.defaultLineTextOffsetY0 连线文本 Y 偏移。使用 textPath 时源码会额外做 -6 的纵向修正。
placeText `‘start’ ‘center’ ‘end’
textAnchor string 普通文本默认按 'center' 处理;textPath 默认 'middle' 文本锚点。常用值:'start''middle''end'
useTextOnPath boolean options.defaultLineTextOnPath,默认 false 是否使用 SVG textPath 让文字沿线排列。直线场景下会按普通文字旋转处理;非直线路径更适合开启。

文本截断规则:

  • options.lineTextMaxLength 默认 66
  • 超过长度后会截断并追加 ...
  • 如果需要完整文本,建议在自定义连线插槽中自行渲染 tooltip 或多行文本。

箭头与内置效果字段

字段 类型 默认值 说明
showStartArrow boolean false 是否显示起点箭头。
showEndArrow boolean true 是否显示终点箭头。
startMarkerId string '' 自定义起点 SVG marker id。设置后优先使用对应 marker。
endMarkerId string '' 自定义终点 SVG marker id。设置后优先使用对应 marker。
dashType number 0 虚线预设类型。会生成类似 rg-line-dashtype-{dashType} 的类名,具体视觉由内置 CSS 或你的 CSS 决定。
animation number 0 动画预设类型。会生成类似 rg-line-anm-{animation} 的类名,具体动画由 CSS 决定。
cssVars Record<string, any> 未设置 连线级 CSS 变量扩展。适合高级样式控制。

箭头规则:

  • 默认终点箭头显示,起点箭头不显示。
  • 如果没有提供自定义 markerId,会使用图谱实例内置的默认箭头。
  • line.isReverse 为运行时内部字段,存在时箭头方向会在渲染时交换;不要在持久化数据里主动依赖它。

行为和布局影响字段

字段 类型 默认值 说明
disablePointEvent boolean 未设置时跟随 options.disableLinePointEvent;导入时常为 false 禁用该线条的事件命中。
hidden boolean false 隐藏连线。也会影响 RGLink.rgCalcedVisibility
forDisplayOnly boolean from === to 时自动为真,否则默认 false 只用于展示,不参与部分关系分析/力学布局关系。自环线会自动设为展示线。
force_elastic number 未设置 力导向布局中的连线弹性参数。具体效果取决于当前布局实现。

历史兼容:

  • isShow 已废弃。若 hidden 未设置,源码会把 hidden = !isShow
  • isHide 已废弃。若 hidden 未设置,源码会把 hidden = isHide
  • 新代码应只使用 hidden

3. RGLine 运行时字段

RGLine 继承 JsonLine,并补充运行时字段:

字段 类型 说明
id string 运行时一定存在。未提供时新增 API 会生成。
isReverse boolean 内部计算字段,表示渲染方向是否被反转。主要影响箭头、交点和端点偏移的渲染处理。不要手动持久化。

普通连线不会直接包含两端节点对象。需要端点节点和多线索引时,应读取对应的 RGLink

const line = graphInstance.getLineById('line-a-b');
const link = graphInstance.getLinkByLineId('line-a-b');

console.log(link?.fromNode, link?.toNode);

4. 连线创建、查询、更新、删除

创建连线

graphInstance.addLines([
  {
    id: 'line-a-b',
    from: 'a',
    to: 'b',
    text: '依赖'
  }
]);

graphInstance.addLines([
  {
    id: 'line-b-c',
    from: 'b',
    to: 'c',
    lineShape: RGLineShape.StandardOrthogonal
  }
]);

新增普通连线时:

  • from/to 必须能找到现有节点。
  • 如果 id 重复,会跳过新增并输出警告。
  • 如果 isFakeLine: trueaddLines 会把它分流到 addFakeLines

查询连线

const line = graphInstance.getLineById('line-a-b');
const lines = graphInstance.getLines();
const checkedLine = graphInstance.getCheckedLine();
const link = graphInstance.getLinkByLineId('line-a-b');

更新连线

graphInstance.updateLine('line-a-b', {
  text: '已更新关系',
  color: '#2563eb',
  lineWidth: 3,
  dashType: 2
});

graphInstance.updateLineData('line-a-b', {
  weight: 0.8,
  status: 'active'
});

更新规则:

  • updateLine(id, partial) 是浅合并字段。
  • 更新业务字段优先使用 updateLineData
  • 改变 from/to 属于关系结构变化,建议删除旧线再新增新线,避免已有 RGLink 上下文短暂不一致。

删除连线

graphInstance.removeLineById('line-a-b');

graphInstance.removeLineByIds(['line-b-c', 'line-c-d']);

const line = graphInstance.getLineById('line-x-y');
if (line) {
  graphInstance.removeLine(line);
}

5. 多条连线与 multiLineDistance

同一对节点之间可以存在多条连线:

graphInstance.addLines([
  { id: 'ab-1', from: 'a', to: 'b', text: '主链路' },
  { id: 'ab-2', from: 'a', to: 'b', text: '备用链路' },
  { id: 'ab-3', from: 'a', to: 'b', text: '监控链路' }
]);

运行时会通过 RGLink 提供:

  • totalLinesBetweenNodes:同一节点对之间的总线数。
  • currentLineIndex:当前线在这些线中的索引。

路径生成时会参考 options.multiLineDistance(默认 30)拉开多条线,避免完全重叠。

6. 推荐写法

const line = {
  id: 'api-to-db',
  from: 'api',
  to: 'database',
  text: 'SQL 查询',
  type: 'request',
  lineShape: RGLineShape.StandardOrthogonal,
  fromJunctionPoint: RGJunctionPoint.right,
  toJunctionPoint: RGJunctionPoint.left,
  color: '#2563eb',
  lineWidth: 2,
  showEndArrow: true,
  placeText: 'center',
  data: {
    protocol: 'postgres',
    p95: 38
  }
};

推荐原则:

  • 结构关系使用 from/to
  • 展示文本使用 text
  • 业务属性放在 data
  • 核心视觉语义放在 color/lineWidth/lineShape,不要只写在 CSS 里。
  • 复杂线条模板可结合 type#line 插槽分发。

7. 常见问题

为什么线没有显示?

常见原因:

  • from/to 对应节点不存在。
  • 线设置了 hidden: true
  • 起点或终点节点隐藏,导致 RGLink.rgCalcedVisibility 为假。
  • 自定义 FakeLine 目标无法解析几何信息。
  • 在性能模式或 EasyView 状态下,主 SVG 层可能被替换为简化绘制。

为什么设置了 lineShape 但路径看起来不明显?

如果两个节点距离很近、节点尺寸较大、或连接点强制固定,某些曲线/折线差异会不明显。可以同时调整:

  • fromJunctionPoint/toJunctionPoint
  • junctionOffset
  • lineRadius
  • multiLineDistance
  • textOffsetX/textOffsetY

为什么自定义 CSS 后缩略图没有同步?

缩略图主要读取连线数据字段,例如 colorlineWidth。如果只在 CSS 中改 .rg-line 的 stroke,缩略图无法知道这些变化。

8. 下一步阅读