解析钻孔(Excellon)格式前首先得了解此格式,这样才能更好的解析呀。

一个钻孔里面包含的基本信息如下:

1.单位:公式mm,英制inch

2.省零方式:前省零,后省零

3.坐标方式:绝对坐标,相对坐标

4.坐标位数:3:3,2:4

5.钻孔刀径信息

6.钻孔坐标信息

更多EXCELLON格式详见

https://wenku.baidu.com/view/4e9553b765ce0508763213e9.html

https://wenku.baidu.com/view/3a8f323b87c24028915fc309.html?rec_flag=default&sxts=1538927482555

一.数据结构信息

M48           钻孔格式开始头部
METRIC,TZ  公制 后省零
M72 单位英制 公制为M71
T01C0.0100 第1把刀0.0100 inch
T02C0.0335 第2把刀0.0335 inch
T03C0.0400 第3把刀0.0400 inch
T04C0.1300 第4把刀0.1300 inch
% 准备进入对应钻孔坐标区域
T01 第一把刀
X14333Y7000 钻孔XY坐标
X16333Y6500 钻孔XY坐标
M30 钻孔结束

此结构仅用于解析Excellon格式绘出钻孔图形,

后续改进点:

1.需增加G84,G85 扩孔;槽孔

2.需增加支持绝对坐标,

3.若要扩展用户交互功能,需改进此结构,钻孔目前是统一在一个集合中的,需改为按刀具大小分类存储

4.钻孔格式固定几类格式3:3,2:4,无法智能匹配钻孔格式,需改为依据板板尺寸或线路焊盘与钻孔格式多次匹配最佳钻孔格式

5.此为解析是基于常规钻孔格式解析,特殊钻孔格式是不支持的.所以此点需改进.

二.JS代码实现:

function loadDrill(text) {
text = text.replace(/^[\s%]*M48/, '');
text = text.replace(/[^\S\n]+/g, ''); function numVal(x) {
if(x[0] == '+')
return numVal(x.slice(1));
if(x[0] == '-')
return -numVal(x.slice(1));
if(x == '0')
return 0;
if(g.omitLead)
while(x.length < g.num)
x = '0'+x;
else
while(x.length < g.num)
x += '0';
return parseFloat(x.slice(0, g.int)+'.'+x.slice(g.int), 10);
} var cmds = text.split('\n'); var g = {offA: 0, offB: 0, shapes: [], cmds: [], scale: 1}, shape, body = false, prevX = 0, prevY = 0; for(var i = 0; i < cmds.length; i++) {
var d = cmds[i];
if(!body) {
if(d[0] == 'T') {
var r = /^T(\d+)[^C]*C([\d.]+)/.exec(d); // assert(r);
g.shapes[parseInt(r[1], 10)] = ['C', +r[2]];
}
else if(d == 'METRIC,LZ')
g.scale = 1, g.omitLead = false, g.int = 3, g.dec = 3, g.num = 6;
else if(d == 'METRIC,TZ' || d == 'M71')
g.scale = 1, g.omitLead = true, g.int = 3, g.dec = 3, g.num = 6;
else if(d == 'INCH,LZ')
g.scale = 25.4, g.omitLead = false, g.int = 2, g.dec = 4, g.num = 6;
else if(d == 'INCH,TZ' || d == 'M72')
g.scale = 25.4, g.omitLead = true, g.int = 2, g.dec = 4, g.num = 6;
else if(d == '%')
body = true;
} else {
function getNum(offset) {
var r = /^[-+\d]*/.exec(d = d.slice(offset)); // assert(r);
d = d.slice(r[0].length);
return numVal(r[0]);
}
if(d[0] == 'T')
shape = parseInt(d.slice(1), 10);
else if(d[0] == 'R') {
var r = /^\d+/.exec(d = d.slice(1)); // assert(r);
var nr = parseInt(r[0], 10), dx = 0, dy = 0;
d = d.slice(r[0].length);
if(d[0] == 'X')
dx = getNum(1);
if(d[0] == 'Y')
dy = getNum(1); // assert(!d.length);
for(var x = prevX, y = prevY, j = 0; j < nr; j++)
x += dx, y += dy, g.cmds.push([(1<<2) | 3, shape, x, y]);
prevX = x, prevY = y;
}
else {
var x = prevX, y = prevY, coords = false;
if(d[0] == 'X')
x = getNum(1), coords = true;
if(d[0] == 'Y')
y = getNum(1), coords = true;
if(coords) {
g.cmds.push([(1<<2) | 3, shape, x, y]);
prevX = x, prevY = y;
}
}
}
}
return g;
};

