PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)
好不容易实现了 《PCB 无需解压,直接读取Genesis TGZ指定文件 》
正好这里有一项需求:PCB电测试--测试点数自动输出到流程指示中

一.自动输出测试点小结;
1.由于历史原因;各工厂差异,测试点数统计单位差异,有的工厂为PCS计算测试点,有些工厂一年前是按PCS计算测试点,而最新测试点是以PNL计算;
而流程指示中统一为PNL为测试点单位统计,在制作前,要识别此坑,不要往里面跳了。
2.另一个,有些客户来的CAM资料是Set为单位,工程CAM制作时是不会再拆为PCS作业,而之前的规则是以PCS计算测试点的,而此测试点数是以SET计算测试点,
而转为PNL测试点时,无法准确测试点数的单位到底是SET还是PCS,可能导致转为PNL测试点错误。
3.基于以上2点问题,解决方法是:读取TGZ Stephdr拼板及工程标准命名规范识别PNL中拼了多少个SET,多少个PCS。计算出转换值。
二.读取TGZ Stephdr文件
/// <summary>
/// 读取stephdr
private void readStephdr()
{
Dictionary<string, List<STEP_REPEAT>> dicStepRepeat = new Dictionary<string, List<STEP_REPEAT>>();
string tarFilePath = @"F:\2p00802ya0.tgz";
string FileName = Path.GetFileNameWithoutExtension(tarFilePath);
string FindDir = $@"{FileName}/steps/"; //以/斜杆结尾为文件夹
using (Stream stream = File.OpenRead(tarFilePath))
{
IReader reader = ReaderFactory.Open(stream);
while (reader.MoveToNextEntry())
{
Match matchresult = Regex.Match(reader.Entry.Key, $@"^{FindDir}([\w\s]+)/stephdr$");
if (matchresult.Success)
{
string StepName = matchresult.Groups[].Value;
using (EntryStream st = reader.OpenEntryStream())
{
byte[] byData = new byte[reader.Entry.Size];
st.Read(byData, , byData.Length);
string STEP_REPEAT_txt = System.Text.Encoding.Default.GetString(byData);
List<STEP_REPEAT> STEP_REPEATlist = Info2STEP_REPEAT(STEP_REPEAT_txt);
dicStepRepeat.Add(StepName, STEP_REPEATlist);
}
}
}
}
List<STEP_REPEAT> STEP_REPEATpnl = new List<STEP_REPEAT>();
if (dicStepRepeat.ContainsKey("pnl"))
{
STEP_REPEATpnl = dicStepRepeat["pnl"];
getAllChild_STEP_REPEAT(STEP_REPEATpnl, dicStepRepeat);
}
int count_ = getStepCount(STEP_REPEATpnl, ".*", false);
}
/// <summary>
/// 获取PNL中有多个拼板个数
/// </summary>
/// <param name="STEP_REPEATpnl">PNL STEP_REPEAT信息</param>
/// <param name="Fillter">过滤Step名</param>
/// <param name="NotRecursion">是否递归深入搜索</param>
/// <returns></returns>
public int getStepCount(List<STEP_REPEAT> STEP_REPEATpnl, string Fillter = "(cam|set|flip).*", bool NotRecursion = false)
{
if (STEP_REPEATpnl == null || STEP_REPEATpnl.Count == )
return ;
int SumCount = ;
foreach (var item in STEP_REPEATpnl)
{
if (Regex.IsMatch(item.NAME, Fillter))
{
if (NotRecursion)
SumCount += item.NX * item.NX;
else
SumCount += item.NX * item.NX * getStepCount(item.STEP_REPEAT_List, Fillter);
}
}
return SumCount;
}
/// <summary>
/// 获取PNL做为父节点 获取拼板关系(PNL->SET->CAM) 递规实现
/// </summary>
/// <param name="STEP_REPEATpnl"></param>
/// <param name="dicStepRepeat"></param>
public void getAllChild_STEP_REPEAT(List<STEP_REPEAT> STEP_REPEATpnl, Dictionary<string, List<STEP_REPEAT>> dicStepRepeat)
{
if (STEP_REPEATpnl == null || STEP_REPEATpnl.Count == )
return;
foreach (var item in STEP_REPEATpnl)
{
if (dicStepRepeat.ContainsKey(item.NAME))
{
item.STEP_REPEAT_List = dicStepRepeat[item.NAME];
getAllChild_STEP_REPEAT(item.STEP_REPEAT_List, dicStepRepeat);
}
}
}
/// <summary>
/// 读取Step Stephdr文件信息到Mod
/// </summary>
/// <param name="STEP_REPEAT_txt"></param>
/// <returns></returns>
public List<STEP_REPEAT> Info2STEP_REPEAT(string STEP_REPEAT_txt)
{
List<STEP_REPEAT> STEP_REPEATlist = new List<winTool.STEP_REPEAT>();
string[] lines = STEP_REPEAT_txt.Split('\n');
bool isStart = false;
STEP_REPEAT ModStep = new STEP_REPEAT();
foreach (var item in lines)
{
if (isStart)
{
string[] itemArray = item.Split('=');
if (itemArray.Length == )
{ string itemKey = itemArray[].Trim();
string itemVal = itemArray[].Trim();
switch (itemKey)
{
case "NAME":
ModStep.NAME = itemVal.ToLower();
break;
case "X":
ModStep.X = Double.Parse(itemVal);
break;
case "Y":
ModStep.Y = Double.Parse(itemVal);
break;
case "DX":
ModStep.DX = Double.Parse(itemVal);
break;
case "DY":
ModStep.DY = Double.Parse(itemVal);
break;
case "NX":
ModStep.NX = int.Parse(itemVal);
break;
case "NY":
ModStep.NY = int.Parse(itemVal);
break;
case "ANGLE":
ModStep.ANGLE = Double.Parse(itemVal);
break;
case "MIRROR":
ModStep.MIRROR = itemVal == "YES" ? true : false;
break;
}
}
else if (item.StartsWith("}"))
{
isStart = false;
STEP_REPEATlist.Add(ModStep);
}
}
else if (!isStart && item.StartsWith("STEP-REPEAT") && item.EndsWith("{"))
{
isStart = true;
ModStep = new STEP_REPEAT();
}
}
return STEP_REPEATlist;
}
Stephdr Mod类
public class STEP_REPEAT
{
public string NAME { get; set; }
public double X { get; set; }
public double Y { get; set; }
public double DX { get; set; }
public double DY { get; set; }
public int NX { get; set; }
public int NY { get; set; }
public double ANGLE { get; set; }
public bool MIRROR { get; set; }
public List<STEP_REPEAT> STEP_REPEAT_List { get; set; }
}
三.读取 ZIP 测试点文件
private void readTestPoint()
{
int resultCount = ;
string tarFilePath = @"F:\4a00n0nb.zip";
string FileName = Path.GetFileNameWithoutExtension(tarFilePath);
using (Stream stream = File.OpenRead(tarFilePath))
{
IReader reader = ReaderFactory.Open(stream);
while (reader.MoveToNextEntry())
{
if (reader.Entry.Key.EndsWith("profile.cmb"))
{
using (EntryStream st = reader.OpenEntryStream())
{
byte[] byData = new byte[reader.Entry.Size];
st.Read(byData, , byData.Length);
string result = System.Text.Encoding.Default.GetString(byData);
resultCount = int.Parse(result);
break;
}
}
}
}
}
PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)的更多相关文章
- hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行
测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...
- IO&&Serize 利用线程Thread.Sleep实现"自动输出"
查看链接 https://github.com/jungle8884/C-.Net/tree/MyClassLibrary using System; using System.Collections ...
- 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程
测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程 最近系统出现问题,由于数据库产生的日志量太大无法开启归档模式,导致offline的 ...
- Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明
Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...
- 利用javascript实现文本的自动输出
主要利用了setTimeout(),递归和String.substring(); 做出的效果就像是有一个打字员在打字. <!doctype html> <html lang=&quo ...
- Mysql取随机数据效率测试(400W条中读取100条)
测试数据表的创建在文章:http://www.cnblogs.com/wt645631686/p/6868192.html 先看一下我的SQL方案 SELECT * FROM `emp` WHERE ...
- top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出
. 自动执行的shell脚本中,使用top -n > log.txt, 上电自动执行,文件无输出,使用一下命令解决: //usr/bin/top -d -n -b > log.txt 如果 ...
- 测试,测试开发,QA,QM,QC--------- 测试之路勿跑偏
测试,测试开发,QA,QM,QC可能是测试行业里的细分角色了,加了不少群学习,看到不同人有对自己不同的角色定位.我也做了这挺长时间的测试,也和大部分测试同胞一样,为了一份好的工作学习各种各样的技术,但 ...
- 配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件
配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件 学习了:http://blog.csdn.net/stevendbaguo/article/de ...
随机推荐
- 调用.NET Serviced Component引发的性能问题及其解决
在企业用户环境里,.NET Serviced Component使用广泛.它比较好的把传统COM+封装和.NET应用逻辑衔接了起来,在服务器端应用起到重要作用..NET Serviced Compon ...
- Linux下清空文件的常用方法
1. 本人用的最多,感觉也是最方便的: > filename.log 2. : > filename.log 3. cat /dev/null > filename.log
- eclipse的任务列表
如上图所示,备注加 TODO ,可以在tasks列表中显示,提示你还有哪些工作需要完善 昨天遇到一个问题,加了 TODO 任务列表里却不显示,后来发现是因为任务列表只显示了前100条,而我的项 ...
- Object.keys() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in ...
- 1 JSONP
一.什么是跨域访问举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求 ...
- zoj 3314 CAPTCHA(纯模拟)
题目 有些人用深搜写的,当然我这弱弱的,只理解纯模拟... 纯模拟,第一次写了那么长的代码,我自己也是够坚韧不拔的,,,,必须留念啊!!! 注意,G包含C,E包含L,R包含P,(照图说O应该不包含C, ...
- 开发LED屏幕页面遇到的问题
上上个礼拜公司的展销会活动需要一个展示在LED大屏幕的页面,顶部显示平台交易总金额,左右两边分别是厂家和买家实时交易记录,具体页面长下面这个样子 需求评审的时候产品说顶部的总金额要有一个数字滚动或者翻 ...
- Huawei-R&S-网络工程师实验笔记20190527-华为设备密码重置、设置web管理
>Huawei-R&S-网络工程师实验笔记20190527-华为设备密码重置.设置web管理 >>实验开始(使用SecureCRT 等工具软件): 一.华为设备密码重置,通过 ...
- Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...
- ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听
对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...