InteractiveHtmlBom项目PCB数据结构解析
项目概述
InteractiveHtmlBom是一个用于生成交互式HTML格式PCB物料清单(BOM)的工具。它通过解析PCB设计文件,提取关键信息并转换为结构化的JSON数据,最终生成可在浏览器中交互查看的BOM文档。本文将深入解析其核心数据结构,帮助开发者理解其工作原理。
坐标系与单位系统
在开始解析数据结构前,需要了解两个基础概念:
- 坐标系:采用左上角为原点(0,0),Y轴向下增长的正方向
- 角度系统:所有角度以度为单位,从正X轴向量开始顺时针测量
- 单位系统:虽然支持任意单位,但建议使用mm或mils以避免浏览器处理大数时的问题
核心数据结构:pcbdata
pcbdata是整个项目的核心数据结构,包含了PCB的所有关键信息:
1. 板框与边缘信息
"edges_bbox": {
"minx": 1, // 最小X坐标
"miny": 2, // 最小Y坐标
"maxx": 100, // 最大X坐标
"maxy": 200 // 最大Y坐标
},
"edges": [drawing1, drawing2, ...] // 所有边缘切割绘图
这部分定义了PCB的物理边界,用于确定默认的缩放和平移值,确保整个板子能完整显示在画布上。
2. 绘图层信息
"drawings": {
"silkscreen": { // 丝印层
"F": [...], // 正面
"B": [...] // 背面
},
"fabrication": { // 制造层
"F": [...],
"B": [...]
}
}
包含所有丝印层和制造层的绘图元素,按正反面分组。
3. 封装(Footprint)信息
"footprints": [
footprint1,
footprint2,
...
]
每个元素对应一个元器件的封装信息,索引对应组件的数字ID。
4. 走线与区域信息(可选)
"tracks": {
"F": [...], // 正面走线
"B": [...] // 背面走线
},
"zones": {
"F": [...], // 正面区域
"B": [...] // 背面区域
}
包含PCB的走线(包括过孔)和铺铜区域信息。
5. 其他信息
nets
: 网络名称列表metadata
: PCB元数据(标题、版本、公司等)bom
: 物料清单数据font_data
: 用于PCB上文字的字体数据
绘图元素(drawing)详解
绘图元素是PCB上各种图形的基础构建块,分为图形元素和文本两大类。
图形元素类型
-
线段(segment)
{ "type": "segment", "start": [x, y], "end": [x, y], "width": width }
-
矩形(rect)
{ "type": "rect", "start": [x, y], "end": [x, y], "width": width }
-
圆形(circle)
{ "type": "circle", "start": [x, y], "radius": radius, "filled": 0, // 是否填充 "width": width }
-
圆弧(arc)
{ "type": "arc", "width": width, "start": [x, y], // 圆心 "radius": radius, "startangle": angle1, "endangle": angle2 }
-
贝塞尔曲线(curve)
{ "type": "curve", "start": [x, y], "end": [x, y], "cpa": [x, y], // 控制点A "cpb": [x, y], // 控制点B "width": width }
-
多边形(polygon)
{ "type": "polygon", "filled": 1, // 默认填充 "width": width, "pos": [x, y], "angle": angle, "polygons": [ [[x1,y1], [x2,y2], ...], // 外轮廓 [...] // 可能的内部孔洞 ] }
文本元素
{
"pos": [x, y],
"text": "显示文本",
"height": 文字高度,
"width": 文字宽度,
"justify": [水平对齐, 垂直对齐], // -1:左/上 0:居中 1:右/下
"thickness": 线宽,
"attr": ["italic", "mirrored"], // 属性:斜体、镜像
"angle": 旋转角度,
"ref": 1, // 如果是参考标志符
"val": 1 // 如果是元件值
}
封装(Footprint)结构
封装是PCB上元器件的基础表示,包含焊盘、绘图和元数据:
{
"ref": "参考标志符",
"center": [x, y], // 中心位置
"bbox": { // 边界框信息
"pos": [x, y],
"angle": 旋转角度,
"relpos": [x, y], // 相对于中心的位置
"size": [x, y] // 尺寸
},
"pads": [ // 焊盘列表
{
"layers": ["F", "B"], // 所在层
"pos": [x, y], // 位置
"size": [x, y], // 尺寸
"angle": 角度,
"pin1": 1, // 是否是第一引脚
"shape": "形状", // rect/oval/circle等
"type": "类型", // th(通孔)/smd(表贴)
"net": "网络名称" // 连接的网络
},
...
],
"drawings": [ // 铜层绘图
{
"layer": "F"或"B",
"drawing": drawing对象
}
],
"layer": "F"或"B" // 封装所在层
}
BOM行结构
BOM行是参考集的列表,每个参考集是(参考名称, 封装ID)的元组数组:
[
["R1", 1],
["R2", 2],
...
]
配置(config)结构
配置决定了BOM的显示和行为:
{
"dark_mode": 是否暗黑模式,
"show_pads": 是否显示焊盘,
"show_fabrication": 是否显示制造层,
"show_silkscreen": 是否显示丝印层,
"highlight_pin1": "引脚1高亮方式", // none/all/selected
"redraw_on_drag": 拖动时是否重绘,
"board_rotation": 板子旋转角度,
"bom_view": "BOM显示方式", // bom-only/left-right/top-bottom
"layer_view": "层显示方式", // F/FB/B
"extra_fields": ["额外字段1", ...]
}
实际应用建议
- 性能优化:对于复杂PCB,考虑简化非必要图形元素
- 单位选择:优先使用mm单位,避免浏览器数值处理问题
- 字体处理:预解析常用字符可提高文本渲染效率
- 交互设计:合理配置highlight_pin1等参数增强用户体验
通过深入理解这些数据结构,开发者可以更好地定制和扩展InteractiveHtmlBom的功能,满足特定项目的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考