Skip to content

布局与路由 ​

布局只做一件事:把“谁连谁”变成“谁在哪、线怎么走”。除了文档显式给出的 pin, 最终坐标都在这里产生。

正在渲染图表…

度量先于摆放 ​

节点大小由注册表里的 measure 决定。布局引擎只拿到已经算好的 sizes,不会调用形状的 render。因此布局可以完全在 Node / CI 里跑,不需要 DOM。

四步分别是 measureDocument、placeDocument、attachEndpoints、routeEdges, layoutDocument 只是组合它们。中间结果都能单独断言。

三种内置引擎 ​

引擎适合什么
layered有方向关系的图,默认引擎
grid容器里的子节点,按网格铺开
explicit设计稿或测试,位置已经由 pins 给出

explicit 的 pin 是绝对坐标,布局不会为了把内容挪回 0,0 而整体平移。未 pin 的子节点 仍然会得到网格回落位置。

路由先尊重端口 ​

端口一旦声明,它就是一个固定挂接点,路由不能为了“更好看”把它挪走。自动端点可以沿边框 滑动,因此两个左右相邻、垂直范围有交集的节点通常会得到一条直线。

constraint: "side" 的端口 side 固定、槽位自动;同一侧多个端口会按对端位置排序并等距 分配。fixed 保留 v1 的 offset 语义。

标签也是布局产物 ​

measure 阶段会把边标签折行并测量,route 阶段产出标签矩形。build 不再用简单的线段中点 自己猜位置;放不下时会产生 LABEL_COLLISION 警告。

只有两端没有任何可共享的走廊时,才会产生拐角。这与“所有节点之间都留一个 12px 台阶” 完全不同,也是示例图里很多边看起来更干净的原因。

路由不是形状的一部分 ​

EdgeSpec 决定线、箭头和标签怎么画,Router 决定折点在哪里。两者分开后,同一个边类型 可以在不同布局里复用,不需要把路由逻辑塞进边注册项。

常见误解 ​

  • render 不能改坐标。所有位置来自 LayoutResult。
  • layout.pins 只被 explicit 消费,不是通用的节点坐标字段。
  • 端口位置固定,自动端点才允许沿边滑动。
  • avoid 路由会绕开盒子,但不应该改变端口本身。

MIT License