从芯片截图到 CAD 图纸:一条半自动化的工程图生成链路
最近在做一款射频功放裸片的 PCB 封装时,手边只有一份扫描版数据手册里的外形尺寸截图。手动在 CAD 里逐点输入坐标画 1:1 图形既枯燥又容易出错,于是顺手探索了一下能不能让 AI 代劳。这篇文章记录了整个尝试过程,重点拆解 AI 视觉提取和 Python 生成 DXF 的技术细节,以及最后踩过的几个值得记下来的坑。
需求背景:为什么需要把截图转成 CAD
我手头这款芯片属于裸片键合封装,外形尺寸和四个键合点的位置全部集中在数据手册的一张截图里。芯片长 3250 微米、宽 1150 微米,键合点尺寸从 80×80 微米到 100×100 微米不等,中心坐标精确到十位微米级。
在画 PCB 封装时,这些尺寸必须 1:1 还原。手动输入的问题不在于复杂度,而在于枯燥带来的出错率。3250 和 3520 在键盘上只差一个数字,但在 50 微米公差的要求下,这种手误足以让封装报废。于是我开始寻找一种能把截图直接转成 DXF 或 DWG 的方法。
现有软件的尝试与局限
最先想到的是市面上已有的 AI 识图转 CAD 工具。我逐一试了几类方案:
-
通用图像转矢量工具(如 Scan2CAD、TechDraw AI):它们擅长把机械零件的轮廓描成线条,但面对芯片截图时有两个致命问题。第一,截图是像素图,放大后文字边缘和线条会产生压缩伪影,矢量化后杂线很多。第二,这类工具只描边,不理解「这是焊盘、那是尺寸标注」,会把引脚编号文字也当成几何线条描出来,后期清理工作量反而更大。
-
专用芯片封装 AI 工具(如 ProtoFlow、PCBPartz):这类工具面向标准 SMT 封装(SOP、QFN、BGA 等),数据库里有大量标准封装模板。但我的芯片是裸片定制键合点,焊盘布局没有标准规律,AI 无法从训练集里找到匹配模板,识别失败。
-
多模态大模型直接生成:把截图丢给 Claude 或 GPT-4o,让它输出 DXF 代码。实测发现,大模型对截图里的数字提取准确率尚可,但让它直接写 DXF 文本格式时,经常会在组码、图层定义、坐标顺序上出错,生成的文件用 AutoCAD 打开直接报错。
结论是:目前没有任何一款工具能做到「截图 → 完美 CAD」的一键闭环。但对于我这种「有明确尺寸标注的规整工程图」,AI 提取尺寸 + 脚本生成图形的半自动化方案是可行的。
自建流程:AI 提取 + Python 生成 DXF
最终我采用的链路分成三步:AI 视觉提取结构化数据、人工核对清洗、Python 脚本生成 DXF。下面详细拆解每一步。
第一步:AI 视觉提取
把截图发给多模态大模型(Claude、GPT-4o、Gemini 均可),关键在于提示词要约束输出格式。我使用的提示词如下:
请读取这张芯片外形尺寸图,提取所有几何信息,按以下 JSON 格式输出:
{
"unit": "μm",
"chip": {
"width": 芯片总宽度,
"height": 芯片总高度,
"thickness": 芯片厚度,
"tolerance": "尺寸公差"
},
"pads": [
{
"id": "编号",
"name": "焊盘名称",
"center": [X坐标, Y坐标],
"size": [宽度, 高度],
"side": "left/right/top/bottom",
"function": "功能描述"
}
],
"notes": ["原图注释1", "原图注释2"]
}
注意:
1. 坐标系以左下角为原点 (0,0),X 向右,Y 向上;
2. 如果某个焊盘的坐标未直接标注,请根据图中尺寸链推算,并在 notes 中说明推算依据;
3. 不要遗漏任何可见的焊盘或尺寸;
4. 如果某个尺寸是推断值而非直接标注,请在对应字段加 "inferred": true。
对于我的截图,模型返回的 JSON 如下:
{
"unit": "μm",
"chip": {
"width": 3250,
"height": 1150,
"thickness": 50,
"tolerance": "±50"
},
"pads"
这里有两个值得注意的细节:
- 推断坐标的处理:原图只标注了 340、790、2290 这几个尺寸,键合点的完整中心坐标需要结合「贴边放置」的惯例推算。AI 在 notes 里说明了推算依据,方便我核对。
- 未编号焊盘的遗漏:原图里 RF 端口和偏置端口旁边还有几个没有编号的小方框,AI 的初始输出里没有包含它们。这引出了后面第三节要讨论的问题。
第二步:数据清洗与核对
这是整个流程里唯一不能跳过的环节。我把 AI 返回的 JSON 和原图逐字核对,重点检查:
- 直接标注尺寸:3250、1150、340、790、2290 是否与截图完全一致;
- 推断坐标:40、3210、1100 的推算逻辑是否合理(贴边放置意味着中心坐标 = 边距 + 半宽/半高);
- 单位一致性:确认所有数值都是微米,没有混入毫米或其他单位;
- 遗漏项:检查是否有未标注焊盘被 AI 忽略。
这个步骤目前必须由人完成,因为芯片封装的焊盘对零点几毫米的精度极其敏感,AI 偶尔会看错或猜错相似数字(比如把 2290 看成 2296,或者把 80×80 看成 80×100)。
核对完成后,我把修正后的 JSON 保存为文件,作为下一步脚本的输入。
第三步:Python + ezdxf 生成 DXF
使用纯 Python 库 ezdxf 生成 DXF 文件,不需要安装 AutoCAD 或 FreeCAD。核心思路是:读取 JSON → 创建 DXF 文档 → 按图层绘制几何实体 → 保存。
1. 环境准备
pip install ezdxfezdxf 是纯 Python 实现,无额外依赖,支持 Python 3.9+。
2. 核心代码结构
import ezdxf
from ezdxf.enums import TextEntityAlignment
import json
# 读取 AI 提取的 JSON
with open('chip_geometry.json', 'r', encoding='utf-8') as f:
data = json.load
3. 绘制芯片外形
# 芯片轮廓:左下 → 右下 → 右上 → 左上 → 闭合
w = chip['width'] / 1000 # 3.25 mm
h = chip['height'] / 1000 # 1.15 mm
outline = [(0, 0), (w, 0), (w, h), (0, h), (0, 0
4. 绘制键合点(按实际尺寸)
for p in pads:
cx = p['center'][0] / 1000
cy = p['center'][1] / 1000
pw = p['size'][0
5. 添加尺寸标注
# 创建适合毫米单位的标注样式
dimstyle = doc.dimstyles.new('MM_STYLE')
dimstyle.dxf.dimtxt = 0.08 # 文字高度 0.08 mm
dimstyle.dxf.dimasz = 0.04 # 箭头大小
dimstyle.dxf.dimexe = 0.03 # 延伸线超出量
dimstyle.dxf.dimexo = 0.03 # 延伸线偏移量
6. 保存文件
doc.saveas('chip_2d_model.dxf')生成的 DXF 文件在 AutoCAD 中打开后,用 DIST 命令测量芯片对角线,应显示约 3.446 mm(即 sqrt(3.25² + 1.15²)),与理论值一致,证明 1:1 比例正确。
7. 文件结构验证
用 ezdxf 自身可以验证生成的文件:
doc = ezdxf.readfile('chip_2d_model.dxf')
print(f"版本: {doc.dxfversion}") # AC1024 = AutoCAD 2010
print(f"单位: {doc.header['$INSUNITS']}") # 4 = mm
print(f踩坑记录:三个容易被忽略的细节
虽然链路跑通了,但在 AutoCAD 里打开后还是发现了三个值得记下来的问题。
字体映射导致中文乱码
我在 DXF 里写了几行中文注释(单位说明、公差说明),结果在 AutoCAD 里全部显示为「???」。原因是 ezdxf 默认使用的字体样式在 AutoCAD 环境中找不到对应的中文字体文件。
AutoCAD 的字体解析依赖系统安装的 SHX 或 TTF 字体。如果 DXF 里指定的字体不含中文字形,而 AutoCAD 的替代字体(如 gbcbig.shx)也未安装,中文就会全部变成问号。最稳妥的解决办法是把注释统一写成英文,彻底避开字体依赖;如果必须用中文,需要在生成 DXF 时显式绑定 gbcbig.shx 或 simsun.ttc,并确保目标环境安装了这些字体。
单位换算:微米还是毫米
我最初在 DXF 里设置了 $INSUNITS = 13(微米),以为 AutoCAD 会自动识别。但 AutoCAD 的默认模板单位是毫米,$INSUNITS 只影响插入外部参照时的缩放比例,并不会把 3250 自动显示成 3.25。结果图纸在 AutoCAD 里看起来是一个 3.25 米 × 1.15 米的芯片,显然荒谬。
对于 PCB 设计来说,行业默认单位是毫米或 mil。如果生成的 DXF 以微米为单位,导入 PCB 软件后还需要手动换算,既容易出错也不符合协作习惯。正确的做法是在 Python 脚本生成阶段就把所有坐标和尺寸除以 1000,以毫米为单位出图。这样拿到 DXF 后直接导入就是 1:1 的物理真实尺寸,无需任何后处理。
那些没有编号的焊盘
原图里除了四个有编号的键合点外,RF 端口和偏置端口旁边还有几个没有编号的小方框。键合点定义表里只列出了四个,这些小方框是什么?
从射频功放裸片的工程惯例推断,这些未标注焊盘极大概率是接地焊盘。射频芯片必须有多点接地来保证回流路径和散热,左右两侧 RF 端口上下对称放置小焊盘,是典型的「信号焊盘 + 接地焊盘」布局。顶部的 Vg1、Vd1 旁边的小方框,则可能是给旁路电容提供的接地端键合点。
这个细节提醒我们:AI 能提取图上写了什么,但提取不了图上「没写」的工程意图。在生成 CAD 图形时,这些未标注焊盘如果确认是 GND,应该在封装中统一命名为同一个网络名,并赋予接地属性,而不是直接忽略。
结论:什么时候值得做,什么时候不值得
这套「AI 提取 + Python 生成 DXF」的链路,对于单张截图、尺寸标注清晰的芯片图,跑通一次大约需要十分钟(其中九分钟在核对数据,一分钟在跑脚本)。它的价值不在于节省了多少时间,而在于把「枯燥且易出错」的手动输入变成了「可复现、可批量」的自动化流程。
但如果你的芯片是标准 SMT 封装(SOP、QFN、BGA 等),直接去 SnapMagic、Ultra Librarian 或立创商城下载现成的封装库,准确率远高于自己从截图提取。只有面对裸片、定制键合点或非标准封装时,这套自建流程才有意义。
目前我的需求量不大,暂时不打算把它做成一个完整的软件工具。但把这条链路记录下来,下次遇到类似需求时可以直接复用,也希望能给有同样困扰的工程师提供一个参考。