使用pcb-tools解码Gerber文件报错IndexError: list index out of range
问题描述:
- 基于Github提供的示例代码编写:
import gerber
from gerber.render.cairo_backend import GerberCairoContext# Read gerber and Excellon files
top_copper = gerber.read('Gerber.GBX')
# nc_drill = gerber.read('example.txt')# Rendering context
ctx = GerberCairoContext()# Create SVG image
top_copper.render(ctx, filename='res.png')
# nc_drill.render(ctx, 'composite.svg')
- Gerber文件Gerber.GBX部分内容如下:
G04 Generated by CircuitCAM Version 4.0*
%FSLAX24Y24*%
%MOIN*%
%ADD10C,0.003937*%
%ADD888C,0.003937*%
%ADD913R,0.051181X0.031496*%
%AMROUNDED906*21,1,0.025000,0.012126,0,0*
*21,1,0.017126,0.020000,0,0*
*1,1,0.007874,0.008563,0.006063*
*1,1,0.007874,0.008563,-0.006063*
*1,1,0.007874,-0.008563,-0.006063*
*1,1,0.007874,-0.008563,0.006063*%
%ADD906ROUNDED906*%
%AMROUNDED903*21,1,0.020000,0.017126,0,0*
*21,1,0.012126,0.025000,0,0*
*1,1,0.007874,0.006063,0.008563*
*1,1,0.007874,0.006063,-0.008563*
*1,1,0.007874,-0.006063,-0.008563*
*1,1,0.007874,-0.006063,0.008563*%
%ADD903ROUNDED903*%
%ADD910R,0.021654X0.053150*%以下略去。。。
- 报错信息如下:
Traceback (most recent call last):File "D:/Project/RectClustering/pcb-tools-test.py", line 5, in <module>top_copper = gerber.read('Gerber.GBX')File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\common.py", line 41, in readreturn loads(data, filename)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\common.py", line 65, in loadsreturn rs274x.loads(data, filename=filename)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\rs274x.py", line 70, in loadsreturn GerberParser().parse_raw(data, filename)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\rs274x.py", line 270, in parse_rawself.evaluate(stmt)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\rs274x.py", line 498, in evaluateself._evaluate_param(stmt)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\rs274x.py", line 616, in _evaluate_paramself._define_aperture(stmt.d, stmt.shape, stmt.modifiers)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\rs274x.py", line 584, in _define_apertureaperture = self.macros[shape].build(modifiers)File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\gerber_statements.py", line 438, in buildself.primitives.append(AMCenterLinePrimitive.from_gerber(primitive))File "C:\Anaconda3\envs\pytorch_py37\lib\site-packages\gerber\am_statements.py", line 888, in from_gerberrotation = float(modifiers[6])
IndexError: list index out of range
解决过程:
- 查看pcb-tools源码,发现报错信息来自如下代码:
class AMCenterLinePrimitive(AMPrimitive):......@classmethoddef from_gerber(cls, primitive):modifiers = primitive.strip(' *').split(",")code = int(modifiers[0])exposure = 'on' if float(modifiers[1]) == 1 else 'off'width = float(modifiers[2])height = float(modifiers[3])center = (float(modifiers[4]), float(modifiers[5]))rotation = float(modifiers[6])return cls(code, exposure, width, height, center, rotation)......
报错信息来自rotation = float(modifiers[6])
这一行代码,在此处打断点以调试模式运行,发现传入的primitive
参数21,1,0.025000,0.012126,0,0
经strip和split操作后生成的list只有6个元素导致list越界。
查看报错的栈信息,发现primitive
参数实际上是来自于Gerber文件内data
的解码,于是在Gerber文件中搜索21,1,0.025000,0.012126,0,0
,发现位于Gerber文件的第7和第8行处。报错根源在于,pcb-tools源码中需要7个参数,但Gerber文件此处只提供了6个参数。第7个参数是旋转角度,干脆自己手动添个0尝试下。同时注意到第14和第15行也是同样问题,顺手也都添了个0。
再次运行,问题解决。猜想可能是生成Gerber文件的软件问题导致Gerber文件不符合规范,同时也表明pcb-tools的源码鲁棒性有待加强,居然在源码中直接写死rotation = float(modifiers[6])
。
使用pcb-tools解码Gerber文件报错IndexError: list index out of range相关推荐
- 【已解决】labelme编辑label时,闪退;报错“IndexError: list index out of range”
当前虚拟环境: python 3.6.13 labelme 5.0.1 pip 21.3.1 1.IndexError: list index out of range ...
- CAM350导入gerber文件报错“Apertures are used which have a size of 0“的解决
文章指出,出现这一警告的原因一般是 文件设计的时候可能出现变形 设计画线时有使用0D码 异形焊盘没有D码 其中3比较少见.如果是原因1或2导致,需要定位该D码对应的线条.解决方法如下: 按A键打开Ap ...
- python提示list index out of range_为什么python报错说“list index out of range”
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import pandas as pd import numpy as np path1 = r'C:\Users\user\Desktop\radar. ...
- python3 for index_Python3 抓取数据报错IndexError: list index out of range
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 from lxml import etree import requests BASE_DOMAIN = "http://www.dytt8.n ...
- android --------- Android10系统上访问本地相机下的视频文件报错 /storage/emulated/0/DCIM/Camera/ open failed: EACCES
最近在Android10系统上访问本地相机下的视频文件报错: 华为Mate30上试的 FileNotFoundException(/storage/emulated/0/DCIM/Camera/xx. ...
- cadence SPB17.4 - allegro - CAM350_V10.7CN 引入槽孔(.rou)文件报错问题的优雅解决思路
cadence SPB17.4 - allegro - CAM350_V10.7CN 引入槽孔(.rou)文件报错问题的优雅解决思路 文章目录 cadence SPB17.4 - allegro - ...
- ieda ts文件报错_Intellij IDEA就这样配置,快到飞起!
目录 1.设置maven 2.IDEA 设置代码行宽度 3.IDEA 提示不区分大小写 4.IntelliJ强制更新Maven Dependencies 5.idea的环境配置默认保存位置 6.隐藏不 ...
- Maven项目中pox.xml文件报错以及项目编译错误
我用Eclipse开发Maven项目,本来好好的,但是后来莫名其妙的其中pom.xml文件报错,后来执行install命令时又编译不通过报错.我痛苦地摸索了一整天,最后才把问题解决了.虽然问题解决了, ...
- R文件报错原因及解决办法汇总
1.如果是导入项目出现这个问题,一般是R文件没有更新造成(据说导入项目,R不会自动更新).可以Project--clean以下,R文件会重新生成. 2.选择工程,右键 Android Tools &g ...
最新文章
- 赠书 | 从阿里到Facebook,一线大厂这样做深度学习推荐系统
- java 接口与抽象类的区别
- python常用内置函数总结-python常见的内置函数
- KnockoutJS + My97DatePicker
- django post and get?
- intel编译器_试试吧!用 Go 写一个即时编译器(JIT)
- 关于open***的实验总结
- 蔚来汽车:ES6和ES8首任车主可享受终生免费换电服务
- java中$和 的区别详解_MyBatis中#{}和${}的区别详解
- 03_java基础(四)之方法的创建与调用
- 如何将屏幕截图保存到桌面以外的自定义文件夹?
- Java多线程之可见性与原子性——synchronized VS volatile
- 迪信通机器人_未来已来,迪信通携手达闼科技共研智能零售机器人
- 01web前端笔试试题
- project安装教程 内含各个版本安装包
- POJO、PO、DTO、DAO、BO、VO需要搞清楚的概念 1
- 软考 | 2015年上半年 软件设计师 下午试卷
- PumpkinRaising靶机渗透
- javascript与css压缩工具
- 在windows平台上打造Linux开发环境-洋葱先生-杨少通
热门文章
- 京东12年被裁,昨天赔偿到账了,加调休和年假总共47万多,感谢公司!
- C#扩展(2):Random的扩展
- 通过VBA导出word文档中的图片
- 常用日本语1000句+简单用语
- ThinkPHP导入Excel文件到数据库的简单实现
- kindeditor 上传图片返回带 当前网址的图片地址
- nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)
- Framebuffer应用开发
- ffmpeg中合并音频文件
- MATLAB中强行终止执行程序的4种方法