三.钻孔解析绘图Web效果图

JS解析展示,无交互功能,虽然是在前端,但最佳作法解析动作放在后端,后端解析后的数据或图像传送到前端

PCB javascript解析钻孔(Excellon)格式实现方法的更多相关文章

  1. PCB javascript解析Gerber274X格式实现方法

    解析钻Gerber274X格式前首先得了解此格式,这样才能更好的解析呀. 一个Gerber274X里面包含的基本信息如下: 1.单位:公式mm,英制inch 2.省零方式:前省零,后省零 3.坐标方式 ...

  2. javascript 解析ajax返回的xml和json格式的数据

    写个例子,以备后用 一.JavaScript 解析返回的xml格式的数据: 1.javascript版本的ajax发送请求 (1).创建XMLHttpRequest对象,这个对象就是ajax请求的核心 ...

  3. 在JavaScript种遇到这样的错误如何解决XML 解析错误:格式不佳 位置:http:/... 行 27,列 32:

    相信很多人在开发的过程中都会遇到在js中解析xml文档的问题.有时候文档解析失败,但就是不知道怎么失败的,哪里格式不对.这里教大家一个方法来排查JavaScript解析xml文档格式出错的办法. 1. ...

  4. Javascript将字符串日期格式化为yyyy-mm-dd的方法 js number 类型 没有length 属性 string类型才有

    日期格式化相信对于大家来说再熟悉不过,最近工作中自己利用Javascript就写了一个,现在将实现的代码分享给大家,希望对有需要的朋友们能有所帮助,感兴趣的朋友们下面来一起看看吧. 这篇文章主要介绍的 ...

  5. ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例

    ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例 2012年04月27日 16:59:16 奋斗的小壁虎 阅读数:4500   ...

  6. Java解析XML的四种方法详解 - 转载

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...

  7. JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决

    JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...

  8. Javascript 获取链接(url)参数的方法

    有时我们需要在客户端获取链接参数,一个常见的方法是将链接当做字符串,按照链接的格式分解,然后获取对应的参数值.本文给出的就是这个流程的具体实现方法. 当然,我们也可以用正则直接匹配,文章中也给出了一个 ...

  9. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

随机推荐

  1. 浅析Oracle中的不等于号

    前几天碰到一个关于Oracle不等于的问题,最后搜索了一下,发现下面资料,拿来跟大家分享一下,需要的朋友可以参考下     关于Oracle中的不等于号: 在Oracle中, <> != ...

  2. Python selenium chrome打包exe后禁用控制台输出滚动日志

    Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...

  3. reading/writing files in Python

    file types: plaintext files, such as .txt .py Binary files, such as .docx, .pdf, iamges, spreadsheet ...

  4. textarea 高度调整

    textarea 高度调整 通过 rows 属性调整 高度

  5. CodeForcesGym 100753K Upside down primes

    Upside down primes Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  6. nyoj 108 士兵杀敌(一)

    士兵杀敌(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军现在 ...

  7. [luoguP1736] 创意吃鱼法(DP)

    传送门 f[i][j][0] 表示从右下角到左上角,以(i,j)为起点能延伸的最大值 f[i][j][1] 表示从左下角到右上角,以(i,j)为起点能延伸的最大值 up[i][j] 表示(i,j)上面 ...

  8. HDU 4923 (贪心+证明)

    Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is ...

  9. hdu——3836 Equivalent Sets

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  10. 1154 能量项链 2006年NOIP全国联赛提高组 codevs

    1154 能量项链  2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...