EDA 工具链协同:从原理图到 Gerber 输出的自动化脚本实践
从原理图到 Gerber,传统流程是:画完原理图→手动导出网表→开 PCB→导网表→布局→布线→手动跑 DRC→手动点“输出 Gerber”→填钻孔文件参数→点确定。每次改一版,重复点十几下鼠标,不仅慢而且容易漏层。下面以 KiCad 8 为例,展示如何用一套 Python 脚本把“原理图 → 网表 → PCB 导入 → DRC → Gerber + 钻孔”串成一条命令。Allegro / Altium 也有类似方案,原理相通。
一、KiCad 8 的 CLI 武器:kicad-cli
KiCad 8 将大部分 GUI 操作暴露给了命令行工具 kicad-cli,无需打开图形界面即可完成:
# 从原理图导出网表(用于 PCB 导入)
kicad-cli sch export netlist --format kicad_sexp project.kicad_sch -o project.net
# 更新 PCB 中的网表(需先有 .kicad_pcb 文件)
kicad-cli pcb update board project.kicad_pcb -n project.net
# 运行 DRC
kicad-cli pcb drc project.kicad_pcb --output drc.rpt
# 导出 Gerber(全部层,含 edge cuts)
kicad-cli pcb export gerbers project.kicad_pcb --layers F.Cu,B.Cu,F.SilkS,B.SilkS,F.Mask,B.Mask,Edge.Cuts --output gerber/
# 导出钻孔文件(Excellon 格式)
kicad-cli pcb export drill project.kicad_pcb --format excellon --output gerber/
二、Python 串联:一键流水线
上面的命令一条条敲仍然繁琐,用 Python 的 subprocess 包装成一个函数,再配上参数和日志:
import subprocess, sys, os
def run_kicad_cli(cmd_args, desc=""):
print(f"[{desc}] Running: {' '.join(cmd_args)}")
result = subprocess.run(cmd_args, capture_output=True, text=True)
if result.returncode != 0:
print(f"ERROR: {result.stderr}")
sys.exit(1)
return result.stdout
def build_all(sch_file, pcb_file, output_dir="gerber"):
# 1. 导出网表
net_file = "project.net"
run_kicad_cli(["kicad-cli", "sch", "export", "netlist",
"--format", "kicad_sexp", sch_file, "-o", net_file],
desc="Export netlist")
# 2. 更新 PCB 网表(如果 PCB 已存在)
if os.path.exists(pcb_file):
run_kicad_cli(["kicad-cli", "pcb", "update", "board",
pcb_file, "-n", net_file],
desc="Update PCB netlist")
# 3. DRC 检查
drc_report = run_kicad_cli(["kicad-cli", "pcb", "drc",
pcb_file, "--output", "drc.rpt"],
desc="Run DRC")
# 如果 DRC 有错误则中止
if "errors: 0" not in open("drc.rpt").read():
print("DRC errors found! Check drc.rpt")
sys.exit(1)
# 4. 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 5. 导出 Gerber(指定常用层)
layers = "F.Cu,B.Cu,F.SilkS,B.SilkS,F.Mask,B.Mask,Edge.Cuts"
run_kicad_cli(["kicad-cli", "pcb", "export", "gerbers",
pcb_file, "--layers", layers,
"--output", output_dir],
desc="Export Gerbers")
# 6. 导出钻孔文件
run_kicad_cli(["kicad-cli", "pcb", "export", "drill",
pcb_file, "--format", "excellon",
"--output", output_dir],
desc="Export drills")
print(f"\n✅ All done! Gerber files in '{output_dir}'")
if __name__ == "__main__":
build_all("project.kicad_sch", "project.kicad_pcb")
三、进阶:集成 BOM 与 PDF 原理图
除了 Gerber,生产还需要 BOM 和原理图 PDF,顺手加入:
# 导出 BOM(CSV 格式,含参考位号和值)
run_kicad_cli(["kicad-cli", "sch", "export", "bom",
sch_file, "--output", "bom.csv"])
# 导出原理图 PDF
run_kicad_cli(["kicad-cli", "sch", "export", "pdf",
sch_file, "--output", "schematic.pdf"])
四、注意事项
• KiCad 版本:kicad-cli 从 KiCad 7 开始提供,8 增加了更多选项。旧版本只能用 Python API(pcbnew 模块)或手动调用插件。
• 路径处理:脚本中所有路径建议用绝对路径或相对于项目根目录,避免 kicad-cli 工作目录混淆。
• DRC 严格性:生产级建议在 DRC 后增加人工复核,脚本只拦截明显错误(短路、未连接等)。
• 多板项目:如果有多个 PCB 变体,可以在脚本中加入参数选择不同 .kicad_pcb 文件。
五、效果
把这套脚本加到 Git hooks 或 CI 里,每次提交代码后自动跑一遍:原理图改完 → 提交 → CI 自动生成 Gerber + BOM + DRC 报告,邮件通知结果。从此告别“忘了导出某层”、“钻孔格式不对”的低级失误。
EDA 自动化的核心不是炫技,是把重复性操作交给机器,让工程师专注于设计和审查。KiCad 的 CLI 只是一个起点,Allegro 的 SKILL、Altium 的 DelphiScript 都能实现类似流水线。关键是先搭框架,再逐步完善异常处理,最终让“一键出 Gerber”成为团队习惯。





