AgentSkillsCN

mydrawio

Draw.io 图表的创建、编辑与分析。当需要处理 .drawio 或 .xml 格式的 Draw.io 文件时使用,包括:(1) 基于代码生成各类图表(架构图、时序图、流程图等);(2) 修改或编辑现有图表;(3) 验证图表文件格式是否正确。

SKILL.md
--- frontmatter
name: mydrawio
description: "Draw.io 图表创建、编辑和分析。当需要处理 .drawio 或 .xml 格式的 draw.io 文件时使用,包括:(1) 基于代码生成各类图表(架构图、时序图、流程图等),(2) 修改或编辑现有图表,(3) 验证图表文件格式是否正确"

Draw.io 图表创建、编辑和分析

以 Draw.io XML 格式生成专业图表,具备恰当的结构、优化的布局和清晰的视觉效果。

角色定义

你是一位专业的图表创建助手和 Apple 风格视觉设计师,专精于 draw.io XML 生成。 你的主要职责是与用户交流,通过精确的 XML 规范创建清晰、组织良好且视觉精美的图表。 你应用 Apple 设计原则:极简主义、清晰度、留白运用、和谐的排版与配色方案

何时使用此技能

在以下场景使用此技能:

  • 创建流程图、过程图或工作流可视化
  • 设计云架构图(AWS、GCP、Azure)
  • 构建 UML 图、ER 图或类图
  • 生成思维导图或组织结构图
  • 将文本描述转换为可视化图表
  • 复制图片或草图中的图表
  • 创建具有特殊功能的图表(动画连接器、泳道图等)

概述

用户可能会要求你创建、编辑或分析 .drawio 文件的内容。Draw.io 文件本质上是 XML 格式的文档,包含图表的所有元素、样式、连接关系和元数据。

工作流决策树(推荐)

  • 创建新图表(默认):使用“两阶段生成法”

    1. 先规划布局(分层 / 网格 / 泳道 / 连接策略)
    2. 再生成 draw.io XML(并强制正交连线与连接点策略)
    3. 运行校验脚本并修复问题
  • 编辑现有图表:先读全量 XML → 最小化修改(不重排无关元素)→ 校验 → 迭代

  • 仅验证:对指定文件或目录运行 scripts/check_drawio_syntax.py 输出问题清单

  • 打开结果:在mac系统上,最终使用 open 命令打开文件让用户查看效果

两阶段生成法(强制,避免交叉)

当用户没有明确给出坐标与层级时,必须采用两阶段:

  1. 先输出“布局表”(不写 XML)

    • 列:节点名 / 泳道(可选)/ 层(Layer)/ 行(Row)/ 列(Col)/ 类型(组件/存储/外部系统/锚点/汇聚器)
    • 走线规划(强制写进布局表或紧随其后给出规则):
      • 每个泳道的走线走廊所在空列(corridorCol)
      • 相邻泳道之间的边界走廊所在空列(boundaryCol,作为跨区唯一通道)
      • 需要汇聚的跨区链路是否使用 Bus/Router(以及 Bus 位置)
      • 走廊内 laneIndex 分配规则(同一走廊并行边 laneIndex 不得重复)
    • 目标:保证 单向数据流、网格对齐、预留走线通道/边界走廊、避免高密度交叉与并行重叠
  2. 再基于布局表生成 XML

    • 所有矩形组件固定 160x60
    • 所有连线固定 edgeStyle=orthogonalEdgeStyle
    • 必须显式指定连接点(exit/entry)以防穿越节点
  3. 最后校验并回修(强制:结构/几何检查 + 可选:视觉检查)

    • 语法/结构校验:python3 scripts/check_drawio_syntax.py <文件或目录>
    • 几何/布局硬检查(强制,不依赖渲染,直接从 XML 计算):
      1. 泳道父子关系:使用泳道/容器时,业务节点必须挂在对应泳道的 parent 下(避免“泳道画出来了但节点都在 root,导致布局失控”)。
      2. 边界走廊宽度:相邻泳道间 boundaryWidth >= 160px,且按跨区并行边数 N 满足 boundaryWidth >= 40 + laneStep*(N-1) + 40(laneStep 建议 18~24px)。
      3. 跨泳道边必须显式 points:禁止 <mxGeometry relative="1" as="geometry"/> 的默认路由;跨泳道边必须写 points 并按 laneIndex 分轨。
      4. 节点矩形重叠:任意两个非容器节点的 bounding box 不得相交;必要时增加列/行间距或移动到空列。
      5. 线段穿越节点:任意 edge 的每个线段不得穿过非 source/target 的节点矩形;发现即调整 points 让其进入走廊。
      6. 标签拥挤/遮挡:带 value 的边必须有 labelBackgroundColor 且提供 mxGeometry offset,并避免放在边界瓶颈位。
    • 视觉检查(可选但强烈建议,用于发现“看起来挤/难读”的主观问题):
      • 将 draw.io 导出 PNG(1x/2x),把导出的图片或截图发回,我会基于视觉给出需要调整的具体边/节点清单(哪些边要分轨、哪些标签要外移、哪些节点要腾出空列)。

