博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)
阅读量:4519 次
发布时间:2019-06-08

本文共 5685 字,大约阅读时间需要 18 分钟。

好不容易实现了 《 》

正好这里有一项需求: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文件

///         /// 读取stephdr        private void readStephdr()        {            Dictionary
> dicStepRepeat = new Dictionary
>(); 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[1].Value; using (EntryStream st = reader.OpenEntryStream()) { byte[] byData = new byte[reader.Entry.Size]; st.Read(byData, 0, byData.Length); string STEP_REPEAT_txt = System.Text.Encoding.Default.GetString(byData); List
STEP_REPEATlist = Info2STEP_REPEAT(STEP_REPEAT_txt); dicStepRepeat.Add(StepName, STEP_REPEATlist); } } } } List
STEP_REPEATpnl = new List
(); if (dicStepRepeat.ContainsKey("pnl")) { STEP_REPEATpnl = dicStepRepeat["pnl"]; getAllChild_STEP_REPEAT(STEP_REPEATpnl, dicStepRepeat); } int count_ = getStepCount(STEP_REPEATpnl, ".*", false); } ///
/// 获取PNL中有多个拼板个数 /// ///
PNL STEP_REPEAT信息 ///
过滤Step名 ///
是否递归深入搜索 ///
public int getStepCount(List
STEP_REPEATpnl, string Fillter = "(cam|set|flip).*", bool NotRecursion = false) { if (STEP_REPEATpnl == null || STEP_REPEATpnl.Count == 0) return 1; int SumCount = 0; 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; } ///
/// 获取PNL做为父节点 获取拼板关系(PNL->SET->CAM) 递规实现 /// ///
///
public void getAllChild_STEP_REPEAT(List
STEP_REPEATpnl, Dictionary
> dicStepRepeat) { if (STEP_REPEATpnl == null || STEP_REPEATpnl.Count == 0) 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); } } } ///
/// 读取Step Stephdr文件信息到Mod /// ///
///
public List
Info2STEP_REPEAT(string STEP_REPEAT_txt) { List
STEP_REPEATlist = new List
(); 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 == 2) { string itemKey = itemArray[0].Trim(); string itemVal = itemArray[1].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_List { get; set; } }

 

三.读取 ZIP 测试点文件

private void readTestPoint()        {            int resultCount = 0;            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, 0, byData.Length);                            string result = System.Text.Encoding.Default.GetString(byData);                            resultCount = int.Parse(result);                            break;                        }                    }                }            }        }

 

转载于:https://www.cnblogs.com/pcbren/p/9379076.html

你可能感兴趣的文章
vs2005/vs2008 快捷键【转】
查看>>
javascript 日常
查看>>
Android打开相机进行人脸识别,使用虹软人脸识别引擎
查看>>
打印沙漏
查看>>
腾讯物联TencentOS tiny上云初探
查看>>
nginx 安装
查看>>
C#中upd分包与发送,已经实现全部代码
查看>>
让插件帮你优化代码
查看>>
学习笔记3
查看>>
LeetCode 20. Valid Parentheses
查看>>
LeetCode 4 Keys Keyboard
查看>>
bean找不到异常
查看>>
重拾Javascript基础(三) - DOM属性&方法
查看>>
电感在电路中的作用(硬件01)
查看>>
ng 动态的生成option。
查看>>
ORACLE-12C-RAC INSTALL
查看>>
LintCode-Topological Sorting
查看>>
自定义引用类型的Enumerable.Union调用(原创)
查看>>
Keil c中自定义带可变参数的printf函数
查看>>
抽象类实例
查看>>