Thesis Diagram Rules
毕业论文配图统一规则与画法。所有为论文输出的架构图、流程图、模块协同图、实体关系图、权限分级图、部署图,全部按本文件执行;任何与本文件冲突的"AI 默认审美"一律放弃。
触发条件:用户提到"画图 / 重画 / 出图 / 架构图 / 流程图 / RAG 图 / Dify 图 / 部署图 / 模块图 / ER 图"或要求"更新论文配图、生成图片包、对照规则检查图片"。
1. 配色规范(强制)
| 角色 |
取色 |
说明 |
| 边线 |
#2563eb |
所有文本框边框、所有连线、所有箭头一致使用 |
| 强填充 |
#dbeafe |
中心节点 / 主链路关键节点 |
| 弱填充 |
#eaf2ff |
普通业务节点 / 模块节点 |
| 白底 |
#ffffff |
外部能力 / 数据出口 / 终态节点 |
| 文字 |
#0f172a |
所有文本框正文 |
| 辅助说明文字 |
#334155 |
极少量贴在线段旁的标注 |
| 外框 |
#dbeafe |
整张图最外层圆角描边 |
绝对禁止:彩色混搭、淡灰、半透明、渐变、阴影、外发光、立体效果。
2. 文字规范(强制)
- 横纵双向居中:所有文本框内文字必须横向居中且纵向居中。多行时按行高 +
line_spacing = 10px 整体居中。
- 字号下限:默认
40px bold;面板小框最低 34px bold。绝不出现 30px 以下文字。
- 字体:微软雅黑(
msyh.ttc / msyhbd.ttc),加载失败回落 ImageFont.load_default()。
- 多行表达:用
\n 显式换行,不依赖自动 wrap。手动换行的目的是让每行长度相近,看起来对齐。
- 图内绝不写标题:题注由正文
**图 X-X xxx** 行承担,图内不重复任何标题文字。
3. 线段与箭头规范(强制)
这一条是历次反馈中最常翻车的,必须逐项核对。
- 起止点必须落在文本框边的中点:
- 顶边中点 =
(x_center, y_top)
- 底边中点 =
(x_center, y_bottom)
- 左边中点 =
(x_left, y_center)
- 右边中点 =
(x_right, y_center)
- 不允许从角点、从靠边偏移位置、从框内部出线。
- 能用直线绝不用折线:
- 两个框上下对齐(x_center 相等)→ 走垂直直线。
- 两个框左右对齐(y_center 相等)→ 走水平直线。
- 起止点不在同一行/同一列时,优先调整框位(移动其中一个框,让它对齐),调完仍不对齐再考虑折线。
- 所有线段一律正交:只能水平或垂直,绝不允许任何斜线。1 对 1 连线用 1 个 L 形直角;扇入 / 扇出(1 对多 / 多对 1)允许用 Z 形(2 次直角)汇聚到一个"水平 / 垂直母线"上,再统一进/出共同端点;母线必须穿过空白区域,不得叠在文本框上。
- 线段绝不与文本框重叠:
- 折线水平/垂直段在选择位置时,必须确保经过路径不穿过任何文本框矩形。
- 若不可避免,重新规划框位,宁可改布局也不要压字。
- 线宽:统一
width = 5,颜色 #2563eb。
- 箭头:实心三角,size = 18,方向由最后一段决定(不要画在中间)。
检查列表(每画完一张图必跑一遍)
4. 文本框布局规范(强制)
- 同层级横向对齐:同一层次(同一行角色)的文本框必须
top 一致或 bottom 一致,宽高一致。例如"学生端 / 教师端 / 管理员端"三个框,三者 y1, y2 必须相等。
- 纵向位置可灵活:不同层级之间纵向间距可按内容紧凑度调整,没有强制等距要求。
- 统一圆角:所有文本框
radius = 18,统一边线 width = 4。
- 尺寸建议:
- 中心顶层节点:高 ≥ 140px。
- 业务模块节点:宽 ≥ 380px。
- 多行节点:高度按
line_count * 60 估算,保证文字四周留白。
5. 画布规范(强制)
- 画布大小:单图宽 ≤ 2100px,长边按内容比例适配,常用
(1800,1080) / (2100,1180) / (1800,980)。
- 外框:在画布四周留 24px 边距,画圆角外框
radius=24, outline=#dbeafe, width=4,不写任何标题文字。
- 背景:纯白
#ffffff。
- 导出:PNG,无压缩损失。
6. 函数实现约定
本项目已有可直接复用的工具函数集合(位于 docs/build_thesis_final.py):
| 函数 |
用途 |
new_canvas(title, size) |
建画布 + 外框(title 仅作日志用途,不画进图) |
draw_box(draw, box, text, fill=...) |
圆角文本框 + 居中文字 |
draw_centered_text(draw, box, text, font) |
在任意矩形区域内做横纵居中绘字 |
draw_arrow(draw, start, end) |
单段直线箭头 |
draw_polyline_arrow(draw, points) |
多段折线箭头,最后一段决定箭头方向 |
save_diagram(img, path) |
保存 PNG |
DIAGRAM_COLORS 字典已定义全部配色,新写图统一引用它。
新增图不要复制粘贴自己写的画图函数:先 import 上面的工具函数(或在临时脚本中直接复用同样定义),保证多张图风格一致。
7. 中点连接的代码套路(务必背下来)
def midpoint(box, side):
x1, y1, x2, y2 = box
cx, cy = (x1 + x2) / 2, (y1 + y2) / 2
return {
"top": (cx, y1),
"bottom": (cx, y2),
"left": (x1, cy),
"right": (x2, cy),
}[side]
# 两个框上下相对:直线
start = midpoint(box_a, "bottom")
end = midpoint(box_b, "top")
draw_arrow(draw, start, end)
# 两个框水平相对:直线
start = midpoint(box_a, "right")
end = midpoint(box_b, "left")
draw_arrow(draw, start, end)
# 不得已折线:从 A 底边中点出 → 走垂直 → L 拐到 B 顶边中点
sx, sy = midpoint(box_a, "bottom")
ex, ey = midpoint(box_b, "top")
mid_y = (sy + ey) / 2 # 选择不会压到任何框的位置
draw_polyline_arrow(draw, [(sx, sy), (sx, mid_y), (ex, mid_y), (ex, ey)])
# 扇入:3 个源 → 1 个目标(target_top 中点)。每条都是 Z 形 + 母线在 bus_y。
# 最后一段必须垂直,确保进入目标的方向正交。
tx, ty = midpoint(target, "top")
bus_y = (max(s.bottom for s in sources) + ty) / 2
for src in sources:
sx, sy = midpoint(src, "bottom")
draw_polyline_arrow(draw, [(sx, sy), (sx, bus_y), (tx, bus_y), (tx, ty)])
实现新图时优先按"中点 + 直线"先把所有线列出来,发现需要折线就反过来调框位,让它们能直线连通。
8. 图的语义层次约定
为了让全篇配图风格一致,按角色分配颜色:
| 角色 |
取色 |
| 系统顶层 / 入口 / 中心节点 |
fill_strong (#dbeafe) |
| 业务模块 / 中间链路 / 数据层 |
fill (#eaf2ff) |
| 外部能力 / 部署形态 / 数据出口 / 终态 |
fill_white (#ffffff) |
辅助说明文字(如"反馈教师治理")允许极少量贴在线段旁,颜色固定 #334155,字号比框内文字小一档。
9. 题注与正文配合规则
- 题注放图下方,独立成段,格式:
**图 X-Y 标题文字**,居中。
- 图与图之间空一行,下一段为正文引用。
- 正文必须显式引用图号:例如"图 3-2 给出了……"或"如图 4-3 所示",不允许只插图不引用。
- 图号与正文章节配套:第二章配图为图 2-X,第三章为图 3-X,第四章为图 4-X,以此类推。
- 同一图号在全文中只能出现一次。
10. 输出物组织
每次"画图任务"产出一组文件,命名套路:
| 类型 |
命名 |
| 临时脚本 |
docs/_tmp_build_*.py(跑完即删) |
| 图片 docx 包 |
docs/论文修改内容包_*_YYYYMMDD_vN.docx 或 docs/论文图片更新包_*_YYYYMMDD_vN.docx |
| 修改说明 |
docs/修改说明_YYYYMMDD_vN.md |
绝不直接覆盖 docs/饶纯含--毕业论文_*.docx 原稿,所有图、文字修改一律新发一份。
11. 自检流程(每张图收尾前必做)
- 把图缩放到 30% 看整体:文字是否居中、颜色是否实蓝白、是否有压字。
- 放大到 200% 看每条线:起止点是否落在边中点、是否存在斜线、是否存在多余折线。
- 把所有同层级框的
top 抠出来比对:是否完全相等。
- 把图丢进 docx 看缩放后效果,文字是否仍清晰可读。
只有 11 步全部通过,图才允许进入交付包。
12. 反例(绝对禁止)
- 内嵌标题如"图 3.1 系统总体架构与模块划分"画在画布上。
- 用渐变蓝、深蓝、浅灰、紫色等花哨配色。
- 文字左对齐 / 偏上 / 偏下,没居中。
- 连线起点是文本框的"右上角"、"右下角"或框内部。
- 明明两框对齐却画成 Z 字折线。
- 折线穿过文本框、压住框内文字。
- 学生端、教师端、管理员端三框
top 各不相同(视觉上参差)。
- 给图加阴影、外发光、立体效果。
13. 历次约定汇总(来源记录)
| 反馈来源 |
约定 |
| 2026-05-13 v5 反馈 |
非系统截图类图不要内嵌标题,文字大且清晰,配色实蓝白 |
| 2026-05-13 v6 反馈 |
3.3 业务实体图必须重做、补五大模块协同关系图、补课程与权限分级图 |
| 2026-05-14 v2 反馈 |
文本框内文字横纵居中 |
| 2026-05-14 v3 反馈 |
起止点落在文本框边中点;能直线绝不折线;文本绝不与线段重叠;横向对齐,纵向可不对齐 |
| 2026-05-14 v4 反馈 |
RAG 图右移提示词拼接成直线;教学业务主链路底部三框横向对齐;管理员端第三-四行直线连接 |
| 2026-05-14 v5 当前 |
第四章每个二级标题各配一张架构图,按本规则统一画 |
新一轮如果有补充约定,追加到本表,再同步更新对应章节正文。
1---2name: thesis-diagram-rules3description: Generate architecture, workflow, ER, and module diagrams for the graduation thesis "单一课程场景下智能教学 Agent 的模块化设计与实践" using a unified, advisor-approved visual style. Use this skill whenever the user asks to "画一张图", "重新出图", "画架构图", "更新图片", "改图", "redraw figure", or otherwise requests any figure that will end up in the thesis or its revision packages (`docs/论文修改内容包_*.docx`, `docs/论文图片更新包_*.docx`, `docs/饶纯含--毕业论文_*.docx`). The skill encodes every figure rule the advisor and the student have signed off on so the agent does not have to re-discover them.4---56# Thesis Diagram Rules78毕业论文配图统一规则与画法。所有为论文输出的架构图、流程图、模块协同图、实体关系图、权限分级图、部署图,全部按本文件执行;任何与本文件冲突的"AI 默认审美"一律放弃。910> **触发条件**:用户提到"画图 / 重画 / 出图 / 架构图 / 流程图 / RAG 图 / Dify 图 / 部署图 / 模块图 / ER 图"或要求"更新论文配图、生成图片包、对照规则检查图片"。1112---1314## 1. 配色规范(强制)1516| 角色 | 取色 | 说明 |17| --- | --- | --- |18| 边线 | `#2563eb` | 所有文本框边框、所有连线、所有箭头一致使用 |19| 强填充 | `#dbeafe` | 中心节点 / 主链路关键节点 |20| 弱填充 | `#eaf2ff` | 普通业务节点 / 模块节点 |21| 白底 | `#ffffff` | 外部能力 / 数据出口 / 终态节点 |22| 文字 | `#0f172a` | 所有文本框正文 |23| 辅助说明文字 | `#334155` | 极少量贴在线段旁的标注 |24| 外框 | `#dbeafe` | 整张图最外层圆角描边 |2526绝对禁止:彩色混搭、淡灰、半透明、渐变、阴影、外发光、立体效果。2728---2930## 2. 文字规范(强制)31321. **横纵双向居中**:所有文本框内文字必须横向居中且纵向居中。多行时按行高 + `line_spacing = 10px` 整体居中。332. **字号下限**:默认 `40px bold`;面板小框最低 `34px bold`。绝不出现 30px 以下文字。343. **字体**:微软雅黑(`msyh.ttc` / `msyhbd.ttc`),加载失败回落 `ImageFont.load_default()`。354. **多行表达**:用 `\n` 显式换行,不依赖自动 wrap。手动换行的目的是让每行长度相近,看起来对齐。365. **图内绝不写标题**:题注由正文 `**图 X-X xxx**` 行承担,图内不重复任何标题文字。3738---3940## 3. 线段与箭头规范(强制)4142这一条是历次反馈中最常翻车的,必须逐项核对。43441. **起止点必须落在文本框边的中点**:45 - 顶边中点 = `(x_center, y_top)`46 - 底边中点 = `(x_center, y_bottom)`47 - 左边中点 = `(x_left, y_center)`48 - 右边中点 = `(x_right, y_center)`49 - 不允许从角点、从靠边偏移位置、从框内部出线。502. **能用直线绝不用折线**:51 - 两个框上下对齐(x_center 相等)→ 走垂直直线。52 - 两个框左右对齐(y_center 相等)→ 走水平直线。53 - 起止点不在同一行/同一列时,**优先调整框位**(移动其中一个框,让它对齐),调完仍不对齐再考虑折线。543. **所有线段一律正交**:只能水平或垂直,**绝不允许任何斜线**。1 对 1 连线用 1 个 L 形直角;扇入 / 扇出(1 对多 / 多对 1)允许用 Z 形(2 次直角)汇聚到一个"水平 / 垂直母线"上,再统一进/出共同端点;母线必须穿过空白区域,不得叠在文本框上。554. **线段绝不与文本框重叠**:56 - 折线水平/垂直段在选择位置时,必须确保经过路径不穿过任何文本框矩形。57 - 若不可避免,重新规划框位,宁可改布局也不要压字。585. **线宽**:统一 `width = 5`,颜色 `#2563eb`。596. **箭头**:实心三角,size = 18,方向由最后一段决定(不要画在中间)。6061### 检查列表(每画完一张图必跑一遍)6263- [ ] 每条线两端点是否分别等于某个框的边中点?64- [ ] 是否存在本可直线却用了折线的情况?65- [ ] 是否存在折线穿过文本框?66- [ ] 是否存在斜线?67- [ ] 是否存在 2 次以上转折?68- [ ] 同层级文本框横向是否对齐?6970---7172## 4. 文本框布局规范(强制)73741. **同层级横向对齐**:同一层次(同一行角色)的文本框必须 `top` 一致或 `bottom` 一致,宽高一致。例如"学生端 / 教师端 / 管理员端"三个框,三者 `y1, y2` 必须相等。752. **纵向位置可灵活**:不同层级之间纵向间距可按内容紧凑度调整,没有强制等距要求。763. **统一圆角**:所有文本框 `radius = 18`,统一边线 `width = 4`。774. **尺寸建议**:78 - 中心顶层节点:高 ≥ 140px。79 - 业务模块节点:宽 ≥ 380px。80 - 多行节点:高度按 `line_count * 60` 估算,保证文字四周留白。8182---8384## 5. 画布规范(强制)85861. **画布大小**:单图宽 ≤ 2100px,长边按内容比例适配,常用 `(1800,1080) / (2100,1180) / (1800,980)`。872. **外框**:在画布四周留 24px 边距,画圆角外框 `radius=24, outline=#dbeafe, width=4`,不写任何标题文字。883. **背景**:纯白 `#ffffff`。894. **导出**:PNG,无压缩损失。9091---9293## 6. 函数实现约定9495本项目已有可直接复用的工具函数集合(位于 `docs/build_thesis_final.py`):9697| 函数 | 用途 |98| --- | --- |99| `new_canvas(title, size)` | 建画布 + 外框(title 仅作日志用途,不画进图) |100| `draw_box(draw, box, text, fill=...)` | 圆角文本框 + 居中文字 |101| `draw_centered_text(draw, box, text, font)` | 在任意矩形区域内做横纵居中绘字 |102| `draw_arrow(draw, start, end)` | 单段直线箭头 |103| `draw_polyline_arrow(draw, points)` | 多段折线箭头,最后一段决定箭头方向 |104| `save_diagram(img, path)` | 保存 PNG |105106`DIAGRAM_COLORS` 字典已定义全部配色,新写图统一引用它。107108> **新增图不要复制粘贴自己写的画图函数**:先 `import` 上面的工具函数(或在临时脚本中直接复用同样定义),保证多张图风格一致。109110---111112## 7. 中点连接的代码套路(务必背下来)113114```python115def midpoint(box, side):116 x1, y1, x2, y2 = box117 cx, cy = (x1 + x2) / 2, (y1 + y2) / 2118 return {119 "top": (cx, y1),120 "bottom": (cx, y2),121 "left": (x1, cy),122 "right": (x2, cy),123 }[side]124125# 两个框上下相对:直线126start = midpoint(box_a, "bottom")127end = midpoint(box_b, "top")128draw_arrow(draw, start, end)129130# 两个框水平相对:直线131start = midpoint(box_a, "right")132end = midpoint(box_b, "left")133draw_arrow(draw, start, end)134135# 不得已折线:从 A 底边中点出 → 走垂直 → L 拐到 B 顶边中点136sx, sy = midpoint(box_a, "bottom")137ex, ey = midpoint(box_b, "top")138mid_y = (sy + ey) / 2 # 选择不会压到任何框的位置139draw_polyline_arrow(draw, [(sx, sy), (sx, mid_y), (ex, mid_y), (ex, ey)])140141# 扇入:3 个源 → 1 个目标(target_top 中点)。每条都是 Z 形 + 母线在 bus_y。142# 最后一段必须垂直,确保进入目标的方向正交。143tx, ty = midpoint(target, "top")144bus_y = (max(s.bottom for s in sources) + ty) / 2145for src in sources:146 sx, sy = midpoint(src, "bottom")147 draw_polyline_arrow(draw, [(sx, sy), (sx, bus_y), (tx, bus_y), (tx, ty)])148```149150实现新图时优先按"中点 + 直线"先把所有线列出来,发现需要折线就**反过来调框位**,让它们能直线连通。151152---153154## 8. 图的语义层次约定155156为了让全篇配图风格一致,按角色分配颜色:157158| 角色 | 取色 |159| --- | --- |160| 系统顶层 / 入口 / 中心节点 | `fill_strong` (#dbeafe) |161| 业务模块 / 中间链路 / 数据层 | `fill` (#eaf2ff) |162| 外部能力 / 部署形态 / 数据出口 / 终态 | `fill_white` (#ffffff) |163164辅助说明文字(如"反馈教师治理")允许极少量贴在线段旁,颜色固定 `#334155`,字号比框内文字小一档。165166---167168## 9. 题注与正文配合规则1691701. 题注放图下方,独立成段,格式:`**图 X-Y 标题文字**`,居中。1712. 图与图之间空一行,下一段为正文引用。1723. 正文必须显式引用图号:例如"图 3-2 给出了……"或"如图 4-3 所示",不允许只插图不引用。1734. 图号与正文章节配套:第二章配图为图 2-X,第三章为图 3-X,第四章为图 4-X,以此类推。1745. 同一图号在全文中只能出现一次。175176---177178## 10. 输出物组织179180每次"画图任务"产出一组文件,命名套路:181182| 类型 | 命名 |183| --- | --- |184| 临时脚本 | `docs/_tmp_build_*.py`(跑完即删) |185| 图片 docx 包 | `docs/论文修改内容包_*_YYYYMMDD_vN.docx` 或 `docs/论文图片更新包_*_YYYYMMDD_vN.docx` |186| 修改说明 | `docs/修改说明_YYYYMMDD_vN.md` |187188**绝不直接覆盖** `docs/饶纯含--毕业论文_*.docx` 原稿,所有图、文字修改一律新发一份。189190---191192## 11. 自检流程(每张图收尾前必做)1931941. 把图缩放到 30% 看整体:文字是否居中、颜色是否实蓝白、是否有压字。1952. 放大到 200% 看每条线:起止点是否落在边中点、是否存在斜线、是否存在多余折线。1963. 把所有同层级框的 `top` 抠出来比对:是否完全相等。1974. 把图丢进 docx 看缩放后效果,文字是否仍清晰可读。198199只有 11 步全部通过,图才允许进入交付包。200201---202203## 12. 反例(绝对禁止)204205- 内嵌标题如"图 3.1 系统总体架构与模块划分"画在画布上。206- 用渐变蓝、深蓝、浅灰、紫色等花哨配色。207- 文字左对齐 / 偏上 / 偏下,没居中。208- 连线起点是文本框的"右上角"、"右下角"或框内部。209- 明明两框对齐却画成 Z 字折线。210- 折线穿过文本框、压住框内文字。211- 学生端、教师端、管理员端三框 `top` 各不相同(视觉上参差)。212- 给图加阴影、外发光、立体效果。213214---215216## 13. 历次约定汇总(来源记录)217218| 反馈来源 | 约定 |219| --- | --- |220| 2026-05-13 v5 反馈 | 非系统截图类图不要内嵌标题,文字大且清晰,配色实蓝白 |221| 2026-05-13 v6 反馈 | 3.3 业务实体图必须重做、补五大模块协同关系图、补课程与权限分级图 |222| 2026-05-14 v2 反馈 | 文本框内文字横纵居中 |223| 2026-05-14 v3 反馈 | 起止点落在文本框边中点;能直线绝不折线;文本绝不与线段重叠;横向对齐,纵向可不对齐 |224| 2026-05-14 v4 反馈 | RAG 图右移提示词拼接成直线;教学业务主链路底部三框横向对齐;管理员端第三-四行直线连接 |225| 2026-05-14 v5 当前 | 第四章每个二级标题各配一张架构图,按本规则统一画 |226227新一轮如果有补充约定,追加到本表,再同步更新对应章节正文。