科研绘图中最耗时的工作往往不是“画”本身,而是把实验流程、技术路线、系统架构变成一张结构清晰、样式统一的 Visio 图。手动拖拽形状、逐条连接线、反复对齐标签,很容易消耗掉攒论文和做汇报的耐心。Codex 这类代码生成工具出现后,很多操作其实可以交给脚本完成:你负责用自然语言描述节点和关系,Codex 负责生成绘制脚本,Visio 负责在 Windows 端把脚本变成图。
这篇文章要解决的是一个可落地的闭环:从一段科研绘图需求出发,让 Codex 生成 VBA 宏或 Python 脚本,再由这些脚本自动驱动 Visio 绘制技术路线图。整个过程不是简单的“复制一段代码跑一下”,而是会解释为什么这样设计、如何验证结果、遇到常见报错该从哪一层排查。
读者可以是科研人员、技术文档作者、研发工程师,也可以是想省去重复拖拽操作的 Visio 重度用户。前置条件只需要:一台 Windows 电脑、已安装的 Visio、能联网的 Codex 环境。如果你还想用 Python 做批量绘图,再额外安装一个 Python 运行环境即可。
1. 先理解 Codex 自动画 Visio 的技术链路
1.1 Codex 在绘图任务里的实际角色
Codex 本身不具备绘图能力,它甚至不认识“.vsdx”文件里的图形对象。它的真正价值在于“代码翻译”:把人的自然语言需求,翻译成可以控制 Visio 的脚本代码。
控制 Visio 的脚本可以写很多种,常见的有 VBA 宏、Python + pywin32、C# COM 调用等。Codex 能理解“在这边画一个矩形,那边连一条线,把文字填进去”这种描述,并生成对应脚本。脚本运行后,Visio 才会真正创建页面、形状、连接线和文字。
所以完整链路是:
text复制需求描述 -> Codex 生成脚本 -> 脚本执行 -> Visio 渲染出图
这个链路里最重要的不是“Codex 一下子生成完美代码”,而是需求描述是否足够结构化。一个能生成高质量绘图脚本的需求,至少需要包含:画在哪个页面、绘制哪些形状、形状的坐标和大小、形状之间的连接关系、文字内容、样式要求。只要这些信息清楚,Codex 产出的脚本就大概率能跑通。
1.2 四条技术路径的取舍
在我实际尝试“自动画 Visio”时,有四条路线可以走。它们的原理、局限性和适用场景差异很大,选错路径会浪费很多时间。
| 路径 | 实现原理 | 主要优点 | 主要局限 | 适用场景 |
|---|---|---|---|---|
| VBA 宏 | 在 Visio 内部写代码宏 | 打开 Visio 就能运行,适合交互式操作 | 只能在 Visio 里编辑,批量处理不够灵活 | 单张图、临时改图、交互式需求 |
| Python + pywin32 | 通过 Windows COM 接口外部驱动 Visio | 可以批量生产,方便做循环和参数化,脚本可被 Git 管理 | 依赖 Windows,必须安装 Visio 和 pywin32 | 批量生成多张图、结合数据源绘图 |
| Python 的 vsdx 库 | 直接读写 .vsdx 文件 | 不需要启动 Visio 进程,适合修改已有文件 | 创建复杂形状和连接线支持有限,文档相对碎片化 | 读取、替换文本、批量改已有文档 |
| PlantUML/Graphviz 导出 | 先画文本图,再导入 Visio | 自动布局、适合复杂关系图 | 导入后往往变成图片或样式受限,编辑性较弱 | 快速原型、架构图、流程图草图 |
对于科研绘图,我更推荐前两条路:VBA 宏适合手工复用,Python + pywin32 适合批量生成。两者生成的结果都是 Visio 原生图形对象,可以在 Visio 里继续拖拽、改色、布局,不会变成一张“死图片”。
1.3 为什么不是“让 AI 直接生成图片”
有人会觉得,既然有 Codex,为什么不直接生成一张 jpg 或 png?原因很简单:科研图往往需要反复修改,且要求字体、线宽、颜色统一。直接生成的图片,在论文排版、投稿、答辩前一旦要改,就只能重新再生成一遍。而脚本生成的 Visio 图形,每一个矩形、每一条线都是独立对象,修改数据重新运行脚本即可,也能在 Visio 里手工微调。
所以这篇文章的核心主线是:用代码描述绘图逻辑,用 Codex 降低写代码门槛,最终获得可编辑、可复用、可版本化的科研图。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:Codex、Visio 和 Python 三者都要可用
2.1 安装 Codex 并解决登录和组织设置问题
Codex 的安装方式会随着版本迭代变化。常见的做法是通过 Node.js 环境安装 CLI,或者在 Windows 上安装桌面版客户端。以 CLI 安装为例,大致命令是:
bash复制npm install -g @openai/codex
如果你拿到的是桌面版安装包,直接双击安装,然后按提示登录。安装完成后,建议执行一次版本检查:
bash复制codex --version
能输出版本号,说明 CLI 已经进入环境变量。如果提示命令不存在,通常是 Node.js 环境变量问题,或者安装路径没有被加入 PATH。
真正常见的坑并不是安装,而是登录。很多用户在启动 Codex 时会遇到“登录不上”或“无法加载组织设置”。这类问题优先按顺序排查:
- 确认账号本身有对应产品权限,免费账号和付费账号能用的能力不同。
- 确认当前登录会话没有过期,必要时退出登录后重新登录。
- 确认 Codex 版本不是过旧,旧版本访问新接口时容易出现协议不匹配。
- 查看终端输出的完整日志。提示“无法加载组织设置”时,优先看是权限问题还是本地配置问题。如果日志里出现组织 ID 相关字样,重点检查组织选择。
这里有一个关键原则:不要刚看到报错就重装软件。Codex 的登录状态、组织权限和本地配置,这三项造成的问题比软件本体损坏多得多。
2.2 准备 Visio 的 VBA 开发环境
如果你希望让 Codex 生成 VBA 宏,那么机器上必须安装的是 Visio,而不是 Office 全家桶里的 Word 或 Excel。Visio 从 2013 到 2019 再到 Microsoft 365 里的 Visio 版本,VBA 基本机制变化不大,但界面名称会有差异。
在 Visio 中需要先打开“开发工具”功能:
- 打开 Visio,进入“文件”菜单。
- 选择“选项”,再选择“自定义功能区”。
- 在右侧主选项卡里勾选“开发工具”。
- 点击确定后,菜单栏会多出“开发工具”选项卡。
打开“开发工具”后,还需要确认宏安全设置。进入“开发工具”->“宏安全性”,建议设置为“禁用带数字签名的宏”或“启用所有宏”。如果你只是自己跑脚本,可以在测试环境启用所有宏,等脚本稳定后再改成更严格的策略。
需要特别提示的是,VBA 工程如果要使用 Visio.Page、Visio.Shape 这种强类型声明,需要在 VBA 编辑器里添加 Visio 类型库引用。我记得完整说法是,Alt+F11 打开 VBA 编辑器,选择“工具”->“引用”,勾选“Microsoft Visio 16.0 Type Library”或类似名称。不同 Visio 版本显示的数字不同,核心是找到包含 “Microsoft Visio” 和 “Type Library” 的那一项。
如果不添加类型库,也可以把 Visio.Page 改成 Object,这种写法叫后期绑定,能减少环境差异,但编写时会牺牲一些自动补全。
2.3 可选:Python 自动调用 Visio 的环境
如果只想在 Visio 里按 Alt+F11 运行宏,可以完全不用 Python。但如果你想批量生成 10 张图、从 CSV 读节点、或者把绘图脚本放进 CI 流水线,那就需要 Python。
Python 侧的主要依赖是 pywin32,它是 Windows 下调用 COM 组件的标准库。安装命令:
bash复制pip install pywin32
安装后可以验证一下:
bash复制python -c "import win32com.client; print('win32com ok')"
能输出 win32com ok 说明环境正常。如果提示 ModuleNotFoundError,绝大多数情况是 pip 安装没有进入当前 Python 解释器环境。
环境准备阶段的完整清单如下:
| 组件 | 版本建议 | 用途 | 检查方式 |
|---|---|---|---|
| Windows | Windows 10 或 11 | 运行 Visio 和 COM | winver |
| Visio | 2013 以上或 Microsoft 365 | 绘图主体 | 能打开新建绘图即可 |
| Codex | 官方最新版 | 生成脚本 | codex --version |
| Node.js | 使用 CLI 时需要 | 安装 codex CLI | node --version |
| Python | 3.9 以上 | 批量自动化 | python --version |
| pywin32 | 最新稳定版 | 调用 Visio COM | 导入 win32com.client |
注意:环境准备阶段最值得花时间的是确认版本匹配,而不是急着写脚本。Visio 版本不一致,代码里对模板和形状名称的处理就会有差异。
3. 最小闭环:让 Codex 生成 Visio 绘图宏
3.1 把绘图需求拆成节点、连接和样式
自动化绘图的起点不是打开 Codex,而是把科研绘图需求拆成计算机能理解的数据结构。以最常见的“技术路线图”为例,可以先拆成三部分:节点、连接、样式。
节点就是图中每个矩形或圆角矩形。每个节点至少需要文字、坐标、宽高。连接表示节点之间的关系,在路线图里通常是一条从左边节点右侧指向右边节点左侧的箭头线。样式包括填充颜色、字体大小、线条粗细,但在第一版脚本里可以先不做,等基础绘图跑通再补。
这里定义一组最小需求:
- 页面第一页。
- 三个节点:研究背景、研究方法、实验结果。
- 节点用矩形:宽 2,高 1。
- 第一个矩形左下角坐标是 (1, 8),第二个矩形左下角坐标是 (4.5, 8),第三个矩形左下角坐标是 (8, 8)。
- 矩形之间用水平线连接,线的 y 坐标取两节点垂直中心。
把这组需求记录成表格:
| 节点 | 文字 | 左下角 x | 左下角 y | 宽 | 高 |
|---|---|---|---|---|---|
| 节点1 | 研究背景 | 1 | 8 | 2 | 1 |
| 节点2 | 研究方法 | 4.5 | 8 | 2 | 1 |
| 节点3 | 实验结果 | 8 | 8 | 2 | 1 |
连接关系是 1->2 和 2->3。这样的结构化信息交给 Codex,它才能生成有坐标、有逻辑的代码,而不是一句空泛的“帮我画个图”。
3.2 给 Codex 的回答:一段可复用的 Prompt
先不要直接用聊天框问“请帮我画一个科研路线图”。应该把环境约束、绘制方式、坐标规则、输出要求都写进去。下面是一段可以直接参考的 Prompt:
text复制我在使用 Visio 2019,需要在当前文档的 ActivePage 上绘制一个技术路线图。
请生成 VBA 宏,绘制三个矩形,文字分别是:研究背景、研究方法、实验结果。
矩形宽 2,高 1,最下面的 y 坐标为 8。
第一个矩形左下角坐标是 (1, 8),
第二个是 (4.5, 8),
第三个是 (8, 8),
三者 y 坐标保持一致。
用 DrawRectangle 绘制矩形,用 DrawLine 绘制连接线。
连接线从第一个矩形右侧连接到第二个矩形左侧,再从第二个矩形右侧连接到第三个矩形左侧,线的 y 坐标取 7.5。
要求:
- 使用 Visio.Page 和 Visio.Shape 类型声明;
- 给每个矩形设置 Text;
- 代码要有注释;
- 不要引用不存在的模板文件。
这段 Prompt 信息密度很高。它告诉 Codex 三件事:第一,输出目标环境是 Visio 2019;第二,使用哪个绘图 API;第三,节点坐标和连接线规则。Codex 生成的代码即使不是完全一致,也大概率是能运行的正确方向。
3.3 Codex 可能生成的 VBA 示例
根据上面的 Prompt,Codex 生成的宏通常会长这样:
vba复制Sub DrawTechRoute()
Dim pg As Visio.Page
Set pg = ActivePage
Dim shp1 As Visio.Shape
Set shp1 = pg.DrawRectangle(1, 8, 3, 7)
shp1.Text = "研究背景"
Dim shp2 As Visio.Shape
Set shp2 = pg.DrawRectangle(4.5, 8, 6.5, 7)
shp2.Text = "研究方法"
Dim shp3 As Visio.Shape
Set shp3 = pg.DrawRectangle(8, 8, 10, 7)
shp3.Text = "实验结果"
Dim line1 As Visio.Shape
Set line1 = pg.DrawLine(3, 7.5, 4.5, 7.5)
Dim line2 As Visio.Shape
Set line2 = pg.DrawLine(6.5, 7.5, 8, 7.5)
End Sub
这里用了 DrawRectangle 和 DrawLine 两个基础绘图方法。DrawRectangle(1, 8, 3, 7) 表示以 (1,8) 为左下角、(3,7) 为右上角绘制矩形。因为上面定义了宽 2 高 1,所以 x 坐标从 1 到 3,y 坐标从 8 到 7。理解这个坐标关系,后面手动调整节点位置就不会糊涂。
DrawLine(3, 7.5, 4.5, 7.5) 从 (3, 7.5) 到 (4.5, 7.5),正好从第一个矩形右边中间连到第二个矩形左边中间。
需要说明的是,这段代码的结果是“矩形加直线”,而不是带动态路由的“连接线”。对于科研技术路线图,直线已经够用。如果你需要曲线连接线,可以在 Prompt 里明确要求 Codex 改用 Dynamic connector 母版,但那样对 Visio 模具名称的依赖会增加,建议在基础版本跑通后再逐步增加复杂度。
3.4 如何运行宏并确认结果
在 Visio 中运行宏的流程:
- 打开一个空白 Visio 绘图。
- 按 Alt+F11 打开 VBA 编辑器。
- 在左侧“工程资源管理器”中选中当前文档。
- 右键插入“模块”。
- 把上面的代码粘贴到模块中。
- 按 F5 运行
DrawTechRoute宏。
运行后切回 Visio 页面,会看到三个水平排列的矩形和两条连接线。文字应该分别出现在矩形内部。如果没有文字,检查 shp.Text 赋值是否被后续代码覆盖;如果没有线,检查 DrawLine 是否连接到矩形右侧,而不是从页面外画到页面内。
注意:宏只对当前
ActivePage生效。运行前先确认当前活动页面是你要画图的页面,否则脚本会把图形画到错误的页上。
4. 进阶:用 Python 和 pywin32 驱动 Visio
4.1 为什么从 VBA 换到 Python 脚本
VBA 宏的优势是打开 Visio 就能用,但它有两个短板:一是代码只能在 VBA 编辑器里维护,不方便用 Git 做版本管理;二是当节点数量从 3 个变成 30 个时,VBA 宏里全是重复代码,改起来很痛苦。
Python 脚本可以把节点定义成数据,用循环和函数生成绘图指令。当你需要画 30 个节点、50 条线时,只需要改数据文件,脚本本身不用动。这种“数据和逻辑分离”的方式,才是科研绘图自动化的正确方向。
Codex 在生成 Python 脚本时,同样需要非常明确的 Prompt。你需要告诉它使用 win32com.client,告诉它 Visio 的坐标规则,告诉它矩形和线的绘制方法,还要提醒它注意 app.Visible 的状态。
4.2 Codex 为 Python 脚本准备的 Prompt
text复制请生成一个 Python 脚本,使用 win32com.client 调用 Windows 上的 Visio。
脚本要做的事情:
1. 启动 Visio 应用,设置 app.Visible = True。
2. 新建空白文档,获取第一页。
3. 循环读取一个 nodes 列表,每个元素包含 text、x_left、y_top。
4. 每个节点用 page.DrawRectangle 绘制矩形,宽 2,高 1。
5. 矩形文字用 shp.Text 设置。
6. 按顺序在两两相邻节点之间绘制水平连接线,使用 page.DrawLine。
7. 连接线起点是前一个节点的右边中心,终点是后一个节点的左边中心。
8. 末尾不要立即退出 Visio,方便查看结果。
要求代码有函数封装,避免在 main 函数里堆叠重复代码。
这段 Prompt 比 VBA 版本的更强调工程化:循环、函数封装、数据列表。Codex 会倾向于生成一个可维护的脚本,而不是一大段平铺代码。
4.3 一个可以落地的 Python 绘图脚本
下面是按照上述思路整理出来的最小实现:
python复制import win32com.client
def draw_flow(chart_nodes):
app = win32com.client.Dispatch("Visio.Application")
app.Visible = True
doc = app.Documents.Add("")
page = doc.Pages.Item(1)
width = 2
height = 1
shapes = []
for text, x_left, y_top in chart_nodes:
shp = page.DrawRectangle(
x_left,
y_top - height,
x_left + width,
y_top
)
shp.Text = text
shapes.append(shp)
for idx in range(len(shapes) - 1):
current = chart_nodes[idx]
nxt = chart_nodes[idx + 1]
x1 = current[1] + width
y_center = current[2] - height / 2
x2 = nxt[1]
page.DrawLine(x1, y_center, x2, y_center)
return app, doc
if __name__ == "__main__":
nodes = [
("研究背景", 1, 8),
("研究方法", 4.5, 8),
("实验结果", 8, 8),
]
app, doc = draw_flow(nodes)
这段脚本有几个关键点需要解释:
第一,app.Visible = True 是为了让你能实时看到绘图过程。批量生产时可以改成 False,但第一次跑一定要保持 True,否则 Visio 窗口藏在后台,脚本有没有画成功不容易判断。
第二,node 元组里的 y 坐标代表矩形的“上边”,所以 DrawRectangle 的第一个 y 参数是 y_top - height,第二个 y 参数是 y_top。这样定义数据时更直观,不会出现反了的情况。
第三,page.DrawLine(x1, y_center, x2, y_center) 中的 y_center 通过 current[2] - height / 2 计算,x1 是当前节点右侧,x2 是下个节点左侧。整个脚本的核心逻辑是把“节点列表”变成“图形坐标”。
运行后,你会看到一个自动生成的 Visio 页面,里面有 3 个框和 2 条线。如果连接线的位置偏上或偏下,检查 y_center 的算法即可。
4.4 运行、调试和批量参数化
第一次运行 Python 脚本前,建议先确认 Visio 没有被启动很多次。如果你连续运行脚本,每次都会 Dispatch 到已经存在的 Visio 实例,可能造成页面混乱。最简单的方式是运行前先关闭所有 Visio 窗口,或者每次脚本里都使用 win32com.client.Dispatch 而不是 EnsureDispatch,并在末尾用 doc.Close(False) 和 app.Quit() 释放。
批量生成多张图的思路很简单:把 nodes 列表换成从 JSON 或 CSV 读取的数据。比如你有 10 张路线图,每张图有不同的节点,只需要把节点数据放在外面:
json复制{
"page_title": "实验技术路线",
"nodes": [
{"text": "样本采集", "x_left": 1, "y_top": 8},
{"text": "数据预处理", "x_left": 4.5, "y_top": 8},
{"text": "统计分析", "x_left": 8, "y_top": 8}
]
}
然后在 Python 里用 json.load 读取数据,循环调用 draw_flow。这样修改图只需要改 JSON,不需要改绘图代码。科研绘图到了这个阶段,才算真正摆脱了手工拖拽。
5. 从能画到画好:样式、布局和人工检查清单
5.1 统一科研绘图样式
科研绘图最常见的问题是每张图颜色不统一。手动绘图时,经常是这张图用了蓝色框,下一张图又用绿色框,论文里拼在一起非常突兀。脚本绘图天然适合解决这个问题:在函数里统一定义填充色、线色、字体大小。
不过,Visio 的 COM 接口设置样式时,不同版本对 CellsU 名称会有差异。通常的思路是修改形状的单元格:
python复制shp.CellsU("FillForegnd").FormulaU = "RGB(240, 240, 240)"
shp.CellsU("LineColor").FormulaU = "RGB(80, 80, 80)"
这种写法在高版本 Visio 中通常有效,但落地前还是要先运行一次确认。如果报错,可以把 CellsU 名称换成当前版本支持的名称。稳妥的做法是先用一个最简单矩形测试样式单元格,再把稳定代码扩展到全部节点。
字体和字号可以手动在 Visio 里用“格式”面板一次性调整,但如果你要做 30 张图,建议把样式信息也放进配置数据。这样外观约束和绘图逻辑分离,项目越大,效果越明显。
5.2 坐标布局与批量生成
坐标布局是脚本绘图的重点。刚才的例子中,节点宽度固定为 2,高度固定为 1,水平间距由下一个节点的 x_left 控制。只要保证两个节点之间的间距大于 0,线就不会重叠。
一种更好的做法是把布局参数全部抽成变量:
python复制NODE_WIDTH = 2
NODE_HEIGHT = 1
H_SPACING = 0.5
然后在计算坐标时动态生成:
python复制x_left = index * (NODE_WIDTH + H_SPACING)
y_top = 8
这样无论节点列表多长,都不需要手工计算每个 x_left。Codex 可以帮你完成这类计算,但你自己要理解其中的公式,否则改了间距后会看不出问题在哪里。
科研绘图中的多图层级,比如技术路线分“背景层”“方法层”“结果层”,也可以用多层 y 坐标实现。把不同层级的节点放在不同的 y_top,线可以是从上到下画,也可以从下到上画。只要给 draw_flow 函数增加“线的起点和终点”参数,就能扩展到任意布局。
5.3 人工验收清单
自动化绘图不是“运行完就结束”。每次脚本生成图后,应该按以下清单检查:
| 检查项 | 验收标准 | 常见问题 |
|---|---|---|
| 节点数量 | 与需求一致 | 漏画、重复画 |
| 节点文字 | 文字在框内,不重叠 | 文字太长溢出 |
| 连接线 | 从边界出发,非对角线乱穿 | 坐标计算错误 |
| 节点间距 | 均匀,不重叠 | 间距变量冲突 |
| 页面缩放 | 整张图能在页面内显示 | 坐标超出页面 |
| 样式统一 | 颜色、字体一致 | 有节点漏设样式 |
这一条清单在纯手工绘图时代也能用,但在自动绘图时代更重要的是“把验收逻辑沉淀成脚本”。比如检查所有 shp.Text 是否等于节点列表的 text,检查页面最大 x 坐标是否在页面尺寸内。这些逻辑让 Codex 帮你写,效率会高很多,但判断标准要由你来定。
注意:不要只验证程序能启动,还要验证输入、输出、异常分支和日志是否符合预期。
6. 常见问题排查:按现象逐级定位
6.1 Codex 侧的登录和组织设置问题
先列出一个高频问题表,这些问题在 Codex 使用的早期阶段很容易遇到:
| 问题现象 | 可能原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| Codex 登录不上 | 登录会话过期、账号权限不足、CLI 版本过旧 | 查看 codex --version,退出后重新登录 |
更新 CLI,确认账号权限,重新认证 |
| 无法加载组织设置 | 当前账号没有绑定组织、本地配置缓存损坏 | 查看终端日志中组织相关字段 | 检查账号组织设置,清理本地配置后重试 |
| 本地接口调用失败 | 本地配置与服务状态不匹配 | 查看日志中 endpoint 请求的返回结果 | 按日志逐层检查本地配置和网络链路,确认服务状态可访问 |
这里需要特别提醒的是,不要一出现 endpoint 相关错误就去重装软件。Codex 在调用接口时失败,原因可能只是账号权限和本地配置不一致。先把日志读完整,再判断是使用侧问题还是服务侧问题。
6.2 Visio 宏和 COM 调用异常
VBA 宏最常见的报错是“用户定义类型未定义”。这个问题的根因是 VBA 工程没有引用 Visio 类型库。解决方法是打开“工具”->“引用”,勾选 Microsoft Visio 类型库。如果你希望代码在任何电脑上都更容易跑通,可以把声明里的 Visio.Page 全部改成 Object,这是后期绑定写法,不依赖类型库。
另一个高频问题是“宏被禁用”。Visio 的宏安全性默认可能会阻止宏运行。进入“开发工具”->“宏安全性”,在测试阶段可以暂时放低安全级别,但正式使用时要改回更严格的策略。
Python 脚本容易出现两类错误。第一类是 ModuleNotFoundError: No module named 'win32com',这是没有安装 pywin32。第二类是 Dispatch 失败,通常是电脑上没有安装 Visio,或者 Visio COM 注册信息损坏。
| 问题现象 | 可能原因 | 检查方式 | 处理建议 |
|---|---|---|---|
宏里声明 Visio.Page 报错 |
缺少类型库引用 | 检查 VBA 项目引用 | 添加 Visio 类型库,或改用 Object |
| 宏运行后无反应 | 宏安全设置禁止执行 | 检查宏安全性 | 测试环境放低安全级别 |
| Python 找不到 win32com | pywin32 未安装 | pip show pywin32 |
重新安装 pywin32 |
| Dispatch 失败 | Visio 未安装或 COM 注册异常 | 打开 Visio 确认可用 | 修复 Office 安装 |
| 脚本卡住不退出 | Visio 窗口被隐藏且未退出 | 查看任务管理器 | 脚本末尾调用 app.Quit() |
6.3 生成结果不符合预期
如果脚本运行没有报错,但图形不对,问题多数在坐标和数据定义。比如矩形画到了页面外,通常是因为 x_left 或 y_top 超出了页面范围。比如连线交叉错乱,通常是节点列表顺序和连接关系没有对应。
这种情况下,最有效的排查方式是把脚本里的“节点列表”原样打印出来,再对照 Visio 页面上的形状位置。你很快就能发现是数据问题还是绘图逻辑问题。不要直接去改 Visio 图形,应该回到 Python 脚本里改数据或坐标计算。
7. Codex 自动绘图的边界与最佳实践
7.1 什么场景适合自动化,什么场景不适合
Codex 自动绘图适合节点关系清晰、结构重复的场景。实验流程图、技术路线图、系统架构图、流程对比图,这些都很适合。它们有明确的节点、连接、层次和文字,本质上是“结构化数据 + 坐标布局”的问题。
不适合自动化的场景包括:概念发散型示意图、强调艺术感的封面图、复杂空间关系的三维示意图。这类图形很难用简单的矩形和直线表达,强行用脚本绘制,成本反而比手工画高。
还有一个更重要的是数据统计图。比如折线图、柱状图、散点图,应该用 Python 的 Matplotlib 或专业统计软件生成,再插入 Visio,而不是用 Visio 的矩形和线拼出来。工具选错,再强的自动化也救不回来。
7.2 让 Prompt 更好用的几个细节
经过实际使用,我发现给 Codex 的绘图相关 Prompt 有几个细节能明显提升产出质量:
- 明确坐标系。告诉 Codex:
DrawRectangle的第一个点是左下角,第二个点是右上角。 - 明确输出环境。告诉 Codex 是 Visio 2019 还是 Microsoft 365 Visio。
- 明确返回值。要求 Codex 生成的函数返回
app和doc,方便后续继续操作。 - 要求注释。每个坐标计算公式都要求 Codex 写注释,这样代码出问题时你能快速看懂它的意图。
- 给出验收条件。比如“生成的图需要能放进 A4 页面”,Codex 会自动调整坐标范围。
这些细节看起来像是“额外要求”,但它们决定了 Codex 输出的是“能跑的画图脚本”还是“一段看起来很漂亮但跑不起来的空代码”。
7.3 模板化和版本管理
当你用 Codex 自动生成多张科研图后,最值得做的一件事是把公共绘图逻辑沉淀成模板。比如脚本读取一个 JSON 文件,JSON 里定义节点、层级、连接、颜色。这样你的论文里所有图的样式都来自同一套模板,谁来看图都不会有“这张图像是另一个画风”的错觉。
版本管理方面,.vsdx 文件是二进制格式,不适合直接 Git diff,但生成它的 Python 脚本和 JSON 数据都是纯文本。把这些文本文件放进 Git,每一次改图都能看到改动记录。图片文件本身可以定期导出为 PDF 或 PNG 归档。
一个简单的绘图数据模板:
json复制{
"page_width": 11,
"page_height": 8.5,
"node_width": 2,
"node_height": 1,
"layers": [
{
"title": "背景层",
"nodes": [
{"text": "研究背景", "x": 1, "y": 7}
]
}
],
"connections": [
{"from": "研究背景", "to": "研究方法"}
]
}
后续的脚本只需要解析 JSON,就能生成对应图形。Codex 可以帮你写这个解析器,核心设计仍然是“数据和逻辑分离”。
7.4 科研绘图工具组合建议
Visio 加脚本适合做需要手工微调的精绘阶段。但科研绘图并不只有精绘这一个环节。草稿阶段,建议用 PlantUML 或 draw.io 快速画出节点关系;定稿阶段,再通过脚本转到 Visio 做样式统一。数据分析图用 Matplotlib 生成,然后在 Visio 里作为图片插入。
这样组合的好处是每一层都用最合适的工具,Codex 在其中负责生成连接脚本。你不需要让 Codex 一步到位画完所有东西,而是让它把重复劳动的部分自动化。真正需要判断和审美的地方,仍然由人来决定。
回到最初的话题:所谓“科研绘图直接躺平”,不是坐在那里等 Codex 变出一张图,而是把绘图需求拆成节点、关系和样式,让 Codex 生成一段可复用的脚本,让 Visio 按照脚本自动完成那些重复、机械、耗时的拖拽操作。最终论文里的每一张图,都应该是一个稳定模板的自然产物。下一步值得做的,是把你经常画的那几类图整理成自己的 JSON 数据模板,再让 Codex 生成对应的绘图函数。有了模板,改一张图只需要改几个文字和坐标,那时候画图就真的不再占用你的核心时间了。