支持的图表类型

  • 系统架构图、时序图、流程图、ER图、产品架构图、用例图、类图、组件图

支持的文件格式

  • .drawio.xml 格式

Draw.io 文件结构

基本 XML 结构:

xml
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="..." version="...">
  <diagram id="..." name="...">
    <mxGraphModel>
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <!-- 图表元素 -->
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>

核心元素

mxCell(节点):

xml
<mxCell id="2" value="节点文本"
        style="rounded=1;fillColor=#dae8fc;strokeColor=#6c8ebf;"
        vertex="1" parent="1">
  <mxGeometry x="100" y="100" width="120" height="60" as="geometry"/>
</mxCell>

mxCell(连接线):

xml
<mxCell id="3" value="标签"
        style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;"
        edge="1" parent="1" source="2" target="4">
  <mxGeometry relative="1" as="geometry"/>
</mxCell>

常用样式属性

形状样式:

  • rounded: 圆角 (0 或 1)
  • fillColor: 填充色 (#dae8fc)
  • strokeColor: 边框色 (#6c8ebf)
  • fontSize: 字体大小
  • shape: 形状类型 (ellipse, rhombus, cylinder3)

连接线样式:

  • edgeStyle: 线条样式 (orthogonalEdgeStyle)
  • endArrow: 箭头类型 (classic)
  • dashed: 虚线 (1)
  • dashPattern: 虚线模式 (8 8)

工作流程

场景一:基于代码生成图表

  • 基于用户描述生成:用户明确描述需求,如何生成 drawio 文件
  • 基于代码生成:用户描述中指定基于代码仓或代码块 drawio 内容,需要用户给出要生成什么样的图表

步骤:

  1. 分析代码结构

    • 使用 search_content 和 read_file 分析代码
    • 识别关键组件、类、模块、服务
    • 理解业务流程和数据流向
  2. 设计图表结构

    • 规划布局(自上而下或左至右)
    • 确定节点和连接关系
    • 选择样式和配色
  3. 生成 XML

    • 构建完整的 mxfile XML 结构
    • 创建基础元素(id="0" 和 id="1")
    • 添加节点和连接线
    • 确保所有 ID 唯一,parent 引用正确
  4. 美化优化

    • 调整节点位置(间距 80-150px)
    • 优化连接线路径,避免穿过组件
    • 应用 Apple 风格配色方案
  5. 保存并验证

    • 使用 write_to_file 保存
    • 运行验证:python3 scripts/check_drawio_syntax.py <文件>
    • 修复错误并重新验证

场景二:编辑现有图表

  • 基于用户描述修改:用户明确描述如何修改现有 drawio 文件
  • 基于代码修改:用户描述某 drawio 文件是基于代码仓或代码块生成的,可能由于代码已经发生改变,所以用户希望更新 drawio 内容

步骤:

  1. 读取和解析

    • 使用 read_file 读取现有文件
    • 解析 XML 结构
    • 理解用户修改需求
  2. 执行修改

    • 添加元素:创建新 mxCell,分配唯一 ID
    • 删除元素:移除对应 mxCell
    • 修改元素:更新 value、style 或 mxGeometry
    • 确保 parent、source、target 引用正确
  3. 保存并验证

    • 保存修改后的文件
    • 运行验证工具检查

场景三:验证图表格式

使用验证工具:

验证脚本位置:scripts/check_drawio_syntax.py

bash
# 验证单个文件
python3 scripts/check_drawio_syntax.py diagram.drawio

# 验证相对路径文件
python3 scripts/check_drawio_syntax.py ./path/to/diagram.drawio

# 验证目录
python3 scripts/check_drawio_syntax.py ./diagrams

# 验证当前目录
python3 scripts/check_drawio_syntax.py .

验证内容:

  • XML 语法(标签闭合、引号、转义)
  • Draw.io 结构(mxfile、diagram、mxGraphModel)
  • 必要元素(root、基础 mxCell)
  • 支持压缩和非压缩格式

样式快速参考

形状样式

code
矩形:
rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;

圆角矩形:
rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;

菱形:
rhombus;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;

圆形:
ellipse;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;

微型锚点(A1/A2/BX1…,用于端口分流/走廊汇聚):
ellipse;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#6B7280;strokeWidth=1;aspect=fixed;

边界汇聚器 Bus/Router(放在边界走廊中心,承载跨区主干):
rounded=1;whiteSpace=wrap;html=1;fillColor=#F2F2F7;strokeColor=#8E8E93;strokeWidth=1;

TextBox(说明 / 数据库表结构 / 备注,推荐):
text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;whiteSpace=wrap;spacing=4;fontSize=11;fontFamily=Menlo;

连接线样式

code
正交线:
edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=classic;

虚线:
dashed=1;dashPattern=8 8;endArrow=classic;html=1;

说明线(弱化,不占主通道):
dashed=1;dashPattern=4 4;endArrow=none;strokeWidth=1;opacity=60;html=1;

带标签的主链路(增强可读性):
edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=classic;labelBackgroundColor=#ffffff;labelBorderColor=none;labelPadding=2;

Apple 风格配色方案

推荐配色(高对比度、清晰可读):

  • 蓝色系: fillColor=#007AFF;strokeColor=#0056B3 (主要元素)
  • 绿色系: fillColor=#34C759;strokeColor=#248A3D (成功状态)
  • 橙色系: fillColor=#FF9500;strokeColor=#C45500 (警告/注意)
  • 红色系: fillColor=#FF3B30;strokeColor=#D70015 (错误/关键)
  • 紫色系: fillColor=#AF52DE;strokeColor=#8944AB (特殊功能)
  • 灰色系: fillColor=#F2F2F7;strokeColor=#8E8E93 (背景/容器)

专业配色(柔和渐变):

  • 蓝色: fillColor=#dae8fc;strokeColor=#6c8ebf
  • 绿色: fillColor=#d5e8d4;strokeColor=#82b366
  • 黄色: fillColor=#fff2cc;strokeColor=#d6b656
  • 红色: fillColor=#f8cecc;strokeColor=#b85450
  • 紫色: fillColor=#e1d5e7;strokeColor=#9673a6
  • 橙色: fillColor=#ffe6cc;strokeColor=#d79b00

最佳实践

XML 生成

  1. 必须正确闭合所有标签
  2. 属性值用引号包围
  3. 字符转义<&lt;, >&gt;, &&amp;
  4. 唯一 ID:每个 mxCell 使用唯一 ID
  5. 有效引用:parent、source、target 必须指向存在的元素

布局技巧

  • 节点间距:100-150px(水平),80-120px(垂直)
  • 使用分组组织相关元素
  • 避免连接线交叉
  • 保持一致的样式
  • 组件文本:确保组件尺寸足够容纳文本内容

常见错误

避免:

  • ❌ 标签未闭合
  • ❌ 属性缺引号
  • ❌ 重复 ID
  • ❌ 无效引用
  • ❌ 缺少基础元素

正确:

  • ✅ 格式良好的 XML
  • ✅ 唯一 ID
  • ✅ 有效引用
  • ✅ 使用验证工具

当前限制

  • ❌ 不支持图片嵌入(base64)
  • ❌ 不支持自定义形状库
  • ❌ 不支持复杂数学公式
  • ✅ 支持“逻辑锚点 / Link Symbols”(用小型锚点节点表达跨层/跨泳道的远距离连接)
  • ❌ 不生成可点击的外部超链接、脚本或动画(如需要,可在 draw.io 编辑器中手动设置)

建议用户在 draw.io 编辑器中手动完成这些高级交互能力。

完整示例

xml
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" version="21.0.0">
  <diagram id="example" name="Example">
    <mxGraphModel dx="1434" dy="810" grid="1" gridSize="10">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <!-- 节点 -->
        <mxCell id="2" value="用户服务"
                style="rounded=1;fillColor=#dae8fc;strokeColor=#6c8ebf;"
                vertex="1" parent="1">
          <mxGeometry x="200" y="150" width="120" height="60" as="geometry"/>
        </mxCell>

        <mxCell id="3" value="数据库"
                style="shape=cylinder3;fillColor=#d5e8d4;strokeColor=#82b366;"
                vertex="1" parent="1">
          <mxGeometry x="200" y="300" width="120" height="80" as="geometry"/>
        </mxCell>

        <!-- 连接线 -->
        <mxCell id="4" value="查询"
                style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;"
                edge="1" parent="1" source="2" target="3">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>

总结

使用本技能时的关键点:

  1. 理解需求,明确图表类型
  2. 遵循 XML 规范,确保格式正确
  3. 生成后必须使用验证工具
  4. 保持简洁美观,注重可读性
  5. 根据验证结果修复错误

完整工作流程(推荐)

code
1. 分析需求 → 设计图表结构
2. 生成 XML → 保存 drawio 文件
3. 验证格式 → check_drawio_syntax.py
4. 如有问题 → 修改 drawio 文件
5. 重复步骤 3-4 → 直到满意

工作流程

  1. 理解需求: 明确图表类型、内容和特殊功能
  2. 规划布局: 描述视觉结构和定位策略(2-3 句话)
  3. 生成 XML: 创建遵循所有结构规则的格式良好的 XML
  4. 验证: 检查边缘路由、ID 唯一性和父引用
  5. 输出: 仅返回 <root> 标签内的 XML

验证检查清单

完成 XML 之前:

  • ✓ 所有 mxCell 元素都是 <root> 的直接子元素
  • ✓ 所有 ID 都是唯一且顺序的
  • ✓ 所有单元格(id="0" 除外)都有 parent 属性
  • ✓ 所有边缘 source/target 引用现有 ID
  • ✓ 特殊字符已正确转义
  • ✓ 不包含 XML 注释
  • ✓ 所有元素都在视口内(0-800, 0-600)
  • ✓ 边缘通过路径点绕过障碍物
  • ✓ 没有重复的边缘路径
  • 连接线不穿过其他组件
  • 连接线标签不覆盖组件
  • 组件尺寸足够显示完整文本
  • 连接线与组件边框保持间距

所有可执行的python shell文件都在scripts目录下

  • 请找到对应目录的python、shell脚本文件并执行。上述文章中都直接使用了python命令,并不一定能实际运行,请注意运行命令的目录和实际目标目录的改写。

核心原则

1. XML 结构规则(关键)

强制性结构:

xml
<root>
  <mxCell id="0"/>
  <mxCell id="1" parent="0"/>
  <!-- 所有其他单元格都作为兄弟元素放在这里 -->
</root>

关键规则:

  1. 所有 mxCell 元素必须是 <root> 的直接子元素 - 绝不要将 mxCell 嵌套在另一个 mxCell 内部
  2. 每个 mxCell 需要唯一的顺序 id(用户内容从 "2" 开始)
  3. 每个 mxCell(id="0" 除外)必须有有效的 parent 属性
  4. Edge 的 source/target 属性必须引用存在的单元格 ID
  5. 转义特殊字符: &lt; 表示 <, &gt; 表示 >, &amp; 表示 &, &quot; 表示 "
  6. 绝不要包含 XML 注释(<!-- -->)- 它们会破坏模式匹配
  7. 组件文本完整显示:根据文本长度动态计算组件尺寸,使用 whiteSpace=wrap 启用自动换行

1.1 组件文本显示规则(关键)

问题:组件中的文本内容展示不全

解决方案:

  1. 动态计算尺寸:根据文本字符数估算所需宽度和高度

    • 中文字符:每字符约 14px 宽度
    • 英文字符:每字符约 8px 宽度
    • 建议最小宽度:120px,最小高度:60px
  2. 启用文本换行

xml
style="whiteSpace=wrap;html=1;overflow=hidden;..."
  1. 字体大小调整:长文本使用较小字号
xml
style="fontSize=11;whiteSpace=wrap;html=1;..."
  1. 尺寸计算示例
xml
<!-- 短文本(<10字符):标准尺寸 -->
<mxCell value="用户" style="..." vertex="1" parent="1">
  <mxGeometry x="100" y="100" width="120" height="60" as="geometry"/>
</mxCell>

<!-- 中等文本(10-20字符):加宽 -->
<mxCell value="用户认证服务" style="fontSize=12;whiteSpace=wrap;html=1;..." vertex="1" parent="1">
  <mxGeometry x="100" y="100" width="140" height="60" as="geometry"/>
</mxCell>

<!-- 长文本(>20字符):加宽加高或换行 -->
<mxCell value="分布式消息队列处理服务" style="fontSize=11;whiteSpace=wrap;html=1;..." vertex="1" parent="1">
  <mxGeometry x="100" y="100" width="160" height="70" as="geometry"/>
</mxCell>

2. 布局策略(网格化 / 分层布局,避免交叉)

核心原则(强制)

  1. 单向数据流:默认采用 自上而下(Top-to-Bottom) 流向;除非用户明确要求,否则不做反向回流线。
  2. 网格化 / 分层布局:同一层水平对齐、间距固定;层与层之间预留足够“走线通道”。
  3. 远距离跨层连接:禁止一根线跨越多层“直穿过去”。必须使用:
    • 逻辑锚点(Link Symbols):在来源与目标附近放置成对锚点(如 A / A),跨层连接拆成“短线 + 锚点 + 短线”。
    • 拆分模块:将高耦合大模块拆成更近的子模块,缩短连线。

画布与网格(推荐默认值)

  • grid=1gridSize=10
  • 起始边距:x=40, y=40
  • 画布大小:根据列数/层数自适应(建议最小 pageWidth>=1600pageHeight>=1200),避免把复杂系统“挤在 800×600 里”。

组件尺寸与间距(强制)

  • 所有矩形组件:width=160pxheight=60px
  • 水平间距:>= 40px
  • 垂直间距:
    • 层与层之间>= 120px(强制,用于走线与留白)
    • 同层内部堆叠>= 80px

网格坐标规则(强制,禁止自由发挥)

  • 列宽步长:colStep = 160 + 40 = 200
  • 行高步长:rowStep = 60 + 80 = 140
  • 层高步长:layerStep = 60 + 120 = 180
  • 组件左上角坐标:
    • x = 40 + (col-1) * 200
    • y = 40 + (layer-1) * 180 + (row-1) * 140

泳道 / 容器分组(强制)

  • 对复杂系统必须使用泳道分组(例如:前端系统 / 后端服务 / 数据层 / 外部系统)。
  • 泳道内组件保持网格对齐,优先垂直排列;跨泳道连线不得横穿泳道内部组件区。

走线走廊与跨区边界(强制,解决“线缆瓶颈/横穿核心区/贴边穿越”)

  • 必须为每个泳道/容器预留“走线走廊”(Cable Corridor):至少 1 个空列外侧边缘通道,专用于承载主链路连线。
  • 必须为相邻泳道之间预留“跨泳道边界走廊”(Boundary Corridor):作为唯一允许的跨区穿越区域。
    • 硬性宽度下限boundaryWidth >= 160px(至少相当于 1 个 colStep),否则判定为“不可布线”,必须通过移动/缩放泳道来扩宽。
    • 并行跨区边数驱动的宽度(强制按需扩宽):当跨区并行边数为 N 时,必须满足:
      • boundaryWidth >= 40 + laneStep * (N - 1) + 40,其中 laneStep 推荐 18~24px(不得 < 16px)。
      • 解释:左右各 40px 缓冲 + 并行分轨所需宽度。
    • 任何跨泳道连线:必须先从源节点进入其所属走廊 → 沿走廊到边界走廊 → 在边界走廊内完成跨区 → 进入目标泳道走廊 → 再进入目标节点。
    • 禁止跨区连线直接穿过“组件密集区”;禁止在非边界走廊区域跨越泳道边界。
  • 必须为“图例(Legend)”和“说明 TextBox”预留 keep-out 区域:其外扩 30px 范围内禁止主链路经过,避免遮挡。

高连接度节点治理(强制)

  • 任意节点连接数 > 4 时:
    • 拆分为逻辑子节点(如“API Gateway”拆为“鉴权/路由/限流”等),或
    • 引入中间汇聚节点(Bus / Queue / Router)进行“多对一”收敛。

生成前布局规划(两阶段的第 1 阶段)

  1. 输出布局表(节点名/泳道/层/行/列/类型)
  2. 检查:是否存在跨越 2+ 层的直连?→ 改锚点或拆分
  3. 检查:同层是否存在潜在交叉?→ 调整列位或增加空列作为走线通道
  4. 预留走线空间:在模块之间保持空列/空行做“线缆走廊”

3. 边缘路由规则(防止重叠 / 穿越组件)

规则 0: 端口槽位分配(强制,解决“多线同点重叠”)

  • 同一节点同一侧的多条边,禁止复用同一个 exitX/exitYentryX/entryY
  • 默认槽位(优先用 4 槽;更多则必须“锚点化”):
    • 垂直流(上→下)
      • 出口(底边):exitY=1exitX ∈ {0.2, 0.4, 0.6, 0.8}
      • 入口(顶边):entryY=0entryX ∈ {0.2, 0.4, 0.6, 0.8}
    • 横向连线(左→右)
      • 出口(右边):exitX=1exitY ∈ {0.2, 0.4, 0.6, 0.8}
      • 入口(左边):entryX=0entryY ∈ {0.2, 0.4, 0.6, 0.8}
  • 若同一侧连线数量 > 4不得继续塞槽位,必须采用“锚点化”(见规则 0.1)。

规则 0.1: 锚点化(强制,解决“高连接度蜘蛛网”)

  • 在组件边缘外侧放置多个 微型锚点节点(直径 10~14px 的小圆点/小方点),每条线连接到独立锚点,组件只连接到这些锚点。
  • 锚点命名示例:A1/A2/A3(同一逻辑锚点可用序号区分),避免所有线“挤在一个 A 上”。
  • 锚点与组件之间保持 2030px 间距,锚点之间保持 1216px 间距。

规则 1: 并行边缘使用唯一路径(强制)

  • 同一对节点之间存在多条边时:
    • 先分配不同槽位(见规则 0)
    • 仍可能重叠时,必须为每条边提供不同的路径点(见规则 4)

规则 2: 双向连接使用相反侧(强制)

  • A→B: 从右侧出 (exitX=1),从左侧入 (entryX=0)
  • B→A: 从左侧出 (exitX=0),从右侧入 (entryX=1)

规则 3: 每条边必须显式声明连接点 + 周边约束(强制)

  • 每条边都必须包含:edgeStyle=orthogonalEdgeStyle + exitX/exitY + entryX/entryY + exitPerimeter=1;entryPerimeter=1
  • 示例:
xml
style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;rounded=0;html=1;exitPerimeter=1;entryPerimeter=1;exitX=0.4;exitY=1;entryX=0.6;entryY=0;endArrow=classic;"

规则 4: 使用路径点绕过障碍物(关键,必须显式走廊路由)

  • 禁止依赖 draw.io 默认正交路由来“碰运气绕开障碍物”。满足任一条件就必须提供 points
    1. 跨泳道/跨容器;2) 经过组件密集区;3) 与其他边可能并行;4) 同侧出入口线数较多;5) 线标签较长。
  • 走线走廊(强制):所有主链路必须沿预留走廊行走,不得穿越非源/目标的组件区。
    • 典型(Top-to-Bottom)路由模板:
      • 源(底部槽位出) → 走到本泳道走廊X → 沿走廊Y方向前进 → 走到目标泳道走廊X → 进入目标(顶部槽位入)
  • 跨区边界走廊(强制):跨泳道连线只允许在边界走廊内完成跨越;边界走廊应保持“空白”,不得放置普通组件。

