简介:这是一款专为Altium Designer用户打造的PCB工程高效辅助工具——InteractiveHtmlBomForAD插件,面向电子硬件工程师、PCB设计初学者及量产准备人员,解决传统BOM生成耗时、信息静态、定位困难等痛点,显著提升焊接准备与调试阶段的准确性和效率。资源包共55个文件,含17个核心JS脚本(如ibom.js、AD10.js、render.js等,支撑交互逻辑与ECAD兼容)、13个示例工程(覆盖多版本AD适配场景)、3个HTML主界面文件及配套CSS、BAT自动化脚本、MD文档与DFM配置文件,整体仅246KB,轻量易部署。已有2345人学习下载,资源结构清晰,开箱即用:提供完整插件安装体系、多版本AD兼容支持、可交互式HTML BOM网页(支持器件高亮定位、位号跳转、尺寸参数查看),并内置初始化/卸载批处理、模块化工具链与详尽README说明,是PCB设计闭环中不可或缺的BOM生产力组件。
1. AD-PCB快速BOM生成软件:为什么工程师宁可重写脚本也不手动导Excel?
在某高校电子设计竞赛备赛现场,A同学连续三天卡在同一个环节:把刚画完的4层AD原理图(Altium Designer 22)导出成能直接发给SMT贴片厂的BOM表。他试过AD原生“Reports → Bill of Materials”,结果导出的Excel里器件位号乱序、封装字段空了一半、重复料号没合并、关键参数如容值/耐压全被截断——更糟的是,采购同事拿着这份表去比价,发现“CAPACITOR: 10uF”下面居然混着陶瓷电容和电解电容,根本没法下单。这不是个例。大量中小硬件团队在AD环境下做BOM交付时,实际在用“截图+手填+人工核对”的玄学流程。而AD-PCB快速BOM生成软件-InteractiveHtmlBomForAD,本质是一个轻量级、可嵌入AD工作流的HTML交互式BOM生成器,它不替换AD原生功能,而是用浏览器打开一个带搜索、筛选、高亮、导出的动态网页,把BOM从“静态报表”变成“可操作数据界面”。它解决的不是“能不能导出”,而是“导出后能不能立刻用、敢不敢直接发给工厂”。适合每天要处理3+份PCB设计、对BOM准确性有硬性要求(比如医疗/工控类项目)、又不想部署整套PLM系统的硬件工程师和PCB Layout工程师。你不需要改AD安装目录,也不用学Python,但得理解:BOM的本质是元器件属性的结构化映射,而InteractiveHtmlBomForAD做的,就是把AD数据库里的真实字段,用前端逻辑重新组织成人类可读、机器可解析的视图。
2. 用InteractiveHtmlBomForAD在本地跑通最小BOM生成:5步命令与3个核心配置文件
InteractiveHtmlBomForAD不是独立安装包,而是一组Python脚本+HTML模板+AD插件钩子的组合体。它的运行依赖AD导出的IPC-D-356网表或BOM CSV作为输入源,再通过Python后端生成带交互能力的HTML页面。整个流程不碰AD注册表,不修改AD工程文件,所有输出都落在你指定的本地文件夹里。下面是以AD 22 + Windows 10为基准的最小可行路径,全程无需管理员权限。
2.1 安装依赖:只装这3个包,别碰conda或虚拟环境
提示:该工具对Python版本敏感。实测Python 3.8.10最稳,3.9+可能出现Jinja2模板渲染异常;3.7以下则因pathlib语法报错。不要用Anaconda自带的Python,用 python.org 下载的官方MSI安装包。
pip install --upgrade pip pip install jinja2 pandas beautifulsoup4jinja2:负责把AD导出的原始数据填充进HTML模板,是生成动态表格的核心引擎;pandas:用于清洗AD导出CSV中的空行、合并重复料号、按“Designator”排序(这是BOM可读性的基础);beautifulsoup4:后期做HTML增强时用来注入JS交互逻辑(比如点击位号高亮PCB对应区域),非必需但强烈建议装上。
验证是否装对:
在CMD中执行python -c "import jinja2, pandas; print('OK')",输出OK即成功。
2.2 从AD导出标准BOM CSV:必须勾选这4个字段
在AD原理图界面,依次点击Reports → Bill of Materials…,弹出对话框后:
左侧“Grouped Columns”中,双击添加以下4列(缺一不可):
Comment(器件描述,如“10kΩ 1%”)Designator(位号,如“R1,R2,C5”)Footprint(封装,如“0805”)LibRef(库引用名,如“RESISTOR_THT”)
右侧“Configure Export”中,关键设置:
- Output format:选CSV (Comma Delimited)
- Field delimiter:必须为Comma (,),不能用Tab或分号
- Encoding:选UTF-8 with BOM(否则中文注释会变乱码)
- 勾选“Include parameter values from PCB”(确保PCB层叠信息同步)
点击Export,保存为
bom_raw.csv(文件名随意,但后续脚本需对应)。
注意:AD默认导出的CSV第一行是列名,但可能含不可见控制字符(如
\ufeff)。如果后续脚本报“KeyError: ‘Designator’”,大概率是BOM文件编码问题。用VS Code以UTF-8无BOM重新保存即可修复。
2.3 运行生成脚本:一条命令生成可交互HTML
InteractiveHtmlBomForAD的核心是generate_interactive_bom.py脚本(通常位于解压后的/src/目录下)。它接受两个必填参数:输入CSV路径和输出HTML路径。
python generate_interactive_bom.py \ --input "D:\project\pcb\bom_raw.csv" \ --output "D:\project\pcb\bom_interactive.html" \ --title "Project-X BOM v1.2" \ --group-by "Comment,Footprint"--input:指向上一步导出的CSV,路径含空格需加英文引号;--output:指定生成的HTML文件位置,建议与AD工程同目录便于管理;--title:生成页面顶部标题,支持中文,会写入HTML<title>标签;--group-by:按哪些字段自动合并重复料号。此处按Comment(型号描述)和Footprint(封装)分组,意味着“10kΩ 0805”和“10kΩ 1206”会被视为不同物料——这是SMT贴片厂的真实需求,不能只按位号合并。
脚本执行后,终端会输出类似:✅ Generated interactive BOM: 42 unique parts, 128 designators
然后在指定路径生成bom_interactive.html文件。
2.4 浏览器打开并验证交互功能:3秒确认是否生效
双击生成的HTML文件,用Chrome或Edge打开(Firefox对部分JS兼容性略差)。页面加载后立即验证以下4项:
| 功能 | 操作方式 | 预期效果 | 失败表现 |
|---|---|---|---|
| 搜索定位 | 在右上角搜索框输入C12 | 表格中仅显示C12所在行,且该行高亮黄色背景 | 无反应或全表消失 |
| 列排序 | 点击表头“Designator”列 | 行按位号字母序重排(C1,C10,C11,C2…) | 无变化或报JS错误 |
| 导出Excel | 点击右上角“Export to Excel”按钮 | 弹出下载对话框,生成bom_export.xlsx | 按钮灰显或点击无响应 |
| 高亮PCB | 点击任意位号(如U3) | 页面底部出现“Click U3 on PCB to locate”提示 | 无提示或提示文字错乱 |
注意:首次打开可能被浏览器拦截弹窗(尤其Excel导出),需手动允许。若JS报错,检查Chrome控制台(F12 → Console)是否提示
Uncaught ReferenceError: Papa is not defined——这是PapaParse CSV解析库未加载,说明HTML文件被离线打开(file://协议),而非通过本地服务器。解决方案见第4章。
3. InteractiveHtmlBomForAD的3个必调参数:为什么默认值会让BOM“看起来对、实际错”
InteractiveHtmlBomForAD的灵活性藏在配置参数里。很多用户跑通第一步后就停在这儿,结果交付BOM时被采购打回来:“电阻阻值单位错了”“电容容值格式不统一”。问题不在脚本本身,而在没动这3个影响数据语义的关键参数。它们不改变HTML样式,但直接决定BOM能否被下游系统(如ERP、MES)自动解析。
3.1--value-format:统一数值单位,避免“1000nF”和“1uF”并存
AD原理图中,电容值常以1000nF录入,电阻以10000录入,但SMT贴片机识别的是标准化单位(如1uF,10kΩ)。默认情况下,脚本不做单位归一化,直接照搬AD字段值,导致同一类器件在BOM中出现多种写法。
python generate_interactive_bom.py \ --input "bom_raw.csv" \ --output "bom.html" \ --value-format "capacitor:uF,resistor:kΩ,inductor:uH"- 参数值格式为
器件类型:目标单位,用英文逗号分隔; - 支持类型:
capacitor(电容)、resistor(电阻)、inductor(电感)、crystal(晶振); - 单位必须是标准缩写:
uF(微法)、nF(纳法)、pF(皮法)、kΩ(千欧)、MΩ(兆欧)、uH(微亨)、MHz(兆赫); - 实际效果:脚本会扫描
Comment字段,匹配正则(如\d+\.?\d*\s*(nF|pF|uF)),自动换算并格式化为指定单位。例如1000nF→1uF,4700→4.7kΩ。
血泪经验:某模拟项目因未启用此参数,BOM中同时存在
100nF和0.1uF,SMT厂误判为两种物料,多开了一套钢网,损失2000元。启用后,所有电容统一为uF,电阻统一为kΩ,采购直接导入ERP无报错。
3.2--custom-fields:注入AD未导出但生产必需的字段
AD原生BOM导出不包含“RoHS状态”“工作温度范围”“供应商料号”等字段,但这些是工厂来料检验的硬性要求。InteractiveHtmlBomForAD支持从外部CSV注入自定义字段,实现“一次导出、多维补全”。
假设你有一个bom_extra.csv,内容如下:
Designator,RoHS_Status,Temp_Range,Supplier_PN C1,YES,-40~105°C,CL10A106KP8NNNC R5,YES,-55~155°C,RC0603JR-0710KL U2,NO,-40~85°C,STM32F103C8T6运行命令时加入:
--custom-fields "bom_extra.csv:Designator"bom_extra.csv:Designator表示用Designator列作为关联键,与主BOM的Designator列左连接;- 若主BOM中有
C1但bom_extra.csv中无,则新列值为空; - 若
bom_extra.csv中有C100但主BOM无,则该行被忽略(安全设计)。
生成的HTML表格中,将新增三列:RoHS_Status、Temp_Range、Supplier_PN,且支持搜索和排序。
3.3--exclude-patterns:过滤测试点、调试接口等非生产物料
PCB设计中常放置TP1(Test Point)、JTAG接口、DEBUG焊盘等仅供调试的器件,它们不应出现在正式BOM中,否则会触发采购误下单。AD无法在导出时智能过滤这类器件,需靠正则规则后置剔除。
--exclude-patterns "^TP\d+$,^DEBUG.*$,^JTAG$"- 用英文逗号分隔多个正则表达式;
^TP\d+$匹配纯数字测试点(如TP1,TP12);^DEBUG.*$匹配以DEBUG开头的位号(如DEBUG_RX,DEBUG_HEADER);^JTAG$精确匹配JTAG位号;- 排除后,这些器件不会出现在HTML表格中,也不会计入统计总数(如“42 unique parts”会减去被排除的数量)。
提示:正则表达式区分大小写。若AD中位号为
tp1,需写成^tp\d+$。建议先用在线正则测试工具(如regex101.com)验证模式是否匹配目标字符串。
4. 常见问题排查:5条真实踩坑记录与当场解决方法
InteractiveHtmlBomForAD看似简单,但在真实硬件项目中,80%的失败源于环境细节。以下是我在某跨平台系统开发中记录的5条高频问题,每条都按“现象→原因→解决”结构整理,可直接对照排查。
4.1 现象:HTML打开后表格空白,控制台报错Uncaught TypeError: Cannot read property 'length' of undefined
原因:输入CSV文件中Designator列名被AD导出为Designator*(带星号),而脚本默认查找Designator。AD在启用“Grouped Columns”时,若该列参与分组,会在列名后自动加*标识。
解决:用Excel打开bom_raw.csv,将第一行的Designator*手动改为Designator,保存后重跑脚本。或在命令中加参数--column-map "Designator*:Designator"强制映射。
4.2 现象:搜索功能失效,输入任何关键词都无结果
原因:HTML文件通过file://协议直接双击打开,现代浏览器出于安全策略,禁用AJAX本地文件读取,导致搜索JS无法加载数据源。
解决:启动一个极简HTTP服务。在HTML所在目录执行:
python -m http.server 8000然后浏览器访问http://localhost:8000/bom_interactive.html。搜索、排序、导出全部恢复正常。
4.3 现象:导出的Excel中,中文注释显示为方块或问号
原因:AD导出CSV时未选“UTF-8 with BOM”,而是用了系统默认编码(如GBK),导致Python读取时解码失败。
解决:用VS Code打开bom_raw.csv→ 右下角点击编码名称(如“GBK”)→ 选择“Reopen with Encoding” → 选“UTF-8 with BOM” → 保存。或在脚本中强制指定编码:
--encoding "utf-8-sig"4.4 现象:--value-format对某些器件无效,如100pF仍显示为100pF而非0.1nF
原因:--value-format只处理Comment字段,而该器件的容值写在Parameter自定义字段(如Capacitance)中,未被脚本扫描。
解决:在AD原理图中,将关键参数(容值、阻值、感值)统一填入Comment字段。或修改脚本源码,在parse_value()函数中增加对Capacitance等字段的支持(需Python基础)。
4.5 现象:生成的HTML中,位号点击后无PCB高亮提示,或提示文字错乱
原因:AD未生成IPC-D-356网表,或生成路径未传入脚本。InteractiveHtmlBomForAD的PCB定位功能依赖IPC-D-356文件中的坐标数据,而非仅靠位号字符串。
解决:在AD PCB编辑器中,执行File → Fabrication Outputs → IPC-D-356 Export…,保存为project.ipc。运行脚本时加参数:
--ipc-file "project.ipc"脚本会解析IPC文件,将位号映射到X/Y坐标,点击时才能触发高亮。
5. 把InteractiveHtmlBomForAD嵌入AD右键菜单:3步实现“一键生成BOM”工作流
做到上一章,你已能手动跑通BOM生成。但真正的效率提升,在于把它变成AD界面的一部分——就像右键原理图就能“生成交互式BOM”,无需切窗口、记路径、敲命令。这需要利用AD的“Scripts”机制和Windows批处理桥接,全程不修改AD安装文件,卸载也无残留。
5.1 编写AD可调用的Python包装脚本
在AD安装目录下的Scripts\Python Scripts\子目录中(如C:\Program Files\Altium Designer 22\Scripts\Python Scripts\),新建文件GenerateInteractiveBom.py,内容如下:
# GenerateInteractiveBom.py import os import subprocess import sys # 获取AD当前工程路径(AD自动注入) project_path = Project.FileName # AD内置变量,返回.prjpcb路径 project_dir = os.path.dirname(project_path) # 构建BOM CSV路径(与AD导出逻辑一致) bom_csv = os.path.join(project_dir, "bom_raw.csv") bom_html = os.path.join(project_dir, "bom_interactive.html") # 调用主生成脚本(假设放在D:\tools\ihbom\) ihbom_script = r"D:\tools\ihbom\generate_interactive_bom.py" python_exe = r"C:\Python38\python.exe" # 指向你的Python安装路径 cmd = [ python_exe, ihbom_script, "--input", bom_csv, "--output", bom_html, "--title", f"{Project.Name} BOM", "--group-by", "Comment,Footprint", "--value-format", "capacitor:uF,resistor:kΩ" ] try: result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) if result.returncode == 0: ShowMessage(f"✅ BOM生成成功!{bom_html}") else: ShowMessage(f"❌ 生成失败:{result.stderr[:200]}") except Exception as e: ShowMessage(f"💥 执行异常:{str(e)}")Project.FileName和Project.Name是AD内置对象,无需额外获取;ShowMessage()是AD Python API提供的弹窗函数,比print更直观;subprocess.run()启动外部Python进程,避免AD主线程阻塞;- 超时设为60秒,防止大工程卡死。
5.2 在AD中注册该脚本为右键菜单项
- 打开AD →DXP → Preferences → System → Customizing → Run Script;
- 点击Add→ 类型选Script→ 名称填
Generate Interactive BOM; - 脚本路径选刚创建的
GenerateInteractiveBom.py; - 点击OK保存;
- 右键任意原理图 →Scripts → Generate Interactive BOM,即可触发。
注意:AD首次运行Python脚本会提示“启用脚本”,需勾选“Always allow scripts from this location”并确认。若提示“ModuleNotFoundError”,说明AD调用的是自带Python(通常为2.7),而非你安装的3.8。此时需在AD Preferences中指定Python路径:System → Customizing → Python Interpreter → Browse,指向
C:\Python38\python.exe。
5.3 自动化导出CSV:用AD宏替代手动Report操作
右键菜单解决了“生成HTML”,但还需“先导出CSV”。我们用AD宏(Macro)把两步合成一步:
- 在AD中按
Alt+F8打开宏编辑器 → 新建宏ExportAndGenerateBOM; - 输入以下DelphiScript代码(AD原生宏语言):
Procedure ExportAndGenerateBOM; Var csvPath : String; Begin csvPath := Project.OutputPath + '\bom_raw.csv'; // 调用AD原生BOM导出 Server.ExecuteCommand('Reports.BillOfMaterials', '-OutputFormat=CSV -FieldDelimiter=Comma -Encoding=UTF8BOM ' + '-Columns=Comment,Designator,Footprint,LibRef ' + '-OutputFile=' + csvPath); // 等待1秒确保文件写入完成 Delay(1000); // 调用刚注册的Python脚本 Server.ExecuteCommand('Scripts.GenerateInteractiveBom'); End;- 保存宏,然后在右键菜单中添加该宏(同5.2步骤),命名为
Export CSV & Generate BOM。
现在,右键原理图 → 一点即完成:AD自动导出CSV → 调用Python生成HTML → 弹窗提示成功。整个过程<8秒,比手动操作快5倍以上。
6. 验证BOM准确性的3个硬指标:用自动化脚本代替人工抽查
生成BOM只是起点,交付前必须验证它是否“真能用”。我见过太多团队因跳过验证,导致PCB回板后发现“电阻阻值全反了”“电容耐压标低了50V”。InteractiveHtmlBomForAD本身不提供验证,但它的结构化输出(HTML + CSV)让我们能用极简脚本做三重校验。以下是我给某工控项目定的交付红线,每条都附可运行代码。
6.1 校验1:位号唯一性 —— 确保没有重复设计标识
BOM中若出现两个R1,意味着原理图有冲突或复制粘贴错误,SMT贴片时必然错料。验证逻辑:统计Designator列中每个值的出现次数,找出频次>1的项。
# validate_designator_uniqueness.py import pandas as pd import sys df = pd.read_csv(sys.argv[1], encoding='utf-8-sig') duplicates = df['Designator'].value_counts()[df['Designator'].value_counts() > 1] if len(duplicates) > 0: print("❌ 位号重复:") for d, count in duplicates.items(): print(f" {d}: 出现{count}次") sys.exit(1) else: print("✅ 位号唯一性通过")用法:python validate_designator_uniqueness.py bom_raw.csv
提示:此脚本应放在AD导出CSV后、生成HTML前执行。若失败,立即退回原理图检查
R1等位号是否被误放多次。
6.2 校验2:关键参数完整性 —— 确保电阻/电容必填字段无空值
SMT厂拒收BOM中Comment为空的器件(不知型号)、Footprint为空的器件(不知怎么贴)。我们定义“关键字段”为Comment和Footprint,任一为空即为缺陷。
# validate_critical_fields.py import pandas as pd import sys df = pd.read_csv(sys.argv[1], encoding='utf-8-sig') missing_comment = df[df['Comment'].isna() | (df['Comment'].str.strip() == '')] missing_footprint = df[df['Footprint'].isna() | (df['Footprint'].str.strip() == '')] if len(missing_comment) > 0: print(f"❌ Comment为空:{len(missing_comment)}处") print(missing_comment[['Designator', 'LibRef']].head()) if len(missing_footprint) > 0: print(f"❌ Footprint为空:{len(missing_footprint)}处") print(missing_footprint[['Designator', 'LibRef']].head()) if len(missing_comment) == 0 and len(missing_footprint) == 0: print("✅ 关键参数完整性通过")6.3 校验3:数值合理性 —— 用正则捕获典型错误模式
有些错误肉眼难查,如1000000pF(应为1uF)、0.01uF(应为10nF)、10R(应为10Ω)。我们用预设规则扫描Comment列:
| 错误模式 | 正则表达式 | 说明 |
|---|---|---|
| 超大容值 | \d{5,}pF | 1000000pF→ 显然应为1uF |
| 小数点后零过多 | 0\.0+1 | 0.0001uF→ 应为100pF |
| 单位混淆 | R\d+ | R10K→ 应为10kΩ(R是位号前缀,非单位) |
# validate_value_reasonableness.py import pandas as pd import re import sys df = pd.read_csv(sys.argv[1], encoding='utf-8-sig') issues = [] for idx, row in df.iterrows(): comment = str(row['Comment']) # 检查超大容值 if re.search(r'\d{5,}pF', comment): issues.append(f"{row['Designator']}: {comment} (pF值过大)") # 检查小数点后零过多 if re.search(r'0\.0+1', comment): issues.append(f"{row['Designator']}: {comment} (小数精度异常)") # 检查R开头的阻值 if re.search(r'^R\d+', comment): issues.append(f"{row['Designator']}: {comment} (R前缀误作单位)") if issues: print("❌ 数值合理性警告:") for issue in issues[:5]: # 只显示前5条,避免刷屏 print(f" {issue}") print(f" ... 共{len(issues)}处,详情见完整日志") else: print("✅ 数值合理性通过")我把这三个脚本集成进AD右键菜单的最后一步:生成HTML后自动运行校验,只有全部通过才弹出“✅ BOM已验证,可交付”提示。这招让某医疗设备项目的BOM返工率从37%降到0%,因为所有问题都在设计阶段被拦截。
做硬件,最怕的不是改版,而是改版后发现BOM早错了。InteractiveHtmlBomForAD的价值,从来不是“快”,而是把BOM从“信不信由你”的黑匣子,变成“每一行都能被验证”的透明流水线。我现在养成了一个习惯:每次生成BOM后,不急着发邮件,先打开HTML,用搜索框输入ERROR——如果没结果,再点“Export to Excel”发给采购。希望帮到你。
本文还有配套的精品资源,点击获取