问题描述

  • 基于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相关推荐

  1. 【已解决】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 ...

  2. CAM350导入gerber文件报错“Apertures are used which have a size of 0“的解决

    文章指出,出现这一警告的原因一般是 文件设计的时候可能出现变形 设计画线时有使用0D码 异形焊盘没有D码 其中3比较少见.如果是原因1或2导致,需要定位该D码对应的线条.解决方法如下: 按A键打开Ap ...

  3. 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. ...

  4. python3 for index_Python3 抓取数据报错IndexError: list index out of range

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 from lxml import etree import requests BASE_DOMAIN = "http://www.dytt8.n ...

  5. android --------- Android10系统上访问本地相机下的视频文件报错 /storage/emulated/0/DCIM/Camera/ open failed: EACCES

    最近在Android10系统上访问本地相机下的视频文件报错: 华为Mate30上试的 FileNotFoundException(/storage/emulated/0/DCIM/Camera/xx. ...

  6. cadence SPB17.4 - allegro - CAM350_V10.7CN 引入槽孔(.rou)文件报错问题的优雅解决思路

    cadence SPB17.4 - allegro - CAM350_V10.7CN 引入槽孔(.rou)文件报错问题的优雅解决思路 文章目录 cadence SPB17.4 - allegro - ...

  7. ieda ts文件报错_Intellij IDEA就这样配置,快到飞起!

    目录 1.设置maven 2.IDEA 设置代码行宽度 3.IDEA 提示不区分大小写 4.IntelliJ强制更新Maven Dependencies 5.idea的环境配置默认保存位置 6.隐藏不 ...

  8. Maven项目中pox.xml文件报错以及项目编译错误

    我用Eclipse开发Maven项目,本来好好的,但是后来莫名其妙的其中pom.xml文件报错,后来执行install命令时又编译不通过报错.我痛苦地摸索了一整天,最后才把问题解决了.虽然问题解决了, ...

  9. R文件报错原因及解决办法汇总

    1.如果是导入项目出现这个问题,一般是R文件没有更新造成(据说导入项目,R不会自动更新).可以Project--clean以下,R文件会重新生成. 2.选择工程,右键 Android Tools &g ...

最新文章

  1. 赠书 | 从阿里到Facebook,一线大厂这样做深度学习推荐系统
  2. java 接口与抽象类的区别
  3. python常用内置函数总结-python常见的内置函数
  4. KnockoutJS + My97DatePicker
  5. django post and get?
  6. intel编译器_试试吧!用 Go 写一个即时编译器(JIT)
  7. 关于open***的实验总结
  8. 蔚来汽车:ES6和ES8首任车主可享受终生免费换电服务
  9. java中$和 的区别详解_MyBatis中#{}和${}的区别详解
  10. 03_java基础(四)之方法的创建与调用
  11. 如何将屏幕截图保存到桌面以外的自定义文件夹?
  12. Java多线程之可见性与原子性——synchronized VS volatile
  13. 迪信通机器人_未来已来,迪信通携手达闼科技共研智能零售机器人
  14. 01web前端笔试试题
  15. project安装教程 内含各个版本安装包
  16. POJO、PO、DTO、DAO、BO、VO需要搞清楚的概念 1
  17. 软考 | 2015年上半年 软件设计师 下午试卷
  18. PumpkinRaising靶机渗透
  19. javascript与css压缩工具
  20. 在windows平台上打造Linux开发环境-洋葱先生-杨少通

热门文章

  1. 京东12年被裁,昨天赔偿到账了,加调休和年假总共47万多,感谢公司!
  2. C#扩展(2):Random的扩展
  3. 通过VBA导出word文档中的图片
  4. 常用日本语1000句+简单用语
  5. ThinkPHP导入Excel文件到数据库的简单实现
  6. kindeditor 上传图片返回带 当前网址的图片地址
  7. nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)
  8. Framebuffer应用开发
  9. ffmpeg中合并音频文件
  10. MATLAB中强行终止执行程序的4种方法