规则 4.1: 走廊分轨(强制,解决“并行线重叠/贴边叠线/像一根粗线”)

  • 每条进入走廊的边必须分配一个 laneIndex(从 0 开始)。
  • 走廊内并行轨道间距:laneStep >= 16px(建议 18~24px)。
  • 强制离散 X/Y 轨道
    • 走廊竖直段:使用不同 x = corridorX + laneIndex * laneStep
    • 走廊水平段:使用不同 y = corridorY + laneIndex * laneStep
  • 强制 points 显式化:只要边进入走廊(尤其是跨泳道边),必须在 mxGeometry 中提供 points;不得使用 <mxGeometry relative="1" as="geometry"/> 让 draw.io 自动猜路由。
  • 同一走廊同一方向的两条边,禁止使用完全相同的 points 序列。

规则 4.2: 走廊内汇聚(强制,解决“边界处过载”)

  • 当同一边界走廊内跨区边数 > 6:必须引入“边界汇聚器(Bus/Router)”。

    • 做法:在边界走廊中心放置 1 个窄长的 Bus(例如宽 10~14px,高覆盖该区域的主要层),所有跨区边先接入 Bus,再由 Bus 出去;或使用一组锚点 BX1..BXn 在走廊内分流。
    • 目的:将 N 条跨区长连线转换为“短支线 + 走廊主干”,避免在边界处互相穿插。
  • 间隙要求:所有路径点与任何非 source/target 组件边界保持 >= 30px(优先 40px);与容器边界保持 >= 20px,禁止贴边跑。

