解析钻孔(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. Chrome升级后打开新的标签页变样了……

    最近更新Chrome后,打开新的标签页完全变样了,让人不知所措,特别是没有了那个“最近关闭标签页”按钮,这让我抓狂…… PS:Chrome版本号为:29.0.1547.76 m PPS:最新版已无法修 ...

  2. C++ CEF 浏览器中显示 Tooltip(标签中的 title 属性)

    在 Windows 中将 CEF 集成到 C++ 客户端以后,默认是无法显示 tooltip 的,比如图片标签中的 title 属性. 实现的方式其实很简单,按下面的步骤操作就可以: 创建一个文本文件 ...

  3. 「 Luogu P2230 」X 「 Vijos 1142 」 HXOS系统

    题目描述可能稍有偏差,但实质上是一样的. 看下面 题目大意 题面这么长,先说说题意吧. 就是有一个操作系统,他的存储方式是树形的.其中分为文件和目录(文件夹)每一个子目录下只能存储 $K$ 个文件或目 ...

  4. 本地搭建easy-mock

    easy-mock要用nodejs启动,需要先安装nodejs ubuntu系统: apt install node centos系统: curl --silent --location https: ...

  5. 脚本开头,python预编译,控制台输入输出,for,while循环,分支判断,break,continue

    3. name = input("name:")与2.x中raw_input一回事, 注意接收的变量全部默认为字符串类型. 从控制台接收用户输入,而密文输入import getpa ...

  6. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交

    [题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...

  7. MySQL 乐观锁和悲观锁

    前言 1)在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和一致性以及数据库的一致性. 2)加锁是为了解决更新丢失问题 ...

  8. HDU 1542 Atlantics 线段树+离散化扫描

    将 x 轴上的点进行离散化,扫描线沿着 y 轴向上扫描 每次添加一条边不断找到当前状态有效边的长度 , 根据这个长度和下一条边形成的高度差得到一块合法的矩形的面积 #include<iostre ...

  9. Win32编程API 基础篇 -- 4.消息循环

    消息循环 理解消息循环 为了编写任何即使是最简单的程序,了解windows程序的消息循环和整个消息发送结构是非常有必要的.既然我们已经尝试了一点消息处理的东西,我们应该对整个程序有更深入的理解,如果你 ...

  10. P1082||T1200 同余方程 codevs|| 洛谷

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   http://codevs.cn/problem/1200/||https://www.luogu.o ...