简介:GerberView-开源是一份面向Linux桌面用户与PCB设计初学者的Gerber文件查看工具资源,主要解决在Ubuntu系统下缺少轻量级、可自由使用的Gerber预览方案的问题。压缩包共7个文件,约1015KB,以3个so动态库为核心,配合可执行主程序、头文件、脚本与辅助数据文件,构成一套可直接部署运行的查看环境,适合需要快速核对光绘文件、检查层叠与图形细节的硬件工程师及学习者。资源已有637人学习下载,说明其在Linux平台Gerber查看场景中具备一定实用参考价值。读者可从中获得完整的程序结构与依赖组织方式,了解动态库拆分、脚本调用与主程序协同的实现思路,也可将其作为二次开发或集成到自有工作流的起点,便于在Ubuntu上完成Gerber文件的日常浏览与初步校验。
1. 打开一份 Gerber 之前,先想清楚你要验证什么
PCB 打样回来发现丝印压焊盘、阻焊开窗偏了半个毫米,翻回设计文件一看,问题早在出 Gerber 那一刻就埋下了。这类返工我见过太多次,根子往往不是设计错,而是没人真正把导出的 Gerber 当回事去“看”一遍。GerberView-开源这个资源,解决的就是这个环节:它是一套面向 Gerber 与钻孔文件的查看、图层解析与叠层核对工具,能把 RS-274X 格式的每一层拆开、按真实叠层顺序渲染,让你在发板前用肉眼和坐标双重确认开窗、丝印、钻孔对位。适合画板子的硬件工程师、做 DFM 检查的工艺人员,以及需要批量核对多版本 Gerber 的从业者。开源软件的好处是解析逻辑摊在明面上,遇到渲染和 CAM 软件对不上时,你能顺着源码找到是哪条光圈或极性指令没处理对,而不是对着黑匣子干瞪眼。
2. Gerber 解析的底层逻辑:为什么你的查看器会“看错”
2.1 RS-274X 的坐标系与单位陷阱
Gerber 文件本身不带“毫米”或“英寸”的语义标签,单位靠%MOMM*%或%MOIN*%这类扩展指令声明,坐标则是整数,真实尺寸 = 整数 × 单位换算系数。麻烦在于,很多老工具导出的文件里%MO指令缺失或位置靠后,解析器如果默认按英寸处理,一块 100mm 的板子会被渲染成 2540mm,缩放到屏幕里看着“差不多”,实际比例全错。GerberView-开源 在解析入口处会先扫一遍全局指令,把单位、格式(%FSLAX46Y46*%里的 4.6 表示 4 位整数 6 位小数)和坐标模式(绝对/增量)提取成一份元数据,再逐行解释绘图指令。
我一般会先确认三件事:文件头有没有%FS格式声明、%MO单位声明、以及G01/G02/G03线性/圆弧插补模式是否在每段路径前正确切换。缺%FS的文件,工具会退回默认 3.5 格式并给出警告——这个警告别忽略,它意味着你的坐标精度可能被截断。
# 快速检查一份 Gerber 的头部声明,确认单位和格式 head -n 20 board_top.gbr | grep -E '%FS|%MO|%AD' # 期望看到类似: # %FSLAX46Y46*% # %MOMM*% # %ADD10C,0.150000*%上面这段命令只做一件事:把文件前 20 行里跟格式、单位、光圈定义相关的行捞出来。%FSLAX46Y46*%中 L 表示前导零省略,A 表示绝对坐标,X46 是 X 轴 4 位整数 6 位小数;%ADD10C,0.15*%是光圈定义,D10 号光圈、圆形、直径 0.15mm。如果grep什么都没输出,基本可以判定这份文件要么不是标准 RS-274X,要么导出时把扩展指令关了,后续渲染必然出问题。
2.2 光圈、极性、层叠:三个决定渲染正确性的参数
光圈(Aperture)决定线宽和焊盘形状,极性(Polarity,%LPD*%暗/%LPC*%清)决定一段图形是“画上去”还是“挖掉”,层叠顺序决定谁盖谁。三者任意一个处理错,渲染结果就和 CAM350 对不上。GerberView-开源 的做法是把每层解析成独立的图形对象列表,极性用布尔运算在渲染阶段合成,而不是解析时直接改像素——这样你切换层可见性时不会丢信息。
实操上,我建议按这个顺序核对:
- 先只开顶层铜(Top Copper),确认所有走线和焊盘都在,没有莫名缺失的线段——缺失通常是光圈未定义或
D码越界。 - 再叠加阻焊层(Solder Mask),看开窗是否比焊盘大一圈(常规单边 0.05~0.1mm),开窗小于焊盘就是典型的“阻焊上焊盘”。
- 最后叠丝印层(Silkscreen),重点看字符有没有压到开窗区域。
# 用工具提供的解析接口读取单层并统计图元数量,用于快速判断解析是否完整 from gerber_view import GerberParser parser = GerberParser("board_top.gbr") layer = parser.parse() print("单位:", layer.unit) # 期望 'mm' print("格式:", layer.format) # 期望 (4, 6) print("光圈数:", len(layer.apertures)) print("线段数:", len(layer.traces)) print("焊盘数:", len(layer.pads)) print("极性切换次数:", layer.polarity_switches)这段代码的价值在于“数量对账”:光圈数应该和你在设计软件里定义的焊盘/线宽种类对得上,线段数和焊盘数量级也应该合理。如果traces为 0 而文件明明有走线,八成是插补模式没被识别;如果polarity_switches异常多,说明文件里大量用了清极性做挖空,渲染时必须严格按顺序合成,否则会出现“该挖的没挖、该留的被挖掉”。
2.3 钻孔文件与 Gerber 的对位校验
钻孔文件(Excellon 格式)和 Gerber 是两套坐标系,单位也可能不同(钻孔常用英寸,Gerber 常用毫米)。对位错位是打样翻车的重灾区:孔位整体偏移、镜像、或者原点定义不一致。GerberView-开源 支持把钻孔层叠加到铜层上,用不同颜色区分,并显示每个孔的坐标。
核对步骤我通常这么走:先确认钻孔文件头部的METRIC或INCH声明,再看T刀具定义里的直径,最后把钻孔层和顶层焊盘叠在一起,逐个看孔是否落在焊盘中心。偏移量如果整体一致,多半是原点(%OFA/%OFS偏移指令)没对齐;如果是个别孔偏,那是设计端封装问题,跟查看器无关。
提示:钻孔直径和焊盘内径的差值(环宽)建议留 0.15mm 以上,低于这个值在渲染里看着“刚好”,实际钻孔公差一叠加就容易破环。
3. 从源码跑起来:环境、依赖与一次完整渲染
3.1 环境准备与依赖安装
这类查看器通常依赖图形渲染库和解析库,跑起来之前先把运行时和包管理器对齐。我一般用虚拟环境隔离,避免和系统里的其他 Python 包打架。下面以常见的 Python 技术栈为例,具体包名以资源包内requirements或pyproject为准。
# 创建并激活虚拟环境 python3 -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装依赖(以资源包内声明的依赖文件为准) pip install -r requirements.txt # 启动查看器主程序 python main.py --file samples/board_top.gbr--file参数指向单层文件;如果资源包支持整包加载,通常还有一个--dir或--job参数指向包含所有层的目录。启动后如果窗口空白,先看终端有没有“aperture Dxx undefined”之类的报错——这是最常见的启动即翻车原因,说明某层引用了未定义的光圈,解析器跳过了整段图形。
3.2 图层加载与叠层顺序配置
一份完整的 PCB 至少包含顶层铜、底层铜、顶层阻焊、底层阻焊、顶层丝印、底层丝印、钻孔,多层板还要加内层。叠层顺序错了,渲染出来的“透视感”就是错的。工具一般提供一份层配置文件,把文件名映射到层类型和显示顺序。
{ "layers": [ {"file": "board_top.gbr", "type": "copper", "side": "top", "order": 1}, {"file": "board_bot.gbr", "type": "copper", "side": "bottom", "order": 2}, {"file": "board_tsm.gbr", "type": "mask", "side": "top", "order": 3}, {"file": "board_tsi.gbr", "type": "silk", "side": "top", "order": 4}, {"file": "board_drl.drl", "type": "drill", "side": "all", "order": 5} ] }order越小越靠底层渲染,side决定是否做镜像显示。这里有个容易忽略的点:底层丝印在查看时通常要镜像,否则字符是反的,但镜像只影响显示,不影响坐标校验。配置文件里如果type写错(比如把阻焊写成silk),颜色和透明度会跟着错,视觉上很难发现,但对位检查时容易误判。
3.3 渲染参数:线宽补偿、透明度与缩放基准
渲染阶段有几个参数直接影响你“看到的是不是真实尺寸”。线宽补偿(stroke width compensation)用于把零宽度的绘图指令按光圈直径渲染成有宽度的线;透明度决定多层叠加时能不能看穿;缩放基准决定 1:1 显示时一个像素对应多少毫米。
我一般把透明度设在 0.6~0.7 之间,既能看清叠层关系,又不至于把底层完全遮住。缩放基准这块,工具通常提供“适应窗口”和“1:1”两种模式,做尺寸核对时一定切到 1:1,再用标尺工具量两个焊盘中心的距离,和设计值比对。适应窗口模式下量出来的尺寸没有参考意义,这是新手最容易踩的坑。
# 设置渲染参数并导出 1:1 预览图,用于和 CAM 软件交叉比对 viewer = GerberViewer(layer_config="layers.json") viewer.set_render_options( opacity=0.65, # 多层叠加透明度 stroke_compensation=True, # 按光圈直径渲染线宽 background="dark" # 深色背景更易看清阻焊开窗 ) viewer.zoom_to_fit() viewer.export_png("preview_1to1.png", scale=1.0) # scale=1.0 即 1:1scale=1.0导出的是 1:1 位图,配合图片的 DPI 元数据可以反推实际尺寸。如果导出图和 CAM 软件截图叠不上,先查 DPI 设置,再查导出时有没有被自动裁剪边距——裁剪会改变原点,导致坐标对不上。
4. 避坑与排查:五条血泪经验
4.1 现象:整板渲染成空白,终端无报错
原因:文件用了%LPC*%清极性开头,或者第一段图形就是挖空操作,渲染器在没有底层的情况下把整层“挖没了”。解决:在渲染选项里临时关闭极性合成,先看原始图元,确认图形确实存在后再开极性;同时检查文件是否缺少%LPD*%的初始声明。
4.2 现象:圆弧画成了直线或折线
原因:G02/G03圆弧插补的I/J偏移量被当成绝对坐标解析,或者多象限模式(G75)没启用。解决:确认解析器对G74/G75的处理,单象限模式下圆弧中心偏移是相对起点,多象限是相对当前点,两者混用必然画歪。GerberView-开源 的解析模块里对这两种模式有分支,改配置前先读那段源码。
4.3 现象:钻孔和焊盘整体偏移一个固定值
原因:钻孔文件的原点定义和 Gerber 不一致,常见于钻孔用了G93或文件头带偏移指令。解决:在层配置里给钻孔层单独设一个offset参数,用两个已知孔位反推偏移量,填进去后重新叠加验证。别指望“看着差不多”,偏移 0.1mm 在细间距器件上就是致命伤。
4.4 现象:丝印字符显示为方块或乱码
原因:丝印层用的是矢量笔画字体(stroke font),解析器把它当成了填充多边形,或者字符编码没对上。解决:确认丝印层按“线”渲染而不是“面”,检查工具是否支持笔画字体的线段序列。如果资源包内自带字体映射表,核对字符编码段是否完整。
4.5 现象:大文件加载卡死或内存暴涨
原因:整板 Gerber 动辄几十万条图元,一次性全部实例化成对象再渲染,内存吃不消。解决:开启按视口裁剪(viewport culling),只渲染当前可见区域的图元;或者先用解析接口做统计,确认图元数量级,再决定是否分块加载。我一般对超过 20 万图元的文件先跑统计脚本,心里有数再开图形界面。
5. 进阶:把查看器变成批量核对脚本
单份文件靠眼睛看还行,一个项目十几版 Gerber、每版七八层,纯手工核对迟早漏。我的做法是把 GerberView-开源 的解析接口抽出来,写一个批量核对脚本,自动比对两版之间的图元差异和关键尺寸。核心思路是:解析每层得到图元集合,按类型和坐标做哈希,差异集合就是改动点。
from gerber_view import GerberParser def layer_signature(path): layer = GerberParser(path).parse() sig = set() for t in layer.traces: # 坐标取整到 0.001mm,避免浮点误差造成假差异 sig.add(("trace", round(t.x1, 3), round(t.y1, 3), round(t.x2, 3), round(t.y2, 3), round(t.width, 3))) for p in layer.pads: sig.add(("pad", round(p.x, 3), round(p.y, 3), p.aperture_id)) return sig old = layer_signature("v1/board_top.gbr") new = layer_signature("v2/board_top.gbr") added = new - old removed = old - new print(f"新增图元 {len(added)} 条,删除图元 {len(removed)} 条") for item in list(added)[:10]: print("新增:", item)这段脚本的关键在坐标取整:Gerber 坐标是整数,但不同导出工具的小数位处理可能有细微差别,取整到 0.001mm 能过滤掉浮点噪声,又不会漏掉真实改动。aperture_id参与焊盘签名,是为了捕捉“位置没动但焊盘尺寸改了”这种隐蔽改动。跑完差异后,把新增/删除的坐标导出来,再回到查看器里定位,比逐层肉眼扫快一个数量级。
几个参数上的经验值:差异比对时线宽容差设 0.001mm 足够;焊盘位置容差可以放宽到 0.005mm,因为有些工具导出时会有亚微米级舍入;如果差异数量突然从个位数跳到几千,先怀疑单位或格式解析变了,而不是设计真改了几千处。
| 核对项 | 建议容差 | 超差后的动作 |
|---|---|---|
| 走线坐标 | 0.001mm | 回查设计端是否移动 |
| 焊盘位置 | 0.005mm | 确认封装原点 |
| 钻孔直径 | 0.02mm | 核对刀具表 |
| 阻焊开窗单边 | 0.05mm | 检查开窗规则 |
从那以后我每次发板前,都强制走一遍“解析统计 → 1:1 渲染 → 钻孔叠加 → 版本差异比对”这四步,哪怕只是改了一根线。眼睛会骗人,脚本不会。希望这套流程帮到你,少一次打样返工,就多一份安心。
本文还有配套的精品资源,点击获取