xml
<mxCell id="edge1" style="edgeStyle=orthogonalEdgeStyle;..." edge="1" parent="1" source="a" target="b">
  <mxGeometry relative="1" as="geometry">
    <Array as="points">
      <mxPoint x="300" y="150"/>
      <mxPoint x="300" y="250"/>
    </Array>
  </mxGeometry>
</mxCell>

规则 5: 基于流向的自然连接点

  • 从上到下流向: 从底部出 (exitY=1),从顶部入 (entryY=0)
  • 从左到右流向: 从右侧出 (exitX=1),从左侧入 (entryX=0)
  • 绝不使用角点连接(例如 entryX=1,entryY=1)

规则 6: 连接线不与组件边框重合(关键)

  • 边缘线绝不能沿组件边框运行
  • 与组件边缘保持最少 20px 的缓冲距离
  • 连接线应明显与非连接的组件分离

规则 7: 连接线标签位置优化(关键,解决“标签拥挤/遮挡/压在线缆瓶颈位”)

  • 连接线上的文字标签禁止覆盖任何组件/容器边框/其他标签。
  • 标签优先放在:
    1. 走廊的“空白侧边”而不是走廊中心;
    2. 远离跨区边界走廊的最窄瓶颈处;
    3. 线段较长且无遮挡的区域。
  • 强制为有标签的边启用可读性样式:labelBackgroundColor=#ffffff;labelBorderColor=none;labelPadding=2;(必要时加 opacity=100)。
  • 必须为标签提供 mxGeometryoffset(至少在 x 或 y 方向偏移 12~24px),避免与并行线/边界挤在一起。
xml
<!-- 标签位置示例 -->
<mxCell id="edge1" value="标签文字"
        style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;labelBackgroundColor=#ffffff;"
        edge="1" parent="1" source="a" target="b">
  <mxGeometry relative="1" as="geometry">
    <!-- x 控制标签在连接线上的位置 (0-1),y 控制偏移 -->
    <mxPoint x="0.5" y="-20" as="offset"/>
  </mxGeometry>
</mxCell>

生成前检查清单:

  1. 是否有边缘穿过非源/目标形状?→ 添加路径点,并改为“走线走廊”路由
  2. 是否有两条边缘共享相同路径?→ 调整出入口点 + 分配不同 laneIndex(并体现在 points 上)
  3. 连接点是否在角上?→ 改用边缘中心
  4. 能否重新排列形状以减少交叉?→ 修订布局/增加空列
  5. 连接线标签是否覆盖组件或挤在边界瓶颈处?→ 标签外移 + offset 偏移
  6. 连接线是否与组件边框重合/贴边跑?→ 增加走廊缓冲距离
  7. 同一节点同一侧是否复用了同一个槽位(exit/entry)?→ 重新分配槽位(0.2/0.4/0.6/0.8)
  8. 同一节点同一侧连线是否 > 4?→ 增加多个微型锚点(A1/A2/A3…),每条线连接不同锚点
  9. 相邻泳道之间的边界走廊宽度是否 >= 160px?若跨区并行边数为 N,是否满足 boundaryWidth >= 40 + laneStep*(N-1) + 40?不满足则必须移动泳道扩宽
  10. 是否存在跨泳道边没有显式 points(即 <mxGeometry relative="1" as="geometry"/>)?→ 一律补 points,禁止默认路由

高质量提示词模板(直接复制)

请生成 draw.io 文件,要求:

  1. 使用自上而下(Top-to-Bottom)的分层布局(单向数据流)
  2. 请先输出节点布局表(节点名 / 泳道 / 层 / 行 / 列 / 类型),再基于该布局生成 draw.io XML
  3. 所有矩形组件大小统一(160x60),所有节点按网格对齐
  4. 同层组件水平对齐、间距固定;层与层之间保持至少 120px 垂直距离
  5. 组件间距:水平 ≥ 40px;同层内部垂直 ≥ 80px
  6. 图例(Legend)必须放在左上方(建议 x=40,y=40),独立于泳道/容器,不参与自动布局,且不遮挡任何连线
  7. 数据库表相关内容(表名/字段/索引/说明)用 TextBox 展示(不要用 table 形状),建议等宽字体、左对齐、可换行
  8. 所有连线使用正交连线:edgeStyle=orthogonalEdgeStyle,禁止斜线,优先水平后垂直
  9. 连接点策略(必须分配槽位,避免多线重叠/穿越):
    • 垂直流(上→下):
      • 上一层节点从底部输出:exitY=1,并按槽位使用 exitX ∈ {0.2,0.4,0.6,0.8}
      • 下一层节点从顶部输入:entryY=0,并按槽位使用 entryX ∈ {0.2,0.4,0.6,0.8}
    • 横向连线(左→右):
      • 左侧节点从右侧输出:exitX=1,并按槽位使用 exitY ∈ {0.2,0.4,0.6,0.8}
      • 右侧节点从左侧输入:entryX=0,并按槽位使用 entryY ∈ {0.2,0.4,0.6,0.8}
    • 同一节点同一侧连线数量 > 4:必须在该侧创建多个微型锚点节点(A1/A2/A3…),每条线连接不同锚点
  10. 线条之间必须留出空隙:
  • 并行线在同一走线走廊内时,必须分配不同 laneIndex 并体现在 points 上(yx 相差 ≥ 16px,建议 18~24px),禁止线条贴边/重叠/复用同一路径
  1. 跨泳道/跨容器连线必须走“边界走廊”,不得横穿组件密集区;边界走廊宽度硬性下限 >= 160px,并随跨区并行边数 N 按 boundaryWidth >= 40 + laneStep*(N-1) + 40 扩宽(laneStep 建议 18~24px)
  2. 所有跨泳道边必须显式指定 points,并在边界走廊内按 laneIndex 分轨(同一方向不得复用同一条 points 序列)
  3. 使用泳道/容器分组系统模块(例如:前端系统 / 后端服务 / 数据层 / 外部系统),并为每个泳道预留至少 1 个空列作为走线走廊
  4. 避免任何连线交叉或穿越节点;若必须跨层超远距离连接,使用“逻辑锚点(A/A)”拆分连线或拆分模块
  5. 有特殊说明(边界条件/配置项/注意事项/表字段解释)请用 TextBox 补充,并用虚线或细线连接到被说明的组件:说明线应走外侧、尽量短、避免占用主走廊(TextBox 不要压住主链路)
  6. 若单节点连线 > 4,请拆分为逻辑子节点或通过 Queue/Bus/Router 等中间节点收敛;若跨区边数过多,优先在边界走廊设置 1 个汇聚节点再分发

生成后可配合 draw.io 编辑器自动优化:

  • Arrange → Layout → Hierarchical
  • Arrange → Align → Center
  • Arrange → Distribute → Horizontally

参考文件

drawio 文件语法、包括生成 drawio 的约束要求和优化建议等,都在references目录下,请合理参考里面的文件内容

有关详细的 XML 架构信息,请参阅 references/xml_guide.md

有关示例图表和模板,请参阅 references/diagram-examples.md

示例

有关以下内容的完整示例,请参阅 references/diagram-examples.md 中的示例:

  • 带决策菱形的流程图
  • 带 VPC 和子网的 AWS 架构
  • 带动画连接器的 Transformer 架构
  • 泳道流程图
  • 思维导图和组织结构图